ETH Price: $3,466.35 (-0.06%)
Gas: 11 Gwei

Token

ViragoToken (NAILS)
 

Overview

Max Total Supply

38,016.609430555555555513 NAILS

Holders

14

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
727.442246527777777777 NAILS

Value
$0.00
0xf6750306cd98cf4736ec944e196cfed4b55c442c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NAILS

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-22
*/

// 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/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// 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/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/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.5.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:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev 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, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{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(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view 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.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * 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.
     */
    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.
     */
    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/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

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

// 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/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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, _allowances[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 = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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;
        }
        _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;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * 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: contracts/ViragoToken.sol


pragma solidity 0.8.12;




contract NAILS is ERC20, ERC20Burnable, AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    
    uint public constant _maxSupply = 100000000 ether;
    
    constructor() ERC20("ViragoToken", "NAILS") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);

    }

    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {
        require(totalSupply() + amount <= _maxSupply, "max supply exceeded");
        _mint(to, amount);
    }

    function burn(address from, uint256 amount) public onlyRole(MINTER_ROLE){
        _burn(from, amount);
    }
    
    function maxSupply() public pure returns(uint) {
        return _maxSupply;
    }
    


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"from","type":"address"},{"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":"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":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f56697261676f546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e41494c530000000000000000000000000000000000000000000000000000008152508160039080519060200190620000969291906200027a565b508060049080519060200190620000af9291906200027a565b505050620000c76000801b33620000ff60201b60201c565b620000f97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ff60201b60201c565b6200038f565b6200011182826200011560201b60201c565b5050565b6200012782826200020760201b60201c565b620002035760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001a86200027260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002889062000359565b90600052602060002090601f016020900481019282620002ac5760008555620002f8565b82601f10620002c757805160ff1916838001178555620002f8565b82800160010185558215620002f8579182015b82811115620002f7578251825591602001919060010190620002da565b5b5090506200030791906200030b565b5090565b5b80821115620003265760008160009055506001016200030c565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037257607f821691505b602082108114156200038957620003886200032a565b5b50919050565b6127fb806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806342966c68116100de578063a217fddf11610097578063d539139311610071578063d539139314610484578063d547741f146104a2578063d5abeb01146104be578063dd62ed3e146104dc57610173565b8063a217fddf14610406578063a457c2d714610424578063a9059cbb1461045457610173565b806342966c681461033457806370a082311461035057806379cc67901461038057806391d148541461039c57806395d89b41146103cc5780639dc29fac146103ea57610173565b8063248a9ca311610130578063248a9ca3146102625780632f2ff15d14610292578063313ce567146102ae57806336568abe146102cc57806339509351146102e857806340c10f191461031857610173565b806301ffc9a71461017857806306fdde03146101a8578063095ea7b3146101c657806318160ddd146101f657806322f4596f1461021457806323b872dd14610232575b600080fd5b610192600480360381019061018d91906119dc565b61050c565b60405161019f9190611a24565b60405180910390f35b6101b0610586565b6040516101bd9190611ad8565b60405180910390f35b6101e060048036038101906101db9190611b8e565b610618565b6040516101ed9190611a24565b60405180910390f35b6101fe61063b565b60405161020b9190611bdd565b60405180910390f35b61021c610645565b6040516102299190611bdd565b60405180910390f35b61024c60048036038101906102479190611bf8565b610654565b6040516102599190611a24565b60405180910390f35b61027c60048036038101906102779190611c81565b610683565b6040516102899190611cbd565b60405180910390f35b6102ac60048036038101906102a79190611cd8565b6106a3565b005b6102b66106cc565b6040516102c39190611d34565b60405180910390f35b6102e660048036038101906102e19190611cd8565b6106d5565b005b61030260048036038101906102fd9190611b8e565b610758565b60405161030f9190611a24565b60405180910390f35b610332600480360381019061032d9190611b8e565b610802565b005b61034e60048036038101906103499190611d4f565b6108a3565b005b61036a60048036038101906103659190611d7c565b6108b7565b6040516103779190611bdd565b60405180910390f35b61039a60048036038101906103959190611b8e565b6108ff565b005b6103b660048036038101906103b19190611cd8565b61091f565b6040516103c39190611a24565b60405180910390f35b6103d461098a565b6040516103e19190611ad8565b60405180910390f35b61040460048036038101906103ff9190611b8e565b610a1c565b005b61040e610a5d565b60405161041b9190611cbd565b60405180910390f35b61043e60048036038101906104399190611b8e565b610a64565b60405161044b9190611a24565b60405180910390f35b61046e60048036038101906104699190611b8e565b610b4e565b60405161047b9190611a24565b60405180910390f35b61048c610b71565b6040516104999190611cbd565b60405180910390f35b6104bc60048036038101906104b79190611cd8565b610b95565b005b6104c6610bbe565b6040516104d39190611bdd565b60405180910390f35b6104f660048036038101906104f19190611da9565b610bd1565b6040516105039190611bdd565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061057f575061057e82610c58565b5b9050919050565b60606003805461059590611e18565b80601f01602080910402602001604051908101604052809291908181526020018280546105c190611e18565b801561060e5780601f106105e35761010080835404028352916020019161060e565b820191906000526020600020905b8154815290600101906020018083116105f157829003601f168201915b5050505050905090565b600080610623610cc2565b9050610630818585610cca565b600191505092915050565b6000600254905090565b6a52b7d2dcc80cd2e400000081565b60008061065f610cc2565b905061066c858285610e95565b610677858585610f21565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b6106ac82610683565b6106bd816106b8610cc2565b6111a2565b6106c7838361123f565b505050565b60006012905090565b6106dd610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190611ebc565b60405180910390fd5b6107548282611320565b5050565b600080610763610cc2565b90506107f7818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107f29190611f0b565b610cca565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108348161082f610cc2565b6111a2565b6a52b7d2dcc80cd2e40000008261084961063b565b6108539190611f0b565b1115610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90611fad565b60405180910390fd5b61089e8383611402565b505050565b6108b46108ae610cc2565b82611562565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109118261090b610cc2565b83610e95565b61091b8282611562565b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461099990611e18565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590611e18565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a4e81610a49610cc2565b6111a2565b610a588383611562565b505050565b6000801b81565b600080610a6f610cc2565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061203f565b60405180910390fd5b610b428286868403610cca565b60019250505092915050565b600080610b59610cc2565b9050610b66818585610f21565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610b9e82610683565b610baf81610baa610cc2565b6111a2565b610bb98383611320565b505050565b60006a52b7d2dcc80cd2e4000000905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906120d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190612163565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610e889190611bdd565b60405180910390a3505050565b6000610ea18484610bd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f1b5781811015610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f04906121cf565b60405180910390fd5b610f1a8484848403610cca565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890612261565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8906122f3565b60405180910390fd5b61100c838383611739565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990612385565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111259190611f0b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111899190611bdd565b60405180910390a361119c84848461173e565b50505050565b6111ac828261091f565b61123b576111d18173ffffffffffffffffffffffffffffffffffffffff166014611743565b6111df8360001c6020611743565b6040516020016111f0929190612479565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329190611ad8565b60405180910390fd5b5050565b611249828261091f565b61131c5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112c1610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61132a828261091f565b156113fe5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113a3610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906124ff565b60405180910390fd5b61147e60008383611739565b80600260008282546114909190611f0b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e59190611f0b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161154a9190611bdd565b60405180910390a361155e6000838361173e565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990612591565b60405180910390fd5b6115de82600083611739565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90612623565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116bb9190612643565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117209190611bdd565b60405180910390a36117348360008461173e565b505050565b505050565b505050565b6060600060028360026117569190612677565b6117609190611f0b565b67ffffffffffffffff811115611779576117786126d1565b5b6040519080825280601f01601f1916602001820160405280156117ab5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117e3576117e2612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061184757611846612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118879190612677565b6118919190611f0b565b90505b6001811115611931577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106118d3576118d2612700565b5b1a60f81b8282815181106118ea576118e9612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061192a9061272f565b9050611894565b5060008414611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906127a5565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6119b981611984565b81146119c457600080fd5b50565b6000813590506119d6816119b0565b92915050565b6000602082840312156119f2576119f161197f565b5b6000611a00848285016119c7565b91505092915050565b60008115159050919050565b611a1e81611a09565b82525050565b6000602082019050611a396000830184611a15565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a79578082015181840152602081019050611a5e565b83811115611a88576000848401525b50505050565b6000601f19601f8301169050919050565b6000611aaa82611a3f565b611ab48185611a4a565b9350611ac4818560208601611a5b565b611acd81611a8e565b840191505092915050565b60006020820190508181036000830152611af28184611a9f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b2582611afa565b9050919050565b611b3581611b1a565b8114611b4057600080fd5b50565b600081359050611b5281611b2c565b92915050565b6000819050919050565b611b6b81611b58565b8114611b7657600080fd5b50565b600081359050611b8881611b62565b92915050565b60008060408385031215611ba557611ba461197f565b5b6000611bb385828601611b43565b9250506020611bc485828601611b79565b9150509250929050565b611bd781611b58565b82525050565b6000602082019050611bf26000830184611bce565b92915050565b600080600060608486031215611c1157611c1061197f565b5b6000611c1f86828701611b43565b9350506020611c3086828701611b43565b9250506040611c4186828701611b79565b9150509250925092565b6000819050919050565b611c5e81611c4b565b8114611c6957600080fd5b50565b600081359050611c7b81611c55565b92915050565b600060208284031215611c9757611c9661197f565b5b6000611ca584828501611c6c565b91505092915050565b611cb781611c4b565b82525050565b6000602082019050611cd26000830184611cae565b92915050565b60008060408385031215611cef57611cee61197f565b5b6000611cfd85828601611c6c565b9250506020611d0e85828601611b43565b9150509250929050565b600060ff82169050919050565b611d2e81611d18565b82525050565b6000602082019050611d496000830184611d25565b92915050565b600060208284031215611d6557611d6461197f565b5b6000611d7384828501611b79565b91505092915050565b600060208284031215611d9257611d9161197f565b5b6000611da084828501611b43565b91505092915050565b60008060408385031215611dc057611dbf61197f565b5b6000611dce85828601611b43565b9250506020611ddf85828601611b43565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e3057607f821691505b60208210811415611e4457611e43611de9565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000611ea6602f83611a4a565b9150611eb182611e4a565b604082019050919050565b60006020820190508181036000830152611ed581611e99565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1682611b58565b9150611f2183611b58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611f5657611f55611edc565b5b828201905092915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000611f97601383611a4a565b9150611fa282611f61565b602082019050919050565b60006020820190508181036000830152611fc681611f8a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612029602583611a4a565b915061203482611fcd565b604082019050919050565b600060208201905081810360008301526120588161201c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006120bb602483611a4a565b91506120c68261205f565b604082019050919050565b600060208201905081810360008301526120ea816120ae565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061214d602283611a4a565b9150612158826120f1565b604082019050919050565b6000602082019050818103600083015261217c81612140565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006121b9601d83611a4a565b91506121c482612183565b602082019050919050565b600060208201905081810360008301526121e8816121ac565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061224b602583611a4a565b9150612256826121ef565b604082019050919050565b6000602082019050818103600083015261227a8161223e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006122dd602383611a4a565b91506122e882612281565b604082019050919050565b6000602082019050818103600083015261230c816122d0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061236f602683611a4a565b915061237a82612313565b604082019050919050565b6000602082019050818103600083015261239e81612362565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006123e66017836123a5565b91506123f1826123b0565b601782019050919050565b600061240782611a3f565b61241181856123a5565b9350612421818560208601611a5b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006124636011836123a5565b915061246e8261242d565b601182019050919050565b6000612484826123d9565b915061249082856123fc565b915061249b82612456565b91506124a782846123fc565b91508190509392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006124e9601f83611a4a565b91506124f4826124b3565b602082019050919050565b60006020820190508181036000830152612518816124dc565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061257b602183611a4a565b91506125868261251f565b604082019050919050565b600060208201905081810360008301526125aa8161256e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061260d602283611a4a565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b600061264e82611b58565b915061265983611b58565b92508282101561266c5761266b611edc565b5b828203905092915050565b600061268282611b58565b915061268d83611b58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126c6576126c5611edc565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061273a82611b58565b9150600082141561274e5761274d611edc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061278f602083611a4a565b915061279a82612759565b602082019050919050565b600060208201905081810360008301526127be81612782565b905091905056fea26469706673582212201175b8f25ab5250bbbe9c38283e106e5168016b6650764d08d5b70608c8da72864736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806342966c68116100de578063a217fddf11610097578063d539139311610071578063d539139314610484578063d547741f146104a2578063d5abeb01146104be578063dd62ed3e146104dc57610173565b8063a217fddf14610406578063a457c2d714610424578063a9059cbb1461045457610173565b806342966c681461033457806370a082311461035057806379cc67901461038057806391d148541461039c57806395d89b41146103cc5780639dc29fac146103ea57610173565b8063248a9ca311610130578063248a9ca3146102625780632f2ff15d14610292578063313ce567146102ae57806336568abe146102cc57806339509351146102e857806340c10f191461031857610173565b806301ffc9a71461017857806306fdde03146101a8578063095ea7b3146101c657806318160ddd146101f657806322f4596f1461021457806323b872dd14610232575b600080fd5b610192600480360381019061018d91906119dc565b61050c565b60405161019f9190611a24565b60405180910390f35b6101b0610586565b6040516101bd9190611ad8565b60405180910390f35b6101e060048036038101906101db9190611b8e565b610618565b6040516101ed9190611a24565b60405180910390f35b6101fe61063b565b60405161020b9190611bdd565b60405180910390f35b61021c610645565b6040516102299190611bdd565b60405180910390f35b61024c60048036038101906102479190611bf8565b610654565b6040516102599190611a24565b60405180910390f35b61027c60048036038101906102779190611c81565b610683565b6040516102899190611cbd565b60405180910390f35b6102ac60048036038101906102a79190611cd8565b6106a3565b005b6102b66106cc565b6040516102c39190611d34565b60405180910390f35b6102e660048036038101906102e19190611cd8565b6106d5565b005b61030260048036038101906102fd9190611b8e565b610758565b60405161030f9190611a24565b60405180910390f35b610332600480360381019061032d9190611b8e565b610802565b005b61034e60048036038101906103499190611d4f565b6108a3565b005b61036a60048036038101906103659190611d7c565b6108b7565b6040516103779190611bdd565b60405180910390f35b61039a60048036038101906103959190611b8e565b6108ff565b005b6103b660048036038101906103b19190611cd8565b61091f565b6040516103c39190611a24565b60405180910390f35b6103d461098a565b6040516103e19190611ad8565b60405180910390f35b61040460048036038101906103ff9190611b8e565b610a1c565b005b61040e610a5d565b60405161041b9190611cbd565b60405180910390f35b61043e60048036038101906104399190611b8e565b610a64565b60405161044b9190611a24565b60405180910390f35b61046e60048036038101906104699190611b8e565b610b4e565b60405161047b9190611a24565b60405180910390f35b61048c610b71565b6040516104999190611cbd565b60405180910390f35b6104bc60048036038101906104b79190611cd8565b610b95565b005b6104c6610bbe565b6040516104d39190611bdd565b60405180910390f35b6104f660048036038101906104f19190611da9565b610bd1565b6040516105039190611bdd565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061057f575061057e82610c58565b5b9050919050565b60606003805461059590611e18565b80601f01602080910402602001604051908101604052809291908181526020018280546105c190611e18565b801561060e5780601f106105e35761010080835404028352916020019161060e565b820191906000526020600020905b8154815290600101906020018083116105f157829003601f168201915b5050505050905090565b600080610623610cc2565b9050610630818585610cca565b600191505092915050565b6000600254905090565b6a52b7d2dcc80cd2e400000081565b60008061065f610cc2565b905061066c858285610e95565b610677858585610f21565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b6106ac82610683565b6106bd816106b8610cc2565b6111a2565b6106c7838361123f565b505050565b60006012905090565b6106dd610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190611ebc565b60405180910390fd5b6107548282611320565b5050565b600080610763610cc2565b90506107f7818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107f29190611f0b565b610cca565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108348161082f610cc2565b6111a2565b6a52b7d2dcc80cd2e40000008261084961063b565b6108539190611f0b565b1115610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90611fad565b60405180910390fd5b61089e8383611402565b505050565b6108b46108ae610cc2565b82611562565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109118261090b610cc2565b83610e95565b61091b8282611562565b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461099990611e18565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590611e18565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a4e81610a49610cc2565b6111a2565b610a588383611562565b505050565b6000801b81565b600080610a6f610cc2565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061203f565b60405180910390fd5b610b428286868403610cca565b60019250505092915050565b600080610b59610cc2565b9050610b66818585610f21565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610b9e82610683565b610baf81610baa610cc2565b6111a2565b610bb98383611320565b505050565b60006a52b7d2dcc80cd2e4000000905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906120d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190612163565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610e889190611bdd565b60405180910390a3505050565b6000610ea18484610bd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f1b5781811015610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f04906121cf565b60405180910390fd5b610f1a8484848403610cca565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890612261565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8906122f3565b60405180910390fd5b61100c838383611739565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990612385565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111259190611f0b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111899190611bdd565b60405180910390a361119c84848461173e565b50505050565b6111ac828261091f565b61123b576111d18173ffffffffffffffffffffffffffffffffffffffff166014611743565b6111df8360001c6020611743565b6040516020016111f0929190612479565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329190611ad8565b60405180910390fd5b5050565b611249828261091f565b61131c5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112c1610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61132a828261091f565b156113fe5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113a3610cc2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906124ff565b60405180910390fd5b61147e60008383611739565b80600260008282546114909190611f0b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e59190611f0b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161154a9190611bdd565b60405180910390a361155e6000838361173e565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990612591565b60405180910390fd5b6115de82600083611739565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90612623565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116bb9190612643565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117209190611bdd565b60405180910390a36117348360008461173e565b505050565b505050565b505050565b6060600060028360026117569190612677565b6117609190611f0b565b67ffffffffffffffff811115611779576117786126d1565b5b6040519080825280601f01601f1916602001820160405280156117ab5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117e3576117e2612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061184757611846612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118879190612677565b6118919190611f0b565b90505b6001811115611931577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106118d3576118d2612700565b5b1a60f81b8282815181106118ea576118e9612700565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061192a9061272f565b9050611894565b5060008414611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c906127a5565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6119b981611984565b81146119c457600080fd5b50565b6000813590506119d6816119b0565b92915050565b6000602082840312156119f2576119f161197f565b5b6000611a00848285016119c7565b91505092915050565b60008115159050919050565b611a1e81611a09565b82525050565b6000602082019050611a396000830184611a15565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a79578082015181840152602081019050611a5e565b83811115611a88576000848401525b50505050565b6000601f19601f8301169050919050565b6000611aaa82611a3f565b611ab48185611a4a565b9350611ac4818560208601611a5b565b611acd81611a8e565b840191505092915050565b60006020820190508181036000830152611af28184611a9f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b2582611afa565b9050919050565b611b3581611b1a565b8114611b4057600080fd5b50565b600081359050611b5281611b2c565b92915050565b6000819050919050565b611b6b81611b58565b8114611b7657600080fd5b50565b600081359050611b8881611b62565b92915050565b60008060408385031215611ba557611ba461197f565b5b6000611bb385828601611b43565b9250506020611bc485828601611b79565b9150509250929050565b611bd781611b58565b82525050565b6000602082019050611bf26000830184611bce565b92915050565b600080600060608486031215611c1157611c1061197f565b5b6000611c1f86828701611b43565b9350506020611c3086828701611b43565b9250506040611c4186828701611b79565b9150509250925092565b6000819050919050565b611c5e81611c4b565b8114611c6957600080fd5b50565b600081359050611c7b81611c55565b92915050565b600060208284031215611c9757611c9661197f565b5b6000611ca584828501611c6c565b91505092915050565b611cb781611c4b565b82525050565b6000602082019050611cd26000830184611cae565b92915050565b60008060408385031215611cef57611cee61197f565b5b6000611cfd85828601611c6c565b9250506020611d0e85828601611b43565b9150509250929050565b600060ff82169050919050565b611d2e81611d18565b82525050565b6000602082019050611d496000830184611d25565b92915050565b600060208284031215611d6557611d6461197f565b5b6000611d7384828501611b79565b91505092915050565b600060208284031215611d9257611d9161197f565b5b6000611da084828501611b43565b91505092915050565b60008060408385031215611dc057611dbf61197f565b5b6000611dce85828601611b43565b9250506020611ddf85828601611b43565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e3057607f821691505b60208210811415611e4457611e43611de9565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000611ea6602f83611a4a565b9150611eb182611e4a565b604082019050919050565b60006020820190508181036000830152611ed581611e99565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1682611b58565b9150611f2183611b58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611f5657611f55611edc565b5b828201905092915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000611f97601383611a4a565b9150611fa282611f61565b602082019050919050565b60006020820190508181036000830152611fc681611f8a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612029602583611a4a565b915061203482611fcd565b604082019050919050565b600060208201905081810360008301526120588161201c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006120bb602483611a4a565b91506120c68261205f565b604082019050919050565b600060208201905081810360008301526120ea816120ae565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061214d602283611a4a565b9150612158826120f1565b604082019050919050565b6000602082019050818103600083015261217c81612140565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006121b9601d83611a4a565b91506121c482612183565b602082019050919050565b600060208201905081810360008301526121e8816121ac565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061224b602583611a4a565b9150612256826121ef565b604082019050919050565b6000602082019050818103600083015261227a8161223e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006122dd602383611a4a565b91506122e882612281565b604082019050919050565b6000602082019050818103600083015261230c816122d0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061236f602683611a4a565b915061237a82612313565b604082019050919050565b6000602082019050818103600083015261239e81612362565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006123e66017836123a5565b91506123f1826123b0565b601782019050919050565b600061240782611a3f565b61241181856123a5565b9350612421818560208601611a5b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006124636011836123a5565b915061246e8261242d565b601182019050919050565b6000612484826123d9565b915061249082856123fc565b915061249b82612456565b91506124a782846123fc565b91508190509392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006124e9601f83611a4a565b91506124f4826124b3565b602082019050919050565b60006020820190508181036000830152612518816124dc565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061257b602183611a4a565b91506125868261251f565b604082019050919050565b600060208201905081810360008301526125aa8161256e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061260d602283611a4a565b9150612618826125b1565b604082019050919050565b6000602082019050818103600083015261263c81612600565b9050919050565b600061264e82611b58565b915061265983611b58565b92508282101561266c5761266b611edc565b5b828203905092915050565b600061268282611b58565b915061268d83611b58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126c6576126c5611edc565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061273a82611b58565b9150600082141561274e5761274d611edc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061278f602083611a4a565b915061279a82612759565b602082019050919050565b600060208201905081810360008301526127be81612782565b905091905056fea26469706673582212201175b8f25ab5250bbbe9c38283e106e5168016b6650764d08d5b70608c8da72864736f6c634300080c0033

Deployed Bytecode Sourcemap

33372:771:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10595:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21340:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23691:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22460:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33508:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24472:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12022:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12415:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22302:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13463:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25176:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33731:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32718:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22631:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33128:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10891:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21559:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33925:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9982:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25919:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22964:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33433:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12807:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34047:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23220:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10595:204;10680:4;10719:32;10704:47;;;:11;:47;;;;:87;;;;10755:36;10779:11;10755:23;:36::i;:::-;10704:87;10697:94;;10595:204;;;:::o;21340:100::-;21394:13;21427:5;21420:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21340:100;:::o;23691:201::-;23774:4;23791:13;23807:12;:10;:12::i;:::-;23791:28;;23830:32;23839:5;23846:7;23855:6;23830:8;:32::i;:::-;23880:4;23873:11;;;23691:201;;;;:::o;22460:108::-;22521:7;22548:12;;22541:19;;22460:108;:::o;33508:49::-;33542:15;33508:49;:::o;24472:295::-;24603:4;24620:15;24638:12;:10;:12::i;:::-;24620:30;;24661:38;24677:4;24683:7;24692:6;24661:15;:38::i;:::-;24710:27;24720:4;24726:2;24730:6;24710:9;:27::i;:::-;24755:4;24748:11;;;24472:295;;;;;:::o;12022:131::-;12096:7;12123:6;:12;12130:4;12123:12;;;;;;;;;;;:22;;;12116:29;;12022:131;;;:::o;12415:147::-;12498:18;12511:4;12498:12;:18::i;:::-;10473:30;10484:4;10490:12;:10;:12::i;:::-;10473:10;:30::i;:::-;12529:25:::1;12540:4;12546:7;12529:10;:25::i;:::-;12415:147:::0;;;:::o;22302:93::-;22360:5;22385:2;22378:9;;22302:93;:::o;13463:218::-;13570:12;:10;:12::i;:::-;13559:23;;:7;:23;;;13551:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;13647:26;13659:4;13665:7;13647:11;:26::i;:::-;13463:218;;:::o;25176:240::-;25264:4;25281:13;25297:12;:10;:12::i;:::-;25281:28;;25320:66;25329:5;25336:7;25375:10;25345:11;:18;25357:5;25345:18;;;;;;;;;;;;;;;:27;25364:7;25345:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;25320:8;:66::i;:::-;25404:4;25397:11;;;25176:240;;;;:::o;33731:186::-;33471:24;10473:30;10484:4;10490:12;:10;:12::i;:::-;10473:10;:30::i;:::-;33542:15:::1;33837:6;33821:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;33813:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33892:17;33898:2;33902:6;33892:5;:17::i;:::-;33731:186:::0;;;:::o;32718:91::-;32774:27;32780:12;:10;:12::i;:::-;32794:6;32774:5;:27::i;:::-;32718:91;:::o;22631:127::-;22705:7;22732:9;:18;22742:7;22732:18;;;;;;;;;;;;;;;;22725:25;;22631:127;;;:::o;33128:164::-;33205:46;33221:7;33230:12;:10;:12::i;:::-;33244:6;33205:15;:46::i;:::-;33262:22;33268:7;33277:6;33262:5;:22::i;:::-;33128:164;;:::o;10891:147::-;10977:4;11001:6;:12;11008:4;11001:12;;;;;;;;;;;:20;;:29;11022:7;11001:29;;;;;;;;;;;;;;;;;;;;;;;;;10994:36;;10891:147;;;;:::o;21559:104::-;21615:13;21648:7;21641:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21559:104;:::o;33925:110::-;33471:24;10473:30;10484:4;10490:12;:10;:12::i;:::-;10473:10;:30::i;:::-;34008:19:::1;34014:4;34020:6;34008:5;:19::i;:::-;33925:110:::0;;;:::o;9982:49::-;10027:4;9982:49;;;:::o;25919:438::-;26012:4;26029:13;26045:12;:10;:12::i;:::-;26029:28;;26068:24;26095:11;:18;26107:5;26095:18;;;;;;;;;;;;;;;:27;26114:7;26095:27;;;;;;;;;;;;;;;;26068:54;;26161:15;26141:16;:35;;26133:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26254:60;26263:5;26270:7;26298:15;26279:16;:34;26254:8;:60::i;:::-;26345:4;26338:11;;;;25919:438;;;;:::o;22964:193::-;23043:4;23060:13;23076:12;:10;:12::i;:::-;23060:28;;23099;23109:5;23116:2;23120:6;23099:9;:28::i;:::-;23145:4;23138:11;;;22964:193;;;;:::o;33433:62::-;33471:24;33433:62;:::o;12807:149::-;12891:18;12904:4;12891:12;:18::i;:::-;10473:30;10484:4;10490:12;:10;:12::i;:::-;10473:10;:30::i;:::-;12922:26:::1;12934:4;12940:7;12922:11;:26::i;:::-;12807:149:::0;;;:::o;34047:83::-;34088:4;33542:15;34105:17;;34047:83;:::o;23220:151::-;23309:7;23336:11;:18;23348:5;23336:18;;;;;;;;;;;;;;;:27;23355:7;23336:27;;;;;;;;;;;;;;;;23329:34;;23220:151;;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;7790:98::-;7843:7;7870:10;7863:17;;7790:98;:::o;29555:380::-;29708:1;29691:19;;:5;:19;;;;29683:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29789:1;29770:21;;:7;:21;;;;29762:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29873:6;29843:11;:18;29855:5;29843:18;;;;;;;;;;;;;;;:27;29862:7;29843:27;;;;;;;;;;;;;;;:36;;;;29911:7;29895:32;;29904:5;29895:32;;;29920:6;29895:32;;;;;;:::i;:::-;;;;;;;;29555:380;;;:::o;30222:453::-;30357:24;30384:25;30394:5;30401:7;30384:9;:25::i;:::-;30357:52;;30444:17;30424:16;:37;30420:248;;30506:6;30486:16;:26;;30478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30590:51;30599:5;30606:7;30634:6;30615:16;:25;30590:8;:51::i;:::-;30420:248;30346:329;30222:453;;;:::o;26836:671::-;26983:1;26967:18;;:4;:18;;;;26959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27060:1;27046:16;;:2;:16;;;;27038:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27115:38;27136:4;27142:2;27146:6;27115:20;:38::i;:::-;27166:19;27188:9;:15;27198:4;27188:15;;;;;;;;;;;;;;;;27166:37;;27237:6;27222:11;:21;;27214:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;27354:6;27340:11;:20;27322:9;:15;27332:4;27322:15;;;;;;;;;;;;;;;:38;;;;27399:6;27382:9;:13;27392:2;27382:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;27438:2;27423:26;;27432:4;27423:26;;;27442:6;27423:26;;;;;;:::i;:::-;;;;;;;;27462:37;27482:4;27488:2;27492:6;27462:19;:37::i;:::-;26948:559;26836:671;;;:::o;11328:505::-;11417:22;11425:4;11431:7;11417;:22::i;:::-;11412:414;;11605:41;11633:7;11605:41;;11643:2;11605:19;:41::i;:::-;11719:38;11747:4;11739:13;;11754:2;11719:19;:38::i;:::-;11510:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11456:358;;;;;;;;;;;:::i;:::-;;;;;;;;11412:414;11328:505;;:::o;14964:238::-;15048:22;15056:4;15062:7;15048;:22::i;:::-;15043:152;;15119:4;15087:6;:12;15094:4;15087:12;;;;;;;;;;;:20;;:29;15108:7;15087:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;15170:12;:10;:12::i;:::-;15143:40;;15161:7;15143:40;;15155:4;15143:40;;;;;;;;;;15043:152;14964:238;;:::o;15334:239::-;15418:22;15426:4;15432:7;15418;:22::i;:::-;15414:152;;;15489:5;15457:6;:12;15464:4;15457:12;;;;;;;;;;;:20;;:29;15478:7;15457:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;15541:12;:10;:12::i;:::-;15514:40;;15532:7;15514:40;;15526:4;15514:40;;;;;;;;;;15414:152;15334:239;;:::o;27794:399::-;27897:1;27878:21;;:7;:21;;;;27870:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27948:49;27977:1;27981:7;27990:6;27948:20;:49::i;:::-;28026:6;28010:12;;:22;;;;;;;:::i;:::-;;;;;;;;28065:6;28043:9;:18;28053:7;28043:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;28108:7;28087:37;;28104:1;28087:37;;;28117:6;28087:37;;;;;;:::i;:::-;;;;;;;;28137:48;28165:1;28169:7;28178:6;28137:19;:48::i;:::-;27794:399;;:::o;28526:591::-;28629:1;28610:21;;:7;:21;;;;28602:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28682:49;28703:7;28720:1;28724:6;28682:20;:49::i;:::-;28744:22;28769:9;:18;28779:7;28769:18;;;;;;;;;;;;;;;;28744:43;;28824:6;28806:14;:24;;28798:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28943:6;28926:14;:23;28905:9;:18;28915:7;28905:18;;;;;;;;;;;;;;;:44;;;;28987:6;28971:12;;:22;;;;;;;:::i;:::-;;;;;;;;29037:1;29011:37;;29020:7;29011:37;;;29041:6;29011:37;;;;;;:::i;:::-;;;;;;;;29061:48;29081:7;29098:1;29102:6;29061:19;:48::i;:::-;28591:526;28526:591;;:::o;31275:125::-;;;;:::o;32004:124::-;;;;:::o;3612:451::-;3687:13;3713:19;3758:1;3749:6;3745:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3735:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3713:47;;3771:15;:6;3778:1;3771:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3797;:6;3804:1;3797:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3828:9;3853:1;3844:6;3840:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3828:26;;3823:135;3860:1;3856;:5;3823:135;;;3895:12;3916:3;3908:5;:11;3895:25;;;;;;;:::i;:::-;;;;;3883:6;3890:1;3883:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;3945:1;3935:11;;;;;3863:3;;;;:::i;:::-;;;3823:135;;;;3985:1;3976:5;:10;3968:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4048:6;4034:21;;;3612:451;;;;:::o;88:117:1:-;197:1;194;187: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:180::-;8379:77;8376:1;8369:88;8476:4;8473:1;8466:15;8500:4;8497:1;8490:15;8517:320;8561:6;8598:1;8592:4;8588:12;8578:22;;8645:1;8639:4;8635:12;8666:18;8656:81;;8722:4;8714:6;8710:17;8700:27;;8656:81;8784:2;8776:6;8773:14;8753:18;8750:38;8747:84;;;8803:18;;:::i;:::-;8747:84;8568:269;8517:320;;;:::o;8843:234::-;8983:34;8979:1;8971:6;8967:14;8960:58;9052:17;9047:2;9039:6;9035:15;9028:42;8843:234;:::o;9083:366::-;9225:3;9246:67;9310:2;9305:3;9246:67;:::i;:::-;9239:74;;9322:93;9411:3;9322:93;:::i;:::-;9440:2;9435:3;9431:12;9424:19;;9083:366;;;:::o;9455:419::-;9621:4;9659:2;9648:9;9644:18;9636:26;;9708:9;9702:4;9698:20;9694:1;9683:9;9679:17;9672:47;9736:131;9862:4;9736:131;:::i;:::-;9728:139;;9455:419;;;:::o;9880:180::-;9928:77;9925:1;9918:88;10025:4;10022:1;10015:15;10049:4;10046:1;10039:15;10066:305;10106:3;10125:20;10143:1;10125:20;:::i;:::-;10120:25;;10159:20;10177:1;10159:20;:::i;:::-;10154:25;;10313:1;10245:66;10241:74;10238:1;10235:81;10232:107;;;10319:18;;:::i;:::-;10232:107;10363:1;10360;10356:9;10349:16;;10066:305;;;;:::o;10377:169::-;10517:21;10513:1;10505:6;10501:14;10494:45;10377:169;:::o;10552:366::-;10694:3;10715:67;10779:2;10774:3;10715:67;:::i;:::-;10708:74;;10791:93;10880:3;10791:93;:::i;:::-;10909:2;10904:3;10900:12;10893:19;;10552:366;;;:::o;10924:419::-;11090:4;11128:2;11117:9;11113:18;11105:26;;11177:9;11171:4;11167:20;11163:1;11152:9;11148:17;11141:47;11205:131;11331:4;11205:131;:::i;:::-;11197:139;;10924:419;;;:::o;11349:224::-;11489:34;11485:1;11477:6;11473:14;11466:58;11558:7;11553:2;11545:6;11541:15;11534:32;11349:224;:::o;11579:366::-;11721:3;11742:67;11806:2;11801:3;11742:67;:::i;:::-;11735:74;;11818:93;11907:3;11818:93;:::i;:::-;11936:2;11931:3;11927:12;11920:19;;11579:366;;;:::o;11951:419::-;12117:4;12155:2;12144:9;12140:18;12132:26;;12204:9;12198:4;12194:20;12190:1;12179:9;12175:17;12168:47;12232:131;12358:4;12232:131;:::i;:::-;12224:139;;11951:419;;;:::o;12376:223::-;12516:34;12512:1;12504:6;12500:14;12493:58;12585:6;12580:2;12572:6;12568:15;12561:31;12376:223;:::o;12605:366::-;12747:3;12768:67;12832:2;12827:3;12768:67;:::i;:::-;12761:74;;12844:93;12933:3;12844:93;:::i;:::-;12962:2;12957:3;12953:12;12946:19;;12605:366;;;:::o;12977:419::-;13143:4;13181:2;13170:9;13166:18;13158:26;;13230:9;13224:4;13220:20;13216:1;13205:9;13201:17;13194:47;13258:131;13384:4;13258:131;:::i;:::-;13250:139;;12977:419;;;:::o;13402:221::-;13542:34;13538:1;13530:6;13526:14;13519:58;13611:4;13606:2;13598:6;13594:15;13587:29;13402:221;:::o;13629:366::-;13771:3;13792:67;13856:2;13851:3;13792:67;:::i;:::-;13785:74;;13868:93;13957:3;13868:93;:::i;:::-;13986:2;13981:3;13977:12;13970:19;;13629:366;;;:::o;14001:419::-;14167:4;14205:2;14194:9;14190:18;14182:26;;14254:9;14248:4;14244:20;14240:1;14229:9;14225:17;14218:47;14282:131;14408:4;14282:131;:::i;:::-;14274:139;;14001:419;;;:::o;14426:179::-;14566:31;14562:1;14554:6;14550:14;14543:55;14426:179;:::o;14611:366::-;14753:3;14774:67;14838:2;14833:3;14774:67;:::i;:::-;14767:74;;14850:93;14939:3;14850:93;:::i;:::-;14968:2;14963:3;14959:12;14952:19;;14611:366;;;:::o;14983:419::-;15149:4;15187:2;15176:9;15172:18;15164:26;;15236:9;15230:4;15226:20;15222:1;15211:9;15207:17;15200:47;15264:131;15390:4;15264:131;:::i;:::-;15256:139;;14983:419;;;:::o;15408:224::-;15548:34;15544:1;15536:6;15532:14;15525:58;15617:7;15612:2;15604:6;15600:15;15593:32;15408:224;:::o;15638:366::-;15780:3;15801:67;15865:2;15860:3;15801:67;:::i;:::-;15794:74;;15877:93;15966:3;15877:93;:::i;:::-;15995:2;15990:3;15986:12;15979:19;;15638:366;;;:::o;16010:419::-;16176:4;16214:2;16203:9;16199:18;16191:26;;16263:9;16257:4;16253:20;16249:1;16238:9;16234:17;16227:47;16291:131;16417:4;16291:131;:::i;:::-;16283:139;;16010:419;;;:::o;16435:222::-;16575:34;16571:1;16563:6;16559:14;16552:58;16644:5;16639:2;16631:6;16627:15;16620:30;16435:222;:::o;16663:366::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:419::-;17201:4;17239:2;17228:9;17224:18;17216:26;;17288:9;17282:4;17278:20;17274:1;17263:9;17259:17;17252:47;17316:131;17442:4;17316:131;:::i;:::-;17308:139;;17035:419;;;:::o;17460:225::-;17600:34;17596:1;17588:6;17584:14;17577:58;17669:8;17664:2;17656:6;17652:15;17645:33;17460:225;:::o;17691:366::-;17833:3;17854:67;17918:2;17913:3;17854:67;:::i;:::-;17847:74;;17930:93;18019:3;17930:93;:::i;:::-;18048:2;18043:3;18039:12;18032:19;;17691:366;;;:::o;18063:419::-;18229:4;18267:2;18256:9;18252:18;18244:26;;18316:9;18310:4;18306:20;18302:1;18291:9;18287:17;18280:47;18344:131;18470:4;18344:131;:::i;:::-;18336:139;;18063:419;;;:::o;18488:148::-;18590:11;18627:3;18612:18;;18488:148;;;;:::o;18642:173::-;18782:25;18778:1;18770:6;18766:14;18759:49;18642:173;:::o;18821:402::-;18981:3;19002:85;19084:2;19079:3;19002:85;:::i;:::-;18995:92;;19096:93;19185:3;19096:93;:::i;:::-;19214:2;19209:3;19205:12;19198:19;;18821:402;;;:::o;19229:377::-;19335:3;19363:39;19396:5;19363:39;:::i;:::-;19418:89;19500:6;19495:3;19418:89;:::i;:::-;19411:96;;19516:52;19561:6;19556:3;19549:4;19542:5;19538:16;19516:52;:::i;:::-;19593:6;19588:3;19584:16;19577:23;;19339:267;19229:377;;;;:::o;19612:167::-;19752:19;19748:1;19740:6;19736:14;19729:43;19612:167;:::o;19785:402::-;19945:3;19966:85;20048:2;20043:3;19966:85;:::i;:::-;19959:92;;20060:93;20149:3;20060:93;:::i;:::-;20178:2;20173:3;20169:12;20162:19;;19785:402;;;:::o;20193:967::-;20575:3;20597:148;20741:3;20597:148;:::i;:::-;20590:155;;20762:95;20853:3;20844:6;20762:95;:::i;:::-;20755:102;;20874:148;21018:3;20874:148;:::i;:::-;20867:155;;21039:95;21130:3;21121:6;21039:95;:::i;:::-;21032:102;;21151:3;21144:10;;20193:967;;;;;:::o;21166:181::-;21306:33;21302:1;21294:6;21290:14;21283:57;21166:181;:::o;21353:366::-;21495:3;21516:67;21580:2;21575:3;21516:67;:::i;:::-;21509:74;;21592:93;21681:3;21592:93;:::i;:::-;21710:2;21705:3;21701:12;21694:19;;21353:366;;;:::o;21725:419::-;21891:4;21929:2;21918:9;21914:18;21906:26;;21978:9;21972:4;21968:20;21964:1;21953:9;21949:17;21942:47;22006:131;22132:4;22006:131;:::i;:::-;21998:139;;21725:419;;;:::o;22150:220::-;22290:34;22286:1;22278:6;22274:14;22267:58;22359:3;22354:2;22346:6;22342:15;22335:28;22150:220;:::o;22376:366::-;22518:3;22539:67;22603:2;22598:3;22539:67;:::i;:::-;22532:74;;22615:93;22704:3;22615:93;:::i;:::-;22733:2;22728:3;22724:12;22717:19;;22376:366;;;:::o;22748:419::-;22914:4;22952:2;22941:9;22937:18;22929:26;;23001:9;22995:4;22991:20;22987:1;22976:9;22972:17;22965:47;23029:131;23155:4;23029:131;:::i;:::-;23021:139;;22748:419;;;:::o;23173:221::-;23313:34;23309:1;23301:6;23297:14;23290:58;23382:4;23377:2;23369:6;23365:15;23358:29;23173:221;:::o;23400:366::-;23542:3;23563:67;23627:2;23622:3;23563:67;:::i;:::-;23556:74;;23639:93;23728:3;23639:93;:::i;:::-;23757:2;23752:3;23748:12;23741:19;;23400:366;;;:::o;23772:419::-;23938:4;23976:2;23965:9;23961:18;23953:26;;24025:9;24019:4;24015:20;24011:1;24000:9;23996:17;23989:47;24053:131;24179:4;24053:131;:::i;:::-;24045:139;;23772:419;;;:::o;24197:191::-;24237:4;24257:20;24275:1;24257:20;:::i;:::-;24252:25;;24291:20;24309:1;24291:20;:::i;:::-;24286:25;;24330:1;24327;24324:8;24321:34;;;24335:18;;:::i;:::-;24321:34;24380:1;24377;24373:9;24365:17;;24197:191;;;;:::o;24394:348::-;24434:7;24457:20;24475:1;24457:20;:::i;:::-;24452:25;;24491:20;24509:1;24491:20;:::i;:::-;24486:25;;24679:1;24611:66;24607:74;24604:1;24601:81;24596:1;24589:9;24582:17;24578:105;24575:131;;;24686:18;;:::i;:::-;24575:131;24734:1;24731;24727:9;24716:20;;24394:348;;;;:::o;24748:180::-;24796:77;24793:1;24786:88;24893:4;24890:1;24883:15;24917:4;24914:1;24907:15;24934:180;24982:77;24979:1;24972:88;25079:4;25076:1;25069:15;25103:4;25100:1;25093:15;25120:171;25159:3;25182:24;25200:5;25182:24;:::i;:::-;25173:33;;25228:4;25221:5;25218:15;25215:41;;;25236:18;;:::i;:::-;25215:41;25283:1;25276:5;25272:13;25265:20;;25120:171;;;:::o;25297:182::-;25437:34;25433:1;25425:6;25421:14;25414:58;25297:182;:::o;25485:366::-;25627:3;25648:67;25712:2;25707:3;25648:67;:::i;:::-;25641:74;;25724:93;25813:3;25724:93;:::i;:::-;25842:2;25837:3;25833:12;25826:19;;25485:366;;;:::o;25857:419::-;26023:4;26061:2;26050:9;26046:18;26038:26;;26110:9;26104:4;26100:20;26096:1;26085:9;26081:17;26074:47;26138:131;26264:4;26138:131;:::i;:::-;26130:139;;25857:419;;;:::o

Swarm Source

ipfs://1175b8f25ab5250bbbe9c38283e106e5168016b6650764d08d5b70608c8da728
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.