Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
VANRY
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-11-02 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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()); } } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract unpausable. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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 {AccessControl-_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 Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @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) external; /** * @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) external; /** * @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) external; } // File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ 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 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]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @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 virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " 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 virtual 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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 { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File: @openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol) pragma solidity ^0.8.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. * * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ */ contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ constructor(string memory name, string memory symbol) ERC20(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, amount); } } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Capped.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Capped.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that adds a cap to the supply of tokens. */ abstract contract ERC20Capped is ERC20 { uint256 private immutable _cap; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ constructor(uint256 cap_) { require(cap_ > 0, "ERC20Capped: cap is 0"); _cap = cap_; } /** * @dev Returns the cap on the token's total supply. */ function cap() public view virtual returns (uint256) { return _cap; } /** * @dev See {ERC20-_mint}. */ function _mint(address account, uint256 amount) internal virtual override { require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded"); super._mint(account, amount); } } // File: contracts/VANRY.sol pragma solidity ^0.8.13; /** * @title New Token * @dev A capped ERC20 token contract with preset functionality 0f minter and pauser. */ contract VANRY is ERC20PresetMinterPauser, ERC20Capped { string public constant TOKEN_NAME = "VANRY"; string public constant TOKEN_SYMBOL = "VANRY"; uint256 public constant MAX_SUPPLY = 2400000000; uint256 public constant INITIAL_SUPPLY = 16248960; event TokensMinted(address indexed _beneficiary, uint256 _amount, string _context); /** * @dev Constructor to initialize the token details and mint initial supply. * @param _beneficiary The address where initial supply will be minted. */ constructor(address _beneficiary) ERC20PresetMinterPauser(TOKEN_NAME, TOKEN_SYMBOL) ERC20Capped(MAX_SUPPLY * 1 ether) { _mint(_beneficiary, INITIAL_SUPPLY * 1 ether); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20, ERC20PresetMinterPauser) { super._beforeTokenTransfer(from, to, amount); } /** * @dev Creates amount of new tokens for account. * * Requirements: * - the caller must have the `MINTER_ROLE`. * * @param _account The address where amount of tokens will be minted. * @param _amount The amount of tokens to be minted. * @param _purpose The purpose of minting the tokens. * */ function mint(address _account, uint256 _amount, string memory _purpose) public { super.mint(_account,_amount); emit TokensMinted(_account, _amount, _purpose); } /** * @dev Creates amount new tokens for account. * * See {ERC20-_mint}. * */ function _mint( address account, uint256 amount ) internal virtual override(ERC20, ERC20Capped) { super._mint(account, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_context","type":"string"}],"name":"TokensMinted","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_purpose","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","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":"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200426e3803806200426e8339818101604052810190620000379190620008df565b670de0b6b3a7640000638f0d18006200005191906200094a565b6040518060400160405280600581526020017f56414e52590000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f56414e525900000000000000000000000000000000000000000000000000000081525081818160059080519060200190620000d7929190620007c5565b508060069080519060200190620000f0929190620007c5565b5050506000600760006101000a81548160ff021916908315150217905550620001326000801b620001266200023660201b60201c565b6200023e60201b60201c565b620001737f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001676200023660201b60201c565b6200023e60201b60201c565b620001b47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001a86200023660201b60201c565b6200023e60201b60201c565b505060008111620001fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001f39062000a0c565b60405180910390fd5b8060808181525050506200022f81670de0b6b3a764000062f7f0806200022391906200094a565b6200025460201b60201c565b5062000c99565b600033905090565b6200025082826200026f60201b60201c565b5050565b6200026b8282620002b760201b62000f021760201c565b5050565b6200028682826200034860201b62000f6c1760201c565b620002b281600160008581526020019081526020016000206200043960201b6200104c1790919060201c565b505050565b620002c76200047160201b60201c565b81620002dd6200047b60201b620007d81760201c565b620002e9919062000a2e565b11156200032d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003249062000adb565b60405180910390fd5b6200034482826200048560201b6200107c1760201c565b5050565b6200035a8282620005f360201b60201c565b6200043557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003da6200023660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000469836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200065d60201b60201c565b905092915050565b6000608051905090565b6000600454905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ee9062000b4d565b60405180910390fd5b6200050b60008383620006d760201b60201c565b80600460008282546200051f919062000a2e565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005d3919062000b80565b60405180910390a3620005ef60008383620006f460201b60201c565b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620006718383620006f960201b60201c565b620006cc578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620006d1565b600090505b92915050565b620006ef8383836200071c60201b620011d31760201c565b505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b620007348383836200073960201b620011e31760201c565b505050565b62000751838383620007a960201b6200123b1760201c565b62000761620007ae60201b60201c565b15620007a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079b9062000c13565b60405180910390fd5b505050565b505050565b6000600760009054906101000a900460ff16905090565b828054620007d39062000c64565b90600052602060002090601f016020900481019282620007f7576000855562000843565b82601f106200081257805160ff191683800117855562000843565b8280016001018555821562000843579182015b828111156200084257825182559160200191906001019062000825565b5b50905062000852919062000856565b5090565b5b808211156200087157600081600090555060010162000857565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008a7826200087a565b9050919050565b620008b9816200089a565b8114620008c557600080fd5b50565b600081519050620008d981620008ae565b92915050565b600060208284031215620008f857620008f762000875565b5b60006200090884828501620008c8565b91505092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620009578262000911565b9150620009648362000911565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620009a0576200099f6200091b565b5b828202905092915050565b600082825260208201905092915050565b7f45524332304361707065643a2063617020697320300000000000000000000000600082015250565b6000620009f4601583620009ab565b915062000a0182620009bc565b602082019050919050565b6000602082019050818103600083015262000a2781620009e5565b9050919050565b600062000a3b8262000911565b915062000a488362000911565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a805762000a7f6200091b565b5b828201905092915050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b600062000ac3601983620009ab565b915062000ad08262000a8b565b602082019050919050565b6000602082019050818103600083015262000af68162000ab4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b35601f83620009ab565b915062000b428262000afd565b602082019050919050565b6000602082019050818103600083015262000b688162000b26565b9050919050565b62000b7a8162000911565b82525050565b600060208201905062000b97600083018462000b6f565b92915050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600062000bfb602a83620009ab565b915062000c088262000b9d565b604082019050919050565b6000602082019050818103600083015262000c2e8162000bec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c7d57607f821691505b60208210810362000c935762000c9262000c35565b5b50919050565b6080516135b962000cb560003960006108df01526135b96000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806342966c681161011a578063a217fddf116100ad578063d3fc98641161007c578063d3fc986414610605578063d539139314610621578063d547741f1461063f578063dd62ed3e1461065b578063e63ab1e91461068b57610206565b8063a217fddf14610557578063a457c2d714610575578063a9059cbb146105a5578063ca15c873146105d557610206565b80638456cb59116100e95780638456cb59146104cf5780639010d07c146104d957806391d148541461050957806395d89b411461053957610206565b806342966c68146104495780635c975abb1461046557806370a082311461048357806379cc6790146104b357610206565b80632f2ff15d1161019d578063355274ea1161016c578063355274ea146103b957806336568abe146103d757806339509351146103f35780633f4ba83a1461042357806340c10f191461042d57610206565b80632f2ff15d146103435780632ff2e9dc1461035f578063313ce5671461037d57806332cb6b0c1461039b57610206565b806318821400116101d957806318821400146102a757806323b872dd146102c5578063248a9ca3146102f55780632a9053181461032557610206565b806301ffc9a71461020b57806306fdde031461023b578063095ea7b31461025957806318160ddd14610289575b600080fd5b6102256004803603810190610220919061223e565b6106a9565b6040516102329190612286565b60405180910390f35b610243610723565b604051610250919061233a565b60405180910390f35b610273600480360381019061026e91906123f0565b6107b5565b6040516102809190612286565b60405180910390f35b6102916107d8565b60405161029e919061243f565b60405180910390f35b6102af6107e2565b6040516102bc919061233a565b60405180910390f35b6102df60048036038101906102da919061245a565b61081b565b6040516102ec9190612286565b60405180910390f35b61030f600480360381019061030a91906124e3565b61084a565b60405161031c919061251f565b60405180910390f35b61032d610869565b60405161033a919061233a565b60405180910390f35b61035d6004803603810190610358919061253a565b6108a2565b005b6103676108c3565b604051610374919061243f565b60405180910390f35b6103856108ca565b6040516103929190612596565b60405180910390f35b6103a36108d3565b6040516103b0919061243f565b60405180910390f35b6103c16108db565b6040516103ce919061243f565b60405180910390f35b6103f160048036038101906103ec919061253a565b610903565b005b61040d600480360381019061040891906123f0565b610986565b60405161041a9190612286565b60405180910390f35b61042b6109bd565b005b610447600480360381019061044291906123f0565b610a37565b005b610463600480360381019061045e91906125b1565b610ab5565b005b61046d610ac9565b60405161047a9190612286565b60405180910390f35b61049d600480360381019061049891906125de565b610ae0565b6040516104aa919061243f565b60405180910390f35b6104cd60048036038101906104c891906123f0565b610b29565b005b6104d7610b49565b005b6104f360048036038101906104ee919061260b565b610bc3565b604051610500919061265a565b60405180910390f35b610523600480360381019061051e919061253a565b610bf2565b6040516105309190612286565b60405180910390f35b610541610c5c565b60405161054e919061233a565b60405180910390f35b61055f610cee565b60405161056c919061251f565b60405180910390f35b61058f600480360381019061058a91906123f0565b610cf5565b60405161059c9190612286565b60405180910390f35b6105bf60048036038101906105ba91906123f0565b610d6c565b6040516105cc9190612286565b60405180910390f35b6105ef60048036038101906105ea91906124e3565b610d8f565b6040516105fc919061243f565b60405180910390f35b61061f600480360381019061061a91906127aa565b610db3565b005b610629610e12565b604051610636919061251f565b60405180910390f35b6106596004803603810190610654919061253a565b610e36565b005b61067560048036038101906106709190612819565b610e57565b604051610682919061243f565b60405180910390f35b610693610ede565b6040516106a0919061251f565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071c575061071b82611240565b5b9050919050565b60606005805461073290612888565b80601f016020809104026020016040519081016040528092919081815260200182805461075e90612888565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b6000806107c06112ba565b90506107cd8185856112c2565b600191505092915050565b6000600454905090565b6040518060400160405280600581526020017f56414e525900000000000000000000000000000000000000000000000000000081525081565b6000806108266112ba565b905061083385828561148b565b61083e858585611517565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6040518060400160405280600581526020017f56414e525900000000000000000000000000000000000000000000000000000081525081565b6108ab8261084a565b6108b481611790565b6108be83836117a4565b505050565b62f7f08081565b60006012905090565b638f0d180081565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b61090b6112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061292b565b60405180910390fd5b61098282826117d8565b5050565b6000806109916112ba565b90506109b28185856109a38589610e57565b6109ad919061297a565b6112c2565b600191505092915050565b6109ee7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109e96112ba565b610bf2565b610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490612a42565b60405180910390fd5b610a3561180c565b565b610a687f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a636112ba565b610bf2565b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90612ad4565b60405180910390fd5b610ab1828261186f565b5050565b610ac6610ac06112ba565b8261187d565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b3b82610b356112ba565b8361148b565b610b45828261187d565b5050565b610b7a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b756112ba565b610bf2565b610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090612b66565b60405180910390fd5b610bc1611a4c565b565b6000610bea8260016000868152602001908152602001600020611aaf90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610c6b90612888565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9790612888565b8015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050505050905090565b6000801b81565b600080610d006112ba565b90506000610d0e8286610e57565b905083811015610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90612bf8565b60405180910390fd5b610d6082868684036112c2565b60019250505092915050565b600080610d776112ba565b9050610d84818585611517565b600191505092915050565b6000610dac60016000848152602001908152602001600020611ac9565b9050919050565b610dbd8383610a37565b8273ffffffffffffffffffffffffffffffffffffffff167f9d89e36eadf856db0ad9ffb5a569e07f95634dddd9501141ecf04820484ad0dc8383604051610e05929190612c18565b60405180910390a2505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610e3f8261084a565b610e4881611790565b610e5283836117d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b610f0a6108db565b81610f136107d8565b610f1d919061297a565b1115610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612c94565b60405180910390fd5b610f68828261107c565b5050565b610f768282610bf2565b61104857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fed6112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611074836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ade565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290612d00565b60405180910390fd5b6110f760008383611b4e565b8060046000828254611109919061297a565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111bb919061243f565b60405180910390a36111cf60008383611b5e565b5050565b6111de8383836111e3565b505050565b6111ee83838361123b565b6111f6610ac9565b15611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90612d92565b60405180910390fd5b505050565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b357506112b282611b63565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612e24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790612eb6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161147e919061243f565b60405180910390a3505050565b60006114978484610e57565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115115781811015611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90612f22565b60405180910390fd5b61151084848484036112c2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90612fb4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613046565b60405180910390fd5b611600838383611b4e565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e906130d8565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611777919061243f565b60405180910390a361178a848484611b5e565b50505050565b6117a18161179c6112ba565b611bcd565b50565b6117ae8282610f6c565b6117d3816001600085815260200190815260200160002061104c90919063ffffffff16565b505050565b6117e28282611c52565b6118078160016000858152602001908152602001600020611d3390919063ffffffff16565b505050565b611814611d63565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118586112ba565b604051611865919061265a565b60405180910390a1565b6118798282610f02565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e39061316a565b60405180910390fd5b6118f882600083611b4e565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906131fc565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a33919061243f565b60405180910390a3611a4783600084611b5e565b505050565b611a54611dac565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a986112ba565b604051611aa5919061265a565b60405180910390a1565b6000611abe8360000183611df6565b60001c905092915050565b6000611ad782600001611e21565b9050919050565b6000611aea8383611e32565b611b43578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611b48565b600090505b92915050565b611b598383836111d3565b505050565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bd78282610bf2565b611c4e57611be481611e55565b611bf28360001c6020611e82565b604051602001611c039291906132f0565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45919061233a565b60405180910390fd5b5050565b611c5c8282610bf2565b15611d2f57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cd46112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d5b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120be565b905092915050565b611d6b610ac9565b611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190613376565b60405180910390fd5b565b611db4610ac9565b15611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906133e2565b60405180910390fd5b565b6000826000018281548110611e0e57611e0d613402565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6060611e7b8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611e82565b9050919050565b606060006002836002611e959190613431565b611e9f919061297a565b67ffffffffffffffff811115611eb857611eb761267f565b5b6040519080825280601f01601f191660200182016040528015611eea5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f2257611f21613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611f8657611f85613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fc69190613431565b611fd0919061297a565b90505b6001811115612070577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061201257612011613402565b5b1a60f81b82828151811061202957612028613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806120699061348b565b9050611fd3565b50600084146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613500565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146121c65760006001826120f09190613520565b90506000600186600001805490506121089190613520565b905081811461217757600086600001828154811061212957612128613402565b5b906000526020600020015490508087600001848154811061214d5761214c613402565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061218b5761218a613554565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506121cc565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61221b816121e6565b811461222657600080fd5b50565b60008135905061223881612212565b92915050565b600060208284031215612254576122536121dc565b5b600061226284828501612229565b91505092915050565b60008115159050919050565b6122808161226b565b82525050565b600060208201905061229b6000830184612277565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122db5780820151818401526020810190506122c0565b838111156122ea576000848401525b50505050565b6000601f19601f8301169050919050565b600061230c826122a1565b61231681856122ac565b93506123268185602086016122bd565b61232f816122f0565b840191505092915050565b600060208201905081810360008301526123548184612301565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123878261235c565b9050919050565b6123978161237c565b81146123a257600080fd5b50565b6000813590506123b48161238e565b92915050565b6000819050919050565b6123cd816123ba565b81146123d857600080fd5b50565b6000813590506123ea816123c4565b92915050565b60008060408385031215612407576124066121dc565b5b6000612415858286016123a5565b9250506020612426858286016123db565b9150509250929050565b612439816123ba565b82525050565b60006020820190506124546000830184612430565b92915050565b600080600060608486031215612473576124726121dc565b5b6000612481868287016123a5565b9350506020612492868287016123a5565b92505060406124a3868287016123db565b9150509250925092565b6000819050919050565b6124c0816124ad565b81146124cb57600080fd5b50565b6000813590506124dd816124b7565b92915050565b6000602082840312156124f9576124f86121dc565b5b6000612507848285016124ce565b91505092915050565b612519816124ad565b82525050565b60006020820190506125346000830184612510565b92915050565b60008060408385031215612551576125506121dc565b5b600061255f858286016124ce565b9250506020612570858286016123a5565b9150509250929050565b600060ff82169050919050565b6125908161257a565b82525050565b60006020820190506125ab6000830184612587565b92915050565b6000602082840312156125c7576125c66121dc565b5b60006125d5848285016123db565b91505092915050565b6000602082840312156125f4576125f36121dc565b5b6000612602848285016123a5565b91505092915050565b60008060408385031215612622576126216121dc565b5b6000612630858286016124ce565b9250506020612641858286016123db565b9150509250929050565b6126548161237c565b82525050565b600060208201905061266f600083018461264b565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126b7826122f0565b810181811067ffffffffffffffff821117156126d6576126d561267f565b5b80604052505050565b60006126e96121d2565b90506126f582826126ae565b919050565b600067ffffffffffffffff8211156127155761271461267f565b5b61271e826122f0565b9050602081019050919050565b82818337600083830152505050565b600061274d612748846126fa565b6126df565b9050828152602081018484840111156127695761276861267a565b5b61277484828561272b565b509392505050565b600082601f83011261279157612790612675565b5b81356127a184826020860161273a565b91505092915050565b6000806000606084860312156127c3576127c26121dc565b5b60006127d1868287016123a5565b93505060206127e2868287016123db565b925050604084013567ffffffffffffffff811115612803576128026121e1565b5b61280f8682870161277c565b9150509250925092565b600080604083850312156128305761282f6121dc565b5b600061283e858286016123a5565b925050602061284f858286016123a5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128a057607f821691505b6020821081036128b3576128b2612859565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612915602f836122ac565b9150612920826128b9565b604082019050919050565b6000602082019050818103600083015261294481612908565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612985826123ba565b9150612990836123ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c461294b565b5b828201905092915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612a2c6039836122ac565b9150612a37826129d0565b604082019050919050565b60006020820190508181036000830152612a5b81612a1f565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b6000612abe6036836122ac565b9150612ac982612a62565b604082019050919050565b60006020820190508181036000830152612aed81612ab1565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b6000612b506037836122ac565b9150612b5b82612af4565b604082019050919050565b60006020820190508181036000830152612b7f81612b43565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612be26025836122ac565b9150612bed82612b86565b604082019050919050565b60006020820190508181036000830152612c1181612bd5565b9050919050565b6000604082019050612c2d6000830185612430565b8181036020830152612c3f8184612301565b90509392505050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000612c7e6019836122ac565b9150612c8982612c48565b602082019050919050565b60006020820190508181036000830152612cad81612c71565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612cea601f836122ac565b9150612cf582612cb4565b602082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612d7c602a836122ac565b9150612d8782612d20565b604082019050919050565b60006020820190508181036000830152612dab81612d6f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e0e6024836122ac565b9150612e1982612db2565b604082019050919050565b60006020820190508181036000830152612e3d81612e01565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ea06022836122ac565b9150612eab82612e44565b604082019050919050565b60006020820190508181036000830152612ecf81612e93565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612f0c601d836122ac565b9150612f1782612ed6565b602082019050919050565b60006020820190508181036000830152612f3b81612eff565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f9e6025836122ac565b9150612fa982612f42565b604082019050919050565b60006020820190508181036000830152612fcd81612f91565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006130306023836122ac565b915061303b82612fd4565b604082019050919050565b6000602082019050818103600083015261305f81613023565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006130c26026836122ac565b91506130cd82613066565b604082019050919050565b600060208201905081810360008301526130f1816130b5565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006131546021836122ac565b915061315f826130f8565b604082019050919050565b6000602082019050818103600083015261318381613147565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006131e66022836122ac565b91506131f18261318a565b604082019050919050565b60006020820190508181036000830152613215816131d9565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061325d60178361321c565b915061326882613227565b601782019050919050565b600061327e826122a1565b613288818561321c565b93506132988185602086016122bd565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006132da60118361321c565b91506132e5826132a4565b601182019050919050565b60006132fb82613250565b91506133078285613273565b9150613312826132cd565b915061331e8284613273565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133606014836122ac565b915061336b8261332a565b602082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006133cc6010836122ac565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061343c826123ba565b9150613447836123ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134805761347f61294b565b5b828202905092915050565b6000613496826123ba565b9150600082036134a9576134a861294b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006134ea6020836122ac565b91506134f5826134b4565b602082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b600061352b826123ba565b9150613536836123ba565b9250828210156135495761354861294b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122099a1bcc84e87a159c8ba33bb4e526c971b6c27aef85de05ad96d5d8b247f367864736f6c634300080d0033000000000000000000000000e8e15a8a80d3c76900923957d1e8fa4308c5c20e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806342966c681161011a578063a217fddf116100ad578063d3fc98641161007c578063d3fc986414610605578063d539139314610621578063d547741f1461063f578063dd62ed3e1461065b578063e63ab1e91461068b57610206565b8063a217fddf14610557578063a457c2d714610575578063a9059cbb146105a5578063ca15c873146105d557610206565b80638456cb59116100e95780638456cb59146104cf5780639010d07c146104d957806391d148541461050957806395d89b411461053957610206565b806342966c68146104495780635c975abb1461046557806370a082311461048357806379cc6790146104b357610206565b80632f2ff15d1161019d578063355274ea1161016c578063355274ea146103b957806336568abe146103d757806339509351146103f35780633f4ba83a1461042357806340c10f191461042d57610206565b80632f2ff15d146103435780632ff2e9dc1461035f578063313ce5671461037d57806332cb6b0c1461039b57610206565b806318821400116101d957806318821400146102a757806323b872dd146102c5578063248a9ca3146102f55780632a9053181461032557610206565b806301ffc9a71461020b57806306fdde031461023b578063095ea7b31461025957806318160ddd14610289575b600080fd5b6102256004803603810190610220919061223e565b6106a9565b6040516102329190612286565b60405180910390f35b610243610723565b604051610250919061233a565b60405180910390f35b610273600480360381019061026e91906123f0565b6107b5565b6040516102809190612286565b60405180910390f35b6102916107d8565b60405161029e919061243f565b60405180910390f35b6102af6107e2565b6040516102bc919061233a565b60405180910390f35b6102df60048036038101906102da919061245a565b61081b565b6040516102ec9190612286565b60405180910390f35b61030f600480360381019061030a91906124e3565b61084a565b60405161031c919061251f565b60405180910390f35b61032d610869565b60405161033a919061233a565b60405180910390f35b61035d6004803603810190610358919061253a565b6108a2565b005b6103676108c3565b604051610374919061243f565b60405180910390f35b6103856108ca565b6040516103929190612596565b60405180910390f35b6103a36108d3565b6040516103b0919061243f565b60405180910390f35b6103c16108db565b6040516103ce919061243f565b60405180910390f35b6103f160048036038101906103ec919061253a565b610903565b005b61040d600480360381019061040891906123f0565b610986565b60405161041a9190612286565b60405180910390f35b61042b6109bd565b005b610447600480360381019061044291906123f0565b610a37565b005b610463600480360381019061045e91906125b1565b610ab5565b005b61046d610ac9565b60405161047a9190612286565b60405180910390f35b61049d600480360381019061049891906125de565b610ae0565b6040516104aa919061243f565b60405180910390f35b6104cd60048036038101906104c891906123f0565b610b29565b005b6104d7610b49565b005b6104f360048036038101906104ee919061260b565b610bc3565b604051610500919061265a565b60405180910390f35b610523600480360381019061051e919061253a565b610bf2565b6040516105309190612286565b60405180910390f35b610541610c5c565b60405161054e919061233a565b60405180910390f35b61055f610cee565b60405161056c919061251f565b60405180910390f35b61058f600480360381019061058a91906123f0565b610cf5565b60405161059c9190612286565b60405180910390f35b6105bf60048036038101906105ba91906123f0565b610d6c565b6040516105cc9190612286565b60405180910390f35b6105ef60048036038101906105ea91906124e3565b610d8f565b6040516105fc919061243f565b60405180910390f35b61061f600480360381019061061a91906127aa565b610db3565b005b610629610e12565b604051610636919061251f565b60405180910390f35b6106596004803603810190610654919061253a565b610e36565b005b61067560048036038101906106709190612819565b610e57565b604051610682919061243f565b60405180910390f35b610693610ede565b6040516106a0919061251f565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071c575061071b82611240565b5b9050919050565b60606005805461073290612888565b80601f016020809104026020016040519081016040528092919081815260200182805461075e90612888565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b6000806107c06112ba565b90506107cd8185856112c2565b600191505092915050565b6000600454905090565b6040518060400160405280600581526020017f56414e525900000000000000000000000000000000000000000000000000000081525081565b6000806108266112ba565b905061083385828561148b565b61083e858585611517565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6040518060400160405280600581526020017f56414e525900000000000000000000000000000000000000000000000000000081525081565b6108ab8261084a565b6108b481611790565b6108be83836117a4565b505050565b62f7f08081565b60006012905090565b638f0d180081565b60007f000000000000000000000000000000000000000007c13bc4b2c133c560000000905090565b61090b6112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061292b565b60405180910390fd5b61098282826117d8565b5050565b6000806109916112ba565b90506109b28185856109a38589610e57565b6109ad919061297a565b6112c2565b600191505092915050565b6109ee7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109e96112ba565b610bf2565b610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490612a42565b60405180910390fd5b610a3561180c565b565b610a687f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a636112ba565b610bf2565b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90612ad4565b60405180910390fd5b610ab1828261186f565b5050565b610ac6610ac06112ba565b8261187d565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b3b82610b356112ba565b8361148b565b610b45828261187d565b5050565b610b7a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b756112ba565b610bf2565b610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090612b66565b60405180910390fd5b610bc1611a4c565b565b6000610bea8260016000868152602001908152602001600020611aaf90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610c6b90612888565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9790612888565b8015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050505050905090565b6000801b81565b600080610d006112ba565b90506000610d0e8286610e57565b905083811015610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90612bf8565b60405180910390fd5b610d6082868684036112c2565b60019250505092915050565b600080610d776112ba565b9050610d84818585611517565b600191505092915050565b6000610dac60016000848152602001908152602001600020611ac9565b9050919050565b610dbd8383610a37565b8273ffffffffffffffffffffffffffffffffffffffff167f9d89e36eadf856db0ad9ffb5a569e07f95634dddd9501141ecf04820484ad0dc8383604051610e05929190612c18565b60405180910390a2505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610e3f8261084a565b610e4881611790565b610e5283836117d8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b610f0a6108db565b81610f136107d8565b610f1d919061297a565b1115610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612c94565b60405180910390fd5b610f68828261107c565b5050565b610f768282610bf2565b61104857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fed6112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611074836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ade565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290612d00565b60405180910390fd5b6110f760008383611b4e565b8060046000828254611109919061297a565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111bb919061243f565b60405180910390a36111cf60008383611b5e565b5050565b6111de8383836111e3565b505050565b6111ee83838361123b565b6111f6610ac9565b15611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90612d92565b60405180910390fd5b505050565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b357506112b282611b63565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612e24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790612eb6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161147e919061243f565b60405180910390a3505050565b60006114978484610e57565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115115781811015611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90612f22565b60405180910390fd5b61151084848484036112c2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90612fb4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613046565b60405180910390fd5b611600838383611b4e565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e906130d8565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611777919061243f565b60405180910390a361178a848484611b5e565b50505050565b6117a18161179c6112ba565b611bcd565b50565b6117ae8282610f6c565b6117d3816001600085815260200190815260200160002061104c90919063ffffffff16565b505050565b6117e28282611c52565b6118078160016000858152602001908152602001600020611d3390919063ffffffff16565b505050565b611814611d63565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118586112ba565b604051611865919061265a565b60405180910390a1565b6118798282610f02565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e39061316a565b60405180910390fd5b6118f882600083611b4e565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906131fc565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a33919061243f565b60405180910390a3611a4783600084611b5e565b505050565b611a54611dac565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a986112ba565b604051611aa5919061265a565b60405180910390a1565b6000611abe8360000183611df6565b60001c905092915050565b6000611ad782600001611e21565b9050919050565b6000611aea8383611e32565b611b43578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611b48565b600090505b92915050565b611b598383836111d3565b505050565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bd78282610bf2565b611c4e57611be481611e55565b611bf28360001c6020611e82565b604051602001611c039291906132f0565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45919061233a565b60405180910390fd5b5050565b611c5c8282610bf2565b15611d2f57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cd46112ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d5b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120be565b905092915050565b611d6b610ac9565b611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190613376565b60405180910390fd5b565b611db4610ac9565b15611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906133e2565b60405180910390fd5b565b6000826000018281548110611e0e57611e0d613402565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6060611e7b8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611e82565b9050919050565b606060006002836002611e959190613431565b611e9f919061297a565b67ffffffffffffffff811115611eb857611eb761267f565b5b6040519080825280601f01601f191660200182016040528015611eea5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f2257611f21613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611f8657611f85613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fc69190613431565b611fd0919061297a565b90505b6001811115612070577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061201257612011613402565b5b1a60f81b82828151811061202957612028613402565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806120699061348b565b9050611fd3565b50600084146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613500565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146121c65760006001826120f09190613520565b90506000600186600001805490506121089190613520565b905081811461217757600086600001828154811061212957612128613402565b5b906000526020600020015490508087600001848154811061214d5761214c613402565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061218b5761218a613554565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506121cc565b60009150505b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61221b816121e6565b811461222657600080fd5b50565b60008135905061223881612212565b92915050565b600060208284031215612254576122536121dc565b5b600061226284828501612229565b91505092915050565b60008115159050919050565b6122808161226b565b82525050565b600060208201905061229b6000830184612277565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122db5780820151818401526020810190506122c0565b838111156122ea576000848401525b50505050565b6000601f19601f8301169050919050565b600061230c826122a1565b61231681856122ac565b93506123268185602086016122bd565b61232f816122f0565b840191505092915050565b600060208201905081810360008301526123548184612301565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123878261235c565b9050919050565b6123978161237c565b81146123a257600080fd5b50565b6000813590506123b48161238e565b92915050565b6000819050919050565b6123cd816123ba565b81146123d857600080fd5b50565b6000813590506123ea816123c4565b92915050565b60008060408385031215612407576124066121dc565b5b6000612415858286016123a5565b9250506020612426858286016123db565b9150509250929050565b612439816123ba565b82525050565b60006020820190506124546000830184612430565b92915050565b600080600060608486031215612473576124726121dc565b5b6000612481868287016123a5565b9350506020612492868287016123a5565b92505060406124a3868287016123db565b9150509250925092565b6000819050919050565b6124c0816124ad565b81146124cb57600080fd5b50565b6000813590506124dd816124b7565b92915050565b6000602082840312156124f9576124f86121dc565b5b6000612507848285016124ce565b91505092915050565b612519816124ad565b82525050565b60006020820190506125346000830184612510565b92915050565b60008060408385031215612551576125506121dc565b5b600061255f858286016124ce565b9250506020612570858286016123a5565b9150509250929050565b600060ff82169050919050565b6125908161257a565b82525050565b60006020820190506125ab6000830184612587565b92915050565b6000602082840312156125c7576125c66121dc565b5b60006125d5848285016123db565b91505092915050565b6000602082840312156125f4576125f36121dc565b5b6000612602848285016123a5565b91505092915050565b60008060408385031215612622576126216121dc565b5b6000612630858286016124ce565b9250506020612641858286016123db565b9150509250929050565b6126548161237c565b82525050565b600060208201905061266f600083018461264b565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126b7826122f0565b810181811067ffffffffffffffff821117156126d6576126d561267f565b5b80604052505050565b60006126e96121d2565b90506126f582826126ae565b919050565b600067ffffffffffffffff8211156127155761271461267f565b5b61271e826122f0565b9050602081019050919050565b82818337600083830152505050565b600061274d612748846126fa565b6126df565b9050828152602081018484840111156127695761276861267a565b5b61277484828561272b565b509392505050565b600082601f83011261279157612790612675565b5b81356127a184826020860161273a565b91505092915050565b6000806000606084860312156127c3576127c26121dc565b5b60006127d1868287016123a5565b93505060206127e2868287016123db565b925050604084013567ffffffffffffffff811115612803576128026121e1565b5b61280f8682870161277c565b9150509250925092565b600080604083850312156128305761282f6121dc565b5b600061283e858286016123a5565b925050602061284f858286016123a5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128a057607f821691505b6020821081036128b3576128b2612859565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612915602f836122ac565b9150612920826128b9565b604082019050919050565b6000602082019050818103600083015261294481612908565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612985826123ba565b9150612990836123ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c461294b565b5b828201905092915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612a2c6039836122ac565b9150612a37826129d0565b604082019050919050565b60006020820190508181036000830152612a5b81612a1f565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b6000612abe6036836122ac565b9150612ac982612a62565b604082019050919050565b60006020820190508181036000830152612aed81612ab1565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b6000612b506037836122ac565b9150612b5b82612af4565b604082019050919050565b60006020820190508181036000830152612b7f81612b43565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612be26025836122ac565b9150612bed82612b86565b604082019050919050565b60006020820190508181036000830152612c1181612bd5565b9050919050565b6000604082019050612c2d6000830185612430565b8181036020830152612c3f8184612301565b90509392505050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000612c7e6019836122ac565b9150612c8982612c48565b602082019050919050565b60006020820190508181036000830152612cad81612c71565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612cea601f836122ac565b9150612cf582612cb4565b602082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000612d7c602a836122ac565b9150612d8782612d20565b604082019050919050565b60006020820190508181036000830152612dab81612d6f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e0e6024836122ac565b9150612e1982612db2565b604082019050919050565b60006020820190508181036000830152612e3d81612e01565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ea06022836122ac565b9150612eab82612e44565b604082019050919050565b60006020820190508181036000830152612ecf81612e93565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612f0c601d836122ac565b9150612f1782612ed6565b602082019050919050565b60006020820190508181036000830152612f3b81612eff565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f9e6025836122ac565b9150612fa982612f42565b604082019050919050565b60006020820190508181036000830152612fcd81612f91565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006130306023836122ac565b915061303b82612fd4565b604082019050919050565b6000602082019050818103600083015261305f81613023565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006130c26026836122ac565b91506130cd82613066565b604082019050919050565b600060208201905081810360008301526130f1816130b5565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006131546021836122ac565b915061315f826130f8565b604082019050919050565b6000602082019050818103600083015261318381613147565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006131e66022836122ac565b91506131f18261318a565b604082019050919050565b60006020820190508181036000830152613215816131d9565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061325d60178361321c565b915061326882613227565b601782019050919050565b600061327e826122a1565b613288818561321c565b93506132988185602086016122bd565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006132da60118361321c565b91506132e5826132a4565b601182019050919050565b60006132fb82613250565b91506133078285613273565b9150613312826132cd565b915061331e8284613273565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133606014836122ac565b915061336b8261332a565b602082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006133cc6010836122ac565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061343c826123ba565b9150613447836123ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134805761347f61294b565b5b828202905092915050565b6000613496826123ba565b9150600082036134a9576134a861294b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006134ea6020836122ac565b91506134f5826134b4565b602082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b600061352b826123ba565b9150613536836123ba565b9250828210156135495761354861294b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122099a1bcc84e87a159c8ba33bb4e526c971b6c27aef85de05ad96d5d8b247f367864736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e8e15a8a80d3c76900923957d1e8fa4308c5c20e
-----Decoded View---------------
Arg [0] : _beneficiary (address): 0xE8E15a8A80D3C76900923957d1e8fa4308C5C20e
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e8e15a8a80d3c76900923957d1e8fa4308c5c20e
Deployed Bytecode Sourcemap
74655:1844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68654:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6648:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9008:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7777:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74719:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9789:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50854:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74769:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51295:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74875:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7619:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74821:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74122:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52439:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10459:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73034:178;;;:::i;:::-;;72225:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18222:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20474:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7948:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18632:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72644:172;;;:::i;:::-;;69467:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49327:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6867:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48432:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11200:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8281:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69794:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76015:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71467:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51735:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8537:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71536:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68654:214;68739:4;68778:42;68763:57;;;:11;:57;;;;:97;;;;68824:36;68848:11;68824:23;:36::i;:::-;68763:97;68756:104;;68654:214;;;:::o;6648:100::-;6702:13;6735:5;6728:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6648:100;:::o;9008:201::-;9091:4;9108:13;9124:12;:10;:12::i;:::-;9108:28;;9147:32;9156:5;9163:7;9172:6;9147:8;:32::i;:::-;9197:4;9190:11;;;9008:201;;;;:::o;7777:108::-;7838:7;7865:12;;7858:19;;7777:108;:::o;74719:43::-;;;;;;;;;;;;;;;;;;;:::o;9789:261::-;9886:4;9903:15;9921:12;:10;:12::i;:::-;9903:30;;9944:38;9960:4;9966:7;9975:6;9944:15;:38::i;:::-;9993:27;10003:4;10009:2;10013:6;9993:9;:27::i;:::-;10038:4;10031:11;;;9789:261;;;;;:::o;50854:131::-;50928:7;50955:6;:12;50962:4;50955:12;;;;;;;;;;;:22;;;50948:29;;50854:131;;;:::o;74769:45::-;;;;;;;;;;;;;;;;;;;:::o;51295:147::-;51378:18;51391:4;51378:12;:18::i;:::-;48923:16;48934:4;48923:10;:16::i;:::-;51409:25:::1;51420:4;51426:7;51409:10;:25::i;:::-;51295:147:::0;;;:::o;74875:49::-;74916:8;74875:49;:::o;7619:93::-;7677:5;7702:2;7695:9;;7619:93;:::o;74821:47::-;74858:10;74821:47;:::o;74122:83::-;74166:7;74193:4;74186:11;;74122:83;:::o;52439:218::-;52546:12;:10;:12::i;:::-;52535:23;;:7;:23;;;52527:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52623:26;52635:4;52641:7;52623:11;:26::i;:::-;52439:218;;:::o;10459:238::-;10547:4;10564:13;10580:12;:10;:12::i;:::-;10564:28;;10603:64;10612:5;10619:7;10656:10;10628:25;10638:5;10645:7;10628:9;:25::i;:::-;:38;;;;:::i;:::-;10603:8;:64::i;:::-;10685:4;10678:11;;;10459:238;;;;:::o;73034:178::-;73087:34;71574:24;73108:12;:10;:12::i;:::-;73087:7;:34::i;:::-;73079:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;73194:10;:8;:10::i;:::-;73034:178::o;72225:205::-;72301:34;71505:24;72322:12;:10;:12::i;:::-;72301:7;:34::i;:::-;72293:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;72405:17;72411:2;72415:6;72405:5;:17::i;:::-;72225:205;;:::o;18222:91::-;18278:27;18284:12;:10;:12::i;:::-;18298:6;18278:5;:27::i;:::-;18222:91;:::o;20474:86::-;20521:4;20545:7;;;;;;;;;;;20538:14;;20474:86;:::o;7948:127::-;8022:7;8049:9;:18;8059:7;8049:18;;;;;;;;;;;;;;;;8042:25;;7948:127;;;:::o;18632:164::-;18709:46;18725:7;18734:12;:10;:12::i;:::-;18748:6;18709:15;:46::i;:::-;18766:22;18772:7;18781:6;18766:5;:22::i;:::-;18632:164;;:::o;72644:172::-;72695:34;71574:24;72716:12;:10;:12::i;:::-;72695:7;:34::i;:::-;72687:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;72800:8;:6;:8::i;:::-;72644:172::o;69467:153::-;69557:7;69584:28;69606:5;69584:12;:18;69597:4;69584:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;69577:35;;69467:153;;;;:::o;49327:147::-;49413:4;49437:6;:12;49444:4;49437:12;;;;;;;;;;;:20;;:29;49458:7;49437:29;;;;;;;;;;;;;;;;;;;;;;;;;49430:36;;49327:147;;;;:::o;6867:104::-;6923:13;6956:7;6949:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:104;:::o;48432:49::-;48477:4;48432:49;;;:::o;11200:436::-;11293:4;11310:13;11326:12;:10;:12::i;:::-;11310:28;;11349:24;11376:25;11386:5;11393:7;11376:9;:25::i;:::-;11349:52;;11440:15;11420:16;:35;;11412:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11533:60;11542:5;11549:7;11577:15;11558:16;:34;11533:8;:60::i;:::-;11624:4;11617:11;;;;11200:436;;;;:::o;8281:193::-;8360:4;8377:13;8393:12;:10;:12::i;:::-;8377:28;;8416;8426:5;8433:2;8437:6;8416:9;:28::i;:::-;8462:4;8455:11;;;8281:193;;;;:::o;69794:142::-;69874:7;69901:27;:12;:18;69914:4;69901:18;;;;;;;;;;;:25;:27::i;:::-;69894:34;;69794:142;;;:::o;76015:188::-;76108:28;76119:8;76128:7;76108:10;:28::i;:::-;76167:8;76154:41;;;76177:7;76186:8;76154:41;;;;;;;:::i;:::-;;;;;;;;76015:188;;;:::o;71467:62::-;71505:24;71467:62;:::o;51735:149::-;51819:18;51832:4;51819:12;:18::i;:::-;48923:16;48934:4;48923:10;:16::i;:::-;51850:26:::1;51862:4;51868:7;51850:11;:26::i;:::-;51735:149:::0;;;:::o;8537:151::-;8626:7;8653:11;:18;8665:5;8653:18;;;;;;;;;;;;;;;:27;8672:7;8653:27;;;;;;;;;;;;;;;;8646:34;;8537:151;;;;:::o;71536:62::-;71574:24;71536:62;:::o;74263:207::-;74388:5;:3;:5::i;:::-;74378:6;74356:19;:17;:19::i;:::-;:28;;;;:::i;:::-;:37;;74348:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;74434:28;74446:7;74455:6;74434:11;:28::i;:::-;74263:207;;:::o;54036:238::-;54120:22;54128:4;54134:7;54120;:22::i;:::-;54115:152;;54191:4;54159:6;:12;54166:4;54159:12;;;;;;;;;;;:20;;:29;54180:7;54159:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54242:12;:10;:12::i;:::-;54215:40;;54233:7;54215:40;;54227:4;54215:40;;;;;;;;;;54115:152;54036:238;;:::o;63284:152::-;63354:4;63378:50;63383:3;:10;;63419:5;63403:23;;63395:32;;63378:4;:50::i;:::-;63371:57;;63284:152;;;;:::o;13199:548::-;13302:1;13283:21;;:7;:21;;;13275:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13353:49;13382:1;13386:7;13395:6;13353:20;:49::i;:::-;13431:6;13415:12;;:22;;;;;;;:::i;:::-;;;;;;;;13608:6;13586:9;:18;13596:7;13586:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;13662:7;13641:37;;13658:1;13641:37;;;13671:6;13641:37;;;;;;:::i;:::-;;;;;;;;13691:48;13719:1;13723:7;13732:6;13691:19;:48::i;:::-;13199:548;;:::o;73220:217::-;73385:44;73412:4;73418:2;73422:6;73385:26;:44::i;:::-;73220:217;;;:::o;22511:238::-;22620:44;22647:4;22653:2;22657:6;22620:26;:44::i;:::-;22686:8;:6;:8::i;:::-;22685:9;22677:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:238;;;:::o;16849:91::-;;;;:::o;49031:204::-;49116:4;49155:32;49140:47;;;:11;:47;;;;:87;;;;49191:36;49215:11;49191:23;:36::i;:::-;49140:87;49133:94;;49031:204;;;:::o;4288:98::-;4341:7;4368:10;4361:17;;4288:98;:::o;15193:346::-;15312:1;15295:19;;:5;:19;;;15287:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15393:1;15374:21;;:7;:21;;;15366:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15477:6;15447:11;:18;15459:5;15447:18;;;;;;;;;;;;;;;:27;15466:7;15447:27;;;;;;;;;;;;;;;:36;;;;15515:7;15499:32;;15508:5;15499:32;;;15524:6;15499:32;;;;;;:::i;:::-;;;;;;;;15193:346;;;:::o;15830:419::-;15931:24;15958:25;15968:5;15975:7;15958:9;:25::i;:::-;15931:52;;16018:17;15998:16;:37;15994:248;;16080:6;16060:16;:26;;16052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16164:51;16173:5;16180:7;16208:6;16189:16;:25;16164:8;:51::i;:::-;15994:248;15920:329;15830:419;;;:::o;12106:806::-;12219:1;12203:18;;:4;:18;;;12195:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12296:1;12282:16;;:2;:16;;;12274:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12351:38;12372:4;12378:2;12382:6;12351:20;:38::i;:::-;12402:19;12424:9;:15;12434:4;12424:15;;;;;;;;;;;;;;;;12402:37;;12473:6;12458:11;:21;;12450:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12590:6;12576:11;:20;12558:9;:15;12568:4;12558:15;;;;;;;;;;;;;;;:38;;;;12793:6;12776:9;:13;12786:2;12776:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12843:2;12828:26;;12837:4;12828:26;;;12847:6;12828:26;;;;;;:::i;:::-;;;;;;;;12867:37;12887:4;12893:2;12897:6;12867:19;:37::i;:::-;12184:728;12106:806;;;:::o;49778:105::-;49845:30;49856:4;49862:12;:10;:12::i;:::-;49845:10;:30::i;:::-;49778:105;:::o;70029:169::-;70117:31;70134:4;70140:7;70117:16;:31::i;:::-;70159;70182:7;70159:12;:18;70172:4;70159:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;70029:169;;:::o;70292:174::-;70381:32;70399:4;70405:7;70381:17;:32::i;:::-;70424:34;70450:7;70424:12;:18;70437:4;70424:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;70292:174;;:::o;21329:120::-;20338:16;:14;:16::i;:::-;21398:5:::1;21388:7;;:15;;;;;;;;;;;;;;;;;;21419:22;21428:12;:10;:12::i;:::-;21419:22;;;;;;:::i;:::-;;;;;;;;21329:120::o:0;76330:166::-;76460:28;76472:7;76481:6;76460:11;:28::i;:::-;76330:166;;:::o;14080:675::-;14183:1;14164:21;;:7;:21;;;14156:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14236:49;14257:7;14274:1;14278:6;14236:20;:49::i;:::-;14298:22;14323:9;:18;14333:7;14323:18;;;;;;;;;;;;;;;;14298:43;;14378:6;14360:14;:24;;14352:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14497:6;14480:14;:23;14459:9;:18;14469:7;14459:18;;;;;;;;;;;;;;;:44;;;;14614:6;14598:12;;:22;;;;;;;;;;;14675:1;14649:37;;14658:7;14649:37;;;14679:6;14649:37;;;;;;:::i;:::-;;;;;;;;14699:48;14719:7;14736:1;14740:6;14699:19;:48::i;:::-;14145:610;14080:675;;:::o;21070:118::-;20079:19;:17;:19::i;:::-;21140:4:::1;21130:7;;:14;;;;;;;;;;;;;;;;;;21160:20;21167:12;:10;:12::i;:::-;21160:20;;;;;;:::i;:::-;;;;;;;;21070:118::o:0;64580:158::-;64654:7;64705:22;64709:3;:10;;64721:5;64705:3;:22::i;:::-;64697:31;;64674:56;;64580:158;;;;:::o;64109:117::-;64172:7;64199:19;64207:3;:10;;64199:7;:19::i;:::-;64192:26;;64109:117;;;:::o;57015:414::-;57078:4;57100:21;57110:3;57115:5;57100:9;:21::i;:::-;57095:327;;57138:3;:11;;57155:5;57138:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57321:3;:11;;:18;;;;57299:3;:12;;:19;57312:5;57299:19;;;;;;;;;;;:40;;;;57361:4;57354:11;;;;57095:327;57405:5;57398:12;;57015:414;;;;;:::o;75417:227::-;75592:44;75619:4;75625:2;75629:6;75592:26;:44::i;:::-;75417:227;;;:::o;17544:90::-;;;;:::o;46165:157::-;46250:4;46289:25;46274:40;;;:11;:40;;;;46267:47;;46165:157;;;:::o;50173:492::-;50262:22;50270:4;50276:7;50262;:22::i;:::-;50257:401;;50450:28;50470:7;50450:19;:28::i;:::-;50551:38;50579:4;50571:13;;50586:2;50551:19;:38::i;:::-;50355:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50301:345;;;;;;;;;;;:::i;:::-;;;;;;;;50257:401;50173:492;;:::o;54454:239::-;54538:22;54546:4;54552:7;54538;:22::i;:::-;54534:152;;;54609:5;54577:6;:12;54584:4;54577:12;;;;;;;;;;;:20;;:29;54598:7;54577:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54661:12;:10;:12::i;:::-;54634:40;;54652:7;54634:40;;54646:4;54634:40;;;;;;;;;;54534:152;54454:239;;:::o;63612:158::-;63685:4;63709:53;63717:3;:10;;63753:5;63737:23;;63729:32;;63709:7;:53::i;:::-;63702:60;;63612:158;;;;:::o;20818:108::-;20885:8;:6;:8::i;:::-;20877:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;20818:108::o;20633:::-;20704:8;:6;:8::i;:::-;20703:9;20695:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;20633:108::o;59789:120::-;59856:7;59883:3;:11;;59895:5;59883:18;;;;;;;;:::i;:::-;;;;;;;;;;59876:25;;59789:120;;;;:::o;59326:109::-;59382:7;59409:3;:11;;:18;;;;59402:25;;59326:109;;;:::o;59111:129::-;59184:4;59231:1;59208:3;:12;;:19;59221:5;59208:19;;;;;;;;;;;;:24;;59201:31;;59111:129;;;;:::o;43999:151::-;44057:13;44090:52;44118:4;44102:22;;41874:2;44090:52;;:11;:52::i;:::-;44083:59;;43999:151;;;:::o;43395:447::-;43470:13;43496:19;43541:1;43532:6;43528:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;43518:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43496:47;;43554:15;:6;43561:1;43554:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;43580;:6;43587:1;43580:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;43611:9;43636:1;43627:6;43623:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;43611:26;;43606:131;43643:1;43639;:5;43606:131;;;43678:8;43695:3;43687:5;:11;43678:21;;;;;;;:::i;:::-;;;;;43666:6;43673:1;43666:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;43724:1;43714:11;;;;;43646:3;;;;:::i;:::-;;;43606:131;;;;43764:1;43755:5;:10;43747:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43827:6;43813:21;;;43395:447;;;;:::o;57605:1420::-;57671:4;57789:18;57810:3;:12;;:19;57823:5;57810:19;;;;;;;;;;;;57789:40;;57860:1;57846:10;:15;57842:1176;;58221:21;58258:1;58245:10;:14;;;;:::i;:::-;58221:38;;58274:17;58315:1;58294:3;:11;;:18;;;;:22;;;;:::i;:::-;58274:42;;58350:13;58337:9;:26;58333:405;;58384:17;58404:3;:11;;58416:9;58404:22;;;;;;;;:::i;:::-;;;;;;;;;;58384:42;;58558:9;58529:3;:11;;58541:13;58529:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;58669:10;58643:3;:12;;:23;58656:9;58643:23;;;;;;;;;;;:36;;;;58365:373;58333:405;58819:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58914:3;:12;;:19;58927:5;58914:19;;;;;;;;;;;58907:26;;;58957:4;58950:11;;;;;;;57842:1176;59001:5;58994:12;;;57605:1420;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:619::-;4680:6;4688;4696;4745:2;4733:9;4724:7;4720:23;4716:32;4713:119;;;4751:79;;:::i;:::-;4713:119;4871:1;4896:53;4941:7;4932:6;4921:9;4917:22;4896:53;:::i;:::-;4886:63;;4842:117;4998:2;5024:53;5069:7;5060:6;5049:9;5045:22;5024:53;:::i;:::-;5014:63;;4969:118;5126:2;5152:53;5197:7;5188:6;5177:9;5173:22;5152:53;:::i;:::-;5142:63;;5097:118;4603:619;;;;;:::o;5228:77::-;5265:7;5294:5;5283:16;;5228:77;;;:::o;5311:122::-;5384:24;5402:5;5384:24;:::i;:::-;5377:5;5374:35;5364:63;;5423:1;5420;5413:12;5364:63;5311:122;:::o;5439:139::-;5485:5;5523:6;5510:20;5501:29;;5539:33;5566:5;5539:33;:::i;:::-;5439:139;;;;:::o;5584:329::-;5643:6;5692:2;5680:9;5671:7;5667:23;5663:32;5660:119;;;5698:79;;:::i;:::-;5660:119;5818:1;5843:53;5888:7;5879:6;5868:9;5864:22;5843:53;:::i;:::-;5833:63;;5789:117;5584:329;;;;:::o;5919:118::-;6006:24;6024:5;6006:24;:::i;:::-;6001:3;5994:37;5919:118;;:::o;6043:222::-;6136:4;6174:2;6163:9;6159:18;6151:26;;6187:71;6255:1;6244:9;6240:17;6231:6;6187:71;:::i;:::-;6043:222;;;;:::o;6271:474::-;6339:6;6347;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6649:2;6675:53;6720:7;6711:6;6700:9;6696:22;6675:53;:::i;:::-;6665:63;;6620:118;6271:474;;;;;:::o;6751:86::-;6786:7;6826:4;6819:5;6815:16;6804:27;;6751:86;;;:::o;6843:112::-;6926:22;6942:5;6926:22;:::i;:::-;6921:3;6914:35;6843:112;;:::o;6961:214::-;7050:4;7088:2;7077:9;7073:18;7065:26;;7101:67;7165:1;7154:9;7150:17;7141:6;7101:67;:::i;:::-;6961:214;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:::-;7575:6;7624:2;7612:9;7603:7;7599:23;7595:32;7592:119;;;7630:79;;:::i;:::-;7592:119;7750:1;7775:53;7820:7;7811:6;7800:9;7796:22;7775:53;:::i;:::-;7765:63;;7721:117;7516:329;;;;:::o;7851:474::-;7919:6;7927;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;8229:2;8255:53;8300:7;8291:6;8280:9;8276:22;8255:53;:::i;:::-;8245:63;;8200:118;7851:474;;;;;:::o;8331:118::-;8418:24;8436:5;8418:24;:::i;:::-;8413:3;8406:37;8331:118;;:::o;8455:222::-;8548:4;8586:2;8575:9;8571:18;8563:26;;8599:71;8667:1;8656:9;8652:17;8643:6;8599:71;:::i;:::-;8455:222;;;;:::o;8683:117::-;8792:1;8789;8782:12;8806:117;8915:1;8912;8905:12;8929:180;8977:77;8974:1;8967:88;9074:4;9071:1;9064:15;9098:4;9095:1;9088:15;9115:281;9198:27;9220:4;9198:27;:::i;:::-;9190:6;9186:40;9328:6;9316:10;9313:22;9292:18;9280:10;9277:34;9274:62;9271:88;;;9339:18;;:::i;:::-;9271:88;9379:10;9375:2;9368:22;9158:238;9115:281;;:::o;9402:129::-;9436:6;9463:20;;:::i;:::-;9453:30;;9492:33;9520:4;9512:6;9492:33;:::i;:::-;9402:129;;;:::o;9537:308::-;9599:4;9689:18;9681:6;9678:30;9675:56;;;9711:18;;:::i;:::-;9675:56;9749:29;9771:6;9749:29;:::i;:::-;9741:37;;9833:4;9827;9823:15;9815:23;;9537:308;;;:::o;9851:154::-;9935:6;9930:3;9925;9912:30;9997:1;9988:6;9983:3;9979:16;9972:27;9851:154;;;:::o;10011:412::-;10089:5;10114:66;10130:49;10172:6;10130:49;:::i;:::-;10114:66;:::i;:::-;10105:75;;10203:6;10196:5;10189:21;10241:4;10234:5;10230:16;10279:3;10270:6;10265:3;10261:16;10258:25;10255:112;;;10286:79;;:::i;:::-;10255:112;10376:41;10410:6;10405:3;10400;10376:41;:::i;:::-;10095:328;10011:412;;;;;:::o;10443:340::-;10499:5;10548:3;10541:4;10533:6;10529:17;10525:27;10515:122;;10556:79;;:::i;:::-;10515:122;10673:6;10660:20;10698:79;10773:3;10765:6;10758:4;10750:6;10746:17;10698:79;:::i;:::-;10689:88;;10505:278;10443:340;;;;:::o;10789:799::-;10876:6;10884;10892;10941:2;10929:9;10920:7;10916:23;10912:32;10909:119;;;10947:79;;:::i;:::-;10909:119;11067:1;11092:53;11137:7;11128:6;11117:9;11113:22;11092:53;:::i;:::-;11082:63;;11038:117;11194:2;11220:53;11265:7;11256:6;11245:9;11241:22;11220:53;:::i;:::-;11210:63;;11165:118;11350:2;11339:9;11335:18;11322:32;11381:18;11373:6;11370:30;11367:117;;;11403:79;;:::i;:::-;11367:117;11508:63;11563:7;11554:6;11543:9;11539:22;11508:63;:::i;:::-;11498:73;;11293:288;10789:799;;;;;:::o;11594:474::-;11662:6;11670;11719:2;11707:9;11698:7;11694:23;11690:32;11687:119;;;11725:79;;:::i;:::-;11687:119;11845:1;11870:53;11915:7;11906:6;11895:9;11891:22;11870:53;:::i;:::-;11860:63;;11816:117;11972:2;11998:53;12043:7;12034:6;12023:9;12019:22;11998:53;:::i;:::-;11988:63;;11943:118;11594:474;;;;;:::o;12074:180::-;12122:77;12119:1;12112:88;12219:4;12216:1;12209:15;12243:4;12240:1;12233:15;12260:320;12304:6;12341:1;12335:4;12331:12;12321:22;;12388:1;12382:4;12378:12;12409:18;12399:81;;12465:4;12457:6;12453:17;12443:27;;12399:81;12527:2;12519:6;12516:14;12496:18;12493:38;12490:84;;12546:18;;:::i;:::-;12490:84;12311:269;12260:320;;;:::o;12586:234::-;12726:34;12722:1;12714:6;12710:14;12703:58;12795:17;12790:2;12782:6;12778:15;12771:42;12586:234;:::o;12826:366::-;12968:3;12989:67;13053:2;13048:3;12989:67;:::i;:::-;12982:74;;13065:93;13154:3;13065:93;:::i;:::-;13183:2;13178:3;13174:12;13167:19;;12826:366;;;:::o;13198:419::-;13364:4;13402:2;13391:9;13387:18;13379:26;;13451:9;13445:4;13441:20;13437:1;13426:9;13422:17;13415:47;13479:131;13605:4;13479:131;:::i;:::-;13471:139;;13198:419;;;:::o;13623:180::-;13671:77;13668:1;13661:88;13768:4;13765:1;13758:15;13792:4;13789:1;13782:15;13809:305;13849:3;13868:20;13886:1;13868:20;:::i;:::-;13863:25;;13902:20;13920:1;13902:20;:::i;:::-;13897:25;;14056:1;13988:66;13984:74;13981:1;13978:81;13975:107;;;14062:18;;:::i;:::-;13975:107;14106:1;14103;14099:9;14092:16;;13809:305;;;;:::o;14120:244::-;14260:34;14256:1;14248:6;14244:14;14237:58;14329:27;14324:2;14316:6;14312:15;14305:52;14120:244;:::o;14370:366::-;14512:3;14533:67;14597:2;14592:3;14533:67;:::i;:::-;14526:74;;14609:93;14698:3;14609:93;:::i;:::-;14727:2;14722:3;14718:12;14711:19;;14370:366;;;:::o;14742:419::-;14908:4;14946:2;14935:9;14931:18;14923:26;;14995:9;14989:4;14985:20;14981:1;14970:9;14966:17;14959:47;15023:131;15149:4;15023:131;:::i;:::-;15015:139;;14742:419;;;:::o;15167:241::-;15307:34;15303:1;15295:6;15291:14;15284:58;15376:24;15371:2;15363:6;15359:15;15352:49;15167:241;:::o;15414:366::-;15556:3;15577:67;15641:2;15636:3;15577:67;:::i;:::-;15570:74;;15653:93;15742:3;15653:93;:::i;:::-;15771:2;15766:3;15762:12;15755:19;;15414:366;;;:::o;15786:419::-;15952:4;15990:2;15979:9;15975:18;15967:26;;16039:9;16033:4;16029:20;16025:1;16014:9;16010:17;16003:47;16067:131;16193:4;16067:131;:::i;:::-;16059:139;;15786:419;;;:::o;16211:242::-;16351:34;16347:1;16339:6;16335:14;16328:58;16420:25;16415:2;16407:6;16403:15;16396:50;16211:242;:::o;16459:366::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:419::-;16997:4;17035:2;17024:9;17020:18;17012:26;;17084:9;17078:4;17074:20;17070:1;17059:9;17055:17;17048:47;17112:131;17238:4;17112:131;:::i;:::-;17104:139;;16831:419;;;:::o;17256:224::-;17396:34;17392:1;17384:6;17380:14;17373:58;17465:7;17460:2;17452:6;17448:15;17441:32;17256:224;:::o;17486:366::-;17628:3;17649:67;17713:2;17708:3;17649:67;:::i;:::-;17642:74;;17725:93;17814:3;17725:93;:::i;:::-;17843:2;17838:3;17834:12;17827:19;;17486:366;;;:::o;17858:419::-;18024:4;18062:2;18051:9;18047:18;18039:26;;18111:9;18105:4;18101:20;18097:1;18086:9;18082:17;18075:47;18139:131;18265:4;18139:131;:::i;:::-;18131:139;;17858:419;;;:::o;18283:423::-;18424:4;18462:2;18451:9;18447:18;18439:26;;18475:71;18543:1;18532:9;18528:17;18519:6;18475:71;:::i;:::-;18593:9;18587:4;18583:20;18578:2;18567:9;18563:18;18556:48;18621:78;18694:4;18685:6;18621:78;:::i;:::-;18613:86;;18283:423;;;;;:::o;18712:175::-;18852:27;18848:1;18840:6;18836:14;18829:51;18712:175;:::o;18893:366::-;19035:3;19056:67;19120:2;19115:3;19056:67;:::i;:::-;19049:74;;19132:93;19221:3;19132:93;:::i;:::-;19250:2;19245:3;19241:12;19234:19;;18893:366;;;:::o;19265:419::-;19431:4;19469:2;19458:9;19454:18;19446:26;;19518:9;19512:4;19508:20;19504:1;19493:9;19489:17;19482:47;19546:131;19672:4;19546:131;:::i;:::-;19538:139;;19265:419;;;:::o;19690:181::-;19830:33;19826:1;19818:6;19814:14;19807:57;19690:181;:::o;19877:366::-;20019:3;20040:67;20104:2;20099:3;20040:67;:::i;:::-;20033:74;;20116:93;20205:3;20116:93;:::i;:::-;20234:2;20229:3;20225:12;20218:19;;19877:366;;;:::o;20249:419::-;20415:4;20453:2;20442:9;20438:18;20430:26;;20502:9;20496:4;20492:20;20488:1;20477:9;20473:17;20466:47;20530:131;20656:4;20530:131;:::i;:::-;20522:139;;20249:419;;;:::o;20674:229::-;20814:34;20810:1;20802:6;20798:14;20791:58;20883:12;20878:2;20870:6;20866:15;20859:37;20674:229;:::o;20909:366::-;21051:3;21072:67;21136:2;21131:3;21072:67;:::i;:::-;21065:74;;21148:93;21237:3;21148:93;:::i;:::-;21266:2;21261:3;21257:12;21250:19;;20909:366;;;:::o;21281:419::-;21447:4;21485:2;21474:9;21470:18;21462:26;;21534:9;21528:4;21524:20;21520:1;21509:9;21505:17;21498:47;21562:131;21688:4;21562:131;:::i;:::-;21554:139;;21281:419;;;:::o;21706:223::-;21846:34;21842:1;21834:6;21830:14;21823:58;21915:6;21910:2;21902:6;21898:15;21891:31;21706:223;:::o;21935:366::-;22077:3;22098:67;22162:2;22157:3;22098:67;:::i;:::-;22091:74;;22174:93;22263:3;22174:93;:::i;:::-;22292:2;22287:3;22283:12;22276:19;;21935:366;;;:::o;22307:419::-;22473:4;22511:2;22500:9;22496:18;22488:26;;22560:9;22554:4;22550:20;22546:1;22535:9;22531:17;22524:47;22588:131;22714:4;22588:131;:::i;:::-;22580:139;;22307:419;;;:::o;22732:221::-;22872:34;22868:1;22860:6;22856:14;22849:58;22941:4;22936:2;22928:6;22924:15;22917:29;22732:221;:::o;22959:366::-;23101:3;23122:67;23186:2;23181:3;23122:67;:::i;:::-;23115:74;;23198:93;23287:3;23198:93;:::i;:::-;23316:2;23311:3;23307:12;23300:19;;22959:366;;;:::o;23331:419::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23584:9;23578:4;23574:20;23570:1;23559:9;23555:17;23548:47;23612:131;23738:4;23612:131;:::i;:::-;23604:139;;23331:419;;;:::o;23756:179::-;23896:31;23892:1;23884:6;23880:14;23873:55;23756:179;:::o;23941:366::-;24083:3;24104:67;24168:2;24163:3;24104:67;:::i;:::-;24097:74;;24180:93;24269:3;24180:93;:::i;:::-;24298:2;24293:3;24289:12;24282:19;;23941:366;;;:::o;24313:419::-;24479:4;24517:2;24506:9;24502:18;24494:26;;24566:9;24560:4;24556:20;24552:1;24541:9;24537:17;24530:47;24594:131;24720:4;24594:131;:::i;:::-;24586:139;;24313:419;;;:::o;24738:224::-;24878:34;24874:1;24866:6;24862:14;24855:58;24947:7;24942:2;24934:6;24930:15;24923:32;24738:224;:::o;24968:366::-;25110:3;25131:67;25195:2;25190:3;25131:67;:::i;:::-;25124:74;;25207:93;25296:3;25207:93;:::i;:::-;25325:2;25320:3;25316:12;25309:19;;24968:366;;;:::o;25340:419::-;25506:4;25544:2;25533:9;25529:18;25521:26;;25593:9;25587:4;25583:20;25579:1;25568:9;25564:17;25557:47;25621:131;25747:4;25621:131;:::i;:::-;25613:139;;25340:419;;;:::o;25765:222::-;25905:34;25901:1;25893:6;25889:14;25882:58;25974:5;25969:2;25961:6;25957:15;25950:30;25765:222;:::o;25993:366::-;26135:3;26156:67;26220:2;26215:3;26156:67;:::i;:::-;26149:74;;26232:93;26321:3;26232:93;:::i;:::-;26350:2;26345:3;26341:12;26334:19;;25993:366;;;:::o;26365:419::-;26531:4;26569:2;26558:9;26554:18;26546:26;;26618:9;26612:4;26608:20;26604:1;26593:9;26589:17;26582:47;26646:131;26772:4;26646:131;:::i;:::-;26638:139;;26365:419;;;:::o;26790:225::-;26930:34;26926:1;26918:6;26914:14;26907:58;26999:8;26994:2;26986:6;26982:15;26975:33;26790:225;:::o;27021:366::-;27163:3;27184:67;27248:2;27243:3;27184:67;:::i;:::-;27177:74;;27260:93;27349:3;27260:93;:::i;:::-;27378:2;27373:3;27369:12;27362:19;;27021:366;;;:::o;27393:419::-;27559:4;27597:2;27586:9;27582:18;27574:26;;27646:9;27640:4;27636:20;27632:1;27621:9;27617:17;27610:47;27674:131;27800:4;27674:131;:::i;:::-;27666:139;;27393:419;;;:::o;27818:220::-;27958:34;27954:1;27946:6;27942:14;27935:58;28027:3;28022:2;28014:6;28010:15;28003:28;27818:220;:::o;28044:366::-;28186:3;28207:67;28271:2;28266:3;28207:67;:::i;:::-;28200:74;;28283:93;28372:3;28283:93;:::i;:::-;28401:2;28396:3;28392:12;28385:19;;28044:366;;;:::o;28416:419::-;28582:4;28620:2;28609:9;28605:18;28597:26;;28669:9;28663:4;28659:20;28655:1;28644:9;28640:17;28633:47;28697:131;28823:4;28697:131;:::i;:::-;28689:139;;28416:419;;;:::o;28841:221::-;28981:34;28977:1;28969:6;28965:14;28958:58;29050:4;29045:2;29037:6;29033:15;29026:29;28841:221;:::o;29068:366::-;29210:3;29231:67;29295:2;29290:3;29231:67;:::i;:::-;29224:74;;29307:93;29396:3;29307:93;:::i;:::-;29425:2;29420:3;29416:12;29409:19;;29068:366;;;:::o;29440:419::-;29606:4;29644:2;29633:9;29629:18;29621:26;;29693:9;29687:4;29683:20;29679:1;29668:9;29664:17;29657:47;29721:131;29847:4;29721:131;:::i;:::-;29713:139;;29440:419;;;:::o;29865:148::-;29967:11;30004:3;29989:18;;29865:148;;;;:::o;30019:173::-;30159:25;30155:1;30147:6;30143:14;30136:49;30019:173;:::o;30198:402::-;30358:3;30379:85;30461:2;30456:3;30379:85;:::i;:::-;30372:92;;30473:93;30562:3;30473:93;:::i;:::-;30591:2;30586:3;30582:12;30575:19;;30198:402;;;:::o;30606:377::-;30712:3;30740:39;30773:5;30740:39;:::i;:::-;30795:89;30877:6;30872:3;30795:89;:::i;:::-;30788:96;;30893:52;30938:6;30933:3;30926:4;30919:5;30915:16;30893:52;:::i;:::-;30970:6;30965:3;30961:16;30954:23;;30716:267;30606:377;;;;:::o;30989:167::-;31129:19;31125:1;31117:6;31113:14;31106:43;30989:167;:::o;31162:402::-;31322:3;31343:85;31425:2;31420:3;31343:85;:::i;:::-;31336:92;;31437:93;31526:3;31437:93;:::i;:::-;31555:2;31550:3;31546:12;31539:19;;31162:402;;;:::o;31570:967::-;31952:3;31974:148;32118:3;31974:148;:::i;:::-;31967:155;;32139:95;32230:3;32221:6;32139:95;:::i;:::-;32132:102;;32251:148;32395:3;32251:148;:::i;:::-;32244:155;;32416:95;32507:3;32498:6;32416:95;:::i;:::-;32409:102;;32528:3;32521:10;;31570:967;;;;;:::o;32543:170::-;32683:22;32679:1;32671:6;32667:14;32660:46;32543:170;:::o;32719:366::-;32861:3;32882:67;32946:2;32941:3;32882:67;:::i;:::-;32875:74;;32958:93;33047:3;32958:93;:::i;:::-;33076:2;33071:3;33067:12;33060:19;;32719:366;;;:::o;33091:419::-;33257:4;33295:2;33284:9;33280:18;33272:26;;33344:9;33338:4;33334:20;33330:1;33319:9;33315:17;33308:47;33372:131;33498:4;33372:131;:::i;:::-;33364:139;;33091:419;;;:::o;33516:166::-;33656:18;33652:1;33644:6;33640:14;33633:42;33516:166;:::o;33688:366::-;33830:3;33851:67;33915:2;33910:3;33851:67;:::i;:::-;33844:74;;33927:93;34016:3;33927:93;:::i;:::-;34045:2;34040:3;34036:12;34029:19;;33688:366;;;:::o;34060:419::-;34226:4;34264:2;34253:9;34249:18;34241:26;;34313:9;34307:4;34303:20;34299:1;34288:9;34284:17;34277:47;34341:131;34467:4;34341:131;:::i;:::-;34333:139;;34060:419;;;:::o;34485:180::-;34533:77;34530:1;34523:88;34630:4;34627:1;34620:15;34654:4;34651:1;34644:15;34671:348;34711:7;34734:20;34752:1;34734:20;:::i;:::-;34729:25;;34768:20;34786:1;34768:20;:::i;:::-;34763:25;;34956:1;34888:66;34884:74;34881:1;34878:81;34873:1;34866:9;34859:17;34855:105;34852:131;;;34963:18;;:::i;:::-;34852:131;35011:1;35008;35004:9;34993:20;;34671:348;;;;:::o;35025:171::-;35064:3;35087:24;35105:5;35087:24;:::i;:::-;35078:33;;35133:4;35126:5;35123:15;35120:41;;35141:18;;:::i;:::-;35120:41;35188:1;35181:5;35177:13;35170:20;;35025:171;;;:::o;35202:182::-;35342:34;35338:1;35330:6;35326:14;35319:58;35202:182;:::o;35390:366::-;35532:3;35553:67;35617:2;35612:3;35553:67;:::i;:::-;35546:74;;35629:93;35718:3;35629:93;:::i;:::-;35747:2;35742:3;35738:12;35731:19;;35390:366;;;:::o;35762:419::-;35928:4;35966:2;35955:9;35951:18;35943:26;;36015:9;36009:4;36005:20;36001:1;35990:9;35986:17;35979:47;36043:131;36169:4;36043:131;:::i;:::-;36035:139;;35762:419;;;:::o;36187:191::-;36227:4;36247:20;36265:1;36247:20;:::i;:::-;36242:25;;36281:20;36299:1;36281:20;:::i;:::-;36276:25;;36320:1;36317;36314:8;36311:34;;;36325:18;;:::i;:::-;36311:34;36370:1;36367;36363:9;36355:17;;36187:191;;;;:::o;36384:180::-;36432:77;36429:1;36422:88;36529:4;36526:1;36519:15;36553:4;36550:1;36543:15
Swarm Source
ipfs://99a1bcc84e87a159c8ba33bb4e526c971b6c27aef85de05ad96d5d8b247f3678
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.