Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Disassemble | 15259121 | 883 days ago | IN | 0 ETH | 0.03408891 | ||||
Disassemble | 15223604 | 888 days ago | IN | 0 ETH | 0.01508768 | ||||
Disassemble | 14317309 | 1034 days ago | IN | 0 ETH | 0.05107458 | ||||
Disassemble | 14317285 | 1034 days ago | IN | 0 ETH | 0.0563546 | ||||
Disassemble | 14172843 | 1056 days ago | IN | 0 ETH | 0.2794109 | ||||
Assemble | 14137161 | 1062 days ago | IN | 1.0588974 ETH | 0.11943729 | ||||
Assemble | 14137012 | 1062 days ago | IN | 1.05829321 ETH | 0.10978033 | ||||
Assemble | 13982825 | 1086 days ago | IN | 0.3018503 ETH | 0.17985751 | ||||
Disassemble | 13934298 | 1093 days ago | IN | 0 ETH | 0.00679853 | ||||
Disassemble | 13864890 | 1104 days ago | IN | 0 ETH | 0.1393012 | ||||
Disassemble | 13864874 | 1104 days ago | IN | 0 ETH | 0.02195845 | ||||
Disassemble | 13864859 | 1104 days ago | IN | 0 ETH | 0.02840689 | ||||
Disassemble | 13864854 | 1104 days ago | IN | 0 ETH | 0.0023582 | ||||
Disassemble | 13864849 | 1104 days ago | IN | 0 ETH | 0.00246352 | ||||
Assemble | 13567800 | 1151 days ago | IN | 1.00616504 ETH | 0.10574305 | ||||
Disassemble | 13478966 | 1165 days ago | IN | 0 ETH | 0.08135362 | ||||
Grant Role | 13396916 | 1177 days ago | IN | 0 ETH | 0.00390471 | ||||
Assemble | 13362427 | 1183 days ago | IN | 2.0124689 ETH | 0.12936625 | ||||
Disassemble | 13216842 | 1205 days ago | IN | 0 ETH | 0.08468687 | ||||
Assemble | 13216663 | 1205 days ago | IN | 4.02565057 ETH | 0.06980502 | ||||
Disassemble | 13172252 | 1212 days ago | IN | 0 ETH | 0.14103969 | ||||
Assemble | 13159641 | 1214 days ago | IN | 5.03255989 ETH | 0.16453053 | ||||
Assemble | 13159614 | 1214 days ago | IN | 2.01247333 ETH | 0.12366763 | ||||
Assemble | 13147117 | 1216 days ago | IN | 1.0061428 ETH | 0.00532657 | ||||
Assemble | 13115818 | 1221 days ago | IN | 0.41350251 ETH | 0.0670321 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15259121 | 883 days ago | 0.20749675 ETH | ||||
15259121 | 883 days ago | 0.00062436 ETH | ||||
15259121 | 883 days ago | 0.00904135 ETH | ||||
15259121 | 883 days ago | 0.04417832 ETH | ||||
15259121 | 883 days ago | 0.00887413 ETH | ||||
15259121 | 883 days ago | 0.01062706 ETH | ||||
15259121 | 883 days ago | 0.0541398 ETH | ||||
15259121 | 883 days ago | 0.03409965 ETH | ||||
15259121 | 883 days ago | 0.01952439 ETH | ||||
15259121 | 883 days ago | 0.02763637 ETH | ||||
15223604 | 888 days ago | 0.47263101 ETH | ||||
15223604 | 888 days ago | 0.00142215 ETH | ||||
15223604 | 888 days ago | 0.0202243 ETH | ||||
15223604 | 888 days ago | 0.09666272 ETH | ||||
15223604 | 888 days ago | 0.02164227 ETH | ||||
15223604 | 888 days ago | 0.02371943 ETH | ||||
15223604 | 888 days ago | 0.12182487 ETH | ||||
15223604 | 888 days ago | 0.0818123 ETH | ||||
15223604 | 888 days ago | 0.0443905 ETH | ||||
15223604 | 888 days ago | 0.06377675 ETH | ||||
14317309 | 1034 days ago | 0.18630502 ETH | ||||
14317309 | 1034 days ago | 0.00056059 ETH | ||||
14317309 | 1034 days ago | 0.00918653 ETH | ||||
14317309 | 1034 days ago | 0.02732984 ETH | ||||
14317309 | 1034 days ago | 0.01105931 ETH |
Loading...
Loading
Contract Name:
ClusterToken
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.6; /* * @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; } } /** * @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 guidelines: functions revert instead * of 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}. */ /** * @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); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @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); } 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 {} } /** * @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()); } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface IController { function getClusterAmountFromEth(uint256 _ethAmount, address _cluster) external view returns (uint256); function addClusterToRegister(address indexAddr) external; function getDHVPriceInETH(address _cluster) external view returns (uint256); function getUnderlyingsInfo(address _cluster, uint256 _ethAmount) external view returns ( uint256[] memory, uint256[] memory, uint256, uint256 ); function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount, address _clusterAddress) external view returns (uint256[] memory); function getEthAmountFromUnderlyingsAmounts(uint256[] memory _underlyingsAmounts, address _cluster) external view returns (uint256); function adapters(address _cluster) external view returns (address); function dhvTokenInstance() external view returns (address); function getDepositComission(address _cluster, uint256 _ethValue) external view returns (uint256); function getRedeemComission(address _cluster, uint256 _ethValue) external view returns (uint256); function getClusterPrice(address _cluster) external view returns (uint256); } interface IDexAdapter { function swapETHToUnderlying(address underlying, uint256 underlyingAmount) external payable; function swapUnderlyingsToETH(uint256[] memory underlyingAmounts, address[] memory underlyings) external; function swapTokenToToken( uint256 _amountToSwap, address _tokenToSwap, address _tokenToReceive ) external returns (uint256); function getUnderlyingAmount( uint256 _amount, address _tokenToSwap, address _tokenToReceive ) external view returns (uint256); function getPath(address _tokenToSwap, address _tokenToReceive) external view returns (address[] memory); function getTokensPrices(address[] memory _tokens) external view returns (uint256[] memory); function getEthPrice() external view returns (uint256); function getDHVPriceInETH(address _dhvToken) external view returns (uint256); function WETH() external view returns (address); function getEthAmountWithSlippage(uint256 _amount, address _tokenToSwap) external view returns (uint256); } interface IClusterToken { function assemble(uint256 clusterAmount, bool coverDhvWithEth) external payable returns (uint256); function disassemble(uint256 indexAmount, bool coverDhvWithEth) external; function withdrawToAccumulation(uint256 _clusterAmount) external; function refundFromAccumulation(uint256 _clusterAmount) external; function returnDebtFromAccumulation(uint256[] calldata _amounts, uint256 _clusterAmount) external; function optimizeProportion(uint256[] memory updatedShares) external returns (uint256[] memory debt); function getUnderlyingInCluster() external view returns (uint256[] calldata); function getUnderlyings() external view returns (address[] calldata); function getUnderlyingBalance(address _underlying) external view returns (uint256); function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount) external view returns (uint256[] calldata); function clusterTokenLock() external view returns (uint256); function clusterLock(address _token) external view returns (uint256); function controllerChange(address) external; function assembleByAdapter(uint256 _clusterAmount) external; function disassembleByAdapter(uint256 _clusterAmount) external; } interface IClusterTokenEvents { /// @notice Event emitted on each successful deposit for cluster in ETH. /// @param clusterAddress Address of cluster deposited upon. /// @param buyer Address of user depositing (user who bought token). /// @param ethDeposited Amount of ETH deposited in exchange of cluster. /// @param clusterAmountBought Amount of cluster bought for given amount of ETH. event ClusterAssembledInETH(address indexed clusterAddress, address indexed buyer, uint256 ethDeposited, uint256 clusterAmountBought); /// @notice Event emitted on each successful cluster redeeming for ETH. /// @param clusterAddress Address of cluster redeemed. /// @param redeemer Address of user performing the redeem. /// @param clusterAmountRedeemed Amount of cluster redeemed by user. event ClusterDisassembledInETH(address indexed clusterAddress, address indexed redeemer, uint256 clusterAmountRedeemed); /// @notice Event emitted on each successful deposit for cluster in ETH. /// @param clusterAddress Address of cluster deposited upon. /// @param buyer Address of user depositing (user who bought token). /// @param clusterAmountBought Amount of cluster bought for given amount of ETH. event ClusterAssembled(address indexed clusterAddress, address indexed buyer, uint256 clusterAmountBought); /// @notice Event emitted on each successful cluster redeeming for ETH. /// @param clusterAddress Address of cluster redeemed. /// @param redeemer Address of user performing the redeem. /// @param clusterAmountRedeemed Amount of cluster redeemed by user. event ClusterDisassembled(address indexed clusterAddress, address indexed redeemer, uint256 clusterAmountRedeemed); /// @notice Event emitted when tokens are withdrawn to accumulation. /// @param clusterAddress Address of cluster, withdrawn from. /// @param farmer Address of authorized farmer. /// @param clusterAmount Amount of cluster tokens to lock for farming. /// @param underlyingsAmounts Amount of underlying tokens, sent to farm. /// @param tokens Addresses of underlying tokens, sent to farm. event ClusterWithdrawnToAcc( address indexed clusterAddress, address indexed farmer, uint256 clusterAmount, uint256[] underlyingsAmounts, address[] tokens ); /// @notice Event emitted when tokens are refunded from accumulation. /// @param clusterAddress Address of cluster, refunded for. /// @param farmer Address of authorized farmer. /// @param clusterAmount Amount of cluster tokens to unlock from farming. /// @param underlyingsAmounts Amount of underlying tokens, unlocked from farm. /// @param tokens Addresses of underlying tokens, unlocked from farm. event ClusterRefundedFromAcc( address indexed clusterAddress, address indexed farmer, uint256 clusterAmount, uint256[] underlyingsAmounts, address[] tokens ); /// @notice Event emitted on optimizing underlyings proportions. /// @param clusterAddress Address of cluster, proportions are optimized for. /// @param delegate Address of authorized delegate. /// @param updatedShares New shares. event ProportionsOptimized(address indexed clusterAddress, address indexed delegate, uint256[] updatedShares); } /// @title Cluster Token Contract /// @author Blaize.tech team /// @notice Cluster Token is a ERC-20 token representing a DeHive cluster of DeFi assets contract ClusterToken is ERC20, Pausable, AccessControl, IClusterToken, IClusterTokenEvents { using SafeERC20 for IERC20; using Address for address; bytes32 public constant FARMER_ROLE = keccak256("FARMER_ROLE"); bytes32 public constant DELEGATE_ROLE = keccak256("DELEGATE_ROLE"); bytes32 public constant ADAPTER_ROLE = keccak256("ADAPTER_ROLE"); /// @notice Coefficient decimal for underlyings proportion uint256 public constant ACCURACY_DECIMALS = 10**6; /// @notice cluster Tokens decimals uint256 public constant CLUSTER_TOKEN_DECIMALS = 10**18; uint256 public constant MAX_COOLDOWN = 2 days; /// @notice amount of ETH dust allowed to be sent to the user uint256 public constant DUST_AMOUNT = 10**12; /// @notice Address of Controller smart contract. address public clusterControllerAddress; /// @notice Address of treasury with token reserves and comissions storage. address internal treasuryAddress; /// @notice Instance of the DHV token IERC20 public dhvTokenInstance; /// @notice Hash id, serves as an additional identifier of the cluster. uint256 public clusterHashId; /// @notice lock period, during which user can't redeem or transfer cluster after assemble uint256 public cooldownPeriod; /// @notice List of tokens within the cluster, called underlyings. /// @dev Order of addresses is important, as it corresponds with the order in underlyingInCluster. address[] public underlyings; /// @notice List of shares, multiplied by 10 ** 6 /// @dev Order of addresses is important, as it corresponds with the order of tokens in underlyings. uint256[] public underlyingInCluster; /// @notice Amount of cluster token activated (sent to farming) uint256 public override clusterTokenLock; /// @notice Amounts of underlyings activated (sent to farming) mapping(address => uint256) public override clusterLock; /// @notice timestamp, before which user can't redeem or transfer cluster. /// @dev userAddress => uint. mapping(address => uint256) public cooldownTimestamps; /// @notice amount of cluster which user can't redeem or transfer due to cooldown. /// @dev userAddress => cluster amount. mapping(address => uint256) public cooldownAmount; /// @notice Checks that lock period on redeeming or transfering cluster is over. modifier checkCooldownPeriod(address _from, uint256 _amount) { if (cooldownTimestamps[_from] > block.timestamp) { uint256 allowedAmount = IERC20(address(this)).balanceOf(_from) - cooldownAmount[_from]; require(allowedAmount >= _amount, "Cooldown in progress"); } _; } modifier checkBuyer() { require(!_msgSender().isContract(), "Not allowed for contracts"); _; } /// @notice Performs initial setup. /// @param _clusterControllerAddress Address of the Controller SC. /// @param _underlyings List of tokens to be recorded in underlyings. /// @param _underlyingInCluster List of shares to be recorded in underlyingInCluster. /// @param _name Name of the ERC-20 token. /// @param _symbol Symbol of the ERC-20 token. /// @param _hashId cluster hash identifier. constructor( address _clusterControllerAddress, address _treasury, address[] memory _underlyings, uint256[] memory _underlyingInCluster, string memory _name, string memory _symbol, uint256 _hashId ) ERC20(_name, _symbol) { require(_clusterControllerAddress != address(0), "dev: Controller zero address"); require(_treasury != address(0), "dev: Treasury zero address"); require(_underlyings.length == _underlyingInCluster.length, "dev: Arrays' lengths must be equal"); for (uint256 i = 0; i < _underlyings.length; i++) { require(_underlyings[i] != address(0), "dev: Underlying zero address"); require(_underlyingInCluster[i] > 0, "dev: Share equals zero"); } _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); underlyings = _underlyings; underlyingInCluster = _underlyingInCluster; clusterHashId = _hashId; clusterControllerAddress = _clusterControllerAddress; treasuryAddress = _treasury; dhvTokenInstance = IERC20(IController(_clusterControllerAddress).dhvTokenInstance()); } receive() external payable {} /********** * ADMIN INTERFACE **********/ /// @notice Function that allows contract owner to update cooldown period on cluster redeeming and transfering. /// @param _cooldownPeriod New lock period. function setCooldownPeriod(uint256 _cooldownPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_cooldownPeriod <= MAX_COOLDOWN, "Incorrect cooldown"); cooldownPeriod = _cooldownPeriod; } /// @notice Function that allows contract owner to update treasury address; /// @param _newTreasury Address of new treasury. function setTreasuryAddress(address _newTreasury) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_newTreasury != address(0), "Incorrect address"); treasuryAddress = _newTreasury; } /// @notice withdraws all ETH stucked or kept as dust function withdrawDust() external onlyRole(DEFAULT_ADMIN_ROLE) { Address.sendValue(payable(_msgSender()), address(this).balance); } /// @notice Function pauses assemble, dissamble, transfers. function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } /// @notice Function unpauses assemble, dissamble, transfers. function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } /// @notice Controller ownership transfer. function controllerChange(address _controller) external override { require(_msgSender() == clusterControllerAddress, "Controller only"); require(_controller != address(0), "dev: Controller zero address"); clusterControllerAddress = _controller; } /********** * USER'S INTERFACE **********/ /// @notice Function that allows depositing ETH and purchase respective amount of cluster. /// @dev Can only be called when token is not paused. /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call, /// rather then transferred from the caller's address. /// @return Amount of cluster purchased. function assemble(uint256 clusterAmount, bool coverDhvWithEth) external payable override whenNotPaused checkBuyer returns (uint256) { uint256 balanceBefore = address(this).balance; _swapEthToUnderlyings(msg.value, clusterAmount); uint256 balanceAfter = address(this).balance; uint256 ethSpent = balanceBefore - balanceAfter; uint256 _ethCommission = IController(clusterControllerAddress).getDepositComission(address(this), ethSpent); uint256 ethAmount = msg.value - ethSpent - _coverCommission(_ethCommission, coverDhvWithEth); if (ethAmount > DUST_AMOUNT) { Address.sendValue(payable(_msgSender()), ethAmount); } if (cooldownPeriod > 0) { if (cooldownTimestamps[_msgSender()] > block.timestamp) { cooldownAmount[_msgSender()] += clusterAmount; } else { cooldownAmount[_msgSender()] = clusterAmount; } cooldownTimestamps[_msgSender()] = block.timestamp + cooldownPeriod; } _mint(_msgSender(), clusterAmount); emit ClusterAssembledInETH(address(this), _msgSender(), ethSpent, clusterAmount); return clusterAmount; } /// @notice Function that allows disassembling cluster and receiving respective amount of ETH. /// @dev Can only be called when token is not paused. /// @param _clusterAmount Amount of cluster to be redeemed, e.g. exchanged to ETH equivalent. /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call, /// rather then transferred from the caller's address. function disassemble(uint256 _clusterAmount, bool coverDhvWithEth) external override whenNotPaused checkCooldownPeriod(_msgSender(), _clusterAmount) checkBuyer { require(_clusterAmount > 0 && _clusterAmount <= balanceOf(_msgSender()), "Not enough cluster"); _burn(_msgSender(), _clusterAmount); uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount); uint256 balanceBefore = address(this).balance; _swapUnderlyingsToEth(underlyingAmounts); uint256 balanceAfter = address(this).balance; uint256 ethEstimated = balanceAfter - balanceBefore; uint256 _ethCommission = IController(clusterControllerAddress).getRedeemComission(address(this), ethEstimated); uint256 ethAmount = ethEstimated - _coverCommission(_ethCommission, coverDhvWithEth); Address.sendValue(payable(_msgSender()), ethAmount); emit ClusterDisassembledInETH(address(this), _msgSender(), _clusterAmount); } /// @dev Standard ERC20 function override in order to check lock period. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override checkCooldownPeriod(from, amount) {} /********** * FARMER AND DELEGATE INTERFACE **********/ /// @notice Mints tokens for the contract with minter role. /// @notice requires approved amounts of underlyings /// @param _clusterAmount Cluster token amount to be minted. function assembleByAdapter(uint256 _clusterAmount) external override onlyRole(ADAPTER_ROLE) { uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount); for (uint256 i = 0; i < underlyingAmounts.length; i++) { IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), underlyingAmounts[i]); } _mint(_msgSender(), _clusterAmount); emit ClusterAssembled(address(this), _msgSender(), _clusterAmount); } /// @notice Burns cluster tokens after the trade. /// @notice requires underlyings to be present /// @param _clusterAmount Cluster token amount to be minted. function disassembleByAdapter(uint256 _clusterAmount) external override onlyRole(ADAPTER_ROLE) { uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount); _burn(_msgSender(), _clusterAmount); for (uint256 i = 0; i < underlyingAmounts.length; i++) { IERC20(underlyings[i]).safeTransfer(_msgSender(), underlyingAmounts[i]); } emit ClusterDisassembled(address(this), _msgSender(), _clusterAmount); } /// @notice Withdraw tokens of cluster for staking. /// @param _clusterAmount Amounts of the cluster locked for farming. function withdrawToAccumulation(uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) { uint256[] memory _amounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount); clusterTokenLock += _clusterAmount; for (uint256 i = 0; i < underlyings.length; i++) { clusterLock[underlyings[i]] += _amounts[i]; IERC20(underlyings[i]).safeTransfer(_msgSender(), _amounts[i]); } emit ClusterWithdrawnToAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings); } /// @notice Refund tokens of cluster from staking. /// @param _clusterAmount Amount of cluster unlocked from farming. function refundFromAccumulation(uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) { uint256[] memory _amounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount); clusterTokenLock -= _clusterAmount; for (uint256 i = 0; i < underlyings.length; i++) { clusterLock[underlyings[i]] -= _amounts[i]; IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), _amounts[i]); } emit ClusterRefundedFromAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings); } /// @notice Extra method to return debt. /// @param _amounts Amount of underlyings to return. /// @param _clusterAmount Amount of cluster unlocked from farming. function returnDebtFromAccumulation(uint256[] memory _amounts, uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) { clusterTokenLock -= _clusterAmount; for (uint256 i = 0; i < underlyings.length; i++) { clusterLock[underlyings[i]] -= _amounts[i]; IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), _amounts[i]); } emit ClusterRefundedFromAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings); } /// @notice Interface for optimizer for the correction of the underlyings proportion. /// @param updatedShares New weights. function optimizeProportion(uint256[] memory updatedShares) external override onlyRole(DELEGATE_ROLE) returns (uint256[] memory debt) { require(updatedShares.length == underlyingInCluster.length, "Wrong array"); debt = new uint256[](underlyings.length); uint256 clusterTokenLockMemo = clusterTokenLock; uint256[] memory curSharesAmounts = IController(clusterControllerAddress).getUnderlyingsAmountsFromClusterAmount( totalSupply() - clusterTokenLockMemo, address(this) ); underlyingInCluster = updatedShares; uint256[] memory newSharesAmounts = getUnderlyingsAmountsFromClusterAmount(totalSupply() - clusterTokenLockMemo); uint256[] memory newLock = getUnderlyingsAmountsFromClusterAmount(clusterTokenLockMemo); for (uint256 i = 0; i < underlyings.length; i++) { address tkn = underlyings[i]; if (newLock[i] > clusterLock[tkn]) { debt[i] = newLock[i] - clusterLock[tkn]; } else { debt[i] = 0; } clusterLock[tkn] = newLock[i]; if (curSharesAmounts[i] > newSharesAmounts[i]) { IERC20(tkn).safeTransfer(_msgSender(), curSharesAmounts[i] - newSharesAmounts[i]); } else if (curSharesAmounts[i] < newSharesAmounts[i]) { IERC20(tkn).safeTransferFrom(_msgSender(), address(this), newSharesAmounts[i] - curSharesAmounts[i]); } } emit ProportionsOptimized(address(this), _msgSender(), updatedShares); } /********** * VIEW INTERFACE **********/ /// @notice Get list of underlyings addresses for the cluster. /// @return underlyings array. function getUnderlyings() external view override returns (address[] memory) { return underlyings; } /// @notice Get list of amount of each underlying for 1 cluster. /// @return underlyingInCluster array. function getUnderlyingInCluster() external view override returns (uint256[] memory) { return underlyingInCluster; } /// @notice Calculates amounts of underlyings over the amount of cluster based on shares amounts. /// @param _clusterAmount Amount of cluster to calculate underlyings from. /// @return Array, which contains amounts of underlyings. function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount) public view override returns (uint256[] memory) { uint256[] memory underlyingAmounts = new uint256[](underlyings.length); for (uint256 i = 0; i < underlyings.length; i++) { underlyingAmounts[i] = (_clusterAmount * underlyingInCluster[i]) / ACCURACY_DECIMALS; uint8 decimals = IERC20Metadata(underlyings[i]).decimals(); if (decimals < 18) { underlyingAmounts[i] /= 10**(18 - decimals); } } return underlyingAmounts; } /// @notice Calculates amount of underlying including locked assets. /// @param _underlyingAddress Underlying address. /// @return The amount of a certain underlying function getUnderlyingBalance(address _underlyingAddress) external view override returns (uint256) { return IERC20(_underlyingAddress).balanceOf(address(this)) + clusterLock[_underlyingAddress]; } /********** * INTERNAL HELPERS AND PRICE CALCULATIONS **********/ /// @notice Covers commission, necessary for cluster deposit or redeem. /// @param _ethCommission Commission in ETH to be covered. /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call, /// rather then transferred from the caller's address. /// @return Amount of Ether, spent on commission. function _coverCommission(uint256 _ethCommission, bool coverDhvWithEth) internal returns (uint256) { if (_ethCommission != 0) { if (coverDhvWithEth) { Address.sendValue(payable(treasuryAddress), _ethCommission); return _ethCommission; } else { uint256 _dhvCommission = (_ethCommission * 10**18) / IController(clusterControllerAddress).getDHVPriceInETH(address(this)); dhvTokenInstance.safeTransferFrom(_msgSender(), treasuryAddress, _dhvCommission); return 0; } } return 0; } /// @notice Allows to swap collected funds into underlyings through the appropriate adapter. function _swapEthToUnderlyings(uint256 _ethAmount, uint256 _clusterAmount) internal { address adapter = IController(clusterControllerAddress).adapters(address(this)); (uint256[] memory underlyingAmounts, uint256[] memory ethPortion, , uint256 ethCalculated) = IController(clusterControllerAddress) .getUnderlyingsInfo(address(this), _clusterAmount); require(_ethAmount >= ethCalculated, "Not enough ether sent"); for (uint256 i = 0; i < underlyings.length; i++) { if ( IERC20(underlyings[i]).balanceOf(treasuryAddress) >= underlyingAmounts[i] && IERC20(underlyings[i]).allowance(treasuryAddress, address(this)) >= underlyingAmounts[i] ) { IERC20(underlyings[i]).safeTransferFrom(treasuryAddress, address(this), underlyingAmounts[i]); Address.sendValue(payable(treasuryAddress), ethPortion[i]); } else { IDexAdapter(adapter).swapETHToUnderlying{value: ethPortion[i]}(underlyings[i], underlyingAmounts[i]); } } } /// @notice Swaps underlyings tokens into ETH. /// @param _underlyingAmounts Array of underlying tokens amounts. function _swapUnderlyingsToEth(uint256[] memory _underlyingAmounts) internal { address adapter = IController(clusterControllerAddress).adapters(address(this)); for (uint256 i = 0; i < _underlyingAmounts.length; i++) { IERC20(underlyings[i]).safeApprove(adapter, 0); IERC20(underlyings[i]).safeApprove(adapter, _underlyingAmounts[i]); } IDexAdapter(adapter).swapUnderlyingsToETH(_underlyingAmounts, underlyings); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_clusterControllerAddress","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address[]","name":"_underlyings","type":"address[]"},{"internalType":"uint256[]","name":"_underlyingInCluster","type":"uint256[]"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_hashId","type":"uint256"}],"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":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountBought","type":"uint256"}],"name":"ClusterAssembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"clusterAmountBought","type":"uint256"}],"name":"ClusterAssembledInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountRedeemed","type":"uint256"}],"name":"ClusterDisassembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountRedeemed","type":"uint256"}],"name":"ClusterDisassembledInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"farmer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"underlyingsAmounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ClusterRefundedFromAcc","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"farmer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"underlyingsAmounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ClusterWithdrawnToAcc","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":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"updatedShares","type":"uint256[]"}],"name":"ProportionsOptimized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[],"name":"ACCURACY_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADAPTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLUSTER_TOKEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUST_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_COOLDOWN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"clusterAmount","type":"uint256"},{"internalType":"bool","name":"coverDhvWithEth","type":"bool"}],"name":"assemble","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"assembleByAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterControllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterHashId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"clusterLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterTokenLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"controllerChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldownAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldownTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dhvTokenInstance","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"},{"internalType":"bool","name":"coverDhvWithEth","type":"bool"}],"name":"disassemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"disassembleByAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_underlyingAddress","type":"address"}],"name":"getUnderlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingInCluster","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyings","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"getUnderlyingsAmountsFromClusterAmount","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"updatedShares","type":"uint256[]"}],"name":"optimizeProportion","outputs":[{"internalType":"uint256[]","name":"debt","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"refundFromAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"returnDebtFromAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownPeriod","type":"uint256"}],"name":"setCooldownPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"","type":"uint256"}],"name":"underlyingInCluster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"underlyings","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"withdrawToAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620059b6380380620059b6833981016040819052620000349162000750565b8251839083906200004d90600390602085019062000454565b5080516200006390600490602084019062000454565b50506005805460ff19169055506001600160a01b038716620000cc5760405162461bcd60e51b815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f20616464726573730000000060448201526064015b60405180910390fd5b6001600160a01b038616620001245760405162461bcd60e51b815260206004820152601a60248201527f6465763a205472656173757279207a65726f20616464726573730000000000006044820152606401620000c3565b8351855114620001825760405162461bcd60e51b815260206004820152602260248201527f6465763a2041727261797327206c656e67746873206d75737420626520657175604482015261185b60f21b6064820152608401620000c3565b60005b8551811015620002935760006001600160a01b0316868281518110620001af57620001af620008f9565b60200260200101516001600160a01b03161415620002105760405162461bcd60e51b815260206004820152601c60248201527f6465763a20556e6465726c79696e67207a65726f2061646472657373000000006044820152606401620000c3565b6000858281518110620002275762000227620008f9565b6020026020010151116200027e5760405162461bcd60e51b815260206004820152601660248201527f6465763a20536861726520657175616c73207a65726f000000000000000000006044820152606401620000c3565b806200028a81620008cf565b91505062000185565b50620002a1600033620003a0565b8451620002b690600c906020880190620004e3565b508351620002cc90600d9060208701906200053b565b50600a819055600780546001600160a01b03808a166001600160a01b0319928316811790935560088054918a16919092161790556040805163583a0f9d60e11b8152905163b0741f3a91600480820192602092909190829003018186803b1580156200033757600080fd5b505afa1580156200034c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037291906200072b565b600980546001600160a01b0319166001600160a01b0392909216919091179055506200092595505050505050565b620003ac8282620003b0565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620003ac5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620004103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620004629062000892565b90600052602060002090601f016020900481019282620004865760008555620004d1565b82601f10620004a157805160ff1916838001178555620004d1565b82800160010185558215620004d1579182015b82811115620004d1578251825591602001919060010190620004b4565b50620004df92915062000578565b5090565b828054828255906000526020600020908101928215620004d1579160200282015b82811115620004d157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000504565b828054828255906000526020600020908101928215620004d15791602002820182811115620004d1578251825591602001919060010190620004b4565b5b80821115620004df576000815560010162000579565b80516001600160a01b0381168114620005a757600080fd5b919050565b600082601f830112620005be57600080fd5b81516020620005d7620005d1836200086c565b62000839565b80838252828201915082860187848660051b8901011115620005f857600080fd5b60005b8581101562000622576200060f826200058f565b84529284019290840190600101620005fb565b5090979650505050505050565b600082601f8301126200064157600080fd5b8151602062000654620005d1836200086c565b80838252828201915082860187848660051b89010111156200067557600080fd5b60005b85811015620006225781518452928401929084019060010162000678565b600082601f830112620006a857600080fd5b81516001600160401b03811115620006c457620006c46200090f565b6020620006da601f8301601f1916820162000839565b8281528582848701011115620006ef57600080fd5b60005b838110156200070f578581018301518282018401528201620006f2565b83811115620007215760008385840101525b5095945050505050565b6000602082840312156200073e57600080fd5b62000749826200058f565b9392505050565b600080600080600080600060e0888a0312156200076c57600080fd5b62000777886200058f565b965062000787602089016200058f565b60408901519096506001600160401b0380821115620007a557600080fd5b620007b38b838c01620005ac565b965060608a0151915080821115620007ca57600080fd5b620007d88b838c016200062f565b955060808a0151915080821115620007ef57600080fd5b620007fd8b838c0162000696565b945060a08a01519150808211156200081457600080fd5b50620008238a828b0162000696565b92505060c0880151905092959891949750929550565b604051601f8201601f191681016001600160401b03811182821017156200086457620008646200090f565b604052919050565b60006001600160401b038211156200088857620008886200090f565b5060051b60200190565b600181811c90821680620008a757607f821691505b60208210811415620008c957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620008f257634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61508180620009356000396000f3fe6080604052600436106103585760003560e01c80638456cb59116101bb578063b0741f3a116100f7578063d547741f11610095578063f0d23e8f1161006f578063f0d23e8f14610a55578063f394397014610a75578063f48f30ac14610aa9578063f65baefa14610ad657600080fd5b8063d547741f146109c2578063dd62ed3e146109e2578063ebe3391314610a3557600080fd5b8063c0ba241b116100d1578063c0ba241b14610942578063cea0252e14610976578063cfb550f114610996578063d031b0be146109ab57600080fd5b8063b0741f3a146108ec578063b63ad23e14610919578063bd5a14ee1461092f57600080fd5b8063953a6b97116101645780639bb1bebb1161013e5780639bb1bebb14610877578063a217fddf14610897578063a457c2d7146108ac578063a9059cbb146108cc57600080fd5b8063953a6b971461082957806395d89b411461084957806397f641ab1461085e57600080fd5b80638e98a220116101955780638e98a2201461078957806390f5fe78146107a957806391d14854146107d657600080fd5b80638456cb59146107305780638973fcc8146107455780638b41d35f1461077257600080fd5b80632f3422ce116102955780636605bfda11610233578063731b383c1161020d578063731b383c1461067e5780637bba46d01461069e5780637eea3400146106be57806380ea3de11461071057600080fd5b80636605bfda146105fb5780636c91fefa1461061b57806370a082311461063b57600080fd5b806336aaa5fd1161026f57806336aaa5fd1461059857806339509351146105ae5780633f4ba83a146105ce5780635c975abb146105e357600080fd5b80632f3422ce14610540578063313ce5671461055c57806336568abe1461057857600080fd5b806317c424c21161030257806323b872dd116102dc57806323b872dd146104b0578063248a9ca3146104d05780632d2e8677146105005780632f2ff15d1461052057600080fd5b806317c424c21461045957806318160ddd1461047b5780631c29078c1461049057600080fd5b806304646a491161033357806304646a491461040157806306fdde0314610417578063095ea7b31461043957600080fd5b806270fd991461036457806301ffc9a71461038f57806302a882e6146103bf57600080fd5b3661035f57005b600080fd5b34801561037057600080fd5b50610379610af8565b6040516103869190614b72565b60405180910390f35b34801561039b57600080fd5b506103af6103aa366004614952565b610b50565b6040519015158152602001610386565b3480156103cb57600080fd5b506103f37fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887181565b604051908152602001610386565b34801561040d57600080fd5b506103f3600b5481565b34801561042357600080fd5b5061042c610be9565b6040516103869190614bb3565b34801561044557600080fd5b506103af6104543660046147a8565b610c72565b34801561046557600080fd5b50610479610474366004614914565b610c88565b005b34801561048757600080fd5b506002546103f3565b34801561049c57600080fd5b506103796104ab3660046147d4565b610d83565b3480156104bc57600080fd5b506103af6104cb366004614767565b61128c565b3480156104dc57600080fd5b506103f36104eb366004614914565b60009081526006602052604090206001015490565b34801561050c57600080fd5b506103f361051b366004614914565b611374565b34801561052c57600080fd5b5061047961053b36600461492d565b611395565b34801561054c57600080fd5b506103f3670de0b6b3a764000081565b34801561056857600080fd5b5060405160128152602001610386565b34801561058457600080fd5b5061047961059336600461492d565b6113c0565b3480156105a457600080fd5b506103f3600a5481565b3480156105ba57600080fd5b506103af6105c93660046147a8565b611473565b3480156105da57600080fd5b506104796114bc565b3480156105ef57600080fd5b5060055460ff166103af565b34801561060757600080fd5b506104796106163660046146f4565b6114d3565b34801561062757600080fd5b50610479610636366004614914565b6115a4565b34801561064757600080fd5b506103f36106563660046146f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561068a57600080fd5b50610479610699366004614914565b6116ce565b3480156106aa57600080fd5b506104796106b9366004614914565b61184a565b3480156106ca57600080fd5b506007546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610386565b34801561071c57600080fd5b5061047961072b366004614914565b6118e8565b34801561073c57600080fd5b50610479611967565b34801561075157600080fd5b506103f36107603660046146f4565b60106020526000908152604090205481565b34801561077e57600080fd5b506103f36202a30081565b34801561079557600080fd5b506104796107a43660046146f4565b61197b565b3480156107b557600080fd5b506103f36107c43660046146f4565b60116020526000908152604090205481565b3480156107e257600080fd5b506103af6107f136600461492d565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561083557600080fd5b506104796108443660046148b2565b611ad6565b34801561085557600080fd5b5061042c611c01565b34801561086a57600080fd5b506103f364e8d4a5100081565b34801561088357600080fd5b50610379610892366004614914565b611c10565b3480156108a357600080fd5b506103f3600081565b3480156108b857600080fd5b506103af6108c73660046147a8565b611de3565b3480156108d857600080fd5b506103af6108e73660046147a8565b611ebb565b3480156108f857600080fd5b506009546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561092557600080fd5b506103f3600e5481565b6103f361093d3660046149ad565b611ec8565b34801561094e57600080fd5b506103f37f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f1581565b34801561098257600080fd5b506106eb610991366004614914565b612194565b3480156109a257600080fd5b506104796121cb565b3480156109b757600080fd5b506103f3620f424081565b3480156109ce57600080fd5b506104796109dd36600461492d565b6121e1565b3480156109ee57600080fd5b506103f36109fd36600461472e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b50610479610a503660046149ad565b612207565b348015610a6157600080fd5b506103f3610a703660046146f4565b6125e6565b348015610a8157600080fd5b506103f37f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d181565b348015610ab557600080fd5b506103f3610ac43660046146f4565b600f6020526000908152604090205481565b348015610ae257600080fd5b50610aeb61269f565b6040516103869190614b18565b6060600d805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815481526020019060010190808311610b32575b5050505050905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610be357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610bf890614f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490614f01565b8015610b465780601f10610c4657610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610c5457509395945050505050565b6000610c7f33848461270d565b50600192915050565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db2622258871610cb381336128b8565b6000610cbe83611c10565b905060005b8151811015610d3b57610d29335b30848481518110610ce457610ce4614fbd565b6020026020010151600c8581548110610cff57610cff614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692919061298a565b80610d3381614f55565b915050610cc3565b50610d463384612a6c565b604051838152339030907fdf882fbcb3ac2f616d4bab2db31dcedd61dd178b733bdaadc75d70525b2a1598906020015b60405180910390a3505050565b60607f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f15610db081336128b8565b600d54835114610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e6720617272617900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600c5467ffffffffffffffff811115610e3c57610e3c614fec565b604051908082528060200260200182016040528015610e65578160200160208202803683370190505b50600e546007549193509060009073ffffffffffffffffffffffffffffffffffffffff1663ffcf655e83610e9860025490565b610ea29190614e66565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915230602482015260440160006040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f519190810190614809565b8551909150610f6790600d9060208801906145c2565b506000610f8183610f7760025490565b6108929190614e66565b90506000610f8e84611c10565b905060005b600c54811015611245576000600c8281548110610fb257610fb2614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600f909152604090912054845191925090849084908110610ffc57610ffc614fbd565b602002602001015111156110795773ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040902054835184908490811061104457611044614fbd565b60200260200101516110569190614e66565b88838151811061106857611068614fbd565b60200260200101818152505061109a565b600088838151811061108d5761108d614fbd565b6020026020010181815250505b8282815181106110ac576110ac614fbd565b6020026020010151600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083828151811061110957611109614fbd565b602002602001015185838151811061112357611123614fbd565b60200260200101511115611196576111913385848151811061114757611147614fbd565b602002602001015187858151811061116157611161614fbd565b60200260200101516111739190614e66565b73ffffffffffffffffffffffffffffffffffffffff84169190612b98565b611232565b8382815181106111a8576111a8614fbd565b60200260200101518583815181106111c2576111c2614fbd565b602002602001015110156112325761123233308785815181106111e7576111e7614fbd565b602002602001015187868151811061120157611201614fbd565b60200260200101516112139190614e66565b73ffffffffffffffffffffffffffffffffffffffff851692919061298a565b508061123d81614f55565b915050610f93565b50604051339030907f23430ac6054603925f82afae7cc6252190a47d0e5fa6b4ac67790c3b3e292eb89061127a908b90614b72565b60405180910390a35050505050919050565b6000611299848484612bee565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548281101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610e18565b611367853385840361270d565b60019150505b9392505050565b600d818154811061138457600080fd5b600091825260209091200154905081565b6000828152600660205260409020600101546113b181336128b8565b6113bb8383612eac565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e18565b61146f8282612fa0565b5050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610c7f9185906114b7908690614cac565b61270d565b60006114c881336128b8565b6114d061305b565b50565b60006114df81336128b8565b73ffffffffffffffffffffffffffffffffffffffff821661155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e636f727265637420616464726573730000000000000000000000000000006044820152606401610e18565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16115cf81336128b8565b60006115da83611c10565b905082600e60008282546115ee9190614e66565b90915550600090505b600c548110156116945781818151811061161357611613614fbd565b6020026020010151600f6000600c848154811061163257611632614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611673908490614e66565b90915550611682905033610cd1565b8061168c81614f55565b9150506115f7565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769087908690600c90614c04565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16116f981336128b8565b600061170483611c10565b905082600e60008282546117189190614cac565b90915550600090505b600c548110156118105781818151811061173d5761173d614fbd565b6020026020010151600f6000600c848154811061175c5761175c614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120805490919061179d908490614cac565b909155506117fe9050335b8383815181106117ba576117ba614fbd565b6020026020010151600c84815481106117d5576117d5614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612b98565b8061180881614f55565b915050611721565b50604051339030907fc72d630122c8ed4fc97918baa82670432c4d36f10149924b98a8c410ad6b0a2b90610d769087908690600c90614c04565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887161187581336128b8565b600061188083611c10565b905061188c338461313c565b60005b81518110156118b3576118a1336117a8565b806118ab81614f55565b91505061188f565b50604051838152339030907f0e519abb97b349157786738cedce344e2eabcd59b8b8c4990b1f4d0c035d9a3090602001610d76565b60006118f481336128b8565b6202a300821115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e636f727265637420636f6f6c646f776e00000000000000000000000000006044820152606401610e18565b50600b55565b600061197381336128b8565b6114d0613335565b60075473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726f6c6c6572206f6e6c7900000000000000000000000000000000006044820152606401610e18565b73ffffffffffffffffffffffffffffffffffffffff8116611a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f2061646472657373000000006044820152606401610e18565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d1611b0181336128b8565b81600e6000828254611b139190614e66565b90915550600090505b600c54811015611bc757838181518110611b3857611b38614fbd565b6020026020010151600f6000600c8481548110611b5757611b57614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611b98908490614e66565b90915550611bb590503330868481518110610ce457610ce4614fbd565b80611bbf81614f55565b915050611b1c565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769086908890600c90614c04565b606060048054610bf890614f01565b600c5460609060009067ffffffffffffffff811115611c3157611c31614fec565b604051908082528060200260200182016040528015611c5a578160200160208202803683370190505b50905060005b600c54811015611ddc57620f4240600d8281548110611c8157611c81614fbd565b906000526020600020015485611c979190614e29565b611ca19190614cc4565b828281518110611cb357611cb3614fbd565b6020026020010181815250506000600c8281548110611cd457611cd4614fbd565b60009182526020918290200154604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263313ce56792600480840193829003018186803b158015611d4357600080fd5b505afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b91906149d2565b905060128160ff161015611dc957611d94816012614e7d565b611d9f90600a614d60565b838381518110611db157611db1614fbd565b60200260200101818151611dc59190614cc4565b9052505b5080611dd481614f55565b915050611c60565b5092915050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611ea4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e18565b611eb1338585840361270d565b5060019392505050565b6000610c7f338484612bee565b6000611ed660055460ff1690565b15611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b611f5e335b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b47611fd034856133f5565b476000611fdd8284614e66565b6007546040517f01d5f4900000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff909116906301d5f4909060440160206040518083038186803b15801561205357600080fd5b505afa158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190614994565b905060006120998288613948565b6120a38434614e66565b6120ad9190614e66565b905064e8d4a510008111156120c7576120c7335b82613a7e565b600b541561214157336000908152601060205260409020544210156121105733600090815260116020526040812080548a9290612105908490614cac565b909155506121239050565b3360009081526011602052604090208890555b600b546121309042614cac565b336000908152601060205260409020555b61214b3389612a6c565b60408051848152602081018a9052339130917f154f5ab3f8529ffdbb246fd1a63a2cce74c42c1b45bd6bbfad82bef2272be9c5910160405180910390a350959695505050505050565b600c81815481106121a457600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60006121d781336128b8565b6114d03347613a7e565b6000828152600660205260409020600101546121fd81336128b8565b6113bb8383612fa0565b60055460ff1615612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b3360008181526010602052604090205483904210156123b65773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233e9190614994565b6123489190614e66565b9050818110156123b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b505b6123bf33611f42565b15612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b60008411801561243e575061243a33610656565b8411155b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820636c757374657200000000000000000000000000006044820152606401610e18565b6124ae338561313c565b60006124b985611c10565b9050476124c582613bd8565b4760006124d28383614e66565b6007546040517f4c7ba3920000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634c7ba3929060440160206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190614994565b9050600061258e828a613948565b6125989084614e66565b90506125a3336120c1565b6040518a8152339030907f2ced335a9d5d52c0e402f0cd99d473593830e0b3c1315c50a05c86c4afbd555f9060200160405180910390a350505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600f60205260408082205490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919290916370a082319060240160206040518083038186803b15801561265d57600080fd5b505afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126959190614994565b610be39190614cac565b6060600c805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116126d9575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff83166127af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610d76565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f576129108173ffffffffffffffffffffffffffffffffffffffff166014613d99565b61291b836020613d99565b60405160200161292c929190614a97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610e1891600401614bb3565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a669085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fdc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e18565b612af5600083836140e8565b8060026000828254612b079190614cac565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290612b41908490614cac565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016129e4565b73ffffffffffffffffffffffffffffffffffffffff8316612c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e18565b612d3f8383836140e8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290612e39908490614cac565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e9f91815260200190565b60405180910390a3612a66565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612f423390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60055460ff166130c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff82166131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b6131eb826000836140e8565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906132dd908490614e66565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff16156133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131123390565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134979190614711565b6007546040517f60db72ef000000000000000000000000000000000000000000000000000000008152306004820152602481018590529192506000918291829173ffffffffffffffffffffffffffffffffffffffff909116906360db72ef9060440160006040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261356b919081019061483e565b93505092509250808610156135dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e7400000000000000000000006044820152606401610e18565b60005b600c5481101561393f578381815181106135fb576135fb614fbd565b6020026020010151600c828154811061361657613616614fbd565b6000918252602090912001546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a082319060240160206040518083038186803b15801561368c57600080fd5b505afa1580156136a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c49190614994565b101580156137b157508381815181106136df576136df614fbd565b6020026020010151600c82815481106136fa576136fa614fbd565b6000918252602090912001546008546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015230602482015291169063dd62ed3e9060440160206040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae9190614994565b10155b1561382e5760085484516137ea9173ffffffffffffffffffffffffffffffffffffffff16903090879085908110610ce457610ce4614fbd565b60085483516138299173ffffffffffffffffffffffffffffffffffffffff169085908490811061381c5761381c614fbd565b6020026020010151613a7e565b61392d565b8473ffffffffffffffffffffffffffffffffffffffff166337f324c984838151811061385c5761385c614fbd565b6020026020010151600c848154811061387757613877614fbd565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168785815181106138b4576138b4614fbd565b60200260200101516040518463ffffffff1660e01b81526004016138fa92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000604051808303818588803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b50505050505b8061393781614f55565b9150506135df565b50505050505050565b60008215613a75578115613980576008546139799073ffffffffffffffffffffffffffffffffffffffff1684613a7e565b5081610be3565b6007546040517f4e4f30a200000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff1690634e4f30a29060240160206040518083038186803b1580156139ea57600080fd5b505afa1580156139fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a229190614994565b613a3485670de0b6b3a7640000614e29565b613a3e9190614cc4565b9050613a6b3360085460095473ffffffffffffffffffffffffffffffffffffffff9081169291168461298a565b6000915050610be3565b50600092915050565b80471015613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e18565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b50509050806113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e18565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b158015613c4257600080fd5b505afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a9190614711565b905060005b8251811015613d0d57613cca826000600c8481548110613ca157613ca1614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190614247565b613cfb82848381518110613ce057613ce0614fbd565b6020026020010151600c8481548110613ca157613ca1614fbd565b80613d0581614f55565b915050613c7f565b506040517f2457ff7300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632457ff7390613d63908590600c90600401614b85565b600060405180830381600087803b158015613d7d57600080fd5b505af1158015613d91573d6000803e3d6000fd5b505050505050565b60606000613da8836002614e29565b613db3906002614cac565b67ffffffffffffffff811115613dcb57613dcb614fec565b6040519080825280601f01601f191660200182016040528015613df5576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613e2c57613e2c614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613e8f57613e8f614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613ecb846002614e29565b613ed6906001614cac565b90505b6001811115613f73577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613f1757613f17614fbd565b1a60f81b828281518110613f2d57613f2d614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93613f6c81614ecc565b9050613ed9565b50831561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e18565b600061403e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143d89092919063ffffffff16565b8051909150156113bb578080602001905181019061405c91906148f7565b6113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054839082904210156142405773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561419257600080fd5b505afa1580156141a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ca9190614994565b6141d49190614e66565b905081811015613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b5050505050565b8015806142f657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156142bc57600080fd5b505afa1580156142d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f49190614994565b155b614382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e18565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016129e4565b60606143e784846000856143ef565b949350505050565b606082471015614481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e18565b843b6144e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e18565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516145129190614a7b565b60006040518083038185875af1925050503d806000811461454f576040519150601f19603f3d011682016040523d82523d6000602084013e614554565b606091505b509150915061456482828661456f565b979650505050505050565b6060831561457e57508161136d565b82511561458e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189190614bb3565b8280548282559060005260206000209081019282156145fd579160200282015b828111156145fd5782518255916020019190600101906145e2565b5061460992915061460d565b5090565b5b80821115614609576000815560010161460e565b600082601f83011261463357600080fd5b8135602061464861464383614c88565b614c39565b80838252828201915082860187848660051b890101111561466857600080fd5b60005b858110156146875781358452928401929084019060010161466b565b5090979650505050505050565b600082601f8301126146a557600080fd5b815160206146b561464383614c88565b80838252828201915082860187848660051b89010111156146d557600080fd5b60005b85811015614687578151845292840192908401906001016146d8565b60006020828403121561470657600080fd5b813561136d8161501b565b60006020828403121561472357600080fd5b815161136d8161501b565b6000806040838503121561474157600080fd5b823561474c8161501b565b9150602083013561475c8161501b565b809150509250929050565b60008060006060848603121561477c57600080fd5b83356147878161501b565b925060208401356147978161501b565b929592945050506040919091013590565b600080604083850312156147bb57600080fd5b82356147c68161501b565b946020939093013593505050565b6000602082840312156147e657600080fd5b813567ffffffffffffffff8111156147fd57600080fd5b6143e784828501614622565b60006020828403121561481b57600080fd5b815167ffffffffffffffff81111561483257600080fd5b6143e784828501614694565b6000806000806080858703121561485457600080fd5b845167ffffffffffffffff8082111561486c57600080fd5b61487888838901614694565b9550602087015191508082111561488e57600080fd5b5061489b87828801614694565b604087015160609097015195989097509350505050565b600080604083850312156148c557600080fd5b823567ffffffffffffffff8111156148dc57600080fd5b6148e885828601614622565b95602094909401359450505050565b60006020828403121561490957600080fd5b815161136d8161503d565b60006020828403121561492657600080fd5b5035919050565b6000806040838503121561494057600080fd5b82359150602083013561475c8161501b565b60006020828403121561496457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461136d57600080fd5b6000602082840312156149a657600080fd5b5051919050565b600080604083850312156149c057600080fd5b82359150602083013561475c8161503d565b6000602082840312156149e457600080fd5b815160ff8116811461136d57600080fd5b6000815480845260208085019450836000528060002060005b83811015614a4057815473ffffffffffffffffffffffffffffffffffffffff1687529582019560019182019101614a0e565b509495945050505050565b600081518084526020808501945080840160005b83811015614a4057815187529582019590820190600101614a5f565b60008251614a8d818460208701614ea0565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614acf816017850160208801614ea0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614b0c816028840160208801614ea0565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614b6657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614b34565b50909695505050505050565b60208152600061136d6020830184614a4b565b604081526000614b986040830185614a4b565b8281036020840152614baa81856149f5565b95945050505050565b6020815260008251806020840152614bd2816040850160208701614ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b838152606060208201526000614c1d6060830185614a4b565b8281036040840152614c2f81856149f5565b9695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c8057614c80614fec565b604052919050565b600067ffffffffffffffff821115614ca257614ca2614fec565b5060051b60200190565b60008219821115614cbf57614cbf614f8e565b500190565b600082614cfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181815b80851115614d5857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d3e57614d3e614f8e565b80851615614d4b57918102915b93841c9390800290614d04565b509250929050565b600061136d60ff841683600082614d7957506001610be3565b81614d8657506000610be3565b8160018114614d9c5760028114614da657614dc2565b6001915050610be3565b60ff841115614db757614db7614f8e565b50506001821b610be3565b5060208310610133831016604e8410600b8410161715614de5575081810a610be3565b614def8383614cff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614e2157614e21614f8e565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6157614e61614f8e565b500290565b600082821015614e7857614e78614f8e565b500390565b600060ff821660ff841680821015614e9757614e97614f8e565b90039392505050565b60005b83811015614ebb578181015183820152602001614ea3565b83811115612a665750506000910152565b600081614edb57614edb614f8e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680614f1557607f821691505b60208210811415614f4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8757614f87614f8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114d057600080fd5b80151581146114d057600080fdfea26469706673582212206b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa378589873611964736f6c63430008060033000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d600000000000000000000000000000000000000000000000000000000000000080000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000111111111117dc0aa78b770fa6a738034120c3020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000008d9a00000000000000000000000000000000000000000000000000000000002afddc00000000000000000000000000000000000000000000000000000000000bd358000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000a58ed000000000000000000000000000000000000000000000000000000000008d24d0000000000000000000000000000000000000000000000000000000000138ce2000000000000000000000000000000000000000000000000000000000000000084554482d436f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445435200000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103585760003560e01c80638456cb59116101bb578063b0741f3a116100f7578063d547741f11610095578063f0d23e8f1161006f578063f0d23e8f14610a55578063f394397014610a75578063f48f30ac14610aa9578063f65baefa14610ad657600080fd5b8063d547741f146109c2578063dd62ed3e146109e2578063ebe3391314610a3557600080fd5b8063c0ba241b116100d1578063c0ba241b14610942578063cea0252e14610976578063cfb550f114610996578063d031b0be146109ab57600080fd5b8063b0741f3a146108ec578063b63ad23e14610919578063bd5a14ee1461092f57600080fd5b8063953a6b97116101645780639bb1bebb1161013e5780639bb1bebb14610877578063a217fddf14610897578063a457c2d7146108ac578063a9059cbb146108cc57600080fd5b8063953a6b971461082957806395d89b411461084957806397f641ab1461085e57600080fd5b80638e98a220116101955780638e98a2201461078957806390f5fe78146107a957806391d14854146107d657600080fd5b80638456cb59146107305780638973fcc8146107455780638b41d35f1461077257600080fd5b80632f3422ce116102955780636605bfda11610233578063731b383c1161020d578063731b383c1461067e5780637bba46d01461069e5780637eea3400146106be57806380ea3de11461071057600080fd5b80636605bfda146105fb5780636c91fefa1461061b57806370a082311461063b57600080fd5b806336aaa5fd1161026f57806336aaa5fd1461059857806339509351146105ae5780633f4ba83a146105ce5780635c975abb146105e357600080fd5b80632f3422ce14610540578063313ce5671461055c57806336568abe1461057857600080fd5b806317c424c21161030257806323b872dd116102dc57806323b872dd146104b0578063248a9ca3146104d05780632d2e8677146105005780632f2ff15d1461052057600080fd5b806317c424c21461045957806318160ddd1461047b5780631c29078c1461049057600080fd5b806304646a491161033357806304646a491461040157806306fdde0314610417578063095ea7b31461043957600080fd5b806270fd991461036457806301ffc9a71461038f57806302a882e6146103bf57600080fd5b3661035f57005b600080fd5b34801561037057600080fd5b50610379610af8565b6040516103869190614b72565b60405180910390f35b34801561039b57600080fd5b506103af6103aa366004614952565b610b50565b6040519015158152602001610386565b3480156103cb57600080fd5b506103f37fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887181565b604051908152602001610386565b34801561040d57600080fd5b506103f3600b5481565b34801561042357600080fd5b5061042c610be9565b6040516103869190614bb3565b34801561044557600080fd5b506103af6104543660046147a8565b610c72565b34801561046557600080fd5b50610479610474366004614914565b610c88565b005b34801561048757600080fd5b506002546103f3565b34801561049c57600080fd5b506103796104ab3660046147d4565b610d83565b3480156104bc57600080fd5b506103af6104cb366004614767565b61128c565b3480156104dc57600080fd5b506103f36104eb366004614914565b60009081526006602052604090206001015490565b34801561050c57600080fd5b506103f361051b366004614914565b611374565b34801561052c57600080fd5b5061047961053b36600461492d565b611395565b34801561054c57600080fd5b506103f3670de0b6b3a764000081565b34801561056857600080fd5b5060405160128152602001610386565b34801561058457600080fd5b5061047961059336600461492d565b6113c0565b3480156105a457600080fd5b506103f3600a5481565b3480156105ba57600080fd5b506103af6105c93660046147a8565b611473565b3480156105da57600080fd5b506104796114bc565b3480156105ef57600080fd5b5060055460ff166103af565b34801561060757600080fd5b506104796106163660046146f4565b6114d3565b34801561062757600080fd5b50610479610636366004614914565b6115a4565b34801561064757600080fd5b506103f36106563660046146f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561068a57600080fd5b50610479610699366004614914565b6116ce565b3480156106aa57600080fd5b506104796106b9366004614914565b61184a565b3480156106ca57600080fd5b506007546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610386565b34801561071c57600080fd5b5061047961072b366004614914565b6118e8565b34801561073c57600080fd5b50610479611967565b34801561075157600080fd5b506103f36107603660046146f4565b60106020526000908152604090205481565b34801561077e57600080fd5b506103f36202a30081565b34801561079557600080fd5b506104796107a43660046146f4565b61197b565b3480156107b557600080fd5b506103f36107c43660046146f4565b60116020526000908152604090205481565b3480156107e257600080fd5b506103af6107f136600461492d565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561083557600080fd5b506104796108443660046148b2565b611ad6565b34801561085557600080fd5b5061042c611c01565b34801561086a57600080fd5b506103f364e8d4a5100081565b34801561088357600080fd5b50610379610892366004614914565b611c10565b3480156108a357600080fd5b506103f3600081565b3480156108b857600080fd5b506103af6108c73660046147a8565b611de3565b3480156108d857600080fd5b506103af6108e73660046147a8565b611ebb565b3480156108f857600080fd5b506009546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561092557600080fd5b506103f3600e5481565b6103f361093d3660046149ad565b611ec8565b34801561094e57600080fd5b506103f37f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f1581565b34801561098257600080fd5b506106eb610991366004614914565b612194565b3480156109a257600080fd5b506104796121cb565b3480156109b757600080fd5b506103f3620f424081565b3480156109ce57600080fd5b506104796109dd36600461492d565b6121e1565b3480156109ee57600080fd5b506103f36109fd36600461472e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b50610479610a503660046149ad565b612207565b348015610a6157600080fd5b506103f3610a703660046146f4565b6125e6565b348015610a8157600080fd5b506103f37f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d181565b348015610ab557600080fd5b506103f3610ac43660046146f4565b600f6020526000908152604090205481565b348015610ae257600080fd5b50610aeb61269f565b6040516103869190614b18565b6060600d805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815481526020019060010190808311610b32575b5050505050905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610be357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610bf890614f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490614f01565b8015610b465780601f10610c4657610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610c5457509395945050505050565b6000610c7f33848461270d565b50600192915050565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db2622258871610cb381336128b8565b6000610cbe83611c10565b905060005b8151811015610d3b57610d29335b30848481518110610ce457610ce4614fbd565b6020026020010151600c8581548110610cff57610cff614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692919061298a565b80610d3381614f55565b915050610cc3565b50610d463384612a6c565b604051838152339030907fdf882fbcb3ac2f616d4bab2db31dcedd61dd178b733bdaadc75d70525b2a1598906020015b60405180910390a3505050565b60607f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f15610db081336128b8565b600d54835114610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e6720617272617900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600c5467ffffffffffffffff811115610e3c57610e3c614fec565b604051908082528060200260200182016040528015610e65578160200160208202803683370190505b50600e546007549193509060009073ffffffffffffffffffffffffffffffffffffffff1663ffcf655e83610e9860025490565b610ea29190614e66565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915230602482015260440160006040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f519190810190614809565b8551909150610f6790600d9060208801906145c2565b506000610f8183610f7760025490565b6108929190614e66565b90506000610f8e84611c10565b905060005b600c54811015611245576000600c8281548110610fb257610fb2614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600f909152604090912054845191925090849084908110610ffc57610ffc614fbd565b602002602001015111156110795773ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040902054835184908490811061104457611044614fbd565b60200260200101516110569190614e66565b88838151811061106857611068614fbd565b60200260200101818152505061109a565b600088838151811061108d5761108d614fbd565b6020026020010181815250505b8282815181106110ac576110ac614fbd565b6020026020010151600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083828151811061110957611109614fbd565b602002602001015185838151811061112357611123614fbd565b60200260200101511115611196576111913385848151811061114757611147614fbd565b602002602001015187858151811061116157611161614fbd565b60200260200101516111739190614e66565b73ffffffffffffffffffffffffffffffffffffffff84169190612b98565b611232565b8382815181106111a8576111a8614fbd565b60200260200101518583815181106111c2576111c2614fbd565b602002602001015110156112325761123233308785815181106111e7576111e7614fbd565b602002602001015187868151811061120157611201614fbd565b60200260200101516112139190614e66565b73ffffffffffffffffffffffffffffffffffffffff851692919061298a565b508061123d81614f55565b915050610f93565b50604051339030907f23430ac6054603925f82afae7cc6252190a47d0e5fa6b4ac67790c3b3e292eb89061127a908b90614b72565b60405180910390a35050505050919050565b6000611299848484612bee565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548281101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610e18565b611367853385840361270d565b60019150505b9392505050565b600d818154811061138457600080fd5b600091825260209091200154905081565b6000828152600660205260409020600101546113b181336128b8565b6113bb8383612eac565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e18565b61146f8282612fa0565b5050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610c7f9185906114b7908690614cac565b61270d565b60006114c881336128b8565b6114d061305b565b50565b60006114df81336128b8565b73ffffffffffffffffffffffffffffffffffffffff821661155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e636f727265637420616464726573730000000000000000000000000000006044820152606401610e18565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16115cf81336128b8565b60006115da83611c10565b905082600e60008282546115ee9190614e66565b90915550600090505b600c548110156116945781818151811061161357611613614fbd565b6020026020010151600f6000600c848154811061163257611632614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611673908490614e66565b90915550611682905033610cd1565b8061168c81614f55565b9150506115f7565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769087908690600c90614c04565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16116f981336128b8565b600061170483611c10565b905082600e60008282546117189190614cac565b90915550600090505b600c548110156118105781818151811061173d5761173d614fbd565b6020026020010151600f6000600c848154811061175c5761175c614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120805490919061179d908490614cac565b909155506117fe9050335b8383815181106117ba576117ba614fbd565b6020026020010151600c84815481106117d5576117d5614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612b98565b8061180881614f55565b915050611721565b50604051339030907fc72d630122c8ed4fc97918baa82670432c4d36f10149924b98a8c410ad6b0a2b90610d769087908690600c90614c04565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887161187581336128b8565b600061188083611c10565b905061188c338461313c565b60005b81518110156118b3576118a1336117a8565b806118ab81614f55565b91505061188f565b50604051838152339030907f0e519abb97b349157786738cedce344e2eabcd59b8b8c4990b1f4d0c035d9a3090602001610d76565b60006118f481336128b8565b6202a300821115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e636f727265637420636f6f6c646f776e00000000000000000000000000006044820152606401610e18565b50600b55565b600061197381336128b8565b6114d0613335565b60075473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726f6c6c6572206f6e6c7900000000000000000000000000000000006044820152606401610e18565b73ffffffffffffffffffffffffffffffffffffffff8116611a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f2061646472657373000000006044820152606401610e18565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d1611b0181336128b8565b81600e6000828254611b139190614e66565b90915550600090505b600c54811015611bc757838181518110611b3857611b38614fbd565b6020026020010151600f6000600c8481548110611b5757611b57614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611b98908490614e66565b90915550611bb590503330868481518110610ce457610ce4614fbd565b80611bbf81614f55565b915050611b1c565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769086908890600c90614c04565b606060048054610bf890614f01565b600c5460609060009067ffffffffffffffff811115611c3157611c31614fec565b604051908082528060200260200182016040528015611c5a578160200160208202803683370190505b50905060005b600c54811015611ddc57620f4240600d8281548110611c8157611c81614fbd565b906000526020600020015485611c979190614e29565b611ca19190614cc4565b828281518110611cb357611cb3614fbd565b6020026020010181815250506000600c8281548110611cd457611cd4614fbd565b60009182526020918290200154604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263313ce56792600480840193829003018186803b158015611d4357600080fd5b505afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b91906149d2565b905060128160ff161015611dc957611d94816012614e7d565b611d9f90600a614d60565b838381518110611db157611db1614fbd565b60200260200101818151611dc59190614cc4565b9052505b5080611dd481614f55565b915050611c60565b5092915050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611ea4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e18565b611eb1338585840361270d565b5060019392505050565b6000610c7f338484612bee565b6000611ed660055460ff1690565b15611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b611f5e335b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b47611fd034856133f5565b476000611fdd8284614e66565b6007546040517f01d5f4900000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff909116906301d5f4909060440160206040518083038186803b15801561205357600080fd5b505afa158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190614994565b905060006120998288613948565b6120a38434614e66565b6120ad9190614e66565b905064e8d4a510008111156120c7576120c7335b82613a7e565b600b541561214157336000908152601060205260409020544210156121105733600090815260116020526040812080548a9290612105908490614cac565b909155506121239050565b3360009081526011602052604090208890555b600b546121309042614cac565b336000908152601060205260409020555b61214b3389612a6c565b60408051848152602081018a9052339130917f154f5ab3f8529ffdbb246fd1a63a2cce74c42c1b45bd6bbfad82bef2272be9c5910160405180910390a350959695505050505050565b600c81815481106121a457600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60006121d781336128b8565b6114d03347613a7e565b6000828152600660205260409020600101546121fd81336128b8565b6113bb8383612fa0565b60055460ff1615612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b3360008181526010602052604090205483904210156123b65773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233e9190614994565b6123489190614e66565b9050818110156123b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b505b6123bf33611f42565b15612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b60008411801561243e575061243a33610656565b8411155b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820636c757374657200000000000000000000000000006044820152606401610e18565b6124ae338561313c565b60006124b985611c10565b9050476124c582613bd8565b4760006124d28383614e66565b6007546040517f4c7ba3920000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634c7ba3929060440160206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190614994565b9050600061258e828a613948565b6125989084614e66565b90506125a3336120c1565b6040518a8152339030907f2ced335a9d5d52c0e402f0cd99d473593830e0b3c1315c50a05c86c4afbd555f9060200160405180910390a350505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600f60205260408082205490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919290916370a082319060240160206040518083038186803b15801561265d57600080fd5b505afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126959190614994565b610be39190614cac565b6060600c805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116126d9575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff83166127af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610d76565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f576129108173ffffffffffffffffffffffffffffffffffffffff166014613d99565b61291b836020613d99565b60405160200161292c929190614a97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610e1891600401614bb3565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a669085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fdc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e18565b612af5600083836140e8565b8060026000828254612b079190614cac565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290612b41908490614cac565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016129e4565b73ffffffffffffffffffffffffffffffffffffffff8316612c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e18565b612d3f8383836140e8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290612e39908490614cac565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e9f91815260200190565b60405180910390a3612a66565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612f423390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60055460ff166130c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff82166131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b6131eb826000836140e8565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906132dd908490614e66565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff16156133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131123390565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134979190614711565b6007546040517f60db72ef000000000000000000000000000000000000000000000000000000008152306004820152602481018590529192506000918291829173ffffffffffffffffffffffffffffffffffffffff909116906360db72ef9060440160006040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261356b919081019061483e565b93505092509250808610156135dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e7400000000000000000000006044820152606401610e18565b60005b600c5481101561393f578381815181106135fb576135fb614fbd565b6020026020010151600c828154811061361657613616614fbd565b6000918252602090912001546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a082319060240160206040518083038186803b15801561368c57600080fd5b505afa1580156136a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c49190614994565b101580156137b157508381815181106136df576136df614fbd565b6020026020010151600c82815481106136fa576136fa614fbd565b6000918252602090912001546008546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015230602482015291169063dd62ed3e9060440160206040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae9190614994565b10155b1561382e5760085484516137ea9173ffffffffffffffffffffffffffffffffffffffff16903090879085908110610ce457610ce4614fbd565b60085483516138299173ffffffffffffffffffffffffffffffffffffffff169085908490811061381c5761381c614fbd565b6020026020010151613a7e565b61392d565b8473ffffffffffffffffffffffffffffffffffffffff166337f324c984838151811061385c5761385c614fbd565b6020026020010151600c848154811061387757613877614fbd565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168785815181106138b4576138b4614fbd565b60200260200101516040518463ffffffff1660e01b81526004016138fa92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000604051808303818588803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b50505050505b8061393781614f55565b9150506135df565b50505050505050565b60008215613a75578115613980576008546139799073ffffffffffffffffffffffffffffffffffffffff1684613a7e565b5081610be3565b6007546040517f4e4f30a200000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff1690634e4f30a29060240160206040518083038186803b1580156139ea57600080fd5b505afa1580156139fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a229190614994565b613a3485670de0b6b3a7640000614e29565b613a3e9190614cc4565b9050613a6b3360085460095473ffffffffffffffffffffffffffffffffffffffff9081169291168461298a565b6000915050610be3565b50600092915050565b80471015613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e18565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b50509050806113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e18565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b158015613c4257600080fd5b505afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a9190614711565b905060005b8251811015613d0d57613cca826000600c8481548110613ca157613ca1614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190614247565b613cfb82848381518110613ce057613ce0614fbd565b6020026020010151600c8481548110613ca157613ca1614fbd565b80613d0581614f55565b915050613c7f565b506040517f2457ff7300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632457ff7390613d63908590600c90600401614b85565b600060405180830381600087803b158015613d7d57600080fd5b505af1158015613d91573d6000803e3d6000fd5b505050505050565b60606000613da8836002614e29565b613db3906002614cac565b67ffffffffffffffff811115613dcb57613dcb614fec565b6040519080825280601f01601f191660200182016040528015613df5576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613e2c57613e2c614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613e8f57613e8f614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613ecb846002614e29565b613ed6906001614cac565b90505b6001811115613f73577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613f1757613f17614fbd565b1a60f81b828281518110613f2d57613f2d614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93613f6c81614ecc565b9050613ed9565b50831561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e18565b600061403e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143d89092919063ffffffff16565b8051909150156113bb578080602001905181019061405c91906148f7565b6113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054839082904210156142405773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561419257600080fd5b505afa1580156141a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ca9190614994565b6141d49190614e66565b905081811015613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b5050505050565b8015806142f657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156142bc57600080fd5b505afa1580156142d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f49190614994565b155b614382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e18565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016129e4565b60606143e784846000856143ef565b949350505050565b606082471015614481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e18565b843b6144e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e18565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516145129190614a7b565b60006040518083038185875af1925050503d806000811461454f576040519150601f19603f3d011682016040523d82523d6000602084013e614554565b606091505b509150915061456482828661456f565b979650505050505050565b6060831561457e57508161136d565b82511561458e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189190614bb3565b8280548282559060005260206000209081019282156145fd579160200282015b828111156145fd5782518255916020019190600101906145e2565b5061460992915061460d565b5090565b5b80821115614609576000815560010161460e565b600082601f83011261463357600080fd5b8135602061464861464383614c88565b614c39565b80838252828201915082860187848660051b890101111561466857600080fd5b60005b858110156146875781358452928401929084019060010161466b565b5090979650505050505050565b600082601f8301126146a557600080fd5b815160206146b561464383614c88565b80838252828201915082860187848660051b89010111156146d557600080fd5b60005b85811015614687578151845292840192908401906001016146d8565b60006020828403121561470657600080fd5b813561136d8161501b565b60006020828403121561472357600080fd5b815161136d8161501b565b6000806040838503121561474157600080fd5b823561474c8161501b565b9150602083013561475c8161501b565b809150509250929050565b60008060006060848603121561477c57600080fd5b83356147878161501b565b925060208401356147978161501b565b929592945050506040919091013590565b600080604083850312156147bb57600080fd5b82356147c68161501b565b946020939093013593505050565b6000602082840312156147e657600080fd5b813567ffffffffffffffff8111156147fd57600080fd5b6143e784828501614622565b60006020828403121561481b57600080fd5b815167ffffffffffffffff81111561483257600080fd5b6143e784828501614694565b6000806000806080858703121561485457600080fd5b845167ffffffffffffffff8082111561486c57600080fd5b61487888838901614694565b9550602087015191508082111561488e57600080fd5b5061489b87828801614694565b604087015160609097015195989097509350505050565b600080604083850312156148c557600080fd5b823567ffffffffffffffff8111156148dc57600080fd5b6148e885828601614622565b95602094909401359450505050565b60006020828403121561490957600080fd5b815161136d8161503d565b60006020828403121561492657600080fd5b5035919050565b6000806040838503121561494057600080fd5b82359150602083013561475c8161501b565b60006020828403121561496457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461136d57600080fd5b6000602082840312156149a657600080fd5b5051919050565b600080604083850312156149c057600080fd5b82359150602083013561475c8161503d565b6000602082840312156149e457600080fd5b815160ff8116811461136d57600080fd5b6000815480845260208085019450836000528060002060005b83811015614a4057815473ffffffffffffffffffffffffffffffffffffffff1687529582019560019182019101614a0e565b509495945050505050565b600081518084526020808501945080840160005b83811015614a4057815187529582019590820190600101614a5f565b60008251614a8d818460208701614ea0565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614acf816017850160208801614ea0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614b0c816028840160208801614ea0565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614b6657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614b34565b50909695505050505050565b60208152600061136d6020830184614a4b565b604081526000614b986040830185614a4b565b8281036020840152614baa81856149f5565b95945050505050565b6020815260008251806020840152614bd2816040850160208701614ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b838152606060208201526000614c1d6060830185614a4b565b8281036040840152614c2f81856149f5565b9695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c8057614c80614fec565b604052919050565b600067ffffffffffffffff821115614ca257614ca2614fec565b5060051b60200190565b60008219821115614cbf57614cbf614f8e565b500190565b600082614cfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181815b80851115614d5857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d3e57614d3e614f8e565b80851615614d4b57918102915b93841c9390800290614d04565b509250929050565b600061136d60ff841683600082614d7957506001610be3565b81614d8657506000610be3565b8160018114614d9c5760028114614da657614dc2565b6001915050610be3565b60ff841115614db757614db7614f8e565b50506001821b610be3565b5060208310610133831016604e8410600b8410161715614de5575081810a610be3565b614def8383614cff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614e2157614e21614f8e565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6157614e61614f8e565b500290565b600082821015614e7857614e78614f8e565b500390565b600060ff821660ff841680821015614e9757614e97614f8e565b90039392505050565b60005b83811015614ebb578181015183820152602001614ea3565b83811115612a665750506000910152565b600081614edb57614edb614f8e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680614f1557607f821691505b60208210811415614f4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8757614f87614f8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114d057600080fd5b80151581146114d057600080fdfea26469706673582212206b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa378589873611964736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d600000000000000000000000000000000000000000000000000000000000000080000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000111111111117dc0aa78b770fa6a738034120c3020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000008d9a00000000000000000000000000000000000000000000000000000000002afddc00000000000000000000000000000000000000000000000000000000000bd358000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000a58ed000000000000000000000000000000000000000000000000000000000008d24d0000000000000000000000000000000000000000000000000000000000138ce2000000000000000000000000000000000000000000000000000000000000000084554482d436f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445435200000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _clusterControllerAddress (address): 0xE806Db0693788Ec79D6c45a8934E0EAF94AFA37E
Arg [1] : _treasury (address): 0x5bAc8C443EBD0525364dc813005AB72956D3705d
Arg [2] : _underlyings (address[]): 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9,0xc00e94Cb662C3520282E6f5717214004A7f26888,0xD533a949740bb3306d119CC777fa900bA034cd52,0x514910771AF9Ca656af840dff83E8264EcF986CA,0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F,0x6B3595068778DD592e39A122f4f5a5cF09C90fE2,0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984,0x111111111117dC0aa78b770fA6A738034120C302
Arg [3] : _underlyingInCluster (uint256[]): 500000,580000,45080000,12400000,5120000,10850000,9250000,20500000
Arg [4] : _name (string): ETH-Core
Arg [5] : _symbol (string): DECR
Arg [6] : _hashId (uint256): 84253821036764534306060160924012026141829460811678815914092579854188903020246
-----Encoded View---------------
29 Constructor Arguments found :
Arg [0] : 000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e
Arg [1] : 0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [6] : ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d6
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9
Arg [9] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [10] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [11] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [12] : 000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f
Arg [13] : 0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Arg [14] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [15] : 000000000000000000000000111111111117dc0aa78b770fa6a738034120c302
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [17] : 000000000000000000000000000000000000000000000000000000000007a120
Arg [18] : 000000000000000000000000000000000000000000000000000000000008d9a0
Arg [19] : 0000000000000000000000000000000000000000000000000000000002afddc0
Arg [20] : 0000000000000000000000000000000000000000000000000000000000bd3580
Arg [21] : 00000000000000000000000000000000000000000000000000000000004e2000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000a58ed0
Arg [23] : 00000000000000000000000000000000000000000000000000000000008d24d0
Arg [24] : 000000000000000000000000000000000000000000000000000000000138ce20
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [26] : 4554482d436f7265000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [28] : 4445435200000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
49229:19623:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64561:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29647:204;;;;;;;;;;-1:-1:-1;29647:204:0;;;;;:::i;:::-;;:::i;:::-;;;12094:14:1;;12087:22;12069:41;;12057:2;12042:18;29647:204:0;12024:92:1;49537:64:0;;;;;;;;;;;;49576:25;49537:64;;;;;12267:25:1;;;12255:2;12240:18;49537:64:0;12222:76:1;50520:29:0;;;;;;;;;;;;;;;;9902:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12069:169::-;;;;;;;;;;-1:-1:-1;12069:169:0;;;;;:::i;:::-;;:::i;59111:513::-;;;;;;;;;;-1:-1:-1;59111:513:0;;;;;:::i;:::-;;:::i;:::-;;11022:108;;;;;;;;;;-1:-1:-1;11110:12:0;;11022:108;;62552:1602;;;;;;;;;;-1:-1:-1;62552:1602:0;;;;;:::i;:::-;;:::i;12720:492::-;;;;;;;;;;-1:-1:-1;12720:492:0;;;;;:::i;:::-;;:::i;31058:123::-;;;;;;;;;;-1:-1:-1;31058:123:0;;;;;:::i;:::-;31124:7;31151:12;;;:6;:12;;;;;:22;;;;31058:123;50928:36;;;;;;;;;;-1:-1:-1;50928:36:0;;;;;:::i;:::-;;:::i;31443:147::-;;;;;;;;;;-1:-1:-1;31443:147:0;;;;;:::i;:::-;;:::i;49771:55::-;;;;;;;;;;;;49820:6;49771:55;;10864:93;;;;;;;;;;-1:-1:-1;10864:93:0;;10947:2;25413:36:1;;25401:2;25386:18;10864:93:0;25368:87:1;32491:218:0;;;;;;;;;;-1:-1:-1;32491:218:0;;;;;:::i;:::-;;:::i;50387:28::-;;;;;;;;;;;;;;;;13621:215;;;;;;;;;;-1:-1:-1;13621:215:0;;;;;:::i;:::-;;:::i;55017:86::-;;;;;;;;;;;;;:::i;20846:::-;;;;;;;;;;-1:-1:-1;20917:7:0;;;;20846:86;;54372:204;;;;;;;;;;-1:-1:-1;54372:204:0;;;;;:::i;:::-;;:::i;61136:576::-;;;;;;;;;;-1:-1:-1;61136:576:0;;;;;:::i;:::-;;:::i;11193:127::-;;;;;;;;;;-1:-1:-1;11193:127:0;;;;;:::i;:::-;11294:18;;11267:7;11294:18;;;;;;;;;;;;11193:127;60444:556;;;;;;;;;;-1:-1:-1;60444:556:0;;;;;:::i;:::-;;:::i;59805:500::-;;;;;;;;;;-1:-1:-1;59805:500:0;;;;;:::i;:::-;;:::i;50064:39::-;;;;;;;;;;-1:-1:-1;50064:39:0;;;;;;;;;;;9410:42:1;9398:55;;;9380:74;;9368:2;9353:18;50064:39:0;9335:125:1;54015:214:0;;;;;;;;;;-1:-1:-1;54015:214:0;;;;;:::i;:::-;;:::i;54860:82::-;;;;;;;;;;;;;:::i;51336:53::-;;;;;;;;;;-1:-1:-1;51336:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;49835:45;;;;;;;;;;;;49874:6;49835:45;;55159:278;;;;;;;;;;-1:-1:-1;55159:278:0;;;;;:::i;:::-;;:::i;51531:49::-;;;;;;;;;;-1:-1:-1;51531:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;29943:139;;;;;;;;;;-1:-1:-1;29943:139:0;;;;;:::i;:::-;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;;;;29943:139;61896:514;;;;;;;;;;-1:-1:-1;61896:514:0;;;;;:::i;:::-;;:::i;10121:104::-;;;;;;;;;;;;;:::i;49956:44::-;;;;;;;;;;;;49994:6;49956:44;;64944:598;;;;;;;;;;-1:-1:-1;64944:598:0;;;;;:::i;:::-;;:::i;27921:49::-;;;;;;;;;;-1:-1:-1;27921:49:0;27966:4;27921:49;;14339:413;;;;;;;;;;-1:-1:-1;14339:413:0;;;;;:::i;:::-;;:::i;11533:175::-;;;;;;;;;;-1:-1:-1;11533:175:0;;;;;:::i;:::-;;:::i;50273:30::-;;;;;;;;;;-1:-1:-1;50273:30:0;;;;;;;;51042:40;;;;;;;;;;;;;;;;55861:1247;;;;;;:::i;:::-;;:::i;49464:66::-;;;;;;;;;;;;49504:26;49464:66;;50732:28;;;;;;;;;;-1:-1:-1;50732:28:0;;;;;:::i;:::-;;:::i;54643:144::-;;;;;;;;;;;;;:::i;49674:49::-;;;;;;;;;;;;49718:5;49674:49;;31835:149;;;;;;;;;;-1:-1:-1;31835:149:0;;;;;:::i;:::-;;:::i;11771:151::-;;;;;;;;;;-1:-1:-1;11771:151:0;;;;;:::i;:::-;11887:18;;;;11860:7;11887:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11771:151;57527:1066;;;;;;;;;;-1:-1:-1;57527:1066:0;;;;;:::i;:::-;;:::i;65731:210::-;;;;;;;;;;-1:-1:-1;65731:210:0;;;;;:::i;:::-;;:::i;49395:62::-;;;;;;;;;;;;49433:24;49395:62;;51157:55;;;;;;;;;;-1:-1:-1;51157:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;64326:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64561:129::-;64627:16;64663:19;64656:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64561:129;:::o;29647:204::-;29732:4;29756:47;;;29771:32;29756:47;;:87;;-1:-1:-1;25589:25:0;25574:40;;;;29807:36;29749:94;29647:204;-1:-1:-1;;29647:204:0:o;9902:100::-;9956:13;9989:5;9982:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9982:12:0;;9902:100;-1:-1:-1;;;;;9902:100:0:o;12069:169::-;12152:4;12169:39;678:10;12192:7;12201:6;12169:8;:39::i;:::-;-1:-1:-1;12226:4:0;12069:169;;;;:::o;59111:513::-;49576:25;29525:30;49576:25;678:10;29525;:30::i;:::-;59214:34:::1;59251:54;59290:14;59251:38;:54::i;:::-;59214:91;;59323:9;59318:172;59342:17;:24;59338:1;:28;59318:172;;;59388:90;678:10:::0;59428:12:::1;59450:4;59457:17;59475:1;59457:20;;;;;;;;:::i;:::-;;;;;;;59395:11;59407:1;59395:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;59388:90;;:39:::1;:90::i;:::-;59368:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59318:172;;;-1:-1:-1::0;59502:35:0::1;678:10:::0;59522:14:::1;59502:5;:35::i;:::-;59555:61;::::0;12267:25:1;;;678:10:0;;59580:4:::1;::::0;59555:61:::1;::::0;12255:2:1;12240:18;59555:61:0::1;;;;;;;;59203:421;59111:513:::0;;:::o;62552:1602::-;62663:21;49504:26;29525:30;49504:26;678:10;29525;:30::i;:::-;62729:19:::1;:26:::0;62705:20;;:50:::1;62697:74;;;::::0;::::1;::::0;;22245:2:1;62697:74:0::1;::::0;::::1;22227:21:1::0;22284:2;22264:18;;;22257:30;22323:13;22303:18;;;22296:41;22354:18;;62697:74:0::1;;;;;;;;;62803:11;:18:::0;62789:33:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62789:33:0::1;-1:-1:-1::0;62866:16:0::1;::::0;62941:24:::1;::::0;62782:40;;-1:-1:-1;62866:16:0;62835:28:::1;::::0;62941:24:::1;;62929:76;62866:16:::0;63020:13:::1;11110:12:::0;;;11022:108;63020:13:::1;:36;;;;:::i;:::-;62929:166;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;24344:25:1::0;;;;63079:4:0::1;24385:18:1::0;;;24378:83;24317:18;;62929:166:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;63106:35:::0;;62893:202;;-1:-1:-1;63106:35:0::1;::::0;:19:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;:::-;;63152:33;63188:76;63243:20;63227:13;11110:12:::0;;;11022:108;63227:13:::1;:36;;;;:::i;63188:76::-;63152:112;;63275:24;63302:60;63341:20;63302:38;:60::i;:::-;63275:87;;63380:9;63375:692;63399:11;:18:::0;63395:22;::::1;63375:692;;;63439:11;63453;63465:1;63453:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;63501:16:::0;;;:11:::1;:16:::0;;;;;;;;63488:10;;63453:14;;-1:-1:-1;63501:16:0;63488:7;;63496:1;;63488:10;::::1;;;;;:::i;:::-;;;;;;;:29;63484:161;;;63561:16;::::0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;63548:10;;:7;;63556:1;;63548:10;::::1;;;;;:::i;:::-;;;;;;;:29;;;;:::i;:::-;63538:4;63543:1;63538:7;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;63484:161;;;63628:1;63618:4;63623:1;63618:7;;;;;;;;:::i;:::-;;;;;;:11;;;::::0;::::1;63484:161;63678:7;63686:1;63678:10;;;;;;;;:::i;:::-;;;;;;;63659:11;:16;63671:3;63659:16;;;;;;;;;;;;;;;:29;;;;63731:16;63748:1;63731:19;;;;;;;;:::i;:::-;;;;;;;63709:16;63726:1;63709:19;;;;;;;;:::i;:::-;;;;;;;:41;63705:351;;;63771:81;678:10:::0;63832:16:::1;63849:1;63832:19;;;;;;;;:::i;:::-;;;;;;;63810:16;63827:1;63810:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;:::i;:::-;63771:24;::::0;::::1;::::0;:81;:24:::1;:81::i;:::-;63705:351;;;63900:16;63917:1;63900:19;;;;;;;;:::i;:::-;;;;;;;63878:16;63895:1;63878:19;;;;;;;;:::i;:::-;;;;;;;:41;63874:182;;;63940:100;678:10:::0;63991:4:::1;64020:16;64037:1;64020:19;;;;;;;;:::i;:::-;;;;;;;63998:16;64015:1;63998:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;:::i;:::-;63940:28;::::0;::::1;::::0;:100;;:28:::1;:100::i;:::-;-1:-1:-1::0;63419:3:0;::::1;::::0;::::1;:::i;:::-;;;;63375:692;;;-1:-1:-1::0;64082:64:0::1;::::0;678:10;;64111:4:::1;::::0;64082:64:::1;::::0;::::1;::::0;64132:13;;64082:64:::1;:::i;:::-;;;;;;;;62686:1468;;;;62552:1602:::0;;;;:::o;12720:492::-;12860:4;12877:36;12887:6;12895:9;12906:6;12877:9;:36::i;:::-;12953:19;;;12926:24;12953:19;;;:11;:19;;;;;;;;678:10;12953:33;;;;;;;;13005:26;;;;12997:79;;;;;;;18800:2:1;12997:79:0;;;18782:21:1;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;18949:10;18929:18;;;18922:38;18977:19;;12997:79:0;18772:230:1;12997:79:0;13112:57;13121:6;678:10;13162:6;13143:16;:25;13112:8;:57::i;:::-;13200:4;13193:11;;;12720:492;;;;;;:::o;50928:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50928:36:0;:::o;31443:147::-;31124:7;31151:12;;;:6;:12;;;;;:22;;;29525:30;29536:4;678:10;29525;:30::i;:::-;31557:25:::1;31568:4;31574:7;31557:10;:25::i;:::-;31443:147:::0;;;:::o;32491:218::-;32587:23;;;678:10;32587:23;32579:83;;;;;;;23414:2:1;32579:83:0;;;23396:21:1;23453:2;23433:18;;;23426:30;23492:34;23472:18;;;23465:62;23563:17;23543:18;;;23536:45;23598:19;;32579:83:0;23386:237:1;32579:83:0;32675:26;32687:4;32693:7;32675:11;:26::i;:::-;32491:218;;:::o;13621:215::-;678:10;13709:4;13758:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;13709:4;;13726:80;;13749:7;;13758:47;;13795:10;;13758:47;:::i;:::-;13726:8;:80::i;55017:86::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;55085:10:::1;:8;:10::i;:::-;55017:86:::0;:::o;54372:204::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54479:26:::1;::::0;::::1;54471:56;;;::::0;::::1;::::0;;18454:2:1;54471:56:0::1;::::0;::::1;18436:21:1::0;18493:2;18473:18;;;18466:30;18532:19;18512:18;;;18505:47;18569:18;;54471:56:0::1;18426:167:1::0;54471:56:0::1;-1:-1:-1::0;54538:15:0::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;54372:204::o;61136:576::-;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;61243:25:::1;61271:54;61310:14;61271:38;:54::i;:::-;61243:82;;61358:14;61338:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61388:9:0::1;::::0;-1:-1:-1;61383:214:0::1;61407:11;:18:::0;61403:22;::::1;61383:214;;;61478:8;61487:1;61478:11;;;;;;;;:::i;:::-;;;;;;;61447;:27;61459:11;61471:1;61459:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;61447:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;61459:14;61447:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;61504:81:0::1;::::0;-1:-1:-1;678:10:0;61544:12:::1;598:98:::0;61504:81:::1;61427:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61383:214;;;-1:-1:-1::0;61614:90:0::1;::::0;678:10;;61645:4:::1;::::0;61614:90:::1;::::0;::::1;::::0;61666:14;;61682:8;;61692:11:::1;::::0;61614:90:::1;:::i;60444:556::-:0;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;60551:25:::1;60579:54;60618:14;60579:38;:54::i;:::-;60551:82;;60666:14;60646:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60696:9:0::1;::::0;-1:-1:-1;60691:195:0::1;60715:11;:18:::0;60711:22;::::1;60691:195;;;60786:8;60795:1;60786:11;;;;;;;;:::i;:::-;;;;;;;60755;:27;60767:11;60779:1;60767:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;60755:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;60767:14;60755:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;60812:62:0::1;::::0;-1:-1:-1;678:10:0;60848:12:::1;60862:8;60871:1;60862:11;;;;;;;;:::i;:::-;;;;;;;60819;60831:1;60819:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;60812:62;:35:::1;:62::i;:::-;60735:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60691:195;;;-1:-1:-1::0;60903:89:0::1;::::0;678:10;;60933:4:::1;::::0;60903:89:::1;::::0;::::1;::::0;60954:14;;60970:8;;60980:11:::1;::::0;60903:89:::1;:::i;59805:500::-:0;49576:25;29525:30;49576:25;678:10;29525;:30::i;:::-;59911:34:::1;59948:54;59987:14;59948:38;:54::i;:::-;59911:91:::0;-1:-1:-1;60015:35:0::1;678:10:::0;60035:14:::1;60015:5;:35::i;:::-;60068:9;60063:153;60087:17;:24;60083:1;:28;60063:153;;;60133:71;678:10:::0;60169:12:::1;598:98:::0;60133:71:::1;60113:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60063:153;;;-1:-1:-1::0;60233:64:0::1;::::0;12267:25:1;;;678:10:0;;60261:4:::1;::::0;60233:64:::1;::::0;12255:2:1;12240:18;60233:64:0::1;12222:76:1::0;54015:214:0;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;49874:6:::1;54124:15;:31;;54116:62;;;::::0;::::1;::::0;;21898:2:1;54116:62:0::1;::::0;::::1;21880:21:1::0;21937:2;21917:18;;;21910:30;21976:20;21956:18;;;21949:48;22014:18;;54116:62:0::1;21870:168:1::0;54116:62:0::1;-1:-1:-1::0;54189:14:0::1;:32:::0;54015:214::o;54860:82::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54926:8:::1;:6;:8::i;55159:278::-:0;55259:24;;;;678:10;55243:40;;;55235:68;;;;;;;15414:2:1;55235:68:0;;;15396:21:1;15453:2;15433:18;;;15426:30;15492:17;15472:18;;;15465:45;15527:18;;55235:68:0;15386:165:1;55235:68:0;55322:25;;;55314:66;;;;;;;20017:2:1;55314:66:0;;;19999:21:1;20056:2;20036:18;;;20029:30;20095;20075:18;;;20068:58;20143:18;;55314:66:0;19989:178:1;55314:66:0;55391:24;:38;;;;;;;;;;;;;;;55159:278::o;61896:514::-;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;62054:14:::1;62034:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62086:9:0::1;::::0;-1:-1:-1;62081:214:0::1;62105:11;:18:::0;62101:22;::::1;62081:214;;;62176:8;62185:1;62176:11;;;;;;;;:::i;:::-;;;;;;;62145;:27;62157:11;62169:1;62157:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;62145:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;62157:14;62145:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;62202:81:0::1;::::0;-1:-1:-1;678:10:0;62264:4:::1;62271:8;62280:1;62271:11;;;;;;;;:::i;62202:81::-;62125:3:::0;::::1;::::0;::::1;:::i;:::-;;;;62081:214;;;-1:-1:-1::0;62312:90:0::1;::::0;678:10;;62343:4:::1;::::0;62312:90:::1;::::0;::::1;::::0;62364:14;;62380:8;;62390:11:::1;::::0;62312:90:::1;:::i;10121:104::-:0;10177:13;10210:7;10203:14;;;;;:::i;64944:598::-;65126:11;:18;65046:16;;65075:34;;65112:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65112:33:0;;65075:70;;65161:9;65156:344;65180:11;:18;65176:22;;65156:344;;;49718:5;65261:19;65281:1;65261:22;;;;;;;;:::i;:::-;;;;;;;;;65244:14;:39;;;;:::i;:::-;65243:61;;;;:::i;:::-;65220:17;65238:1;65220:20;;;;;;;;:::i;:::-;;;;;;:84;;;;;65319:14;65351:11;65363:1;65351:14;;;;;;;;:::i;:::-;;;;;;;;;;;;65336:41;;;;;;;;65351:14;;;;;65336:39;;:41;;;;;;;;;;65351:14;65336:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65319:58;;65407:2;65396:8;:13;;;65392:97;;;65459:13;65464:8;65459:2;:13;:::i;:::-;65454:19;;:2;:19;:::i;:::-;65430:17;65448:1;65430:20;;;;;;;;:::i;:::-;;;;;;:43;;;;;;;:::i;:::-;;;-1:-1:-1;65392:97:0;-1:-1:-1;65200:3:0;;;;:::i;:::-;;;;65156:344;;;-1:-1:-1;65517:17:0;64944:598;-1:-1:-1;;64944:598:0:o;14339:413::-;678:10;14432:4;14476:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;14529:35;;;;14521:85;;;;;;;23008:2:1;14521:85:0;;;22990:21:1;23047:2;23027:18;;;23020:30;23086:34;23066:18;;;23059:62;23157:7;23137:18;;;23130:35;23182:19;;14521:85:0;22980:227:1;14521:85:0;14642:67;678:10;14665:7;14693:15;14674:16;:34;14642:8;:67::i;:::-;-1:-1:-1;14740:4:0;;14339:413;-1:-1:-1;;;14339:413:0:o;11533:175::-;11619:4;11636:42;678:10;11660:9;11671:6;11636:9;:42::i;55861:1247::-;55984:7;21172:8;20917:7;;;;;20846:86;21172:8;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;52050:25:::1;678:10:::0;52050:12:::1;:23;;35217:20:::0;35265:8;;;34894:387;52050:25:::1;52049:26;52041:64;;;::::0;::::1;::::0;;14657:2:1;52041:64:0::1;::::0;::::1;14639:21:1::0;14696:2;14676:18;;;14669:30;14735:27;14715:18;;;14708:55;14780:18;;52041:64:0::1;14629:175:1::0;52041:64:0::1;56028:21:::2;56060:47;56082:9;56093:13:::0;56060:21:::2;:47::i;:::-;56141:21;56118:20;56194:28;56141:21:::0;56194:13;:28:::2;:::i;:::-;56272:24;::::0;56260:82:::2;::::0;;;;56326:4:::2;56260:82;::::0;::::2;10374:74:1::0;10464:18;;;10457:34;;;56175:47:0;;-1:-1:-1;56235:22:0::2;::::0;56272:24:::2;::::0;;::::2;::::0;56260:57:::2;::::0;10347:18:1;;56260:82:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56235:107;;56353:17;56396:49;56413:14;56429:15;56396:16;:49::i;:::-;56373:20;56385:8:::0;56373:9:::2;:20;:::i;:::-;:72;;;;:::i;:::-;56353:92;;49994:6;56462:9;:23;56458:107;;;56502:51;678:10:::0;56528:12:::2;56543:9;56502:17;:51::i;:::-;56581:14;::::0;:18;56577:353:::2;;678:10:::0;56620:32:::2;::::0;;;:18:::2;:32;::::0;;;;;56655:15:::2;-1:-1:-1::0;56616:221:0::2;;;678:10:::0;56691:28:::2;::::0;;;:14:::2;:28;::::0;;;;:45;;56723:13;;56691:28;:45:::2;::::0;56723:13;;56691:45:::2;:::i;:::-;::::0;;;-1:-1:-1;56616:221:0::2;::::0;-1:-1:-1;56616:221:0::2;;678:10:::0;56777:28:::2;::::0;;;:14:::2;:28;::::0;;;;:44;;;56616:221:::2;56904:14;::::0;56886:32:::2;::::0;:15:::2;:32;:::i;:::-;678:10:::0;56851:32:::2;::::0;;;:18:::2;:32;::::0;;;;:67;56577:353:::2;56942:34;678:10:::0;56962:13:::2;56942:5;:34::i;:::-;56992:75;::::0;;25192:25:1;;;25248:2;25233:18;;25226:34;;;678:10:0;;57022:4:::2;::::0;56992:75:::2;::::0;25165:18:1;56992:75:0::2;;;;;;;-1:-1:-1::0;57087:13:0;;55861:1247;-1:-1:-1;;;;;;55861:1247:0:o;50732:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50732:28:0;:::o;54643:144::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54716:63:::1;678:10:::0;54757:21:::1;54716:17;:63::i;31835:149::-:0;31124:7;31151:12;;;:6;:12;;;;;:22;;;29525:30;29536:4;678:10;29525;:30::i;:::-;31950:26:::1;31962:4;31968:7;31950:11;:26::i;57527:1066::-:0;20917:7;;;;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;678:10;51751:25:::1;::::0;;;:18:::1;:25;::::0;;;;;57696:14;;51779:15:::1;-1:-1:-1::0;51747:234:0::1;;;51876:21;::::0;::::1;51811;51876::::0;;;:14:::1;:21;::::0;;;;;;51835:38;;;;;::::1;::::0;::::1;9380:74:1::0;;;;51811:21:0;;51850:4:::1;::::0;51835:31:::1;::::0;9353:18:1;;51835:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;51811:86;;51937:7;51920:13;:24;;51912:57;;;::::0;::::1;::::0;;17760:2:1;51912:57:0::1;::::0;::::1;17742:21:1::0;17799:2;17779:18;;;17772:30;17838:22;17818:18;;;17811:50;17878:18;;51912:57:0::1;17732:170:1::0;51912:57:0::1;51796:185;51747:234;52050:25:::2;678:10:::0;52050:12:::2;598:98:::0;52050:25:::2;52049:26;52041:64;;;::::0;::::2;::::0;;14657:2:1;52041:64:0::2;::::0;::::2;14639:21:1::0;14696:2;14676:18;;;14669:30;14735:27;14715:18;;;14708:55;14780:18;;52041:64:0::2;14629:175:1::0;52041:64:0::2;57773:1:::3;57756:14;:18;:63;;;;-1:-1:-1::0;57796:23:0::3;678:10:::0;57806:12:::3;598:98:::0;57796:23:::3;57778:14;:41;;57756:63;57748:94;;;::::0;::::3;::::0;;13961:2:1;57748:94:0::3;::::0;::::3;13943:21:1::0;14000:2;13980:18;;;13973:30;14039:20;14019:18;;;14012:48;14077:18;;57748:94:0::3;13933:168:1::0;57748:94:0::3;57853:35;678:10:::0;57873:14:::3;57853:5;:35::i;:::-;57901:34;57938:54;57977:14;57938:38;:54::i;:::-;57901:91:::0;-1:-1:-1;58029:21:0::3;58061:40;57901:91:::0;58061:21:::3;:40::i;:::-;58135:21;58112:20;58192:28;58207:13:::0;58135:21;58192:28:::3;:::i;:::-;58268:24;::::0;58256:85:::3;::::0;;;;58321:4:::3;58256:85;::::0;::::3;10374:74:1::0;10464:18;;;10457:34;;;58169:51:0;;-1:-1:-1;58231:22:0::3;::::0;58268:24:::3;::::0;;::::3;::::0;58256:56:::3;::::0;10347:18:1;;58256:85:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58231:110;;58352:17;58387:49;58404:14;58420:15;58387:16;:49::i;:::-;58372:64;::::0;:12;:64:::3;:::i;:::-;58352:84:::0;-1:-1:-1;58449:51:0::3;678:10:::0;58475:12:::3;598:98:::0;58449:51:::3;58516:69;::::0;12267:25:1;;;678:10:0;;58549:4:::3;::::0;58516:69:::3;::::0;12255:2:1;12240:18;58516:69:0::3;;;;;;;57737:856;;;;;;21212:1:::1;;57527:1066:::0;;:::o;65731:210::-;65902:31;;;65821:7;65902:31;;;:11;:31;;;;;;;65848:51;;;;;65893:4;65848:51;;;9380:74:1;65821:7:0;;65902:31;;65848:36;;9353:18:1;;65848:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;;;;:::i;64326:113::-;64384:16;64420:11;64413:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64326:113;:::o;18023:380::-;18159:19;;;18151:68;;;;;;;20374:2:1;18151:68:0;;;20356:21:1;20413:2;20393:18;;;20386:30;20452:34;20432:18;;;20425:62;20523:6;20503:18;;;20496:34;20547:19;;18151:68:0;20346:226:1;18151:68:0;18238:21;;;18230:68;;;;;;;15758:2:1;18230:68:0;;;15740:21:1;15797:2;15777:18;;;15770:30;15836:34;15816:18;;;15809:62;15907:4;15887:18;;;15880:32;15929:19;;18230:68:0;15730:224:1;18230:68:0;18311:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18363:32;;12267:25:1;;;18363:32:0;;12240:18:1;18363:32:0;12222:76:1;30372:497:0;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;30448:414;;30641:41;30669:7;30641:41;;30679:2;30641:19;:41::i;:::-;30755:38;30783:4;30790:2;30755:19;:38::i;:::-;30546:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;30492:358;;;;;;;;:::i;5493:248::-;5664:68;;10009:42:1;10078:15;;;5664:68:0;;;10060:34:1;10130:15;;10110:18;;;10103:43;10162:18;;;10155:34;;;5637:96:0;;5657:5;;5687:27;;9972:18:1;;5664:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5637:19;:96::i;:::-;5493:248;;;;:::o;16262:399::-;16346:21;;;16338:65;;;;;;;23830:2:1;16338:65:0;;;23812:21:1;23869:2;23849:18;;;23842:30;23908:33;23888:18;;;23881:61;23959:18;;16338:65:0;23802:181:1;16338:65:0;16416:49;16445:1;16449:7;16458:6;16416:20;:49::i;:::-;16494:6;16478:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;16511:18:0;;;:9;:18;;;;;;;;;;:28;;16533:6;;16511:9;:28;;16533:6;;16511:28;:::i;:::-;;;;-1:-1:-1;;16555:37:0;;12267:25:1;;;16555:37:0;;;;16572:1;;16555:37;;12255:2:1;12240:18;16555:37:0;;;;;;;32491:218;;:::o;5274:211::-;5418:58;;10404:42:1;10392:55;;5418:58:0;;;10374:74:1;10464:18;;;10457:34;;;5391:86:0;;5411:5;;5441:23;;10347:18:1;;5418:58:0;10329:168:1;15242:733:0;15382:20;;;15374:70;;;;;;;19611:2:1;15374:70:0;;;19593:21:1;19650:2;19630:18;;;19623:30;19689:34;19669:18;;;19662:62;19760:7;19740:18;;;19733:35;19785:19;;15374:70:0;19583:227:1;15374:70:0;15463:23;;;15455:71;;;;;;;13557:2:1;15455:71:0;;;13539:21:1;13596:2;13576:18;;;13569:30;13635:34;13615:18;;;13608:62;13706:5;13686:18;;;13679:33;13729:19;;15455:71:0;13529:225:1;15455:71:0;15539:47;15560:6;15568:9;15579:6;15539:20;:47::i;:::-;15623:17;;;15599:21;15623:17;;;;;;;;;;;15659:23;;;;15651:74;;;;;;;16161:2:1;15651:74:0;;;16143:21:1;16200:2;16180:18;;;16173:30;16239:34;16219:18;;;16212:62;16310:8;16290:18;;;16283:36;16336:19;;15651:74:0;16133:228:1;15651:74:0;15761:17;;;;:9;:17;;;;;;;;;;;15781:22;;;15761:42;;15825:20;;;;;;;;:30;;15797:6;;15761:9;15825:30;;15797:6;;15825:30;:::i;:::-;;;;;;;;15890:9;15873:35;;15882:6;15873:35;;;15901:6;15873:35;;;;12267:25:1;;12255:2;12240:18;;12222:76;15873:35:0;;;;;;;;15921:46;31443:147;33739:229;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;33809:152;;33853:12;;;;:6;:12;;;;;;;;:29;;;;;;;;;;:36;;;;33885:4;33853:36;;;33936:12;678:10;;598:98;33936:12;33909:40;;33927:7;33909:40;;33921:4;33909:40;;;;;;;;;;33739:229;;:::o;33976:230::-;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;34047:152;;;34122:5;34090:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;:37;;;;;;34147:40;678:10;;34090:12;;34147:40;;34122:5;34147:40;33976:230;;:::o;21905:120::-;20917:7;;;;21441:41;;;;;;;14308:2:1;21441:41:0;;;14290:21:1;14347:2;14327:18;;;14320:30;14386:22;14366:18;;;14359:50;14426:18;;21441:41:0;14280:170:1;21441:41:0;21964:7:::1;:15:::0;;;::::1;::::0;;21995:22:::1;678:10:::0;22004:12:::1;21995:22;::::0;9410:42:1;9398:55;;;9380:74;;9368:2;9353:18;21995:22:0::1;;;;;;;21905:120::o:0;16994:591::-;17078:21;;;17070:67;;;;;;;19209:2:1;17070:67:0;;;19191:21:1;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;19358:3;19338:18;;;19331:31;19379:19;;17070:67:0;19181:223:1;17070:67:0;17150:49;17171:7;17188:1;17192:6;17150:20;:49::i;:::-;17237:18;;;17212:22;17237:18;;;;;;;;;;;17274:24;;;;17266:71;;;;;;;15011:2:1;17266:71:0;;;14993:21:1;15050:2;15030:18;;;15023:30;15089:34;15069:18;;;15062:62;15160:4;15140:18;;;15133:32;15182:19;;17266:71:0;14983:224:1;17266:71:0;17373:18;;;:9;:18;;;;;;;;;;17394:23;;;17373:44;;17439:12;:22;;17411:6;;17373:9;17439:22;;17411:6;;17439:22;:::i;:::-;;;;-1:-1:-1;;17479:37:0;;12267:25:1;;;17505:1:0;;17479:37;;;;;;12255:2:1;12240:18;17479:37:0;;;;;;;31443:147;;;:::o;21646:118::-;20917:7;;;;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;21706:7:::1;:14:::0;;;::::1;21716:4;21706:14;::::0;;21736:20:::1;21743:12;678:10:::0;;598:98;67120:1116;67245:24;;67233:61;;;;;67288:4;67233:61;;;9380:74:1;67215:15:0;;67245:24;;;67233:46;;9353:18:1;;67233:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67412:24;;67400:101;;;;;67479:4;67400:101;;;10374:74:1;10464:18;;;10457:34;;;67215:79:0;;-1:-1:-1;67308:34:0;;;;;;67412:24;;;;;67400:70;;10347:18:1;;67400:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67307:194;;;;;;;67536:13;67522:10;:27;;67514:61;;;;;;;21137:2:1;67514:61:0;;;21119:21:1;21176:2;21156:18;;;21149:30;21215:23;21195:18;;;21188:51;21256:18;;67514:61:0;21109:171:1;67514:61:0;67593:9;67588:641;67612:11;:18;67608:22;;67588:641;;;67727:17;67745:1;67727:20;;;;;;;;:::i;:::-;;;;;;;67681:11;67693:1;67681:14;;;;;;;;:::i;:::-;;;;;;;;;;;67707:15;;67674:49;;;;;67681:14;67707:15;;;67674:49;;;9380:74:1;67681:14:0;;;67674:32;;9353:18:1;;67674:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;:182;;;;;67836:17;67854:1;67836:20;;;;;;;;:::i;:::-;;;;;;;67775:11;67787:1;67775:14;;;;;;;;:::i;:::-;;;;;;;;;;;67801:15;;67768:64;;;;;67775:14;67801:15;;;67768:64;;;9700:34:1;67826:4:0;9750:18:1;;;9743:43;67775:14:0;;;67768:32;;9612:18:1;;67768:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;67674:182;67652:566;;;67931:15;;67963:20;;67891:93;;67931:15;;;67956:4;;67963:17;;67981:1;;67963:20;;;;;;:::i;67891:93::-;68029:15;;68047:13;;68003:58;;68029:15;;;68047:10;;68058:1;;68047:13;;;;;;:::i;:::-;;;;;;;68003:17;:58::i;:::-;67652:566;;;68114:7;68102:40;;;68150:10;68161:1;68150:13;;;;;;;;:::i;:::-;;;;;;;68165:11;68177:1;68165:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;68181:17;68199:1;68181:20;;;;;;;;:::i;:::-;;;;;;;68102:100;;;;;;;;;;;;;;;10404:42:1;10392:55;;;;10374:74;;10479:2;10464:18;;10457:34;10362:2;10347:18;;10329:168;68102:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67652:566;67632:3;;;;:::i;:::-;;;;67588:641;;;;67204:1032;;;;67120:1116;;:::o;66383:631::-;66473:7;66497:19;;66493:495;;66537:15;66533:444;;;66599:15;;66573:59;;66599:15;;66617:14;66573:17;:59::i;:::-;-1:-1:-1;66658:14:0;66651:21;;66533:444;66778:24;;66766:69;;;;;66829:4;66766:69;;;9380:74:1;66713:22:0;;66778:24;;;66766:54;;9353:18:1;;66766:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66739:23;:14;66756:6;66739:23;:::i;:::-;66738:97;;;;:::i;:::-;66713:122;-1:-1:-1;66854:80:0;678:10;66902:15;;66854:16;;66902:15;66854:16;;;;:80;66902:15;66919:14;66854:33;:80::i;:::-;66960:1;66953:8;;;;;66533:444;-1:-1:-1;67005:1:0;66383:631;;;;:::o;36216:317::-;36331:6;36306:21;:31;;36298:73;;;;;;;16995:2:1;36298:73:0;;;16977:21:1;17034:2;17014:18;;;17007:30;17073:31;17053:18;;;17046:59;17122:18;;36298:73:0;16967:179:1;36298:73:0;36385:12;36403:9;:14;;36425:6;36403:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:52;;;36455:7;36447:78;;;;;;;16568:2:1;36447:78:0;;;16550:21:1;16607:2;16587:18;;;16580:30;16646:34;16626:18;;;16619:62;16717:28;16697:18;;;16690:56;16763:19;;36447:78:0;16540:248:1;68367:482:0;68485:24;;68473:61;;;;;68528:4;68473:61;;;9380:74:1;68455:15:0;;68485:24;;;68473:46;;9353:18:1;;68473:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68455:79;;68550:9;68545:210;68569:18;:25;68565:1;:29;68545:210;;;68616:46;68651:7;68660:1;68623:11;68635:1;68623:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;68616:46;:34;:46::i;:::-;68677:66;68712:7;68721:18;68740:1;68721:21;;;;;;;;:::i;:::-;;;;;;;68684:11;68696:1;68684:14;;;;;;;;:::i;68677:66::-;68596:3;;;;:::i;:::-;;;;68545:210;;;-1:-1:-1;68767:74:0;;;;;:41;;;;;;:74;;68809:18;;68829:11;;68767:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68444:405;68367:482;:::o;23559:451::-;23634:13;23660:19;23692:10;23696:6;23692:1;:10;:::i;:::-;:14;;23705:1;23692:14;:::i;:::-;23682:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23682:25:0;;23660:47;;23718:15;:6;23725:1;23718:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;23744;:6;23751:1;23744:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;23775:9:0;23787:10;23791:6;23787:1;:10;:::i;:::-;:14;;23800:1;23787:14;:::i;:::-;23775:26;;23770:135;23807:1;23803;:5;23770:135;;;23842:12;23855:5;23863:3;23855:11;23842:25;;;;;;;:::i;:::-;;;;23830:6;23837:1;23830:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;23892:1:0;23882:11;;;;;23810:3;;;:::i;:::-;;;23770:135;;;-1:-1:-1;23923:10:0;;23915:55;;;;;;;13196:2:1;23915:55:0;;;13178:21:1;;;13215:18;;;13208:30;13274:34;13254:18;;;13247:62;13326:18;;23915:55:0;13168:182:1;7847:716:0;8271:23;8297:69;8325:4;8297:69;;;;;;;;;;;;;;;;;8305:5;8297:27;;;;:69;;;;;:::i;:::-;8381:17;;8271:95;;-1:-1:-1;8381:21:0;8377:179;;8478:10;8467:30;;;;;;;;;;;;:::i;:::-;8459:85;;;;;;;21487:2:1;8459:85:0;;;21469:21:1;21526:2;21506:18;;;21499:30;21565:34;21545:18;;;21538:62;21636:12;21616:18;;;21609:40;21666:19;;8459:85:0;21459:232:1;58679:160:0;51751:25;;;;;;;:18;:25;;;;;;58823:4;;58829:6;;51779:15;-1:-1:-1;51747:234:0;;;51876:21;;;51811;51876;;;:14;:21;;;;;;;51835:38;;;;;;;;9380:74:1;;;;51811:21:0;;51850:4;;51835:31;;9353:18:1;;51835:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;51811:86;;51937:7;51920:13;:24;;51912:57;;;;;;;17760:2:1;51912:57:0;;;17742:21:1;17799:2;17779:18;;;17772:30;17838:22;17818:18;;;17811:50;17878:18;;51912:57:0;17732:170:1;51747:234:0;58679:160;;;;;:::o;6010:616::-;6374:10;;;6373:62;;-1:-1:-1;6390:39:0;;;;;6414:4;6390:39;;;9700:34:1;6390:15:0;9770::1;;;9750:18;;;9743:43;6390:15:0;;;;;9612:18:1;;6390:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;6373:62;6351:166;;;;;;;22585:2:1;6351:166:0;;;22567:21:1;22624:2;22604:18;;;22597:30;22663:34;22643:18;;;22636:62;22734:24;22714:18;;;22707:52;22776:19;;6351:166:0;22557:244:1;6351:166:0;6555:62;;10404:42:1;10392:55;;6555:62:0;;;10374:74:1;10464:18;;;10457:34;;;6528:90:0;;6548:5;;6578:22;;10347:18:1;;6555:62:0;10329:168:1;37700:229:0;37837:12;37869:52;37891:6;37899:4;37905:1;37908:12;37869:21;:52::i;:::-;37862:59;37700:229;-1:-1:-1;;;;37700:229:0:o;38820:511::-;38990:12;39048:5;39023:21;:30;;39015:81;;;;;;;17353:2:1;39015:81:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:34;17411:18;;;17404:62;17502:8;17482:18;;;17475:36;17528:19;;39015:81:0;17325:228:1;39015:81:0;35217:20;;39107:60;;;;;;;20779:2:1;39107:60:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:31;20837:18;;;20830:59;20906:18;;39107:60:0;20751:179:1;39107:60:0;39181:12;39195:23;39222:6;:11;;39241:5;39248:4;39222:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39180:73;;;;39271:52;39289:7;39298:10;39310:12;39271:17;:52::i;:::-;39264:59;38820:511;-1:-1:-1;;;;;;;38820:511:0:o;41289:712::-;41439:12;41468:7;41464:530;;;-1:-1:-1;41499:10:0;41492:17;;41464:530;41613:17;;:21;41609:374;;41811:10;41805:17;41872:15;41859:10;41855:2;41851:19;41844:44;41609:374;41954:12;41947:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:673:1;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;139:1;136;129:12;88:2;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:2;;;463:1;460;453:12;406:2;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;78:609;-1:-1:-1;;;;;;;78:609:1:o;692:670::-;757:5;810:3;803:4;795:6;791:17;787:27;777:2;;828:1;825;818:12;777:2;857:6;851:13;883:4;907:60;923:43;963:2;923:43;:::i;907:60::-;989:3;1013:2;1008:3;1001:15;1041:2;1036:3;1032:12;1025:19;;1076:2;1068:6;1064:15;1128:3;1123:2;1117;1114:1;1110:10;1102:6;1098:23;1094:32;1091:41;1088:2;;;1145:1;1142;1135:12;1088:2;1167:1;1177:156;1191:2;1188:1;1185:9;1177:156;;;1248:10;;1236:23;;1279:12;;;;1311;;;;1209:1;1202:9;1177:156;;1367:247;1426:6;1479:2;1467:9;1458:7;1454:23;1450:32;1447:2;;;1495:1;1492;1485:12;1447:2;1534:9;1521:23;1553:31;1578:5;1553:31;:::i;1619:251::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:2;;;1758:1;1755;1748:12;1710:2;1790:9;1784:16;1809:31;1834:5;1809:31;:::i;1875:388::-;1943:6;1951;2004:2;1992:9;1983:7;1979:23;1975:32;1972:2;;;2020:1;2017;2010:12;1972:2;2059:9;2046:23;2078:31;2103:5;2078:31;:::i;:::-;2128:5;-1:-1:-1;2185:2:1;2170:18;;2157:32;2198:33;2157:32;2198:33;:::i;:::-;2250:7;2240:17;;;1962:301;;;;;:::o;2268:456::-;2345:6;2353;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:2;;;2430:1;2427;2420:12;2382:2;2469:9;2456:23;2488:31;2513:5;2488:31;:::i;:::-;2538:5;-1:-1:-1;2595:2:1;2580:18;;2567:32;2608:33;2567:32;2608:33;:::i;:::-;2372:352;;2660:7;;-1:-1:-1;;;2714:2:1;2699:18;;;;2686:32;;2372:352::o;2729:315::-;2797:6;2805;2858:2;2846:9;2837:7;2833:23;2829:32;2826:2;;;2874:1;2871;2864:12;2826:2;2913:9;2900:23;2932:31;2957:5;2932:31;:::i;:::-;2982:5;3034:2;3019:18;;;;3006:32;;-1:-1:-1;;;2816:228:1:o;3049:348::-;3133:6;3186:2;3174:9;3165:7;3161:23;3157:32;3154:2;;;3202:1;3199;3192:12;3154:2;3242:9;3229:23;3275:18;3267:6;3264:30;3261:2;;;3307:1;3304;3297:12;3261:2;3330:61;3383:7;3374:6;3363:9;3359:22;3330:61;:::i;3402:363::-;3497:6;3550:2;3538:9;3529:7;3525:23;3521:32;3518:2;;;3566:1;3563;3556:12;3518:2;3599:9;3593:16;3632:18;3624:6;3621:30;3618:2;;;3664:1;3661;3654:12;3618:2;3687:72;3751:7;3742:6;3731:9;3727:22;3687:72;:::i;3770:737::-;3917:6;3925;3933;3941;3994:3;3982:9;3973:7;3969:23;3965:33;3962:2;;;4011:1;4008;4001:12;3962:2;4044:9;4038:16;4073:18;4114:2;4106:6;4103:14;4100:2;;;4130:1;4127;4120:12;4100:2;4153:72;4217:7;4208:6;4197:9;4193:22;4153:72;:::i;:::-;4143:82;;4271:2;4260:9;4256:18;4250:25;4234:41;;4300:2;4290:8;4287:16;4284:2;;;4316:1;4313;4306:12;4284:2;;4339:74;4405:7;4394:8;4383:9;4379:24;4339:74;:::i;:::-;4453:2;4438:18;;4432:25;4497:2;4482:18;;;4476:25;3952:555;;4329:84;;-1:-1:-1;3952:555:1;-1:-1:-1;;;;3952:555:1:o;4512:416::-;4605:6;4613;4666:2;4654:9;4645:7;4641:23;4637:32;4634:2;;;4682:1;4679;4672:12;4634:2;4722:9;4709:23;4755:18;4747:6;4744:30;4741:2;;;4787:1;4784;4777:12;4741:2;4810:61;4863:7;4854:6;4843:9;4839:22;4810:61;:::i;:::-;4800:71;4918:2;4903:18;;;;4890:32;;-1:-1:-1;;;;4624:304:1:o;4933:245::-;5000:6;5053:2;5041:9;5032:7;5028:23;5024:32;5021:2;;;5069:1;5066;5059:12;5021:2;5101:9;5095:16;5120:28;5142:5;5120:28;:::i;5183:180::-;5242:6;5295:2;5283:9;5274:7;5270:23;5266:32;5263:2;;;5311:1;5308;5301:12;5263:2;-1:-1:-1;5334:23:1;;5253:110;-1:-1:-1;5253:110:1:o;5368:315::-;5436:6;5444;5497:2;5485:9;5476:7;5472:23;5468:32;5465:2;;;5513:1;5510;5503:12;5465:2;5549:9;5536:23;5526:33;;5609:2;5598:9;5594:18;5581:32;5622:31;5647:5;5622:31;:::i;5688:332::-;5746:6;5799:2;5787:9;5778:7;5774:23;5770:32;5767:2;;;5815:1;5812;5805:12;5767:2;5854:9;5841:23;5904:66;5897:5;5893:78;5886:5;5883:89;5873:2;;5986:1;5983;5976:12;6210:184;6280:6;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6349:1;6346;6339:12;6301:2;-1:-1:-1;6372:16:1;;6291:103;-1:-1:-1;6291:103:1:o;6399:309::-;6464:6;6472;6525:2;6513:9;6504:7;6500:23;6496:32;6493:2;;;6541:1;6538;6531:12;6493:2;6577:9;6564:23;6554:33;;6637:2;6626:9;6622:18;6609:32;6650:28;6672:5;6650:28;:::i;6713:273::-;6781:6;6834:2;6822:9;6813:7;6809:23;6805:32;6802:2;;;6850:1;6847;6840:12;6802:2;6882:9;6876:16;6932:4;6925:5;6921:16;6914:5;6911:27;6901:2;;6952:1;6949;6942:12;6991:518;7052:3;7090:5;7084:12;7117:6;7112:3;7105:19;7143:4;7172:2;7167:3;7163:12;7156:19;;7194:5;7191:1;7184:16;7236:2;7233:1;7223:16;7257:1;7267:217;7281:6;7278:1;7275:13;7267:217;;;7346:13;;7361:42;7342:62;7330:75;;7425:12;;;;7472:1;7460:14;;;;7296:9;7267:217;;;-1:-1:-1;7500:3:1;;7060:449;-1:-1:-1;;;;;7060:449:1:o;7514:435::-;7567:3;7605:5;7599:12;7632:6;7627:3;7620:19;7658:4;7687:2;7682:3;7678:12;7671:19;;7724:2;7717:5;7713:14;7745:1;7755:169;7769:6;7766:1;7763:13;7755:169;;;7830:13;;7818:26;;7864:12;;;;7899:15;;;;7791:1;7784:9;7755:169;;7954:274;8083:3;8121:6;8115:13;8137:53;8183:6;8178:3;8171:4;8163:6;8159:17;8137:53;:::i;:::-;8206:16;;;;;8091:137;-1:-1:-1;;8091:137:1:o;8443:786::-;8854:25;8849:3;8842:38;8824:3;8909:6;8903:13;8925:62;8980:6;8975:2;8970:3;8966:12;8959:4;8951:6;8947:17;8925:62;:::i;:::-;9051:19;9046:2;9006:16;;;9038:11;;;9031:40;9096:13;;9118:63;9096:13;9167:2;9159:11;;9152:4;9140:17;;9118:63;:::i;:::-;9201:17;9220:2;9197:26;;8832:397;-1:-1:-1;;;;8832:397:1:o;10502:681::-;10673:2;10725:21;;;10795:13;;10698:18;;;10817:22;;;10644:4;;10673:2;10896:15;;;;10870:2;10855:18;;;10644:4;10939:218;10953:6;10950:1;10947:13;10939:218;;;11018:13;;11033:42;11014:62;11002:75;;11132:15;;;;11097:12;;;;10975:1;10968:9;10939:218;;;-1:-1:-1;11174:3:1;;10653:530;-1:-1:-1;;;;;;10653:530:1:o;11188:261::-;11367:2;11356:9;11349:21;11330:4;11387:56;11439:2;11428:9;11424:18;11416:6;11387:56;:::i;11454:470::-;11708:2;11697:9;11690:21;11671:4;11734:56;11786:2;11775:9;11771:18;11763:6;11734:56;:::i;:::-;11838:9;11830:6;11826:22;11821:2;11810:9;11806:18;11799:50;11866:52;11911:6;11903;11866:52;:::i;:::-;11858:60;11680:244;-1:-1:-1;;;;;11680:244:1:o;12547:442::-;12696:2;12685:9;12678:21;12659:4;12728:6;12722:13;12771:6;12766:2;12755:9;12751:18;12744:34;12787:66;12846:6;12841:2;12830:9;12826:18;12821:2;12813:6;12809:15;12787:66;:::i;:::-;12905:2;12893:15;12910:66;12889:88;12874:104;;;;12980:2;12870:113;;12668:321;-1:-1:-1;;12668:321:1:o;24472:541::-;24754:6;24743:9;24736:25;24797:2;24792;24781:9;24777:18;24770:30;24717:4;24823:56;24875:2;24864:9;24860:18;24852:6;24823:56;:::i;:::-;24927:9;24919:6;24915:22;24910:2;24899:9;24895:18;24888:50;24955:52;25000:6;24992;24955:52;:::i;:::-;24947:60;24726:287;-1:-1:-1;;;;;;24726:287:1:o;25460:334::-;25531:2;25525:9;25587:2;25577:13;;25592:66;25573:86;25561:99;;25690:18;25675:34;;25711:22;;;25672:62;25669:2;;;25737:18;;:::i;:::-;25773:2;25766:22;25505:289;;-1:-1:-1;25505:289:1:o;25799:183::-;25859:4;25892:18;25884:6;25881:30;25878:2;;;25914:18;;:::i;:::-;-1:-1:-1;25959:1:1;25955:14;25971:4;25951:25;;25868:114::o;25987:128::-;26027:3;26058:1;26054:6;26051:1;26048:13;26045:2;;;26064:18;;:::i;:::-;-1:-1:-1;26100:9:1;;26035:80::o;26120:274::-;26160:1;26186;26176:2;;26221:77;26218:1;26211:88;26322:4;26319:1;26312:15;26350:4;26347:1;26340:15;26176:2;-1:-1:-1;26379:9:1;;26166:228::o;26399:482::-;26488:1;26531:5;26488:1;26545:330;26566:7;26556:8;26553:21;26545:330;;;26685:4;26617:66;26613:77;26607:4;26604:87;26601:2;;;26694:18;;:::i;:::-;26744:7;26734:8;26730:22;26727:2;;;26764:16;;;;26727:2;26843:22;;;;26803:15;;;;26545:330;;;26549:3;26463:418;;;;;:::o;26886:140::-;26944:5;26973:47;27014:4;27004:8;27000:19;26994:4;27080:5;27110:8;27100:2;;-1:-1:-1;27151:1:1;27165:5;;27100:2;27199:4;27189:2;;-1:-1:-1;27236:1:1;27250:5;;27189:2;27281:4;27299:1;27294:59;;;;27367:1;27362:130;;;;27274:218;;27294:59;27324:1;27315:10;;27338:5;;;27362:130;27399:3;27389:8;27386:17;27383:2;;;27406:18;;:::i;:::-;-1:-1:-1;;27462:1:1;27448:16;;27477:5;;27274:218;;27576:2;27566:8;27563:16;27557:3;27551:4;27548:13;27544:36;27538:2;27528:8;27525:16;27520:2;27514:4;27511:12;27507:35;27504:77;27501:2;;;-1:-1:-1;27613:19:1;;;27645:5;;27501:2;27692:34;27717:8;27711:4;27692:34;:::i;:::-;27822:6;27754:66;27750:79;27741:7;27738:92;27735:2;;;27833:18;;:::i;:::-;27871:20;;27090:807;-1:-1:-1;;;27090:807:1:o;27902:228::-;27942:7;28068:1;28000:66;27996:74;27993:1;27990:81;27985:1;27978:9;27971:17;27967:105;27964:2;;;28075:18;;:::i;:::-;-1:-1:-1;28115:9:1;;27954:176::o;28135:125::-;28175:4;28203:1;28200;28197:8;28194:2;;;28208:18;;:::i;:::-;-1:-1:-1;28245:9:1;;28184:76::o;28265:195::-;28303:4;28340;28337:1;28333:12;28372:4;28369:1;28365:12;28397:3;28392;28389:12;28386:2;;;28404:18;;:::i;:::-;28441:13;;;28312:148;-1:-1:-1;;;28312:148:1:o;28465:258::-;28537:1;28547:113;28561:6;28558:1;28555:13;28547:113;;;28637:11;;;28631:18;28618:11;;;28611:39;28583:2;28576:10;28547:113;;;28678:6;28675:1;28672:13;28669:2;;;-1:-1:-1;;28713:1:1;28695:16;;28688:27;28518:205::o;28728:196::-;28767:3;28795:5;28785:2;;28804:18;;:::i;:::-;-1:-1:-1;28851:66:1;28840:78;;28775:149::o;28929:437::-;29008:1;29004:12;;;;29051;;;29072:2;;29126:4;29118:6;29114:17;29104:27;;29072:2;29179;29171:6;29168:14;29148:18;29145:38;29142:2;;;29216:77;29213:1;29206:88;29317:4;29314:1;29307:15;29345:4;29342:1;29335:15;29142:2;;28984:382;;;:::o;29371:195::-;29410:3;29441:66;29434:5;29431:77;29428:2;;;29511:18;;:::i;:::-;-1:-1:-1;29558:1:1;29547:13;;29418:148::o;29571:184::-;29623:77;29620:1;29613:88;29720:4;29717:1;29710:15;29744:4;29741:1;29734:15;29760:184;29812:77;29809:1;29802:88;29909:4;29906:1;29899:15;29933:4;29930:1;29923:15;29949:184;30001:77;29998:1;29991:88;30098:4;30095:1;30088:15;30122:4;30119:1;30112:15;30138:154;30224:42;30217:5;30213:54;30206:5;30203:65;30193:2;;30282:1;30279;30272:12;30297:118;30383:5;30376:13;30369:21;30362:5;30359:32;30349:2;;30405:1;30402;30395:12
Swarm Source
ipfs://6b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa3785898736119
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.