ERC-20
Overview
Max Total Supply
8,691,855.383139427955340911 HOTM
Holders
1,025
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
630.46261574074074074 HOTMValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HumansOfTheMetaverseToken
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-14 */ //SPDX-License-Identifier: Unlicense /* ,----, ,--, ,----.. ,/ .`| ____ ,--.'| / / \ ,` .' : ,' , `. ,--, | : / . : ; ; / ,-+-,.' _ | ,---.'| : ' . / ;. \ .'___,/ ,' ,-+-. ; , || | | : _' | . ; / ` ; | : | ,--.'|' | ;| : : |.' | ; | ; \ ; | ; |.'; ; | | ,', | ':t | ' ' ; : | : | ; | ' `----' | | | | / | | || ' | .'. | . | ' ' ' : ' : ; ' | : | : |, | | : | ' ' ; \; / | | | ' ; . | ; |--' ' : | : ; \ \ ', / ' : | | : | | , | | ' ,/ ; : / ; |.' | : ' |/ ; : ;--' \ \ .' '---' ; | |`-' | ,/ `---` | ;/ '---' '---' */ 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; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } 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); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } 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. */ 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) { return _values(set._inner); } // 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; 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 on 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; assembly { result := store } return result; } } pragma solidity ^0.8.10; interface IYielder { function ownerOf(uint256 _tokenId) external view returns(address); } interface IBooster { function computeAmount(uint256 amount) external view returns(uint256); function computeAmounts(uint256[] calldata amounts, uint256[] calldata yieldingCores, uint256[] calldata tokens) external view returns(uint256); } contract HumansOfTheMetaverseToken is ERC20("HOTM", "HOTM"), Ownable, Pausable, ReentrancyGuard { using EnumerableSet for EnumerableSet.UintSet; struct YielderSettings { uint256 _defaultYieldRate; // fallback for yieldingCoresAmount absence uint256 _startTime; uint256 _endTime; uint256 _timeRate; mapping(uint256 => uint256) _tokenYieldingCoresMapping; // tokenId => yieldingCoreId (i.e. job) mapping(uint256 => uint256) _yieldingCoresAmountMapping; // yieldingCoreId => amount mapping(uint256 => uint256) _lastClaim; // tokenId => date } struct BoosterSettings { address _appliesFor; // yielder bool _status; EnumerableSet.UintSet _yieldingCores; mapping(uint256 => uint256) _boosterStartDates; // tokenId => boosterStartDate } mapping(address => YielderSettings) yielders; mapping(address => BoosterSettings) boosters; address[] public boostersAddresses; // boosters should be iterable mapping(address => mapping(address => EnumerableSet.UintSet)) tokensOwnerShip; // map econtract addrss => map owner address => yieldingToken uint256 public allowedPublicTokensMinted = 31207865 ether; // max total supply * 0.6 uint256 public foundersAndOthersAllowedMinting = 20805244 ether; uint256 public foundersLinearDistributionPeriod = 365 days; uint256 public foundersAndOthersLastClaim; constructor() { _pause(); foundersAndOthersLastClaim = block.timestamp; } // YIELDERS function setYielderSettings( uint256 _defaultYieldRate, uint256 _startTime, uint256 _endTime, uint256 _timeRate, address _yielderAddress ) external onlyOwner { YielderSettings storage yielderSettings = yielders[_yielderAddress]; yielderSettings._defaultYieldRate = _defaultYieldRate; yielderSettings._startTime = _startTime; yielderSettings._endTime = _endTime; yielderSettings._timeRate = _timeRate; } function getYielderSettings(address _address) internal view returns (YielderSettings storage) { YielderSettings storage yielderSettings = yielders[_address]; require(yielderSettings._startTime != uint256(0), "There is no yielder with provided address"); return yielderSettings; } function setTokenYielderMapping( address _yielderAddress, uint256[] calldata _tokenIds, uint256[] calldata _yieldingCores ) external onlyOwner { require(_tokenIds.length == _yieldingCores.length, "Provided arrays should have the same length"); YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress); for(uint256 i = 0; i < _tokenIds.length; ++i) { yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]] = _yieldingCores[i]; } } function setYieldingAmountMapping( address _yielderAddress, uint256[] calldata _yieldingCores, uint256[] calldata _amounts ) external onlyOwner { require(_amounts.length == _yieldingCores.length, "Provided arrays should have the same length"); YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress); for(uint256 i = 0; i < _yieldingCores.length; ++i) { yielderSettings._yieldingCoresAmountMapping[_yieldingCores[i]] = _amounts[i] * (10 ** 18); // cast to ether } } function setEndDateForYielder(uint256 _endTime, address _contract) external onlyOwner { YielderSettings storage yielderSettings = getYielderSettings(_contract); yielderSettings._endTime = _endTime; } function setStartDateForYielder(uint256 _startTime, address _contract) external onlyOwner { YielderSettings storage yielderSettings = getYielderSettings(_contract); yielderSettings._startTime = _startTime; } function setDefaultYieldRateForYielder(uint256 _defaultYieldRate, address _contract) external onlyOwner { YielderSettings storage yielderSettings = getYielderSettings(_contract); yielderSettings._defaultYieldRate = _defaultYieldRate * (10 ** 18); } function setTimeRateForYielder(uint256 _timeRate, address _contract) external onlyOwner { YielderSettings storage yielderSettings = getYielderSettings(_contract); yielderSettings._timeRate = _timeRate; } // BOOSTERS function setBoosterConfiguration( address _appliesFor, bool _status, address _boosterAddress ) external onlyOwner { boostersAddresses.push(_boosterAddress); BoosterSettings storage boosterSettings = boosters[_boosterAddress]; boosterSettings._appliesFor= _appliesFor; boosterSettings._status = _status; } function getBoosterSettings(address _address) internal view returns (BoosterSettings storage) { BoosterSettings storage boosterSettings = boosters[_address]; require(boosterSettings._appliesFor != address(0), "There is no yielder with provided address"); return boosterSettings; } function setBoosterCores(address _boosterAddress, uint256[] calldata _yieldingCoresIds) external onlyOwner { BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress); for (uint256 i = 0; i < _yieldingCoresIds.length; ++i) { boosterSettings._yieldingCores.add(_yieldingCoresIds[i]); } } function setBoosterStatus(address _boosterAddress, bool _status) external onlyOwner { BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress); boosterSettings._status = _status; } function setBoosterAppliesFor(address _boosterAddress, address _appliesFor) external onlyOwner{ BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress); boosterSettings._appliesFor = _appliesFor; } function replaceBoosterCores(address _boosterAddress, uint256[] calldata _yieldingCoresIds) external onlyOwner { BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress); for (uint256 i = 0; i < boosterSettings._yieldingCores.length(); ++i) { boosterSettings._yieldingCores.remove(boosterSettings._yieldingCores.at(i)); } for (uint256 i = 0; i < _yieldingCoresIds.length; ++i) { boosterSettings._yieldingCores.add(_yieldingCoresIds[i]); } } // TOKEN function claimRewards( address _contractAddress, uint256[] calldata _tokenIds ) external whenNotPaused nonReentrant() returns (uint256) { YielderSettings storage yielderSettings = getYielderSettings(_contractAddress); for(uint256 i = 0; i < _tokenIds.length; i++) { uint256 _tokenId = _tokenIds[i]; processTokenOwnerShip(_contractAddress, _tokenId); } uint256 currentTime = block.timestamp; uint256 totalUnclaimedRewards = computeUnclaimedRewardsAndUpdate(yielderSettings, _contractAddress, _tokenIds, currentTime); claimTokens(totalUnclaimedRewards); for(uint256 i = 0; i < _tokenIds.length; i++) { uint256 _tokenId = _tokenIds[i]; if (currentTime > yielderSettings._endTime) { yielderSettings._lastClaim[_tokenId] = yielderSettings._endTime; } else { yielderSettings._lastClaim[_tokenId] = currentTime; } } return totalUnclaimedRewards; } function checkClaimableAmount(address _contractAddress, uint256[] calldata _tokenIds) view external whenNotPaused returns(uint256) { YielderSettings storage yielderSettings = getYielderSettings(_contractAddress); uint256 totalUnclaimedRewards = computeUnclaimedRewardsSafe(yielderSettings, _contractAddress, _tokenIds, block.timestamp); return totalUnclaimedRewards; } function computeUnclaimedRewardsAndUpdate( YielderSettings storage _yielderSettings, address _yielderAddress, uint256[] calldata _tokenIds, uint256 _currentTime ) internal returns (uint256) { uint256 totalReward = 0; totalReward += computeBaseAccumulatedRewards(_yielderSettings, _tokenIds, _currentTime); totalReward += computeBoostersAccumulatedRewardsAndUpdate(_yielderAddress, _yielderSettings, _tokenIds, _currentTime); return totalReward; } function computeUnclaimedRewardsSafe( YielderSettings storage _yielderSettings, address _yielderAddress, uint256[] calldata _tokenIds, uint256 _currentTime ) internal view returns (uint256) { uint256 totalReward = 0; totalReward += computeBaseAccumulatedRewards(_yielderSettings, _tokenIds, _currentTime); totalReward += computeBoostersAccumulatedRewardsSafe(_yielderAddress, _yielderSettings, _tokenIds, _currentTime); return totalReward; } function computeBaseAccumulatedRewards( YielderSettings storage _yielderSettings, uint256[] calldata _tokenIds, uint256 _currentTime ) internal view returns (uint256) { uint256 baseAccumulatedRewards = 0; for (uint256 i = 0; i < _tokenIds.length; ++i) { uint256 lastClaimDate = getLastClaimForYielder(_yielderSettings, _tokenIds[i]); if (lastClaimDate != _yielderSettings._endTime) { uint256 secondsElapsed = _currentTime - lastClaimDate; if (_yielderSettings._defaultYieldRate != uint256(0)) { baseAccumulatedRewards += secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate; } else { baseAccumulatedRewards += secondsElapsed * _yielderSettings._yieldingCoresAmountMapping[_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]] / _yielderSettings._timeRate; } } } return baseAccumulatedRewards; } function computeBoostersAccumulatedRewardsAndUpdate( address _yielderAddress, YielderSettings storage _yielderSettings, uint256[] calldata _tokenIds, uint256 _currentTime ) internal returns (uint256) { uint256 boosterAccumulatedRewards = 0; for (uint256 boosterIndex = 0; boosterIndex < boostersAddresses.length; ++boosterIndex) { BoosterSettings storage boosterSettings = getBoosterSettings(boostersAddresses[boosterIndex]); uint256 toBeSentArraysIndex = 0; uint256[] memory accumulatedRewardsForBooster = new uint256[](_tokenIds.length); uint256[] memory validTokensCandidates = new uint256[](_tokenIds.length); if (boosterSettings._appliesFor == _yielderAddress && boosterSettings._status) { for (uint256 i = 0; i < _tokenIds.length; ++i) { uint256 boosterStartDate = getLastClaimForBooster(boosterSettings, _tokenIds[i]); if ( ( boosterSettings._yieldingCores.length() == 0 || boosterSettings._yieldingCores.contains(_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]) ) && getLastClaimForYielder(_yielderSettings, _tokenIds[i]) != _yielderSettings._endTime && boosterStartDate != uint256(0) ) { uint256 secondsElapsed = _currentTime - boosterStartDate; if (_yielderSettings._defaultYieldRate != uint256(0)) { accumulatedRewardsForBooster[toBeSentArraysIndex] = secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate; } else { uint256 tokenYieldingCoresMapping = _yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]; uint256 yieldingCoresAmountMapping = _yielderSettings._yieldingCoresAmountMapping[tokenYieldingCoresMapping]; accumulatedRewardsForBooster[toBeSentArraysIndex] = secondsElapsed * yieldingCoresAmountMapping / _yielderSettings._timeRate; } validTokensCandidates[toBeSentArraysIndex] = _tokenIds[i]; toBeSentArraysIndex++; } } if (boosterSettings._yieldingCores.length() != 0) { uint256[] memory yieldingCores = new uint256[](validTokensCandidates.length); for (uint256 i = 0; i < validTokensCandidates.length; ++i) { yieldingCores[i] = _yielderSettings._tokenYieldingCoresMapping[validTokensCandidates[i]]; } boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmounts(accumulatedRewardsForBooster, yieldingCores, validTokensCandidates); } else { uint256 summedBoosterAccumulatedRewards = 0; for (uint256 i = 0; i < validTokensCandidates.length; ++i) { summedBoosterAccumulatedRewards += accumulatedRewardsForBooster[i]; } boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmount(summedBoosterAccumulatedRewards); } for (uint256 i = 0; i < validTokensCandidates.length; ++i) { if (boosterSettings._boosterStartDates[validTokensCandidates[i]] != uint256(0)) { boosterSettings._boosterStartDates[validTokensCandidates[i]] = _currentTime; } } } } return boosterAccumulatedRewards; } function computeBoostersAccumulatedRewardsSafe( address _yielderAddress, YielderSettings storage _yielderSettings, uint256[] calldata _tokenIds, uint256 _currentTime ) internal view returns (uint256) { uint256 boosterAccumulatedRewards = 0; for (uint256 boosterIndex = 0; boosterIndex < boostersAddresses.length; ++boosterIndex) { BoosterSettings storage boosterSettings = getBoosterSettings(boostersAddresses[boosterIndex]); uint256 toBeSentArraysIndex = 0; uint256[] memory accumulatedRewardsForBooster = new uint256[](_tokenIds.length); uint256[] memory validTokensCandidates = new uint256[](_tokenIds.length); if (boosterSettings._appliesFor == _yielderAddress && boosterSettings._status) { for (uint256 i = 0; i < _tokenIds.length; ++i) { uint256 boosterStartDate = getLastClaimForBooster(boosterSettings, _tokenIds[i]); if ( ( boosterSettings._yieldingCores.length() == 0 || boosterSettings._yieldingCores.contains(_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]) ) && getLastClaimForYielder(_yielderSettings, _tokenIds[i]) != _yielderSettings._endTime && boosterStartDate != uint256(0) ) { uint256 secondsElapsed = _currentTime - boosterStartDate; if (_yielderSettings._defaultYieldRate != uint256(0)) { accumulatedRewardsForBooster[toBeSentArraysIndex] = secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate; } else { uint256 tokenYieldingCoresMapping = _yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]; uint256 yieldingCoresAmountMapping = _yielderSettings._yieldingCoresAmountMapping[tokenYieldingCoresMapping]; accumulatedRewardsForBooster[toBeSentArraysIndex] = secondsElapsed * yieldingCoresAmountMapping / _yielderSettings._timeRate; } validTokensCandidates[toBeSentArraysIndex] = _tokenIds[i]; toBeSentArraysIndex++; } } if (boosterSettings._yieldingCores.length() != 0) { uint256[] memory yieldingCores = new uint256[](validTokensCandidates.length); for (uint256 i = 0; i < validTokensCandidates.length; ++i) { yieldingCores[i] = _yielderSettings._tokenYieldingCoresMapping[validTokensCandidates[i]]; } boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmounts(accumulatedRewardsForBooster, yieldingCores, validTokensCandidates); } else { uint256 summedBoosterAccumulatedRewards = 0; for (uint256 i = 0; i < validTokensCandidates.length; ++i) { summedBoosterAccumulatedRewards += accumulatedRewardsForBooster[i]; } boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmount(summedBoosterAccumulatedRewards); } } } return boosterAccumulatedRewards; } function getLastClaimForYielder(YielderSettings storage _yielderSettings, uint256 _tokenId) internal view returns (uint256) { uint256 lastClaimDate = _yielderSettings._lastClaim[_tokenId]; if (lastClaimDate == uint256(0)) { lastClaimDate = _yielderSettings._startTime; } return lastClaimDate; } function getLastClaim(address _yielderAddress, uint256 _tokenId) external whenNotPaused view returns (uint256) { YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress); return getLastClaimForYielder(yielderSettings, _tokenId); } function getLastClaimForBooster(BoosterSettings storage _boosterSettings, uint256 _tokenId) view internal returns (uint256) { uint256 lastClaimDate = _boosterSettings._boosterStartDates[_tokenId]; return lastClaimDate; } // UTILS function watchTransfer(address _from, address _to, uint256 _tokenId) external { getYielderSettings(msg.sender); if (_from == address(0)) { tokensOwnerShip[msg.sender][_to].add(_tokenId); } else { tokensOwnerShip[msg.sender][_to].add(_tokenId); if (tokensOwnerShip[msg.sender][_from].contains(_tokenId)) { tokensOwnerShip[msg.sender][_from].remove(_tokenId); if (tokensOwnerShip[msg.sender][_from].length() == 0) { delete tokensOwnerShip[msg.sender][_from]; } } } } function watchBooster(address _collection, uint256[] calldata _tokenIds, uint256[] calldata _startDates) external { // boster shall send uint256(0) as start if removed BoosterSettings storage boosterSettings = getBoosterSettings(msg.sender); if (boosterSettings._appliesFor == _collection) { for (uint32 i = 0; i < _tokenIds.length; ++i) { boosterSettings._boosterStartDates[_tokenIds[i]] = _startDates[i]; } } } function claimTokens(uint256 _amount) internal { if (allowedPublicTokensMinted - _amount >= 0) { _mint(msg.sender, _amount); allowedPublicTokensMinted -= _amount; } else { IERC20(address(this)).transfer(msg.sender, _amount); } } function processTokenOwnerShip(address _contractAddress, uint256 _tokenId) internal { if (!tokensOwnerShip[_contractAddress][msg.sender].contains(_tokenId)) { address owner = IYielder(_contractAddress).ownerOf(_tokenId); if (owner == msg.sender) { tokensOwnerShip[_contractAddress][msg.sender].add(_tokenId); } } require(tokensOwnerShip[_contractAddress][msg.sender].contains(_tokenId), "Not the owner of the token"); } function reserveTeamTokens() external onlyOwner { uint256 currentDate = block.timestamp; _mint(msg.sender, foundersAndOthersAllowedMinting * (currentDate - foundersAndOthersLastClaim) / foundersLinearDistributionPeriod); foundersAndOthersLastClaim = block.timestamp; } function withdrawContractAdditionalTokens() external onlyOwner { IERC20(address(this)).transfer(msg.sender, IERC20(address(this)).balanceOf(address(this))); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setPublicAllowedTokensToBeMinted(uint256 _amount) external onlyOwner { allowedPublicTokensMinted = _amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":[],"name":"allowedPublicTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boostersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"checkClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundersAndOthersAllowedMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersAndOthersLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersLinearDistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCoresIds","type":"uint256[]"}],"name":"replaceBoosterCores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"address","name":"_appliesFor","type":"address"}],"name":"setBoosterAppliesFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_appliesFor","type":"address"},{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"address","name":"_boosterAddress","type":"address"}],"name":"setBoosterConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCoresIds","type":"uint256[]"}],"name":"setBoosterCores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBoosterStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultYieldRate","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setDefaultYieldRateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setEndDateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPublicAllowedTokensToBeMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setStartDateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setTimeRateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_yieldingCores","type":"uint256[]"}],"name":"setTokenYielderMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultYieldRate","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"address","name":"_yielderAddress","type":"address"}],"name":"setYielderSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCores","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setYieldingAmountMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_startDates","type":"uint256[]"}],"name":"watchBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"watchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawContractAdditionalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526a19d085c067a8ce1b440000600b556a1135ae898595012c700000600c556301e13380600d553480156200003757600080fd5b50604080518082018252600480825263484f544d60e01b6020808401828152855180870190965292855284015281519192916200007791600391620001d8565b5080516200008d906004906020840190620001d8565b505050620000aa620000a4620000d060201b60201c565b620000d4565b6005805460ff60a01b191690556001600655620000c662000126565b42600e55620002bb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200013a600554600160a01b900460ff1690565b156200017f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001bb3390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620001e6906200027e565b90600052602060002090601f0160209004810192826200020a576000855562000255565b82601f106200022557805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025557825182559160200191906001019062000238565b506200026392915062000267565b5090565b5b8082111562000263576000815560010162000268565b600181811c908216806200029357607f821691505b60208210811415620002b557634e487b7160e01b600052602260045260246000fd5b50919050565b6130bc80620002cb6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80636fb73d0811610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146104fe578063dd7b464914610537578063df272e671461054a578063f01a44de14610552578063f2fde38b1461055a578063f7d3aece1461056d57600080fd5b8063a9059cbb146104a9578063b146ba71146104bc578063b75ebb19146104cf578063ce71f6d1146104e2578063d3cc8dd3146104eb57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461045757806395d89b4114610468578063a457c2d714610470578063a51abfb014610483578063a8ed01241461049657600080fd5b80636fb73d08146103f85780636fc259551461040b57806370a082311461041e578063715018a6146104475780638456cb591461044f57600080fd5b8063327e1152116101df5780634c87e619116101a35780634c87e619146103915780634f3969e7146103a457806356760ecc146103b75780635c25bbe8146103ca5780635c975abb146103dd5780635cf14f0a146103ef57600080fd5b8063327e115214610351578063356b756314610364578063395093511461036d5780633f4ba83a1461038057806340b1bff21461038857600080fd5b806318160ddd1161022657806318160ddd146103015780632237db251461030957806323b872dd1461031c5780632c42d0bd1461032f578063313ce5671461034257600080fd5b8063028594641461026357806305231dea1461027857806306fdde031461029e578063095ea7b3146102b35780630ca00cc8146102d6575b600080fd5b610276610271366004612a3c565b610580565b005b61028b610286366004612ac9565b6106c3565b6040519081526020015b60405180910390f35b6102a6610845565b6040516102959190612b1e565b6102c66102c1366004612b73565b6108d7565b6040519015158152602001610295565b6102e96102e4366004612b9f565b6108ee565b6040516001600160a01b039091168152602001610295565b60025461028b565b610276610317366004612bb8565b610918565b6102c661032a366004612a3c565b610958565b61027661033d366004612b9f565b610a02565b60405160128152602001610295565b61027661035f366004612bb8565b610a31565b61028b600d5481565b6102c661037b366004612b73565b610a80565b610276610abc565b61028b600b5481565b61027661039f366004612be8565b610af0565b6102766103b2366004612c6b565b610bbf565b6102766103c5366004612ac9565b610c17565b61028b6103d8366004612ac9565b610c9f565b600554600160a01b900460ff166102c6565b61028b600e5481565b610276610406366004612be8565b610cf2565b610276610419366004612bb8565b610d95565b61028b61042c366004612c99565b6001600160a01b031660009081526020819052604090205490565b610276610dd5565b610276610e09565b6005546001600160a01b03166102e9565b6102a6610e3b565b6102c661047e366004612b73565b610e4a565b610276610491366004612cc4565b610ee3565b6102766104a4366004612ac9565b610f37565b6102c66104b7366004612b73565b610fe1565b6102766104ca366004612cf2565b610fee565b6102766104dd366004612d3d565b611095565b61028b600c5481565b6102766104f9366004612be8565b6110ee565b61028b61050c366004612c6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61028b610545366004612b73565b6111aa565b6102766111f6565b61027661125d565b610276610568366004612c99565b611363565b61027661057b366004612bb8565b6113fb565b6105893361143b565b506001600160a01b0383166105cb57336000908152600a602090815260408083206001600160a01b038616845290915290206105c59082611474565b50505050565b336000908152600a602090815260408083206001600160a01b038616845290915290206105f89082611474565b50336000908152600a602090815260408083206001600160a01b038716845290915290206106269082611487565b156106be57336000908152600a602090815260408083206001600160a01b03871684529091529020610658908261149f565b50336000908152600a602090815260408083206001600160a01b03871684529091529020610685906114ab565b6106be57336000908152600a602090815260408083206001600160a01b038716845290915281209081816106b982826129f5565b505050505b505050565b600554600090600160a01b900460ff16156106f95760405162461bcd60e51b81526004016106f090612d8a565b60405180910390fd5b6002600654141561074c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f0565b6002600655600061075c8561143b565b905060005b838110156107a357600085858381811061077d5761077d612db4565b90506020020135905061079087826114b5565b508061079b81612de0565b915050610761565b504260006107b48388888886611613565b90506107bf81611650565b60005b858110156108355760008787838181106107de576107de612db4565b905060200201359050846002015484111561080e5760028501546000828152600687016020526040902055610822565b600081815260068601602052604090208490555b508061082d81612de0565b9150506107c2565b5060016006559695505050505050565b60606003805461085490612dfb565b80601f016020809104026020016040519081016040528092919081815260200182805461088090612dfb565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e43384846116f4565b5060015b92915050565b600981815481106108fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146109425760405162461bcd60e51b81526004016106f090612e36565b600061094d8261143b565b600301929092555050565b6000610965848484611818565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109ea5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106f0565b6109f785338584036116f4565b506001949350505050565b6005546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016106f090612e36565b600b55565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016106f090612e36565b6000610a668261143b565b9050610a7a83670de0b6b3a7640000612e6b565b90555050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108e4918590610ab7908690612e8a565b6116f4565b6005546001600160a01b03163314610ae65760405162461bcd60e51b81526004016106f090612e36565b610aee6119e7565b565b6005546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016106f090612e36565b808314610b395760405162461bcd60e51b81526004016106f090612ea2565b6000610b448661143b565b905060005b848110156106b957838382818110610b6357610b63612db4565b90506020020135670de0b6b3a7640000610b7d9190612e6b565b826005016000888885818110610b9557610b95612db4565b9050602002013581526020019081526020016000208190555080610bb890612de0565b9050610b49565b6005546001600160a01b03163314610be95760405162461bcd60e51b81526004016106f090612e36565b6000610bf483611a84565b80546001600160a01b0319166001600160a01b0393909316929092179091555050565b6005546001600160a01b03163314610c415760405162461bcd60e51b81526004016106f090612e36565b6000610c4c84611a84565b905060005b82811015610c9857610c87848483818110610c6e57610c6e612db4565b905060200201358360010161147490919063ffffffff16565b50610c9181612de0565b9050610c51565b5050505050565b600554600090600160a01b900460ff1615610ccc5760405162461bcd60e51b81526004016106f090612d8a565b6000610cd78561143b565b90506000610ce88287878742611ac0565b9695505050505050565b6000610cfd33611a84565b80549091506001600160a01b0387811691161415610d8d5760005b63ffffffff81168511156106b95783838263ffffffff16818110610d3e57610d3e612db4565b9050602002013582600301600088888563ffffffff16818110610d6357610d63612db4565b9050602002013581526020019081526020016000208190555080610d8690612eed565b9050610d18565b505050505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b81526004016106f090612e36565b6000610dca8261143b565b600101929092555050565b6005546001600160a01b03163314610dff5760405162461bcd60e51b81526004016106f090612e36565b610aee6000611ae8565b6005546001600160a01b03163314610e335760405162461bcd60e51b81526004016106f090612e36565b610aee611b3a565b60606004805461085490612dfb565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ecc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106f0565b610ed933858584036116f4565b5060019392505050565b6005546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016106f090612e36565b6000610f1883611a84565b8054921515600160a01b0260ff60a01b19909316929092179091555050565b6005546001600160a01b03163314610f615760405162461bcd60e51b81526004016106f090612e36565b6000610f6c84611a84565b905060005b610f7d826001016114ab565b811015610faf57610f9e610f946001840183611b9f565b600184019061149f565b50610fa881612de0565b9050610f71565b5060005b82811015610c9857610fd0848483818110610c6e57610c6e612db4565b50610fda81612de0565b9050610fb3565b60006108e4338484611818565b6005546001600160a01b031633146110185760405162461bcd60e51b81526004016106f090612e36565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039283166001600160a01b0319909116811790915560009081526008602052604090208054921515600160a01b026001600160a81b03199093169390911692909217179055565b6005546001600160a01b031633146110bf5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0316600090815260076020526040902093845560018401929092556002830155600390910155565b6005546001600160a01b031633146111185760405162461bcd60e51b81526004016106f090612e36565b8281146111375760405162461bcd60e51b81526004016106f090612ea2565b60006111428661143b565b905060005b848110156106b95783838281811061116157611161612db4565b9050602002013582600401600088888581811061118057611180612db4565b90506020020135815260200190815260200160002081905550806111a390612de0565b9050611147565b600554600090600160a01b900460ff16156111d75760405162461bcd60e51b81526004016106f090612d8a565b60006111e28461143b565b90506111ee8184611bab565b949350505050565b6005546001600160a01b031633146112205760405162461bcd60e51b81526004016106f090612e36565b600042905061125633600d54600e548461123a9190612f11565b600c546112479190612e6b565b6112519190612f28565b611bcb565b5042600e55565b6005546001600160a01b031633146112875760405162461bcd60e51b81526004016106f090612e36565b6040516370a0823160e01b815230600482018190529063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f19190612f4a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612f63565b50565b6005546001600160a01b0316331461138d5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f0565b61136081611ae8565b6005546001600160a01b031633146114255760405162461bcd60e51b81526004016106f090612e36565b60006114308261143b565b600201929092555050565b6001600160a01b038116600090815260076020526040812060018101546108e85760405162461bcd60e51b81526004016106f090612f80565b60006114808383611caa565b9392505050565b60008181526001830160205260408120541515611480565b60006114808383611cf9565b60006108e8825490565b6001600160a01b0382166000908152600a6020908152604080832033845290915290206114e29082611487565b611596576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612fc9565b90506001600160a01b038116331415611594576001600160a01b0383166000908152600a6020908152604080832033845290915290206115929083611474565b505b505b6001600160a01b0382166000908152600a6020908152604080832033845290915290206115c39082611487565b61160f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e00000000000060448201526064016106f0565b5050565b60008061162287868686611dec565b61162c9082612e8a565b905061163b8688878787611ef3565b6116459082612e8a565b979650505050505050565b600081600b546116609190612f11565b1061168c5761166f3382611bcb565b80600b60008282546116819190612f11565b909155506113609050565b60405163a9059cbb60e01b815233600482015260248101829052309063a9059cbb906044016020604051808303816000875af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f9190612f63565b6001600160a01b0383166117565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106f0565b6001600160a01b0382166117b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106f0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661187c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106f0565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106f0565b6001600160a01b038316600090815260208190526040902054818110156119565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106f0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061198d908490612e8a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d991815260200190565b60405180910390a350505050565b600554600160a01b900460ff16611a375760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f0565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038082166000908152600860205260408120805491929091166108e85760405162461bcd60e51b81526004016106f090612f80565b600080611acf87868686611dec565b611ad99082612e8a565b905061163b86888787876124d8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611b645760405162461bcd60e51b81526004016106f090612d8a565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a673390565b600061148083836129cb565b600081815260068301602052604081205480611480575050506001015490565b6001600160a01b038216611c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f0565b8060026000828254611c339190612e8a565b90915550506001600160a01b03821660009081526020819052604081208054839290611c60908490612e8a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000818152600183016020526040812054611cf1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e8565b5060006108e8565b60008181526001830160205260408120548015611de2576000611d1d600183612f11565b8554909150600090611d3190600190612f11565b9050818114611d96576000866000018281548110611d5157611d51612db4565b9060005260206000200154905080876000018481548110611d7457611d74612db4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611da757611da7612fe6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e8565b60009150506108e8565b600080805b84811015611ee9576000611e1d88888885818110611e1157611e11612db4565b90506020020135611bab565b905087600201548114611ed8576000611e368287612f11565b895490915015611e6c5760038901548954611e519083612e6b565b611e5b9190612f28565b611e659085612e8a565b9350611ed6565b88600301548960050160008b60040160008c8c89818110611e8f57611e8f612db4565b9050602002013581526020019081526020016000205481526020019081526020016000205482611ebf9190612e6b565b611ec99190612f28565b611ed39085612e8a565b93505b505b50611ee281612de0565b9050611df1565b5095945050505050565b600080805b6009548110156124cd576000611f3460098381548110611f1a57611f1a612db4565b6000918252602090912001546001600160a01b0316611a84565b90506000808767ffffffffffffffff811115611f5257611f52612ffc565b604051908082528060200260200182016040528015611f7b578160200160208202803683370190505b50905060008867ffffffffffffffff811115611f9957611f99612ffc565b604051908082528060200260200182016040528015611fc2578160200160208202803683370190505b5084549091506001600160a01b038d81169116148015611fea57508354600160a01b900460ff165b156124b85760005b898110156121ee57600061202f868d8d8581811061201257612012612db4565b905060200201356000908152600391909101602052604090205490565b905061203d866001016114ab565b158061208757506120878d60040160008e8e8681811061205f5761205f612db4565b905060200201358152602001908152602001600020548760010161148790919063ffffffff16565b80156120ac57508c600201546120a98e8e8e86818110611e1157611e11612db4565b14155b80156120b757508015155b156121dd5760006120c8828c612f11565b8e54909150156121105760038e01548e546120e39083612e6b565b6120ed9190612f28565b8587815181106120ff576120ff612db4565b602002602001018181525050612198565b60008e60040160008f8f8781811061212a5761212a612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f60030154818461216d9190612e6b565b6121779190612f28565b87898151811061218957612189612db4565b60200260200101818152505050505b8c8c848181106121aa576121aa612db4565b905060200201358487815181106121c3576121c3612db4565b6020908102919091010152856121d881612de0565b965050505b506121e781612de0565b9050611ff2565b506121fb846001016114ab565b15612354576000815167ffffffffffffffff81111561221c5761221c612ffc565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060005b82518110156122b0578c600401600084838151811061226c5761226c612db4565b602002602001015181526020019081526020016000205482828151811061229557612295612db4565b60209081029190910101526122a981612de0565b905061224b565b50600986815481106122c4576122c4612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906123019086908590879060040161304d565b602060405180830381865afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190612f4a565b61234c9088612e8a565b965050612430565b6000805b82518110156123985783818151811061237357612373612db4565b6020026020010151826123869190612e8a565b915061239181612de0565b9050612358565b50600986815481106123ac576123ac612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190612f4a565b61242c9088612e8a565b9650505b60005b81518110156124b657600085600301600084848151811061245657612456612db4565b6020026020010151815260200190815260200160002054146124a6578885600301600084848151811061248b5761248b612db4565b60200260200101518152602001908152602001600020819055505b6124af81612de0565b9050612433565b505b50505050806124c690612de0565b9050611ef8565b509695505050505050565b600080805b6009548110156124cd5760006124ff60098381548110611f1a57611f1a612db4565b90506000808767ffffffffffffffff81111561251d5761251d612ffc565b604051908082528060200260200182016040528015612546578160200160208202803683370190505b50905060008867ffffffffffffffff81111561256457612564612ffc565b60405190808252806020026020018201604052801561258d578160200160208202803683370190505b5084549091506001600160a01b038d811691161480156125b557508354600160a01b900460ff165b156129b65760005b898110156127745760006125dd868d8d8581811061201257612012612db4565b90506125eb866001016114ab565b158061260d575061260d8d60040160008e8e8681811061205f5761205f612db4565b801561263257508c6002015461262f8e8e8e86818110611e1157611e11612db4565b14155b801561263d57508015155b1561276357600061264e828c612f11565b8e54909150156126965760038e01548e546126699083612e6b565b6126739190612f28565b85878151811061268557612685612db4565b60200260200101818152505061271e565b60008e60040160008f8f878181106126b0576126b0612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f6003015481846126f39190612e6b565b6126fd9190612f28565b87898151811061270f5761270f612db4565b60200260200101818152505050505b8c8c8481811061273057612730612db4565b9050602002013584878151811061274957612749612db4565b60209081029190910101528561275e81612de0565b965050505b5061276d81612de0565b90506125bd565b50612781846001016114ab565b156128da576000815167ffffffffffffffff8111156127a2576127a2612ffc565b6040519080825280602002602001820160405280156127cb578160200160208202803683370190505b50905060005b8251811015612836578c60040160008483815181106127f2576127f2612db4565b602002602001015181526020019081526020016000205482828151811061281b5761281b612db4565b602090810291909101015261282f81612de0565b90506127d1565b506009868154811061284a5761284a612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906128879086908590879060040161304d565b602060405180830381865afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190612f4a565b6128d29088612e8a565b9650506129b6565b6000805b825181101561291e578381815181106128f9576128f9612db4565b60200260200101518261290c9190612e8a565b915061291781612de0565b90506128de565b506009868154811061293257612932612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190612f4a565b6129b29088612e8a565b9650505b50505050806129c490612de0565b90506124dd565b60008260000182815481106129e2576129e2612db4565b9060005260206000200154905092915050565b508054600082559060005260206000209081019061136091905b80821115612a235760008155600101612a0f565b5090565b6001600160a01b038116811461136057600080fd5b600080600060608486031215612a5157600080fd5b8335612a5c81612a27565b92506020840135612a6c81612a27565b929592945050506040919091013590565b60008083601f840112612a8f57600080fd5b50813567ffffffffffffffff811115612aa757600080fd5b6020830191508360208260051b8501011115612ac257600080fd5b9250929050565b600080600060408486031215612ade57600080fd5b8335612ae981612a27565b9250602084013567ffffffffffffffff811115612b0557600080fd5b612b1186828701612a7d565b9497909650939450505050565b600060208083528351808285015260005b81811015612b4b57858101830151858201604001528201612b2f565b81811115612b5d576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612b8657600080fd5b8235612b9181612a27565b946020939093013593505050565b600060208284031215612bb157600080fd5b5035919050565b60008060408385031215612bcb57600080fd5b823591506020830135612bdd81612a27565b809150509250929050565b600080600080600060608688031215612c0057600080fd5b8535612c0b81612a27565b9450602086013567ffffffffffffffff80821115612c2857600080fd5b612c3489838a01612a7d565b90965094506040880135915080821115612c4d57600080fd5b50612c5a88828901612a7d565b969995985093965092949392505050565b60008060408385031215612c7e57600080fd5b8235612c8981612a27565b91506020830135612bdd81612a27565b600060208284031215612cab57600080fd5b813561148081612a27565b801515811461136057600080fd5b60008060408385031215612cd757600080fd5b8235612ce281612a27565b91506020830135612bdd81612cb6565b600080600060608486031215612d0757600080fd5b8335612d1281612a27565b92506020840135612d2281612cb6565b91506040840135612d3281612a27565b809150509250925092565b600080600080600060a08688031215612d5557600080fd5b853594506020860135935060408601359250606086013591506080860135612d7c81612a27565b809150509295509295909350565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612df457612df4612dca565b5060010190565b600181811c90821680612e0f57607f821691505b60208210811415612e3057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612e8557612e85612dca565b500290565b60008219821115612e9d57612e9d612dca565b500190565b6020808252602b908201527f50726f7669646564206172726179732073686f756c642068617665207468652060408201526a0e6c2daca40d8cadccee8d60ab1b606082015260800190565b600063ffffffff80831681811415612f0757612f07612dca565b6001019392505050565b600082821015612f2357612f23612dca565b500390565b600082612f4557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612f5c57600080fd5b5051919050565b600060208284031215612f7557600080fd5b815161148081612cb6565b60208082526029908201527f5468657265206973206e6f207969656c64657220776974682070726f7669646560408201526864206164647265737360b81b606082015260800190565b600060208284031215612fdb57600080fd5b815161148081612a27565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b8381101561304257815187529582019590820190600101613026565b509495945050505050565b6060815260006130606060830186613012565b82810360208401526130728186613012565b90508281036040840152610ce8818561301256fea264697066735822122041b7ccfca971685acbc29a15aaf0b79b6c92a1202db4b6eedf8a4833b737764564736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80636fb73d0811610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146104fe578063dd7b464914610537578063df272e671461054a578063f01a44de14610552578063f2fde38b1461055a578063f7d3aece1461056d57600080fd5b8063a9059cbb146104a9578063b146ba71146104bc578063b75ebb19146104cf578063ce71f6d1146104e2578063d3cc8dd3146104eb57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461045757806395d89b4114610468578063a457c2d714610470578063a51abfb014610483578063a8ed01241461049657600080fd5b80636fb73d08146103f85780636fc259551461040b57806370a082311461041e578063715018a6146104475780638456cb591461044f57600080fd5b8063327e1152116101df5780634c87e619116101a35780634c87e619146103915780634f3969e7146103a457806356760ecc146103b75780635c25bbe8146103ca5780635c975abb146103dd5780635cf14f0a146103ef57600080fd5b8063327e115214610351578063356b756314610364578063395093511461036d5780633f4ba83a1461038057806340b1bff21461038857600080fd5b806318160ddd1161022657806318160ddd146103015780632237db251461030957806323b872dd1461031c5780632c42d0bd1461032f578063313ce5671461034257600080fd5b8063028594641461026357806305231dea1461027857806306fdde031461029e578063095ea7b3146102b35780630ca00cc8146102d6575b600080fd5b610276610271366004612a3c565b610580565b005b61028b610286366004612ac9565b6106c3565b6040519081526020015b60405180910390f35b6102a6610845565b6040516102959190612b1e565b6102c66102c1366004612b73565b6108d7565b6040519015158152602001610295565b6102e96102e4366004612b9f565b6108ee565b6040516001600160a01b039091168152602001610295565b60025461028b565b610276610317366004612bb8565b610918565b6102c661032a366004612a3c565b610958565b61027661033d366004612b9f565b610a02565b60405160128152602001610295565b61027661035f366004612bb8565b610a31565b61028b600d5481565b6102c661037b366004612b73565b610a80565b610276610abc565b61028b600b5481565b61027661039f366004612be8565b610af0565b6102766103b2366004612c6b565b610bbf565b6102766103c5366004612ac9565b610c17565b61028b6103d8366004612ac9565b610c9f565b600554600160a01b900460ff166102c6565b61028b600e5481565b610276610406366004612be8565b610cf2565b610276610419366004612bb8565b610d95565b61028b61042c366004612c99565b6001600160a01b031660009081526020819052604090205490565b610276610dd5565b610276610e09565b6005546001600160a01b03166102e9565b6102a6610e3b565b6102c661047e366004612b73565b610e4a565b610276610491366004612cc4565b610ee3565b6102766104a4366004612ac9565b610f37565b6102c66104b7366004612b73565b610fe1565b6102766104ca366004612cf2565b610fee565b6102766104dd366004612d3d565b611095565b61028b600c5481565b6102766104f9366004612be8565b6110ee565b61028b61050c366004612c6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61028b610545366004612b73565b6111aa565b6102766111f6565b61027661125d565b610276610568366004612c99565b611363565b61027661057b366004612bb8565b6113fb565b6105893361143b565b506001600160a01b0383166105cb57336000908152600a602090815260408083206001600160a01b038616845290915290206105c59082611474565b50505050565b336000908152600a602090815260408083206001600160a01b038616845290915290206105f89082611474565b50336000908152600a602090815260408083206001600160a01b038716845290915290206106269082611487565b156106be57336000908152600a602090815260408083206001600160a01b03871684529091529020610658908261149f565b50336000908152600a602090815260408083206001600160a01b03871684529091529020610685906114ab565b6106be57336000908152600a602090815260408083206001600160a01b038716845290915281209081816106b982826129f5565b505050505b505050565b600554600090600160a01b900460ff16156106f95760405162461bcd60e51b81526004016106f090612d8a565b60405180910390fd5b6002600654141561074c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f0565b6002600655600061075c8561143b565b905060005b838110156107a357600085858381811061077d5761077d612db4565b90506020020135905061079087826114b5565b508061079b81612de0565b915050610761565b504260006107b48388888886611613565b90506107bf81611650565b60005b858110156108355760008787838181106107de576107de612db4565b905060200201359050846002015484111561080e5760028501546000828152600687016020526040902055610822565b600081815260068601602052604090208490555b508061082d81612de0565b9150506107c2565b5060016006559695505050505050565b60606003805461085490612dfb565b80601f016020809104026020016040519081016040528092919081815260200182805461088090612dfb565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e43384846116f4565b5060015b92915050565b600981815481106108fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146109425760405162461bcd60e51b81526004016106f090612e36565b600061094d8261143b565b600301929092555050565b6000610965848484611818565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109ea5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106f0565b6109f785338584036116f4565b506001949350505050565b6005546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016106f090612e36565b600b55565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016106f090612e36565b6000610a668261143b565b9050610a7a83670de0b6b3a7640000612e6b565b90555050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108e4918590610ab7908690612e8a565b6116f4565b6005546001600160a01b03163314610ae65760405162461bcd60e51b81526004016106f090612e36565b610aee6119e7565b565b6005546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016106f090612e36565b808314610b395760405162461bcd60e51b81526004016106f090612ea2565b6000610b448661143b565b905060005b848110156106b957838382818110610b6357610b63612db4565b90506020020135670de0b6b3a7640000610b7d9190612e6b565b826005016000888885818110610b9557610b95612db4565b9050602002013581526020019081526020016000208190555080610bb890612de0565b9050610b49565b6005546001600160a01b03163314610be95760405162461bcd60e51b81526004016106f090612e36565b6000610bf483611a84565b80546001600160a01b0319166001600160a01b0393909316929092179091555050565b6005546001600160a01b03163314610c415760405162461bcd60e51b81526004016106f090612e36565b6000610c4c84611a84565b905060005b82811015610c9857610c87848483818110610c6e57610c6e612db4565b905060200201358360010161147490919063ffffffff16565b50610c9181612de0565b9050610c51565b5050505050565b600554600090600160a01b900460ff1615610ccc5760405162461bcd60e51b81526004016106f090612d8a565b6000610cd78561143b565b90506000610ce88287878742611ac0565b9695505050505050565b6000610cfd33611a84565b80549091506001600160a01b0387811691161415610d8d5760005b63ffffffff81168511156106b95783838263ffffffff16818110610d3e57610d3e612db4565b9050602002013582600301600088888563ffffffff16818110610d6357610d63612db4565b9050602002013581526020019081526020016000208190555080610d8690612eed565b9050610d18565b505050505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b81526004016106f090612e36565b6000610dca8261143b565b600101929092555050565b6005546001600160a01b03163314610dff5760405162461bcd60e51b81526004016106f090612e36565b610aee6000611ae8565b6005546001600160a01b03163314610e335760405162461bcd60e51b81526004016106f090612e36565b610aee611b3a565b60606004805461085490612dfb565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ecc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106f0565b610ed933858584036116f4565b5060019392505050565b6005546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016106f090612e36565b6000610f1883611a84565b8054921515600160a01b0260ff60a01b19909316929092179091555050565b6005546001600160a01b03163314610f615760405162461bcd60e51b81526004016106f090612e36565b6000610f6c84611a84565b905060005b610f7d826001016114ab565b811015610faf57610f9e610f946001840183611b9f565b600184019061149f565b50610fa881612de0565b9050610f71565b5060005b82811015610c9857610fd0848483818110610c6e57610c6e612db4565b50610fda81612de0565b9050610fb3565b60006108e4338484611818565b6005546001600160a01b031633146110185760405162461bcd60e51b81526004016106f090612e36565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039283166001600160a01b0319909116811790915560009081526008602052604090208054921515600160a01b026001600160a81b03199093169390911692909217179055565b6005546001600160a01b031633146110bf5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0316600090815260076020526040902093845560018401929092556002830155600390910155565b6005546001600160a01b031633146111185760405162461bcd60e51b81526004016106f090612e36565b8281146111375760405162461bcd60e51b81526004016106f090612ea2565b60006111428661143b565b905060005b848110156106b95783838281811061116157611161612db4565b9050602002013582600401600088888581811061118057611180612db4565b90506020020135815260200190815260200160002081905550806111a390612de0565b9050611147565b600554600090600160a01b900460ff16156111d75760405162461bcd60e51b81526004016106f090612d8a565b60006111e28461143b565b90506111ee8184611bab565b949350505050565b6005546001600160a01b031633146112205760405162461bcd60e51b81526004016106f090612e36565b600042905061125633600d54600e548461123a9190612f11565b600c546112479190612e6b565b6112519190612f28565b611bcb565b5042600e55565b6005546001600160a01b031633146112875760405162461bcd60e51b81526004016106f090612e36565b6040516370a0823160e01b815230600482018190529063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f19190612f4a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612f63565b50565b6005546001600160a01b0316331461138d5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f0565b61136081611ae8565b6005546001600160a01b031633146114255760405162461bcd60e51b81526004016106f090612e36565b60006114308261143b565b600201929092555050565b6001600160a01b038116600090815260076020526040812060018101546108e85760405162461bcd60e51b81526004016106f090612f80565b60006114808383611caa565b9392505050565b60008181526001830160205260408120541515611480565b60006114808383611cf9565b60006108e8825490565b6001600160a01b0382166000908152600a6020908152604080832033845290915290206114e29082611487565b611596576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612fc9565b90506001600160a01b038116331415611594576001600160a01b0383166000908152600a6020908152604080832033845290915290206115929083611474565b505b505b6001600160a01b0382166000908152600a6020908152604080832033845290915290206115c39082611487565b61160f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e00000000000060448201526064016106f0565b5050565b60008061162287868686611dec565b61162c9082612e8a565b905061163b8688878787611ef3565b6116459082612e8a565b979650505050505050565b600081600b546116609190612f11565b1061168c5761166f3382611bcb565b80600b60008282546116819190612f11565b909155506113609050565b60405163a9059cbb60e01b815233600482015260248101829052309063a9059cbb906044016020604051808303816000875af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f9190612f63565b6001600160a01b0383166117565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106f0565b6001600160a01b0382166117b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106f0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661187c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106f0565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106f0565b6001600160a01b038316600090815260208190526040902054818110156119565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106f0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061198d908490612e8a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d991815260200190565b60405180910390a350505050565b600554600160a01b900460ff16611a375760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f0565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038082166000908152600860205260408120805491929091166108e85760405162461bcd60e51b81526004016106f090612f80565b600080611acf87868686611dec565b611ad99082612e8a565b905061163b86888787876124d8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611b645760405162461bcd60e51b81526004016106f090612d8a565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a673390565b600061148083836129cb565b600081815260068301602052604081205480611480575050506001015490565b6001600160a01b038216611c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f0565b8060026000828254611c339190612e8a565b90915550506001600160a01b03821660009081526020819052604081208054839290611c60908490612e8a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000818152600183016020526040812054611cf1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e8565b5060006108e8565b60008181526001830160205260408120548015611de2576000611d1d600183612f11565b8554909150600090611d3190600190612f11565b9050818114611d96576000866000018281548110611d5157611d51612db4565b9060005260206000200154905080876000018481548110611d7457611d74612db4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611da757611da7612fe6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e8565b60009150506108e8565b600080805b84811015611ee9576000611e1d88888885818110611e1157611e11612db4565b90506020020135611bab565b905087600201548114611ed8576000611e368287612f11565b895490915015611e6c5760038901548954611e519083612e6b565b611e5b9190612f28565b611e659085612e8a565b9350611ed6565b88600301548960050160008b60040160008c8c89818110611e8f57611e8f612db4565b9050602002013581526020019081526020016000205481526020019081526020016000205482611ebf9190612e6b565b611ec99190612f28565b611ed39085612e8a565b93505b505b50611ee281612de0565b9050611df1565b5095945050505050565b600080805b6009548110156124cd576000611f3460098381548110611f1a57611f1a612db4565b6000918252602090912001546001600160a01b0316611a84565b90506000808767ffffffffffffffff811115611f5257611f52612ffc565b604051908082528060200260200182016040528015611f7b578160200160208202803683370190505b50905060008867ffffffffffffffff811115611f9957611f99612ffc565b604051908082528060200260200182016040528015611fc2578160200160208202803683370190505b5084549091506001600160a01b038d81169116148015611fea57508354600160a01b900460ff165b156124b85760005b898110156121ee57600061202f868d8d8581811061201257612012612db4565b905060200201356000908152600391909101602052604090205490565b905061203d866001016114ab565b158061208757506120878d60040160008e8e8681811061205f5761205f612db4565b905060200201358152602001908152602001600020548760010161148790919063ffffffff16565b80156120ac57508c600201546120a98e8e8e86818110611e1157611e11612db4565b14155b80156120b757508015155b156121dd5760006120c8828c612f11565b8e54909150156121105760038e01548e546120e39083612e6b565b6120ed9190612f28565b8587815181106120ff576120ff612db4565b602002602001018181525050612198565b60008e60040160008f8f8781811061212a5761212a612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f60030154818461216d9190612e6b565b6121779190612f28565b87898151811061218957612189612db4565b60200260200101818152505050505b8c8c848181106121aa576121aa612db4565b905060200201358487815181106121c3576121c3612db4565b6020908102919091010152856121d881612de0565b965050505b506121e781612de0565b9050611ff2565b506121fb846001016114ab565b15612354576000815167ffffffffffffffff81111561221c5761221c612ffc565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060005b82518110156122b0578c600401600084838151811061226c5761226c612db4565b602002602001015181526020019081526020016000205482828151811061229557612295612db4565b60209081029190910101526122a981612de0565b905061224b565b50600986815481106122c4576122c4612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906123019086908590879060040161304d565b602060405180830381865afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190612f4a565b61234c9088612e8a565b965050612430565b6000805b82518110156123985783818151811061237357612373612db4565b6020026020010151826123869190612e8a565b915061239181612de0565b9050612358565b50600986815481106123ac576123ac612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190612f4a565b61242c9088612e8a565b9650505b60005b81518110156124b657600085600301600084848151811061245657612456612db4565b6020026020010151815260200190815260200160002054146124a6578885600301600084848151811061248b5761248b612db4565b60200260200101518152602001908152602001600020819055505b6124af81612de0565b9050612433565b505b50505050806124c690612de0565b9050611ef8565b509695505050505050565b600080805b6009548110156124cd5760006124ff60098381548110611f1a57611f1a612db4565b90506000808767ffffffffffffffff81111561251d5761251d612ffc565b604051908082528060200260200182016040528015612546578160200160208202803683370190505b50905060008867ffffffffffffffff81111561256457612564612ffc565b60405190808252806020026020018201604052801561258d578160200160208202803683370190505b5084549091506001600160a01b038d811691161480156125b557508354600160a01b900460ff165b156129b65760005b898110156127745760006125dd868d8d8581811061201257612012612db4565b90506125eb866001016114ab565b158061260d575061260d8d60040160008e8e8681811061205f5761205f612db4565b801561263257508c6002015461262f8e8e8e86818110611e1157611e11612db4565b14155b801561263d57508015155b1561276357600061264e828c612f11565b8e54909150156126965760038e01548e546126699083612e6b565b6126739190612f28565b85878151811061268557612685612db4565b60200260200101818152505061271e565b60008e60040160008f8f878181106126b0576126b0612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f6003015481846126f39190612e6b565b6126fd9190612f28565b87898151811061270f5761270f612db4565b60200260200101818152505050505b8c8c8481811061273057612730612db4565b9050602002013584878151811061274957612749612db4565b60209081029190910101528561275e81612de0565b965050505b5061276d81612de0565b90506125bd565b50612781846001016114ab565b156128da576000815167ffffffffffffffff8111156127a2576127a2612ffc565b6040519080825280602002602001820160405280156127cb578160200160208202803683370190505b50905060005b8251811015612836578c60040160008483815181106127f2576127f2612db4565b602002602001015181526020019081526020016000205482828151811061281b5761281b612db4565b602090810291909101015261282f81612de0565b90506127d1565b506009868154811061284a5761284a612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906128879086908590879060040161304d565b602060405180830381865afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190612f4a565b6128d29088612e8a565b9650506129b6565b6000805b825181101561291e578381815181106128f9576128f9612db4565b60200260200101518261290c9190612e8a565b915061291781612de0565b90506128de565b506009868154811061293257612932612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190612f4a565b6129b29088612e8a565b9650505b50505050806129c490612de0565b90506124dd565b60008260000182815481106129e2576129e2612db4565b9060005260206000200154905092915050565b508054600082559060005260206000209081019061136091905b80821115612a235760008155600101612a0f565b5090565b6001600160a01b038116811461136057600080fd5b600080600060608486031215612a5157600080fd5b8335612a5c81612a27565b92506020840135612a6c81612a27565b929592945050506040919091013590565b60008083601f840112612a8f57600080fd5b50813567ffffffffffffffff811115612aa757600080fd5b6020830191508360208260051b8501011115612ac257600080fd5b9250929050565b600080600060408486031215612ade57600080fd5b8335612ae981612a27565b9250602084013567ffffffffffffffff811115612b0557600080fd5b612b1186828701612a7d565b9497909650939450505050565b600060208083528351808285015260005b81811015612b4b57858101830151858201604001528201612b2f565b81811115612b5d576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612b8657600080fd5b8235612b9181612a27565b946020939093013593505050565b600060208284031215612bb157600080fd5b5035919050565b60008060408385031215612bcb57600080fd5b823591506020830135612bdd81612a27565b809150509250929050565b600080600080600060608688031215612c0057600080fd5b8535612c0b81612a27565b9450602086013567ffffffffffffffff80821115612c2857600080fd5b612c3489838a01612a7d565b90965094506040880135915080821115612c4d57600080fd5b50612c5a88828901612a7d565b969995985093965092949392505050565b60008060408385031215612c7e57600080fd5b8235612c8981612a27565b91506020830135612bdd81612a27565b600060208284031215612cab57600080fd5b813561148081612a27565b801515811461136057600080fd5b60008060408385031215612cd757600080fd5b8235612ce281612a27565b91506020830135612bdd81612cb6565b600080600060608486031215612d0757600080fd5b8335612d1281612a27565b92506020840135612d2281612cb6565b91506040840135612d3281612a27565b809150509250925092565b600080600080600060a08688031215612d5557600080fd5b853594506020860135935060408601359250606086013591506080860135612d7c81612a27565b809150509295509295909350565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612df457612df4612dca565b5060010190565b600181811c90821680612e0f57607f821691505b60208210811415612e3057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612e8557612e85612dca565b500290565b60008219821115612e9d57612e9d612dca565b500190565b6020808252602b908201527f50726f7669646564206172726179732073686f756c642068617665207468652060408201526a0e6c2daca40d8cadccee8d60ab1b606082015260800190565b600063ffffffff80831681811415612f0757612f07612dca565b6001019392505050565b600082821015612f2357612f23612dca565b500390565b600082612f4557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612f5c57600080fd5b5051919050565b600060208284031215612f7557600080fd5b815161148081612cb6565b60208082526029908201527f5468657265206973206e6f207969656c64657220776974682070726f7669646560408201526864206164647265737360b81b606082015260800190565b600060208284031215612fdb57600080fd5b815161148081612a27565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b8381101561304257815187529582019590820190600101613026565b509495945050505050565b6060815260006130606060830186613012565b82810360208401526130728186613012565b90508281036040840152610ce8818561301256fea264697066735822122041b7ccfca971685acbc29a15aaf0b79b6c92a1202db4b6eedf8a4833b737764564736f6c634300080a0033
Deployed Bytecode Sourcemap
37111:21521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55892:631;;;;;;:::i;:::-;;:::i;:::-;;43789:1071;;;;;;:::i;:::-;;:::i;:::-;;;1706:25:1;;;1694:2;1679:18;43789:1071:0;;;;;;;;14381:100;;;:::i;:::-;;;;;;;:::i;16548:169::-;;;;;;:::i;:::-;;:::i;:::-;;;2829:14:1;;2822:22;2804:41;;2792:2;2777:18;16548:169:0;2664:187:1;38082:34:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3205:32:1;;;3187:51;;3175:2;3160:18;38082:34:0;3041:203:1;15501:108:0;15589:12;;15501:108;;41420:226;;;;;;:::i;:::-;;:::i;17199:480::-;;;;;;:::i;:::-;;:::i;58497:132::-;;;;;;:::i;:::-;;:::i;15343:93::-;;;15426:2;3711:36:1;;3699:2;3684:18;15343:93:0;3569:184:1;41141:271:0;;;;;;:::i;:::-;;:::i;38464:58::-;;;;;;18088:215;;;;;;:::i;:::-;;:::i;58422:67::-;;;:::i;38304:57::-;;;;;;40088:577;;;;;;:::i;:::-;;:::i;42972:242::-;;;;;;:::i;:::-;;:::i;42381:351::-;;;;;;:::i;:::-;;:::i;44868:404::-;;;;;;:::i;:::-;;:::i;7841:86::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;7841:86;;38531:41;;;;;;56531:498;;;;;;:::i;:::-;;:::i;40903:230::-;;;;;;:::i;:::-;;:::i;15672:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15773:18:0;15746:7;15773:18;;;;;;;;;;;;15672:127;6202:94;;;:::i;58351:63::-;;;:::i;5551:87::-;5624:6;;-1:-1:-1;;;;;5624:6:0;5551:87;;14600:104;;;:::i;18806:401::-;;;;;;:::i;:::-;;:::i;42740:224::-;;;;;;:::i;:::-;;:::i;43222:541::-;;;;;;:::i;:::-;;:::i;16012:175::-;;;;;;:::i;:::-;;:::i;41673:378::-;;;;;;:::i;:::-;;:::i;38704:505::-;;;;;;:::i;:::-;;:::i;38394:63::-;;;;;;39538:542;;;;;;:::i;:::-;;:::i;16250:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;16366:18:0;;;16339:7;16366:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16250:151;55337:276;;;;;;:::i;:::-;;:::i;57861:302::-;;;:::i;58171:172::-;;;:::i;6451:192::-;;;;;;:::i;:::-;;:::i;40673:222::-;;;;;;:::i;:::-;;:::i;55892:631::-;55981:30;56000:10;55981:18;:30::i;:::-;-1:-1:-1;;;;;;56028:19:0;;56024:492;;56080:10;56064:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56064:32:0;;;;;;;;;:46;;56101:8;56064:36;:46::i;:::-;;55892:631;;;:::o;56024:492::-;56159:10;56143:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56143:32:0;;;;;;;;;:46;;56180:8;56143:36;:46::i;:::-;-1:-1:-1;56224:10:0;56208:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56208:34:0;;;;;;;;;:53;;56252:8;56208:43;:53::i;:::-;56204:301;;;56298:10;56282:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56282:34:0;;;;;;;;;:51;;56324:8;56282:41;:51::i;:::-;-1:-1:-1;56372:10:0;56356:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56356:34:0;;;;;;;;;:43;;:41;:43::i;:::-;56352:138;;56452:10;56436:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56436:34:0;;;;;;;;;;;:27;56429:41;56436:34;:27;56429:41;:::i;:::-;;;;;56352:138;55892:631;;;:::o;43789:1071::-;7912:7;;43939;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;;;;;;;;;3669:1:::1;4265:7;;:19;;4257:63;;;::::0;-1:-1:-1;;;4257:63:0;;7427:2:1;4257:63:0::1;::::0;::::1;7409:21:1::0;7466:2;7446:18;;;7439:30;7505:33;7485:18;;;7478:61;7556:18;;4257:63:0::1;7225:355:1::0;4257:63:0::1;3669:1;4398:7;:18:::0;43959:39:::2;44001:36;44020:16:::0;44001:18:::2;:36::i;:::-;43959:78;;44054:9;44050:168;44069:20:::0;;::::2;44050:168;;;44111:16;44130:9;;44140:1;44130:12;;;;;;;:::i;:::-;;;;;;;44111:31;;44157:49;44179:16;44197:8;44157:21;:49::i;:::-;-1:-1:-1::0;44091:3:0;::::2;::::0;::::2;:::i;:::-;;;;44050:168;;;-1:-1:-1::0;44250:15:0::2;44228:19;44310:91;44343:15:::0;44360:16;44378:9;;44250:15;44310:32:::2;:91::i;:::-;44278:123;;44414:34;44426:21;44414:11;:34::i;:::-;44465:9;44461:351;44480:20:::0;;::::2;44461:351;;;44522:16;44541:9;;44551:1;44541:12;;;;;;;:::i;:::-;;;;;;;44522:31;;44586:15;:24;;;44572:11;:38;44568:233;;;44670:24;::::0;::::2;::::0;44631:36:::2;::::0;;;:26:::2;::::0;::::2;:36;::::0;;;;:63;44568:233:::2;;;44735:36;::::0;;;:26:::2;::::0;::::2;:36;::::0;;;;:50;;;44568:233:::2;-1:-1:-1::0;44502:3:0;::::2;::::0;::::2;:::i;:::-;;;;44461:351;;;-1:-1:-1::0;3625:1:0::1;4577:7;:22:::0;44831:21;43789:1071;-1:-1:-1;;;;;;43789:1071:0:o;14381:100::-;14435:13;14468:5;14461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14381:100;:::o;16548:169::-;16631:4;16648:39;1857:10;16671:7;16680:6;16648:8;:39::i;:::-;-1:-1:-1;16705:4:0;16548:169;;;;;:::o;38082:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38082:34:0;;-1:-1:-1;38082:34:0;:::o;41420:226::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41519:39:::1;41561:29;41580:9;41561:18;:29::i;:::-;41601:25;;:37:::0;;;;-1:-1:-1;;41420:226:0:o;17199:480::-;17339:4;17356:36;17366:6;17374:9;17385:6;17356:9;:36::i;:::-;-1:-1:-1;;;;;17432:19:0;;17405:24;17432:19;;;:11;:19;;;;;;;;1857:10;17432:33;;;;;;;;17484:26;;;;17476:79;;;;-1:-1:-1;;;17476:79:0;;8937:2:1;17476:79:0;;;8919:21:1;8976:2;8956:18;;;8949:30;9015:34;8995:18;;;8988:62;-1:-1:-1;;;9066:18:1;;;9059:38;9114:19;;17476:79:0;8735:404:1;17476:79:0;17583:57;17592:6;1857:10;17633:6;17614:16;:25;17583:8;:57::i;:::-;-1:-1:-1;17667:4:0;;17199:480;-1:-1:-1;;;;17199:480:0:o;58497:132::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58586:25:::1;:35:::0;58497:132::o;41141:271::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41256:39:::1;41298:29;41317:9;41298:18;:29::i;:::-;41256:71:::0;-1:-1:-1;41374:30:0::1;:17:::0;41395:8:::1;41374:30;:::i;:::-;41338:66:::0;;-1:-1:-1;;41141:271:0:o;18088:215::-;1857:10;18176:4;18225:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18225:34:0;;;;;;;;;;18176:4;;18193:80;;18216:7;;18225:47;;18262:10;;18225:47;:::i;:::-;18193:8;:80::i;58422:67::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58471:10:::1;:8;:10::i;:::-;58422:67::o:0;40088:577::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;40283:40;;::::1;40275:96;;;;-1:-1:-1::0;;;40275:96:0::1;;;;;;;:::i;:::-;40384:39;40426:35;40445:15;40426:18;:35::i;:::-;40384:77;;40478:9;40474:184;40493:25:::0;;::::1;40474:184;;;40605:8;;40614:1;40605:11;;;;;;;:::i;:::-;;;;;;;40620:8;40605:24;;;;:::i;:::-;40540:15;:43;;:62;40584:14;;40599:1;40584:17;;;;;;;:::i;:::-;;;;;;;40540:62;;;;;;;;;;;:89;;;;40520:3;;;;:::i;:::-;;;40474:184;;42972:242:::0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;43077:39:::1;43119:35;43138:15;43119:18;:35::i;:::-;43165:41:::0;;-1:-1:-1;;;;;;43165:41:0::1;-1:-1:-1::0;;;;;43165:41:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;42972:242:0:o;42381:351::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;42499:39:::1;42541:35;42560:15;42541:18;:35::i;:::-;42499:77;;42592:9;42587:138;42607:28:::0;;::::1;42587:138;;;42657:56;42692:17;;42710:1;42692:20;;;;;;;:::i;:::-;;;;;;;42657:15;:30;;:34;;:56;;;;:::i;:::-;-1:-1:-1::0;42637:3:0::1;::::0;::::1;:::i;:::-;;;42587:138;;;;42488:244;42381:351:::0;;;:::o;44868:404::-;7912:7;;44990;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;45010:39:::1;45052:36;45071:16;45052:18;:36::i;:::-;45010:78;;45101:29;45133:90;45161:15;45178:16;45196:9;;45207:15;45133:27;:90::i;:::-;45101:122:::0;44868:404;-1:-1:-1;;;;;;44868:404:0:o;56531:498::-;56717:39;56759:30;56778:10;56759:18;:30::i;:::-;56806:27;;;;-1:-1:-1;;;;;;56806:42:0;;;:27;;:42;56802:220;;;56870:8;56865:146;56884:20;;;;-1:-1:-1;56865:146:0;;;56981:11;;56993:1;56981:14;;;;;;;;;:::i;:::-;;;;;;;56930:15;:34;;:48;56965:9;;56975:1;56965:12;;;;;;;;;:::i;:::-;;;;;;;56930:48;;;;;;;;;;;:65;;;;56906:3;;;;:::i;:::-;;;56865:146;;56802:220;56645:384;56531:498;;;;;:::o;40903:230::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41004:39:::1;41046:29;41065:9;41046:18;:29::i;:::-;41086:26;;:39:::0;;;;-1:-1:-1;;40903:230:0:o;6202:94::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;6267:21:::1;6285:1;6267:9;:21::i;58351:63::-:0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58398:8:::1;:6;:8::i;14600:104::-:0;14656:13;14689:7;14682:14;;;;;:::i;18806:401::-;1857:10;18899:4;18943:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18943:34:0;;;;;;;;;;18996:35;;;;18988:85;;;;-1:-1:-1;;;18988:85:0;;10270:2:1;18988:85:0;;;10252:21:1;10309:2;10289:18;;;10282:30;10348:34;10328:18;;;10321:62;-1:-1:-1;;;10399:18:1;;;10392:35;10444:19;;18988:85:0;10068:401:1;18988:85:0;19101:67;1857:10;19124:7;19152:15;19133:16;:34;19101:8;:67::i;:::-;-1:-1:-1;19195:4:0;;18806:401;-1:-1:-1;;;18806:401:0:o;42740:224::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;42835:39:::1;42877:35;42896:15;42877:18;:35::i;:::-;42923:33:::0;;;::::1;;-1:-1:-1::0;;;42923:33:0::1;-1:-1:-1::0;;;;42923:33:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;42740:224:0:o;43222:541::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;43344:39:::1;43386:35;43405:15;43386:18;:35::i;:::-;43344:77;;43439:9;43434:172;43458:39;:15;:30;;:37;:39::i;:::-;43454:1;:43;43434:172;;;43519:75;43557:36;:30;::::0;::::1;43591:1:::0;43557:33:::1;:36::i;:::-;43519:30;::::0;::::1;::::0;:37:::1;:75::i;:::-;-1:-1:-1::0;43499:3:0::1;::::0;::::1;:::i;:::-;;;43434:172;;;;43623:9;43618:138;43638:28:::0;;::::1;43618:138;;;43688:56;43723:17;;43741:1;43723:20;;;;;;;:::i;43688:56::-;-1:-1:-1::0;43668:3:0::1;::::0;::::1;:::i;:::-;;;43618:138;;16012:175:::0;16098:4;16115:42;1857:10;16139:9;16150:6;16115:9;:42::i;41673:378::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41830:17:::1;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;41830:39:0;;::::1;-1:-1:-1::0;;;;;;41830:39:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;41922:25:0;;;:8:::1;41830:39;41922:25:::0;;;;41958:41;;42010:33;::::1;;-1:-1:-1::0;;;42010:33:0::1;-1:-1:-1::0;;;;;;42010:33:0;;;41958:41;;;::::1;42010:33:::0;;;;::::1;::::0;;41673:378::o;38704:505::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38966:25:0::1;38923:39;38966:25:::0;;;:8:::1;:25;::::0;;;;39004:53;;;39068:26:::1;::::0;::::1;:39:::0;;;;39118:24:::1;::::0;::::1;:35:::0;39164:25:::1;::::0;;::::1;:37:::0;38704:505::o;39538:542::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;39732:41;;::::1;39724:97;;;;-1:-1:-1::0;;;39724:97:0::1;;;;;;;:::i;:::-;39834:39;39876:35;39895:15;39876:18;:35::i;:::-;39834:77;;39928:9;39924:149;39943:20:::0;;::::1;39924:149;;;40044:14;;40059:1;40044:17;;;;;;;:::i;:::-;;;;;;;39985:15;:42;;:56;40028:9;;40038:1;40028:12;;;;;;;:::i;:::-;;;;;;;39985:56;;;;;;;;;;;:76;;;;39965:3;;;;:::i;:::-;;;39924:149;;55337:276:::0;7912:7;;55439;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;55459:39:::1;55501:35;55520:15;55501:18;:35::i;:::-;55459:77;;55556:49;55579:15;55596:8;55556:22;:49::i;:::-;55549:56:::0;55337:276;-1:-1:-1;;;;55337:276:0:o;57861:302::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;57920:19:::1;57942:15;57920:37;;57968:130;57974:10;58065:32;;58035:26;;58021:11;:40;;;;:::i;:::-;57986:31;;:76;;;;:::i;:::-;:111;;;;:::i;:::-;57968:5;:130::i;:::-;-1:-1:-1::0;58140:15:0::1;58111:26;:44:::0;57861:302::o;58171:172::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58288:46:::1;::::0;-1:-1:-1;;;58288:46:0;;58260:4:::1;58288:46;::::0;::::1;3187:51:1::0;;;58260:4:0;58245:30:::1;::::0;58276:10:::1;::::0;58260:4;;58288:31:::1;::::0;3160:18:1;;58288:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58245:90;::::0;-1:-1:-1;;;;;;58245:90:0::1;::::0;;;;;;-1:-1:-1;;;;;11207:32:1;;;58245:90:0::1;::::0;::::1;11189:51:1::0;11256:18;;;11249:34;11162:18;;58245:90:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58171:172::o:0;6451:192::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6540:22:0;::::1;6532:73;;;::::0;-1:-1:-1;;;6532:73:0;;11746:2:1;6532:73:0::1;::::0;::::1;11728:21:1::0;11785:2;11765:18;;;11758:30;11824:34;11804:18;;;11797:62;-1:-1:-1;;;11875:18:1;;;11868:36;11921:19;;6532:73:0::1;11544:402:1::0;6532:73:0::1;6616:19;6626:8;6616:9;:19::i;40673:222::-:0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;40770:39:::1;40812:29;40831:9;40812:18;:29::i;:::-;40852:24;;:35:::0;;;;-1:-1:-1;;40673:222:0:o;39217:313::-;-1:-1:-1;;;;;39364:18:0;;39286:23;39364:18;;;:8;:18;;;;;39401:26;;;;39393:94;;;;-1:-1:-1;;;39393:94:0;;;;;;;:::i;34544:131::-;34611:4;34635:32;34640:3;34660:5;34635:4;:32::i;:::-;34628:39;34544:131;-1:-1:-1;;;34544:131:0:o;35074:146::-;35151:4;28134:19;;;:12;;;:19;;;;;;:24;;35175:37;28037:129;34851:137;34921:4;34945:35;34953:3;34973:5;34945:7;:35::i;35306:114::-;35366:7;35393:19;35401:3;28335:18;;28252:109;57344:509;-1:-1:-1;;;;;57444:33:0;;;;;;:15;:33;;;;;;;;57478:10;57444:45;;;;;;;:64;;57499:8;57444:54;:64::i;:::-;57439:291;;57541:44;;-1:-1:-1;;;57541:44:0;;;;;1706:25:1;;;57525:13:0;;-1:-1:-1;;;;;57541:34:0;;;;;1679:18:1;;57541:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57525:60;-1:-1:-1;;;;;;57604:19:0;;57613:10;57604:19;57600:119;;;-1:-1:-1;;;;;57644:33:0;;;;;;:15;:33;;;;;;;;57678:10;57644:45;;;;;;;:59;;57694:8;57644:49;:59::i;:::-;;57600:119;57510:220;57439:291;-1:-1:-1;;;;;57748:33:0;;;;;;:15;:33;;;;;;;;57782:10;57748:45;;;;;;;:64;;57803:8;57748:54;:64::i;:::-;57740:103;;;;-1:-1:-1;;;57740:103:0;;12819:2:1;57740:103:0;;;12801:21:1;12858:2;12838:18;;;12831:30;12897:28;12877:18;;;12870:56;12943:18;;57740:103:0;12617:350:1;57740:103:0;57344:509;;:::o;45280:532::-;45502:7;;45573:72;45603:16;45621:9;;45632:12;45573:29;:72::i;:::-;45558:87;;;;:::i;:::-;;;45671:102;45714:15;45731:16;45749:9;;45760:12;45671:42;:102::i;:::-;45656:117;;;;:::i;:::-;;45280:532;-1:-1:-1;;;;;;;45280:532:0:o;57037:299::-;57138:1;57127:7;57099:25;;:35;;;;:::i;:::-;:40;57095:234;;57156:26;57162:10;57174:7;57156:5;:26::i;:::-;57226:7;57197:25;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;57095:234:0;;-1:-1:-1;57095:234:0;;57266:51;;-1:-1:-1;;;57266:51:0;;57297:10;57266:51;;;11189::1;11256:18;;;11249:34;;;57281:4:0;;57266:30;;11162:18:1;;57266:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22454:380::-;-1:-1:-1;;;;;22590:19:0;;22582:68;;;;-1:-1:-1;;;22582:68:0;;13174:2:1;22582:68:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:1;;;13296:34;13347:19;;22582:68:0;12972:400:1;22582:68:0;-1:-1:-1;;;;;22669:21:0;;22661:68;;;;-1:-1:-1;;;22661:68:0;;13579:2:1;22661:68:0;;;13561:21:1;13618:2;13598:18;;;13591:30;13657:34;13637:18;;;13630:62;-1:-1:-1;;;13708:18:1;;;13701:32;13750:19;;22661:68:0;13377:398:1;22661:68:0;-1:-1:-1;;;;;22742:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22794:32;;1706:25:1;;;22794:32:0;;1679:18:1;22794:32:0;;;;;;;22454:380;;;:::o;19697:721::-;-1:-1:-1;;;;;19837:20:0;;19829:70;;;;-1:-1:-1;;;19829:70:0;;13982:2:1;19829:70:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;-1:-1:-1;;;14111:18:1;;;14104:35;14156:19;;19829:70:0;13780:401:1;19829:70:0;-1:-1:-1;;;;;19918:23:0;;19910:71;;;;-1:-1:-1;;;19910:71:0;;14388:2:1;19910:71:0;;;14370:21:1;14427:2;14407:18;;;14400:30;14466:34;14446:18;;;14439:62;-1:-1:-1;;;14517:18:1;;;14510:33;14560:19;;19910:71:0;14186:399:1;19910:71:0;-1:-1:-1;;;;;20078:17:0;;20054:21;20078:17;;;;;;;;;;;20114:23;;;;20106:74;;;;-1:-1:-1;;;20106:74:0;;14792:2:1;20106:74:0;;;14774:21:1;14831:2;14811:18;;;14804:30;14870:34;14850:18;;;14843:62;-1:-1:-1;;;14921:18:1;;;14914:36;14967:19;;20106:74:0;14590:402:1;20106:74:0;-1:-1:-1;;;;;20208:17:0;;;:9;:17;;;;;;;;;;;20228:22;;;20208:42;;20268:20;;;;;;;;:30;;20244:6;;20208:9;20268:30;;20244:6;;20268:30;:::i;:::-;;;;;;;;20333:9;-1:-1:-1;;;;;20316:35:0;20325:6;-1:-1:-1;;;;;20316:35:0;;20344:6;20316:35;;;;1706:25:1;;1694:2;1679:18;;1560:177;20316:35:0;;;;;;;;19818:600;19697:721;;;:::o;8900:120::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;8436:41;;;;-1:-1:-1;;;8436:41:0;;15199:2:1;8436:41:0;;;15181:21:1;15238:2;15218:18;;;15211:30;-1:-1:-1;;;15257:18:1;;;15250:50;15317:18;;8436:41:0;14997:344:1;8436:41:0;8959:7:::1;:15:::0;;-1:-1:-1;;;;8959:15:0::1;::::0;;8990:22:::1;1857:10:::0;8999:12:::1;8990:22;::::0;-1:-1:-1;;;;;3205:32:1;;;3187:51;;3175:2;3160:18;8990:22:0::1;;;;;;;8900:120::o:0;42059:314::-;-1:-1:-1;;;;;42206:18:0;;;42128:23;42206:18;;;:8;:18;;;;;42243:27;;42128:23;;42206:18;;42243:27;42235:95;;;;-1:-1:-1;;;42235:95:0;;;;;;;:::i;45820:527::-;46042:7;;46113:72;46143:16;46161:9;;46172:12;46113:29;:72::i;:::-;46098:87;;;;:::i;:::-;;;46211:97;46249:15;46266:16;46284:9;;46295:12;46211:37;:97::i;6651:173::-;6726:6;;;-1:-1:-1;;;;;6743:17:0;;;-1:-1:-1;;;;;;6743:17:0;;;;;;;6776:40;;6726:6;;;6743:17;6726:6;;6776:40;;6707:16;;6776:40;6696:128;6651:173;:::o;8641:118::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;8701:7:::1;:14:::0;;-1:-1:-1;;;;8701:14:0::1;-1:-1:-1::0;;;8701:14:0::1;::::0;;8731:20:::1;8738:12;1857:10:::0;;1777:98;35774:137;35845:7;35880:22;35884:3;35896:5;35880:3;:22::i;54978:351::-;55093:7;55138:37;;;:27;;;:37;;;;;;55190:27;55186:103;;-1:-1:-1;;;55250:27:0;;;;54978:351::o;20705:399::-;-1:-1:-1;;;;;20789:21:0;;20781:65;;;;-1:-1:-1;;;20781:65:0;;15548:2:1;20781:65:0;;;15530:21:1;15587:2;15567:18;;;15560:30;15626:33;15606:18;;;15599:61;15677:18;;20781:65:0;15346:355:1;20781:65:0;20937:6;20921:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;20954:18:0;;:9;:18;;;;;;;;;;:28;;20976:6;;20954:9;:28;;20976:6;;20954:28;:::i;:::-;;;;-1:-1:-1;;20998:37:0;;1706:25:1;;;-1:-1:-1;;;;;20998:37:0;;;21015:1;;20998:37;;1694:2:1;1679:18;20998:37:0;;;;;;;57344:509;;:::o;25941:414::-;26004:4;28134:19;;;:12;;;:19;;;;;;26021:327;;-1:-1:-1;26064:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;26247:18;;26225:19;;;:12;;;:19;;;;;;:40;;;;26280:11;;26021:327;-1:-1:-1;26331:5:0;26324:12;;26531:1420;26597:4;26736:19;;;:12;;;:19;;;;;;26772:15;;26768:1176;;27147:21;27171:14;27184:1;27171:10;:14;:::i;:::-;27220:18;;27147:38;;-1:-1:-1;27200:17:0;;27220:22;;27241:1;;27220:22;:::i;:::-;27200:42;;27276:13;27263:9;:26;27259:405;;27310:17;27330:3;:11;;27342:9;27330:22;;;;;;;;:::i;:::-;;;;;;;;;27310:42;;27484:9;27455:3;:11;;27467:13;27455:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;27569:23;;;:12;;;:23;;;;;:36;;;27259:405;27745:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27840:3;:12;;:19;27853:5;27840:19;;;;;;;;;;;27833:26;;;27883:4;27876:11;;;;;;;26768:1176;27927:5;27920:12;;;;;46355:1076;46545:7;;;46612:770;46632:20;;;46612:770;;;46674:21;46698:54;46721:16;46739:9;;46749:1;46739:12;;;;;;;:::i;:::-;;;;;;;46698:22;:54::i;:::-;46674:78;;46790:16;:25;;;46773:13;:42;46769:602;;46836:22;46861:28;46876:13;46861:12;:28;:::i;:::-;46912:34;;46836:53;;-1:-1:-1;46912:48:0;46908:448;;47065:26;;;;47028:34;;47011:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;46985:106;;;;:::i;:::-;;;46908:448;;;47310:16;:26;;;47204:16;:44;;:103;47249:16;:43;;:57;47293:9;;47303:1;47293:12;;;;;;;:::i;:::-;;;;;;;47249:57;;;;;;;;;;;;47204:103;;;;;;;;;;;;47187:14;:120;;;;:::i;:::-;:149;;;;:::i;:::-;47140:196;;;;:::i;:::-;;;46908:448;46817:554;46769:602;-1:-1:-1;46654:3:0;;;:::i;:::-;;;46612:770;;;-1:-1:-1;47401:22:0;46355:1076;-1:-1:-1;;;;;46355:1076:0:o;47439:3922::-;47671:7;;;47743:3566;47789:17;:24;47774:39;;47743:3566;;;47846:39;47888:51;47907:17;47925:12;47907:31;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;47907:31:0;47888:18;:51::i;:::-;47846:93;-1:-1:-1;47954:27:0;;48062:9;48048:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48048:31:0;-1:-1:-1;48000:79:0;-1:-1:-1;48094:38:0;48149:9;48135:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48135:31:0;-1:-1:-1;48187:27:0;;48094:72;;-1:-1:-1;;;;;;48187:46:0;;;:27;;:46;:73;;;;-1:-1:-1;48237:23:0;;-1:-1:-1;;;48237:23:0;;;;48187:73;48183:3115;;;48286:9;48281:1639;48301:20;;;48281:1639;;;48351:24;48378:53;48401:15;48418:9;;48428:1;48418:12;;;;;;;:::i;:::-;;;;;;;55736:7;55780:45;;;:35;;;;;:45;;;;;;;55621:245;48378:53;48351:80;;48511:39;:15;:30;;:37;:39::i;:::-;:44;;:171;;;48584:98;48624:16;:43;;:57;48668:9;;48678:1;48668:12;;;;;;;:::i;:::-;;;;;;;48624:57;;;;;;;;;;;;48584:15;:30;;:39;;:98;;;;:::i;:::-;48484:312;;;;;48771:16;:25;;;48713:54;48736:16;48754:9;;48764:1;48754:12;;;;;;;:::i;48713:54::-;:83;;48484:312;:371;;;;-1:-1:-1;48825:30:0;;;48484:371;48454:1447;;;48906:22;48931:31;48946:16;48931:12;:31;:::i;:::-;48995:34;;48906:56;;-1:-1:-1;48995:48:0;48991:755;;49211:26;;;;49174:34;;49157:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;49076:28;49105:19;49076:49;;;;;;;;:::i;:::-;;;;;;:161;;;;;48991:755;;;49302:33;49338:16;:43;;:57;49382:9;;49392:1;49382:12;;;;;;;:::i;:::-;;;;;;;49338:57;;;;;;;;;;;;49302:93;;49426:34;49463:16;:44;;:71;49508:25;49463:71;;;;;;;;;;;;49426:108;;49692:16;:26;;;49663;49646:14;:43;;;;:::i;:::-;:72;;;;:::i;:::-;49565:28;49594:19;49565:49;;;;;;;;:::i;:::-;;;;;;:153;;;;;49271:475;;48991:755;49817:9;;49827:1;49817:12;;;;;;;:::i;:::-;;;;;;;49772:21;49794:19;49772:42;;;;;;;;:::i;:::-;;;;;;;;;;:57;49856:21;;;;:::i;:::-;;;;48879:1022;48454:1447;-1:-1:-1;48323:3:0;;;:::i;:::-;;;48281:1639;;;;49942:39;:15;:30;;:37;:39::i;:::-;:44;49938:1020;;50011:30;50058:21;:28;50044:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50044:43:0;;50011:76;;50117:9;50112:198;50136:21;:28;50132:1;:32;50112:198;;;50217:16;:43;;:69;50261:21;50283:1;50261:24;;;;;;;;:::i;:::-;;;;;;;50217:69;;;;;;;;;;;;50198:13;50212:1;50198:16;;;;;;;;:::i;:::-;;;;;;;;;;:88;50166:3;;;:::i;:::-;;;50112:198;;;;50393:17;50411:12;50393:31;;;;;;;;:::i;:::-;;;;;;;;;;;50384:124;;-1:-1:-1;;;50384:124:0;;-1:-1:-1;;;;;50393:31:0;;;;50384:56;;:124;;50441:28;;50471:13;;50486:21;;50384:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50334:174;;;;:::i;:::-;;;49988:540;49938:1020;;;50557:39;50628:9;50623:176;50647:21;:28;50643:1;:32;50623:176;;;50744:28;50773:1;50744:31;;;;;;;;:::i;:::-;;;;;;;50709:66;;;;;:::i;:::-;;-1:-1:-1;50677:3:0;;;:::i;:::-;;;50623:176;;;;50859:17;50877:12;50859:31;;;;;;;;:::i;:::-;;;;;;;;;;;50850:88;;-1:-1:-1;;;50850:88:0;;;;;1706:25:1;;;-1:-1:-1;;;;;50859:31:0;;;;50850:55;;1679:18:1;;50850:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50821:117;;;;:::i;:::-;;;50534:424;49938:1020;50981:9;50976:307;51000:21;:28;50996:1;:32;50976:307;;;51134:1;51062:15;:34;;:60;51097:21;51119:1;51097:24;;;;;;;;:::i;:::-;;;;;;;51062:60;;;;;;;;;;;;:74;51058:206;;51228:12;51165:15;:34;;:60;51200:21;51222:1;51200:24;;;;;;;;:::i;:::-;;;;;;;51165:60;;;;;;;;;;;:75;;;;51058:206;51030:3;;;:::i;:::-;;;50976:307;;;;48183:3115;47831:3478;;;;47815:14;;;;:::i;:::-;;;47743:3566;;;-1:-1:-1;51328:25:0;47439:3922;-1:-1:-1;;;;;;47439:3922:0:o;51369:3601::-;51601:7;;;51673:3245;51719:17;:24;51704:39;;51673:3245;;;51776:39;51818:51;51837:17;51855:12;51837:31;;;;;;;;:::i;51818:51::-;51776:93;-1:-1:-1;51884:27:0;;51992:9;51978:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51978:31:0;-1:-1:-1;51930:79:0;-1:-1:-1;52024:38:0;52079:9;52065:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52065:31:0;-1:-1:-1;52117:27:0;;52024:72;;-1:-1:-1;;;;;;52117:46:0;;;:27;;:46;:73;;;;-1:-1:-1;52167:23:0;;-1:-1:-1;;;52167:23:0;;;;52117:73;52113:2794;;;52216:9;52211:1641;52231:20;;;52211:1641;;;52281:24;52308:53;52331:15;52348:9;;52358:1;52348:12;;;;;;;:::i;52308:53::-;52281:80;;52441:39;:15;:30;;:37;:39::i;:::-;:44;;:171;;;52514:98;52554:16;:43;;:57;52598:9;;52608:1;52598:12;;;;;;;:::i;52514:98::-;52414:312;;;;;52701:16;:25;;;52643:54;52666:16;52684:9;;52694:1;52684:12;;;;;;;:::i;52643:54::-;:83;;52414:312;:371;;;;-1:-1:-1;52755:30:0;;;52414:371;52384:1449;;;52838:22;52863:31;52878:16;52863:12;:31;:::i;:::-;52927:34;;52838:56;;-1:-1:-1;52927:48:0;52923:755;;53143:26;;;;53106:34;;53089:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;53008:28;53037:19;53008:49;;;;;;;;:::i;:::-;;;;;;:161;;;;;52923:755;;;53234:33;53270:16;:43;;:57;53314:9;;53324:1;53314:12;;;;;;;:::i;:::-;;;;;;;53270:57;;;;;;;;;;;;53234:93;;53358:34;53395:16;:44;;:71;53440:25;53395:71;;;;;;;;;;;;53358:108;;53624:16;:26;;;53595;53578:14;:43;;;;:::i;:::-;:72;;;;:::i;:::-;53497:28;53526:19;53497:49;;;;;;;;:::i;:::-;;;;;;:153;;;;;53203:475;;52923:755;53749:9;;53759:1;53749:12;;;;;;;:::i;:::-;;;;;;;53704:21;53726:19;53704:42;;;;;;;;:::i;:::-;;;;;;;;;;:57;53788:21;;;;:::i;:::-;;;;52809:1024;52384:1449;-1:-1:-1;52253:3:0;;;:::i;:::-;;;52211:1641;;;;53874:39;:15;:30;;:37;:39::i;:::-;:44;53870:1022;;53943:30;53990:21;:28;53976:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53976:43:0;;53943:76;;54049:9;54044:198;54068:21;:28;54064:1;:32;54044:198;;;54149:16;:43;;:69;54193:21;54215:1;54193:24;;;;;;;;:::i;:::-;;;;;;;54149:69;;;;;;;;;;;;54130:13;54144:1;54130:16;;;;;;;;:::i;:::-;;;;;;;;;;:88;54098:3;;;:::i;:::-;;;54044:198;;;;54325:17;54343:12;54325:31;;;;;;;;:::i;:::-;;;;;;;;;;;54316:124;;-1:-1:-1;;;54316:124:0;;-1:-1:-1;;;;;54325:31:0;;;;54316:56;;:124;;54373:28;;54403:13;;54418:21;;54316:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54266:174;;;;:::i;:::-;;;53920:542;53870:1022;;;54491:39;54562:9;54557:176;54581:21;:28;54577:1;:32;54557:176;;;54678:28;54707:1;54678:31;;;;;;;;:::i;:::-;;;;;;;54643:66;;;;;:::i;:::-;;-1:-1:-1;54611:3:0;;;:::i;:::-;;;54557:176;;;;54793:17;54811:12;54793:31;;;;;;;;:::i;:::-;;;;;;;;;;;54784:88;;-1:-1:-1;;;54784:88:0;;;;;1706:25:1;;;-1:-1:-1;;;;;54793:31:0;;;;54784:55;;1679:18:1;;54784:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54755:117;;;;:::i;:::-;;;54468:424;53870:1022;51761:3157;;;;51745:14;;;;:::i;:::-;;;51673:3245;;28715:120;28782:7;28809:3;:11;;28821:5;28809:18;;;;;;;;:::i;:::-;;;;;;;;;28802:25;;28715:120;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:456;227:6;235;243;296:2;284:9;275:7;271:23;267:32;264:52;;;312:1;309;302:12;264:52;351:9;338:23;370:31;395:5;370:31;:::i;:::-;420:5;-1:-1:-1;477:2:1;462:18;;449:32;490:33;449:32;490:33;:::i;:::-;150:456;;542:7;;-1:-1:-1;;;596:2:1;581:18;;;;568:32;;150:456::o;611:367::-;674:8;684:6;738:3;731:4;723:6;719:17;715:27;705:55;;756:1;753;746:12;705:55;-1:-1:-1;779:20:1;;822:18;811:30;;808:50;;;854:1;851;844:12;808:50;891:4;883:6;879:17;867:29;;951:3;944:4;934:6;931:1;927:14;919:6;915:27;911:38;908:47;905:67;;;968:1;965;958:12;905:67;611:367;;;;;:::o;983:572::-;1078:6;1086;1094;1147:2;1135:9;1126:7;1122:23;1118:32;1115:52;;;1163:1;1160;1153:12;1115:52;1202:9;1189:23;1221:31;1246:5;1221:31;:::i;:::-;1271:5;-1:-1:-1;1327:2:1;1312:18;;1299:32;1354:18;1343:30;;1340:50;;;1386:1;1383;1376:12;1340:50;1425:70;1487:7;1478:6;1467:9;1463:22;1425:70;:::i;:::-;983:572;;1514:8;;-1:-1:-1;1399:96:1;;-1:-1:-1;;;;983:572:1:o;1742:597::-;1854:4;1883:2;1912;1901:9;1894:21;1944:6;1938:13;1987:6;1982:2;1971:9;1967:18;1960:34;2012:1;2022:140;2036:6;2033:1;2030:13;2022:140;;;2131:14;;;2127:23;;2121:30;2097:17;;;2116:2;2093:26;2086:66;2051:10;;2022:140;;;2180:6;2177:1;2174:13;2171:91;;;2250:1;2245:2;2236:6;2225:9;2221:22;2217:31;2210:42;2171:91;-1:-1:-1;2323:2:1;2302:15;-1:-1:-1;;2298:29:1;2283:45;;;;2330:2;2279:54;;1742:597;-1:-1:-1;;;1742:597:1:o;2344:315::-;2412:6;2420;2473:2;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2528:9;2515:23;2547:31;2572:5;2547:31;:::i;:::-;2597:5;2649:2;2634:18;;;;2621:32;;-1:-1:-1;;;2344:315:1:o;2856:180::-;2915:6;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;-1:-1:-1;3007:23:1;;2856:180;-1:-1:-1;2856:180:1:o;3249:315::-;3317:6;3325;3378:2;3366:9;3357:7;3353:23;3349:32;3346:52;;;3394:1;3391;3384:12;3346:52;3430:9;3417:23;3407:33;;3490:2;3479:9;3475:18;3462:32;3503:31;3528:5;3503:31;:::i;:::-;3553:5;3543:15;;;3249:315;;;;;:::o;3758:908::-;3889:6;3897;3905;3913;3921;3974:2;3962:9;3953:7;3949:23;3945:32;3942:52;;;3990:1;3987;3980:12;3942:52;4029:9;4016:23;4048:31;4073:5;4048:31;:::i;:::-;4098:5;-1:-1:-1;4154:2:1;4139:18;;4126:32;4177:18;4207:14;;;4204:34;;;4234:1;4231;4224:12;4204:34;4273:70;4335:7;4326:6;4315:9;4311:22;4273:70;:::i;:::-;4362:8;;-1:-1:-1;4247:96:1;-1:-1:-1;4450:2:1;4435:18;;4422:32;;-1:-1:-1;4466:16:1;;;4463:36;;;4495:1;4492;4485:12;4463:36;;4534:72;4598:7;4587:8;4576:9;4572:24;4534:72;:::i;:::-;3758:908;;;;-1:-1:-1;3758:908:1;;-1:-1:-1;4625:8:1;;4508:98;3758:908;-1:-1:-1;;;3758:908:1:o;4671:388::-;4739:6;4747;4800:2;4788:9;4779:7;4775:23;4771:32;4768:52;;;4816:1;4813;4806:12;4768:52;4855:9;4842:23;4874:31;4899:5;4874:31;:::i;:::-;4924:5;-1:-1:-1;4981:2:1;4966:18;;4953:32;4994:33;4953:32;4994:33;:::i;5064:247::-;5123:6;5176:2;5164:9;5155:7;5151:23;5147:32;5144:52;;;5192:1;5189;5182:12;5144:52;5231:9;5218:23;5250:31;5275:5;5250:31;:::i;5316:118::-;5402:5;5395:13;5388:21;5381:5;5378:32;5368:60;;5424:1;5421;5414:12;5439:382;5504:6;5512;5565:2;5553:9;5544:7;5540:23;5536:32;5533:52;;;5581:1;5578;5571:12;5533:52;5620:9;5607:23;5639:31;5664:5;5639:31;:::i;:::-;5689:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;5759:30;5718:32;5759:30;:::i;5826:523::-;5900:6;5908;5916;5969:2;5957:9;5948:7;5944:23;5940:32;5937:52;;;5985:1;5982;5975:12;5937:52;6024:9;6011:23;6043:31;6068:5;6043:31;:::i;:::-;6093:5;-1:-1:-1;6150:2:1;6135:18;;6122:32;6163:30;6122:32;6163:30;:::i;:::-;6212:7;-1:-1:-1;6271:2:1;6256:18;;6243:32;6284:33;6243:32;6284:33;:::i;:::-;6336:7;6326:17;;;5826:523;;;;;:::o;6354:521::-;6449:6;6457;6465;6473;6481;6534:3;6522:9;6513:7;6509:23;6505:33;6502:53;;;6551:1;6548;6541:12;6502:53;6587:9;6574:23;6564:33;;6644:2;6633:9;6629:18;6616:32;6606:42;;6695:2;6684:9;6680:18;6667:32;6657:42;;6746:2;6735:9;6731:18;6718:32;6708:42;;6800:3;6789:9;6785:19;6772:33;6814:31;6839:5;6814:31;:::i;:::-;6864:5;6854:15;;;6354:521;;;;;;;;:::o;6880:340::-;7082:2;7064:21;;;7121:2;7101:18;;;7094:30;-1:-1:-1;;;7155:2:1;7140:18;;7133:46;7211:2;7196:18;;6880:340::o;7585:127::-;7646:10;7641:3;7637:20;7634:1;7627:31;7677:4;7674:1;7667:15;7701:4;7698:1;7691:15;7717:127;7778:10;7773:3;7769:20;7766:1;7759:31;7809:4;7806:1;7799:15;7833:4;7830:1;7823:15;7849:135;7888:3;-1:-1:-1;;7909:17:1;;7906:43;;;7929:18;;:::i;:::-;-1:-1:-1;7976:1:1;7965:13;;7849:135::o;7989:380::-;8068:1;8064:12;;;;8111;;;8132:61;;8186:4;8178:6;8174:17;8164:27;;8132:61;8239:2;8231:6;8228:14;8208:18;8205:38;8202:161;;;8285:10;8280:3;8276:20;8273:1;8266:31;8320:4;8317:1;8310:15;8348:4;8345:1;8338:15;8202:161;;7989:380;;;:::o;8374:356::-;8576:2;8558:21;;;8595:18;;;8588:30;8654:34;8649:2;8634:18;;8627:62;8721:2;8706:18;;8374:356::o;9144:168::-;9184:7;9250:1;9246;9242:6;9238:14;9235:1;9232:21;9227:1;9220:9;9213:17;9209:45;9206:71;;;9257:18;;:::i;:::-;-1:-1:-1;9297:9:1;;9144:168::o;9317:128::-;9357:3;9388:1;9384:6;9381:1;9378:13;9375:39;;;9394:18;;:::i;:::-;-1:-1:-1;9430:9:1;;9317:128::o;9450:407::-;9652:2;9634:21;;;9691:2;9671:18;;;9664:30;9730:34;9725:2;9710:18;;9703:62;-1:-1:-1;;;9796:2:1;9781:18;;9774:41;9847:3;9832:19;;9450:407::o;9862:201::-;9900:3;9928:10;9973:2;9966:5;9962:14;10000:2;9991:7;9988:15;9985:41;;;10006:18;;:::i;:::-;10055:1;10042:15;;9862:201;-1:-1:-1;;;9862:201:1:o;10474:125::-;10514:4;10542:1;10539;10536:8;10533:34;;;10547:18;;:::i;:::-;-1:-1:-1;10584:9:1;;10474:125::o;10604:217::-;10644:1;10670;10660:132;;10714:10;10709:3;10705:20;10702:1;10695:31;10749:4;10746:1;10739:15;10777:4;10774:1;10767:15;10660:132;-1:-1:-1;10806:9:1;;10604:217::o;10826:184::-;10896:6;10949:2;10937:9;10928:7;10924:23;10920:32;10917:52;;;10965:1;10962;10955:12;10917:52;-1:-1:-1;10988:16:1;;10826:184;-1:-1:-1;10826:184:1:o;11294:245::-;11361:6;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;11462:9;11456:16;11481:28;11503:5;11481:28;:::i;11951:405::-;12153:2;12135:21;;;12192:2;12172:18;;;12165:30;12231:34;12226:2;12211:18;;12204:62;-1:-1:-1;;;12297:2:1;12282:18;;12275:39;12346:3;12331:19;;11951:405::o;12361:251::-;12431:6;12484:2;12472:9;12463:7;12459:23;12455:32;12452:52;;;12500:1;12497;12490:12;12452:52;12532:9;12526:16;12551:31;12576:5;12551:31;:::i;15706:127::-;15767:10;15762:3;15758:20;15755:1;15748:31;15798:4;15795:1;15788:15;15822:4;15819:1;15812:15;15838:127;15899:10;15894:3;15890:20;15887:1;15880:31;15930:4;15927:1;15920:15;15954:4;15951:1;15944:15;15970:435;16023:3;16061:5;16055:12;16088:6;16083:3;16076:19;16114:4;16143:2;16138:3;16134:12;16127:19;;16180:2;16173:5;16169:14;16201:1;16211:169;16225:6;16222:1;16219:13;16211:169;;;16286:13;;16274:26;;16320:12;;;;16355:15;;;;16247:1;16240:9;16211:169;;;-1:-1:-1;16396:3:1;;15970:435;-1:-1:-1;;;;;15970:435:1:o;16410:669::-;16745:2;16734:9;16727:21;16708:4;16771:56;16823:2;16812:9;16808:18;16800:6;16771:56;:::i;:::-;16875:9;16867:6;16863:22;16858:2;16847:9;16843:18;16836:50;16909:44;16946:6;16938;16909:44;:::i;:::-;16895:58;;17001:9;16993:6;16989:22;16984:2;16973:9;16969:18;16962:50;17029:44;17066:6;17058;17029:44;:::i
Swarm Source
ipfs://41b7ccfca971685acbc29a15aaf0b79b6c92a1202db4b6eedf8a4833b7377645
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.