ETH Price: $3,388.83 (-1.54%)
Gas: 2 Gwei

Token

GoMoney2 (GOM2)
 

Overview

Max Total Supply

966,640,417 GOM2

Holders

166 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
15,009.9857 GOM2

Value
$0.00
0x3b533a755332eef04dcbfd61c85715b31360212f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GoMoney2 is a utility token based on ERC20. It was issued by Moon Labs PTE., LTD. and the token is being used as a utility token for an offline pet care center in Korea called AnimalGo. In the AnimalGo stores, customers could make a payment with GOM2 in purchasing goods for pets or taking services.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GoMoney2

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// File: @openzeppelin/contracts/utils/Arrays.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

// 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/ERC20Snapshot.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Snapshot.sol)

pragma solidity ^0.8.0;




/**
 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
 * total supply at the time are recorded for later access.
 *
 * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
 * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
 * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
 * used to create an efficient ERC20 forking mechanism.
 *
 * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
 * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
 * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
 * and the account address.
 *
 * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
 * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this
 * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
 *
 * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
 * alternative consider {ERC20Votes}.
 *
 * ==== Gas Costs
 *
 * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
 * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
 * smaller since identical balances in subsequent snapshots are stored as a single entry.
 *
 * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
 * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
 * transfers will have normal cost until the next snapshot, and so on.
 */

abstract contract ERC20Snapshot is ERC20 {
    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
    // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    /**
     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
     */
    event Snapshot(uint256 id);

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
     * set of accounts, for example using {AccessControl}, or it may be open to the public.
     *
     * [WARNING]
     * ====
     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
     * you must consider that it can potentially be used by attackers in two ways.
     *
     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
     * section above.
     *
     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
     * ====
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    /**
     * @dev Get the current snapshotId
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     */
    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    /**
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     */
    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // Update balance and/or total supply snapshots before the values are modified. This is implemented
    // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");

        // When a valid snapshot is queried, there are three possibilities:
        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
        //  to this id is the current one.
        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
        //  requested id, and its value is the one to return.
        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
        //  larger than the requested one.
        //
        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
        // exactly this.

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

// File: GOM2/GOM2.sol


pragma solidity ^0.8.13;



contract GoMoney2 is ERC20Snapshot, AccessControl {
    
    bytes32 public constant FREEZE_ROLE = keccak256("FREEZE_ROLE");
    bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");

    constructor() payable ERC20('GoMoney2', 'GOM2') {
        _mint(msg.sender, 1000000000 * uint(10) ** decimals());
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(FREEZE_ROLE, msg.sender);
        _setupRole(SNAPSHOT_ROLE, msg.sender);
    }

    mapping (address => bool) public frozen;

    event Freeze(address holder);
    event Unfreeze(address holder);

    modifier notFrozen(address holder) {
        require(!frozen[holder]);
        _;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function transfer(
        address to,
        uint256 value
    ) notFrozen(msg.sender) public override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from, 
        address to, 
        uint256 amount
    ) notFrozen(from) public override returns (bool) {
        require(allowance(from, to) >= amount);
        _transfer(from, to, amount);
        return true;
    }

    function burn(uint256 amount) notFrozen(msg.sender) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _burn(msg.sender, amount);
    }

    function freezeAccount(address _holder) public onlyRole(FREEZE_ROLE) returns (bool) {
        require(!frozen[_holder]);
        frozen[_holder] = true;
        emit Freeze(_holder);
        return true;
    }

    function unfreezeAccount(address _holder) public onlyRole(FREEZE_ROLE) returns (bool) {
        require(frozen[_holder]);
        frozen[_holder] = false;
        emit Unfreeze(_holder);
        return true;
    }

    function snapshot() public onlyRole(SNAPSHOT_ROLE) returns (uint256) {
        uint256 snapshotId = _snapshot();
        emit Snapshot(snapshotId);
        return snapshotId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"Freeze","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":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"Unfreeze","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREEZE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNAPSHOT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"freezeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":[],"name":"snapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"unfreezeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600881526020017f476f4d6f6e6579320000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474f4d320000000000000000000000000000000000000000000000000000000081525081600390805190602001906200008892919062000746565b508060049080519060200190620000a192919062000746565b505050620000e433620000b96200016360201b60201c565b600a620000c7919062000990565b633b9aca00620000d89190620009e1565b6200016c60201b60201c565b620000f96000801b33620002e460201b60201c565b6200012b7f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d33620002e460201b60201c565b6200015d7f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f33620002e460201b60201c565b62000c1e565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d59062000aa3565b60405180910390fd5b620001f260008383620002fa60201b60201c565b806002600082825462000206919062000ac5565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200025d919062000ac5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002c4919062000b33565b60405180910390a3620002e060008383620003f360201b60201c565b5050565b620002f68282620003f860201b60201c565b5050565b62000312838383620004ea60201b620010be1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200036e576200035882620004ef60201b60201c565b620003686200055260201b60201c565b620003ee565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003ca57620003b483620004ef60201b60201c565b620003c46200055260201b60201c565b620003ed565b620003db83620004ef60201b60201c565b620003ec82620004ef60201b60201c565b5b5b505050565b505050565b6200040a82826200057660201b60201c565b620004e65760016009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048b620005e160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b6200054f600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200054383620005e960201b60201c565b6200063160201b60201c565b50565b62000574600662000568620006bd60201b60201c565b6200063160201b60201c565b565b60006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000643620006c760201b60201c565b9050806200065a84600001620006e560201b60201c565b1015620006b85782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000600254905090565b6000620006e060086200073860201b620010c31760201c565b905090565b600080828054905003620006fd576000905062000733565b816001838054905062000711919062000b50565b8154811062000725576200072462000b8b565b5b906000526020600020015490505b919050565b600081600001549050919050565b828054620007549062000be9565b90600052602060002090601f016020900481019282620007785760008555620007c4565b82601f106200079357805160ff1916838001178555620007c4565b82800160010185558215620007c4579182015b82811115620007c3578251825591602001919060010190620007a6565b5b509050620007d39190620007d7565b5090565b5b80821115620007f2576000816000905550600101620007d8565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000884578086048111156200085c576200085b620007f6565b5b60018516156200086c5780820291505b80810290506200087c8562000825565b94506200083c565b94509492505050565b6000826200089f576001905062000972565b81620008af576000905062000972565b8160018114620008c85760028114620008d35762000909565b600191505062000972565b60ff841115620008e857620008e7620007f6565b5b8360020a915084821115620009025762000901620007f6565b5b5062000972565b5060208310610133831016604e8410600b8410161715620009435782820a9050838111156200093d576200093c620007f6565b5b62000972565b62000952848484600162000832565b925090508184048111156200096c576200096b620007f6565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200099d8262000979565b9150620009aa8362000983565b9250620009d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200088d565b905092915050565b6000620009ee8262000979565b9150620009fb8362000979565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000a375762000a36620007f6565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000a8b601f8362000a42565b915062000a988262000a53565b602082019050919050565b6000602082019050818103600083015262000abe8162000a7c565b9050919050565b600062000ad28262000979565b915062000adf8362000979565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b175762000b16620007f6565b5b828201905092915050565b62000b2d8162000979565b82525050565b600060208201905062000b4a600083018462000b22565b92915050565b600062000b5d8262000979565b915062000b6a8362000979565b92508282101562000b805762000b7f620007f6565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c0257607f821691505b60208210810362000c185762000c1762000bba565b5b50919050565b612ef18062000c2e6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063a457c2d711610097578063d547741f11610071578063d547741f14610544578063dd62ed3e14610560578063f26c159f14610590578063f9e85723146105c0576101a9565b8063a457c2d7146104b4578063a9059cbb146104e4578063d051665014610514576101a9565b806395d89b41116100d357806395d89b411461042a5780639711715a14610448578063981b24d014610466578063a217fddf14610496576101a9565b806370a082311461039a578063788649ea146103ca57806391d14854146103fa576101a9565b80632f2ff15d116101665780633950935111610140578063395093511461030057806342966c68146103305780634ee2cd7e1461034c5780637028e2cd1461037c576101a9565b80632f2ff15d146102aa578063313ce567146102c657806336568abe146102e4576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063095ea7b3146101fc57806318160ddd1461022c57806323b872dd1461024a578063248a9ca31461027a575b600080fd5b6101c860048036038101906101c391906120b6565b6105de565b6040516101d591906120fe565b60405180910390f35b6101e6610658565b6040516101f391906121b2565b60405180910390f35b61021660048036038101906102119190612268565b6106ea565b60405161022391906120fe565b60405180910390f35b61023461070d565b60405161024191906122b7565b60405180910390f35b610264600480360381019061025f91906122d2565b610717565b60405161027191906120fe565b60405180910390f35b610294600480360381019061028f919061235b565b61079e565b6040516102a19190612397565b60405180910390f35b6102c460048036038101906102bf91906123b2565b6107be565b005b6102ce6107e7565b6040516102db919061240e565b60405180910390f35b6102fe60048036038101906102f991906123b2565b6107f0565b005b61031a60048036038101906103159190612268565b610873565b60405161032791906120fe565b60405180910390f35b61034a60048036038101906103459190612429565b61091d565b005b61036660048036038101906103619190612268565b610999565b60405161037391906122b7565b60405180910390f35b610384610a09565b6040516103919190612397565b60405180910390f35b6103b460048036038101906103af9190612456565b610a2d565b6040516103c191906122b7565b60405180910390f35b6103e460048036038101906103df9190612456565b610a75565b6040516103f191906120fe565b60405180910390f35b610414600480360381019061040f91906123b2565b610b98565b60405161042191906120fe565b60405180910390f35b610432610c03565b60405161043f91906121b2565b60405180910390f35b610450610c95565b60405161045d91906122b7565b60405180910390f35b610480600480360381019061047b9190612429565b610d14565b60405161048d91906122b7565b60405180910390f35b61049e610d45565b6040516104ab9190612397565b60405180910390f35b6104ce60048036038101906104c99190612268565b610d4c565b6040516104db91906120fe565b60405180910390f35b6104fe60048036038101906104f99190612268565b610e36565b60405161050b91906120fe565b60405180910390f35b61052e60048036038101906105299190612456565b610ea6565b60405161053b91906120fe565b60405180910390f35b61055e600480360381019061055991906123b2565b610ec6565b005b61057a60048036038101906105759190612483565b610eef565b60405161058791906122b7565b60405180910390f35b6105aa60048036038101906105a59190612456565b610f76565b6040516105b791906120fe565b60405180910390f35b6105c861109a565b6040516105d59190612397565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106515750610650826110d1565b5b9050919050565b606060038054610667906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610693906124f2565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b6000806106f561113b565b9050610702818585611143565b600191505092915050565b6000600254905090565b600083600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561077157600080fd5b8261077c8686610eef565b101561078757600080fd5b61079285858561130c565b60019150509392505050565b600060096000838152602001908152602001600020600101549050919050565b6107c78261079e565b6107d8816107d361113b565b61158b565b6107e28383611628565b505050565b60006012905090565b6107f861113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612595565b60405180910390fd5b61086f8282611709565b5050565b60008061087e61113b565b9050610912818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461090d91906125e4565b611143565b600191505092915050565b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561097557600080fd5b6000801b61098a8161098561113b565b61158b565b61099433846117eb565b505050565b60008060006109e684600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119c1565b91509150816109fd576109f885610a2d565b6109ff565b805b9250505092915050565b7f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d610aa981610aa461113b565b61158b565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610aff57600080fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fca5069937e68fd197927055037f59d7c90bf75ac104e6e375539ef480c3ad6ee83604051610b869190612649565b60405180910390a16001915050919050565b60006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610c12906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e906124f2565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b5050505050905090565b60007f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f610cc981610cc461113b565b61158b565b6000610cd3611ab6565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610d0491906122b7565b60405180910390a1809250505090565b6000806000610d248460066119c1565b9150915081610d3a57610d3561070d565b610d3c565b805b92505050919050565b6000801b81565b600080610d5761113b565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e14906126d6565b60405180910390fd5b610e2a8286868403611143565b60019250505092915050565b600033600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e9057600080fd5b610e9b33858561130c565b600191505092915050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610ecf8261079e565b610ee081610edb61113b565b61158b565b610eea8383611709565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d610faa81610fa561113b565b61158b565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561100157600080fd5b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507faf85b60d26151edd11443b704d424da6c43d0468f2235ebae3d1904dbc323049836040516110889190612649565b60405180910390a16001915050919050565b7f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d81565b505050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990612768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611218906127fa565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112ff91906122b7565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361137b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113729061288c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e19061291e565b60405180910390fd5b6113f5838383611b0c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561147b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611472906129b0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461150e91906125e4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161157291906122b7565b60405180910390a3611585848484611bc4565b50505050565b6115958282610b98565b611624576115ba8173ffffffffffffffffffffffffffffffffffffffff166014611bc9565b6115c88360001c6020611bc9565b6040516020016115d9929190612aa4565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b91906121b2565b60405180910390fd5b5050565b6116328282610b98565b6117055760016009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116aa61113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6117138282610b98565b156117e75760006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061178c61113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190612b50565b60405180910390fd5b61186682600083611b0c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390612be2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546119439190612c02565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119a891906122b7565b60405180910390a36119bc83600084611bc4565b505050565b60008060008411611a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fe90612c82565b60405180910390fd5b611a0f611e05565b841115611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890612cee565b60405180910390fd5b6000611a698585600001611e1690919063ffffffff16565b905083600001805490508103611a86576000809250925050611aaf565b6001846001018281548110611a9e57611a9d612d0e565b5b906000526020600020015492509250505b9250929050565b6000611ac26008611eef565b6000611acc611e05565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611afd91906122b7565b60405180910390a18091505090565b611b178383836110be565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b6157611b5482611f05565b611b5c611f58565b611bbf565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bab57611b9e83611f05565b611ba6611f58565b611bbe565b611bb483611f05565b611bbd82611f05565b5b5b505050565b505050565b606060006002836002611bdc9190612d3d565b611be691906125e4565b67ffffffffffffffff811115611bff57611bfe612d97565b5b6040519080825280601f01601f191660200182016040528015611c315781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6957611c68612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ccd57611ccc612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d0d9190612d3d565b611d1791906125e4565b90505b6001811115611db7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5957611d58612d0e565b5b1a60f81b828281518110611d7057611d6f612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611db090612dc6565b9050611d1a565b5060008414611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290612e3b565b60405180910390fd5b8091505092915050565b6000611e1160086110c3565b905090565b600080838054905003611e2c5760009050611ee9565b600080848054905090505b80821015611e90576000611e4b8383611f6c565b905084868281548110611e6157611e60612d0e565b5b90600052602060002001541115611e7a57809150611e8a565b600181611e8791906125e4565b92505b50611e37565b600082118015611ec857508385600184611eaa9190612c02565b81548110611ebb57611eba612d0e565b5b9060005260206000200154145b15611ee357600182611eda9190612c02565b92505050611ee9565b81925050505b92915050565b6001816000016000828254019250508190555050565b611f55600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f5083610a2d565b611f92565b50565b611f6a6006611f6561070d565b611f92565b565b60006002828418611f7d9190612e8a565b828416611f8a91906125e4565b905092915050565b6000611f9c611e05565b905080611fab8460000161200d565b10156120085782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000808280549050036120235760009050612054565b81600183805490506120359190612c02565b8154811061204657612045612d0e565b5b906000526020600020015490505b919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120938161205e565b811461209e57600080fd5b50565b6000813590506120b08161208a565b92915050565b6000602082840312156120cc576120cb612059565b5b60006120da848285016120a1565b91505092915050565b60008115159050919050565b6120f8816120e3565b82525050565b600060208201905061211360008301846120ef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612153578082015181840152602081019050612138565b83811115612162576000848401525b50505050565b6000601f19601f8301169050919050565b600061218482612119565b61218e8185612124565b935061219e818560208601612135565b6121a781612168565b840191505092915050565b600060208201905081810360008301526121cc8184612179565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ff826121d4565b9050919050565b61220f816121f4565b811461221a57600080fd5b50565b60008135905061222c81612206565b92915050565b6000819050919050565b61224581612232565b811461225057600080fd5b50565b6000813590506122628161223c565b92915050565b6000806040838503121561227f5761227e612059565b5b600061228d8582860161221d565b925050602061229e85828601612253565b9150509250929050565b6122b181612232565b82525050565b60006020820190506122cc60008301846122a8565b92915050565b6000806000606084860312156122eb576122ea612059565b5b60006122f98682870161221d565b935050602061230a8682870161221d565b925050604061231b86828701612253565b9150509250925092565b6000819050919050565b61233881612325565b811461234357600080fd5b50565b6000813590506123558161232f565b92915050565b60006020828403121561237157612370612059565b5b600061237f84828501612346565b91505092915050565b61239181612325565b82525050565b60006020820190506123ac6000830184612388565b92915050565b600080604083850312156123c9576123c8612059565b5b60006123d785828601612346565b92505060206123e88582860161221d565b9150509250929050565b600060ff82169050919050565b612408816123f2565b82525050565b600060208201905061242360008301846123ff565b92915050565b60006020828403121561243f5761243e612059565b5b600061244d84828501612253565b91505092915050565b60006020828403121561246c5761246b612059565b5b600061247a8482850161221d565b91505092915050565b6000806040838503121561249a57612499612059565b5b60006124a88582860161221d565b92505060206124b98582860161221d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250a57607f821691505b60208210810361251d5761251c6124c3565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061257f602f83612124565b915061258a82612523565b604082019050919050565b600060208201905081810360008301526125ae81612572565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125ef82612232565b91506125fa83612232565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561262f5761262e6125b5565b5b828201905092915050565b612643816121f4565b82525050565b600060208201905061265e600083018461263a565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006126c0602583612124565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612752602483612124565b915061275d826126f6565b604082019050919050565b6000602082019050818103600083015261278181612745565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006127e4602283612124565b91506127ef82612788565b604082019050919050565b60006020820190508181036000830152612813816127d7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612876602583612124565b91506128818261281a565b604082019050919050565b600060208201905081810360008301526128a581612869565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612908602383612124565b9150612913826128ac565b604082019050919050565b60006020820190508181036000830152612937816128fb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061299a602683612124565b91506129a58261293e565b604082019050919050565b600060208201905081810360008301526129c98161298d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612a116017836129d0565b9150612a1c826129db565b601782019050919050565b6000612a3282612119565b612a3c81856129d0565b9350612a4c818560208601612135565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612a8e6011836129d0565b9150612a9982612a58565b601182019050919050565b6000612aaf82612a04565b9150612abb8285612a27565b9150612ac682612a81565b9150612ad28284612a27565b91508190509392505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b3a602183612124565b9150612b4582612ade565b604082019050919050565b60006020820190508181036000830152612b6981612b2d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bcc602283612124565b9150612bd782612b70565b604082019050919050565b60006020820190508181036000830152612bfb81612bbf565b9050919050565b6000612c0d82612232565b9150612c1883612232565b925082821015612c2b57612c2a6125b5565b5b828203905092915050565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b6000612c6c601683612124565b9150612c7782612c36565b602082019050919050565b60006020820190508181036000830152612c9b81612c5f565b9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b6000612cd8601d83612124565b9150612ce382612ca2565b602082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612d4882612232565b9150612d5383612232565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8c57612d8b6125b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612dd182612232565b915060008203612de457612de36125b5565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612e25602083612124565b9150612e3082612def565b602082019050919050565b60006020820190508181036000830152612e5481612e18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e9582612232565b9150612ea083612232565b925082612eb057612eaf612e5b565b5b82820490509291505056fea2646970667358221220e1243d7583417ddb304820f2b93b4ddf73bda4b3077f8a109c43a2199dc01c2764736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063a457c2d711610097578063d547741f11610071578063d547741f14610544578063dd62ed3e14610560578063f26c159f14610590578063f9e85723146105c0576101a9565b8063a457c2d7146104b4578063a9059cbb146104e4578063d051665014610514576101a9565b806395d89b41116100d357806395d89b411461042a5780639711715a14610448578063981b24d014610466578063a217fddf14610496576101a9565b806370a082311461039a578063788649ea146103ca57806391d14854146103fa576101a9565b80632f2ff15d116101665780633950935111610140578063395093511461030057806342966c68146103305780634ee2cd7e1461034c5780637028e2cd1461037c576101a9565b80632f2ff15d146102aa578063313ce567146102c657806336568abe146102e4576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063095ea7b3146101fc57806318160ddd1461022c57806323b872dd1461024a578063248a9ca31461027a575b600080fd5b6101c860048036038101906101c391906120b6565b6105de565b6040516101d591906120fe565b60405180910390f35b6101e6610658565b6040516101f391906121b2565b60405180910390f35b61021660048036038101906102119190612268565b6106ea565b60405161022391906120fe565b60405180910390f35b61023461070d565b60405161024191906122b7565b60405180910390f35b610264600480360381019061025f91906122d2565b610717565b60405161027191906120fe565b60405180910390f35b610294600480360381019061028f919061235b565b61079e565b6040516102a19190612397565b60405180910390f35b6102c460048036038101906102bf91906123b2565b6107be565b005b6102ce6107e7565b6040516102db919061240e565b60405180910390f35b6102fe60048036038101906102f991906123b2565b6107f0565b005b61031a60048036038101906103159190612268565b610873565b60405161032791906120fe565b60405180910390f35b61034a60048036038101906103459190612429565b61091d565b005b61036660048036038101906103619190612268565b610999565b60405161037391906122b7565b60405180910390f35b610384610a09565b6040516103919190612397565b60405180910390f35b6103b460048036038101906103af9190612456565b610a2d565b6040516103c191906122b7565b60405180910390f35b6103e460048036038101906103df9190612456565b610a75565b6040516103f191906120fe565b60405180910390f35b610414600480360381019061040f91906123b2565b610b98565b60405161042191906120fe565b60405180910390f35b610432610c03565b60405161043f91906121b2565b60405180910390f35b610450610c95565b60405161045d91906122b7565b60405180910390f35b610480600480360381019061047b9190612429565b610d14565b60405161048d91906122b7565b60405180910390f35b61049e610d45565b6040516104ab9190612397565b60405180910390f35b6104ce60048036038101906104c99190612268565b610d4c565b6040516104db91906120fe565b60405180910390f35b6104fe60048036038101906104f99190612268565b610e36565b60405161050b91906120fe565b60405180910390f35b61052e60048036038101906105299190612456565b610ea6565b60405161053b91906120fe565b60405180910390f35b61055e600480360381019061055991906123b2565b610ec6565b005b61057a60048036038101906105759190612483565b610eef565b60405161058791906122b7565b60405180910390f35b6105aa60048036038101906105a59190612456565b610f76565b6040516105b791906120fe565b60405180910390f35b6105c861109a565b6040516105d59190612397565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106515750610650826110d1565b5b9050919050565b606060038054610667906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610693906124f2565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b6000806106f561113b565b9050610702818585611143565b600191505092915050565b6000600254905090565b600083600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561077157600080fd5b8261077c8686610eef565b101561078757600080fd5b61079285858561130c565b60019150509392505050565b600060096000838152602001908152602001600020600101549050919050565b6107c78261079e565b6107d8816107d361113b565b61158b565b6107e28383611628565b505050565b60006012905090565b6107f861113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612595565b60405180910390fd5b61086f8282611709565b5050565b60008061087e61113b565b9050610912818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461090d91906125e4565b611143565b600191505092915050565b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561097557600080fd5b6000801b61098a8161098561113b565b61158b565b61099433846117eb565b505050565b60008060006109e684600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119c1565b91509150816109fd576109f885610a2d565b6109ff565b805b9250505092915050565b7f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d610aa981610aa461113b565b61158b565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610aff57600080fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fca5069937e68fd197927055037f59d7c90bf75ac104e6e375539ef480c3ad6ee83604051610b869190612649565b60405180910390a16001915050919050565b60006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610c12906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e906124f2565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b5050505050905090565b60007f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f610cc981610cc461113b565b61158b565b6000610cd3611ab6565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610d0491906122b7565b60405180910390a1809250505090565b6000806000610d248460066119c1565b9150915081610d3a57610d3561070d565b610d3c565b805b92505050919050565b6000801b81565b600080610d5761113b565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e14906126d6565b60405180910390fd5b610e2a8286868403611143565b60019250505092915050565b600033600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e9057600080fd5b610e9b33858561130c565b600191505092915050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610ecf8261079e565b610ee081610edb61113b565b61158b565b610eea8383611709565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d610faa81610fa561113b565b61158b565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561100157600080fd5b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507faf85b60d26151edd11443b704d424da6c43d0468f2235ebae3d1904dbc323049836040516110889190612649565b60405180910390a16001915050919050565b7f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d81565b505050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990612768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611218906127fa565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112ff91906122b7565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361137b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113729061288c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e19061291e565b60405180910390fd5b6113f5838383611b0c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561147b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611472906129b0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461150e91906125e4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161157291906122b7565b60405180910390a3611585848484611bc4565b50505050565b6115958282610b98565b611624576115ba8173ffffffffffffffffffffffffffffffffffffffff166014611bc9565b6115c88360001c6020611bc9565b6040516020016115d9929190612aa4565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b91906121b2565b60405180910390fd5b5050565b6116328282610b98565b6117055760016009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116aa61113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6117138282610b98565b156117e75760006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061178c61113b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190612b50565b60405180910390fd5b61186682600083611b0c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390612be2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546119439190612c02565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119a891906122b7565b60405180910390a36119bc83600084611bc4565b505050565b60008060008411611a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fe90612c82565b60405180910390fd5b611a0f611e05565b841115611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890612cee565b60405180910390fd5b6000611a698585600001611e1690919063ffffffff16565b905083600001805490508103611a86576000809250925050611aaf565b6001846001018281548110611a9e57611a9d612d0e565b5b906000526020600020015492509250505b9250929050565b6000611ac26008611eef565b6000611acc611e05565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611afd91906122b7565b60405180910390a18091505090565b611b178383836110be565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b6157611b5482611f05565b611b5c611f58565b611bbf565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bab57611b9e83611f05565b611ba6611f58565b611bbe565b611bb483611f05565b611bbd82611f05565b5b5b505050565b505050565b606060006002836002611bdc9190612d3d565b611be691906125e4565b67ffffffffffffffff811115611bff57611bfe612d97565b5b6040519080825280601f01601f191660200182016040528015611c315781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6957611c68612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ccd57611ccc612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d0d9190612d3d565b611d1791906125e4565b90505b6001811115611db7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5957611d58612d0e565b5b1a60f81b828281518110611d7057611d6f612d0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611db090612dc6565b9050611d1a565b5060008414611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290612e3b565b60405180910390fd5b8091505092915050565b6000611e1160086110c3565b905090565b600080838054905003611e2c5760009050611ee9565b600080848054905090505b80821015611e90576000611e4b8383611f6c565b905084868281548110611e6157611e60612d0e565b5b90600052602060002001541115611e7a57809150611e8a565b600181611e8791906125e4565b92505b50611e37565b600082118015611ec857508385600184611eaa9190612c02565b81548110611ebb57611eba612d0e565b5b9060005260206000200154145b15611ee357600182611eda9190612c02565b92505050611ee9565b81925050505b92915050565b6001816000016000828254019250508190555050565b611f55600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f5083610a2d565b611f92565b50565b611f6a6006611f6561070d565b611f92565b565b60006002828418611f7d9190612e8a565b828416611f8a91906125e4565b905092915050565b6000611f9c611e05565b905080611fab8460000161200d565b10156120085782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000808280549050036120235760009050612054565b81600183805490506120359190612c02565b8154811061204657612045612d0e565b5b906000526020600020015490505b919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120938161205e565b811461209e57600080fd5b50565b6000813590506120b08161208a565b92915050565b6000602082840312156120cc576120cb612059565b5b60006120da848285016120a1565b91505092915050565b60008115159050919050565b6120f8816120e3565b82525050565b600060208201905061211360008301846120ef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612153578082015181840152602081019050612138565b83811115612162576000848401525b50505050565b6000601f19601f8301169050919050565b600061218482612119565b61218e8185612124565b935061219e818560208601612135565b6121a781612168565b840191505092915050565b600060208201905081810360008301526121cc8184612179565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ff826121d4565b9050919050565b61220f816121f4565b811461221a57600080fd5b50565b60008135905061222c81612206565b92915050565b6000819050919050565b61224581612232565b811461225057600080fd5b50565b6000813590506122628161223c565b92915050565b6000806040838503121561227f5761227e612059565b5b600061228d8582860161221d565b925050602061229e85828601612253565b9150509250929050565b6122b181612232565b82525050565b60006020820190506122cc60008301846122a8565b92915050565b6000806000606084860312156122eb576122ea612059565b5b60006122f98682870161221d565b935050602061230a8682870161221d565b925050604061231b86828701612253565b9150509250925092565b6000819050919050565b61233881612325565b811461234357600080fd5b50565b6000813590506123558161232f565b92915050565b60006020828403121561237157612370612059565b5b600061237f84828501612346565b91505092915050565b61239181612325565b82525050565b60006020820190506123ac6000830184612388565b92915050565b600080604083850312156123c9576123c8612059565b5b60006123d785828601612346565b92505060206123e88582860161221d565b9150509250929050565b600060ff82169050919050565b612408816123f2565b82525050565b600060208201905061242360008301846123ff565b92915050565b60006020828403121561243f5761243e612059565b5b600061244d84828501612253565b91505092915050565b60006020828403121561246c5761246b612059565b5b600061247a8482850161221d565b91505092915050565b6000806040838503121561249a57612499612059565b5b60006124a88582860161221d565b92505060206124b98582860161221d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250a57607f821691505b60208210810361251d5761251c6124c3565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061257f602f83612124565b915061258a82612523565b604082019050919050565b600060208201905081810360008301526125ae81612572565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125ef82612232565b91506125fa83612232565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561262f5761262e6125b5565b5b828201905092915050565b612643816121f4565b82525050565b600060208201905061265e600083018461263a565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006126c0602583612124565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612752602483612124565b915061275d826126f6565b604082019050919050565b6000602082019050818103600083015261278181612745565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006127e4602283612124565b91506127ef82612788565b604082019050919050565b60006020820190508181036000830152612813816127d7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612876602583612124565b91506128818261281a565b604082019050919050565b600060208201905081810360008301526128a581612869565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612908602383612124565b9150612913826128ac565b604082019050919050565b60006020820190508181036000830152612937816128fb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061299a602683612124565b91506129a58261293e565b604082019050919050565b600060208201905081810360008301526129c98161298d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612a116017836129d0565b9150612a1c826129db565b601782019050919050565b6000612a3282612119565b612a3c81856129d0565b9350612a4c818560208601612135565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612a8e6011836129d0565b9150612a9982612a58565b601182019050919050565b6000612aaf82612a04565b9150612abb8285612a27565b9150612ac682612a81565b9150612ad28284612a27565b91508190509392505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b3a602183612124565b9150612b4582612ade565b604082019050919050565b60006020820190508181036000830152612b6981612b2d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bcc602283612124565b9150612bd782612b70565b604082019050919050565b60006020820190508181036000830152612bfb81612bbf565b9050919050565b6000612c0d82612232565b9150612c1883612232565b925082821015612c2b57612c2a6125b5565b5b828203905092915050565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b6000612c6c601683612124565b9150612c7782612c36565b602082019050919050565b60006020820190508181036000830152612c9b81612c5f565b9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b6000612cd8601d83612124565b9150612ce382612ca2565b602082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612d4882612232565b9150612d5383612232565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d8c57612d8b6125b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612dd182612232565b915060008203612de457612de36125b5565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612e25602083612124565b9150612e3082612def565b602082019050919050565b60006020820190508181036000830152612e5481612e18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e9582612232565b9150612ea083612232565b925082612eb057612eaf612e5b565b5b82820490509291505056fea2646970667358221220e1243d7583417ddb304820f2b93b4ddf73bda4b3077f8a109c43a2199dc01c2764736f6c634300080d0033

Deployed Bytecode Sourcemap

45464:2055:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14931:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25676:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28027:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26796:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46472:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16358:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16751:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46167:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17799:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29512:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46744:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41509:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45596:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26967:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47106:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15227:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25895:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47332:184;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41879:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30255:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46268:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45947:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17143:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27556:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46884:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45527:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14931:204;15016:4;15055:32;15040:47;;;:11;:47;;;;:87;;;;15091:36;15115:11;15091:23;:36::i;:::-;15040:87;15033:94;;14931:204;;;:::o;25676:100::-;25730:13;25763:5;25756:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25676:100;:::o;28027:201::-;28110:4;28127:13;28143:12;:10;:12::i;:::-;28127:28;;28166:32;28175:5;28182:7;28191:6;28166:8;:32::i;:::-;28216:4;28209:11;;;28027:201;;;;:::o;26796:108::-;26857:7;26884:12;;26877:19;;26796:108;:::o;46472:264::-;46613:4;46582;46124:6;:14;46131:6;46124:14;;;;;;;;;;;;;;;;;;;;;;;;;46123:15;46115:24;;;;;;46661:6:::1;46638:19;46648:4;46654:2;46638:9;:19::i;:::-;:29;;46630:38;;;::::0;::::1;;46679:27;46689:4;46695:2;46699:6;46679:9;:27::i;:::-;46724:4;46717:11;;46472:264:::0;;;;;;:::o;16358:131::-;16432:7;16459:6;:12;16466:4;16459:12;;;;;;;;;;;:22;;;16452:29;;16358:131;;;:::o;16751:147::-;16834:18;16847:4;16834:12;:18::i;:::-;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;16865:25:::1;16876:4;16882:7;16865:10;:25::i;:::-;16751:147:::0;;;:::o;46167:93::-;46225:5;46250:2;46243:9;;46167:93;:::o;17799:218::-;17906:12;:10;:12::i;:::-;17895:23;;:7;:23;;;17887:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;17983:26;17995:4;18001:7;17983:11;:26::i;:::-;17799:218;;:::o;29512:240::-;29600:4;29617:13;29633:12;:10;:12::i;:::-;29617:28;;29656:66;29665:5;29672:7;29711:10;29681:11;:18;29693:5;29681:18;;;;;;;;;;;;;;;:27;29700:7;29681:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;29656:8;:66::i;:::-;29740:4;29733:11;;;29512:240;;;;:::o;46744:132::-;46784:10;46124:6;:14;46131:6;46124:14;;;;;;;;;;;;;;;;;;;;;;;;;46123:15;46115:24;;;;;;14363:4:::1;46812:18:::0;::::1;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;46843:25:::2;46849:10;46861:6;46843:5;:25::i;:::-;46150:1:::1;46744:132:::0;;:::o;41509:266::-;41596:7;41617:16;41635:13;41652:55;41661:10;41673:24;:33;41698:7;41673:33;;;;;;;;;;;;;;;41652:8;:55::i;:::-;41616:91;;;;41727:11;:40;;41749:18;41759:7;41749:9;:18::i;:::-;41727:40;;;41741:5;41727:40;41720:47;;;;41509:266;;;;:::o;45596:66::-;45636:26;45596:66;:::o;26967:127::-;27041:7;27068:9;:18;27078:7;27068:18;;;;;;;;;;;;;;;;27061:25;;26967:127;;;:::o;47106:218::-;47186:4;45565:24;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;47211:6:::1;:15;47218:7;47211:15;;;;;;;;;;;;;;;;;;;;;;;;;47203:24;;;::::0;::::1;;47256:5;47238:6;:15;47245:7;47238:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;47277:17;47286:7;47277:17;;;;;;:::i;:::-;;;;;;;;47312:4;47305:11;;47106:218:::0;;;;:::o;15227:147::-;15313:4;15337:6;:12;15344:4;15337:12;;;;;;;;;;;:20;;:29;15358:7;15337:29;;;;;;;;;;;;;;;;;;;;;;;;;15330:36;;15227:147;;;;:::o;25895:104::-;25951:13;25984:7;25977:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25895:104;:::o;47332:184::-;47392:7;45636:26;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;47412:18:::1;47433:11;:9;:11::i;:::-;47412:32;;47460:20;47469:10;47460:20;;;;;;:::i;:::-;;;;;;;;47498:10;47491:17;;;47332:184:::0;;:::o;41879:234::-;41951:7;41972:16;41990:13;42007:43;42016:10;42028:21;42007:8;:43::i;:::-;41971:79;;;;42070:11;:35;;42092:13;:11;:13::i;:::-;42070:35;;;42084:5;42070:35;42063:42;;;;41879:234;;;:::o;14318:49::-;14363:4;14318:49;;;:::o;30255:438::-;30348:4;30365:13;30381:12;:10;:12::i;:::-;30365:28;;30404:24;30431:11;:18;30443:5;30431:18;;;;;;;;;;;;;;;:27;30450:7;30431:27;;;;;;;;;;;;;;;;30404:54;;30497:15;30477:16;:35;;30469:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30590:60;30599:5;30606:7;30634:15;30615:16;:34;30590:8;:60::i;:::-;30681:4;30674:11;;;;30255:438;;;;:::o;46268:196::-;46385:4;46348:10;46124:6;:14;46131:6;46124:14;;;;;;;;;;;;;;;;;;;;;;;;;46123:15;46115:24;;;;;;46402:32:::1;46412:10;46424:2;46428:5;46402:9;:32::i;:::-;46452:4;46445:11;;46268:196:::0;;;;;:::o;45947:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;17143:149::-;17227:18;17240:4;17227:12;:18::i;:::-;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;17258:26:::1;17270:4;17276:7;17258:11;:26::i;:::-;17143:149:::0;;;:::o;27556:151::-;27645:7;27672:11;:18;27684:5;27672:18;;;;;;;;;;;;;;;:27;27691:7;27672:27;;;;;;;;;;;;;;;;27665:34;;27556:151;;;;:::o;46884:214::-;46962:4;45565:24;14809:30;14820:4;14826:12;:10;:12::i;:::-;14809:10;:30::i;:::-;46988:6:::1;:15;46995:7;46988:15;;;;;;;;;;;;;;;;;;;;;;;;;46987:16;46979:25;;;::::0;::::1;;47033:4;47015:6;:15;47022:7;47015:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;47053:15;47060:7;47053:15;;;;;;:::i;:::-;;;;;;;;47086:4;47079:11;;46884:214:::0;;;;:::o;45527:62::-;45565:24;45527:62;:::o;35611:125::-;;;;:::o;7983:114::-;8048:7;8075;:14;;;8068:21;;7983:114;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;12126:98::-;12179:7;12206:10;12199:17;;12126:98;:::o;33891:380::-;34044:1;34027:19;;:5;:19;;;34019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34125:1;34106:21;;:7;:21;;;34098:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34209:6;34179:11;:18;34191:5;34179:18;;;;;;;;;;;;;;;:27;34198:7;34179:27;;;;;;;;;;;;;;;:36;;;;34247:7;34231:32;;34240:5;34231:32;;;34256:6;34231:32;;;;;;:::i;:::-;;;;;;;;33891:380;;;:::o;31172:671::-;31319:1;31303:18;;:4;:18;;;31295:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31396:1;31382:16;;:2;:16;;;31374:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31451:38;31472:4;31478:2;31482:6;31451:20;:38::i;:::-;31502:19;31524:9;:15;31534:4;31524:15;;;;;;;;;;;;;;;;31502:37;;31573:6;31558:11;:21;;31550:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;31690:6;31676:11;:20;31658:9;:15;31668:4;31658:15;;;;;;;;;;;;;;;:38;;;;31735:6;31718:9;:13;31728:2;31718:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;31774:2;31759:26;;31768:4;31759:26;;;31778:6;31759:26;;;;;;:::i;:::-;;;;;;;;31798:37;31818:4;31824:2;31828:6;31798:19;:37::i;:::-;31284:559;31172:671;;;:::o;15664:505::-;15753:22;15761:4;15767:7;15753;:22::i;:::-;15748:414;;15941:41;15969:7;15941:41;;15979:2;15941:19;:41::i;:::-;16055:38;16083:4;16075:13;;16090:2;16055:19;:38::i;:::-;15846:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15792:358;;;;;;;;;;;:::i;:::-;;;;;;;;15748:414;15664:505;;:::o;19300:238::-;19384:22;19392:4;19398:7;19384;:22::i;:::-;19379:152;;19455:4;19423:6;:12;19430:4;19423:12;;;;;;;;;;;:20;;:29;19444:7;19423:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;19506:12;:10;:12::i;:::-;19479:40;;19497:7;19479:40;;19491:4;19479:40;;;;;;;;;;19379:152;19300:238;;:::o;19670:239::-;19754:22;19762:4;19768:7;19754;:22::i;:::-;19750:152;;;19825:5;19793:6;:12;19800:4;19793:12;;;;;;;;;;;:20;;:29;19814:7;19793:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19877:12;:10;:12::i;:::-;19850:40;;19868:7;19850:40;;19862:4;19850:40;;;;;;;;;;19750:152;19670:239;;:::o;32862:591::-;32965:1;32946:21;;:7;:21;;;32938:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33018:49;33039:7;33056:1;33060:6;33018:20;:49::i;:::-;33080:22;33105:9;:18;33115:7;33105:18;;;;;;;;;;;;;;;;33080:43;;33160:6;33142:14;:24;;33134:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33279:6;33262:14;:23;33241:9;:18;33251:7;33241:18;;;;;;;;;;;;;;;:44;;;;33323:6;33307:12;;:22;;;;;;;:::i;:::-;;;;;;;;33373:1;33347:37;;33356:7;33347:37;;;33377:6;33347:37;;;;;;:::i;:::-;;;;;;;;33397:48;33417:7;33434:1;33438:6;33397:19;:48::i;:::-;32927:526;32862:591;;:::o;42960:1619::-;43049:4;43055:7;43096:1;43083:10;:14;43075:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;43157:23;:21;:23::i;:::-;43143:10;:37;;43135:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;44353:13;44369:40;44398:10;44369:9;:13;;:28;;:40;;;;:::i;:::-;44353:56;;44435:9;:13;;:20;;;;44426:5;:29;44422:150;;44480:5;44487:1;44472:17;;;;;;;44422:150;44530:4;44536:9;:16;;44553:5;44536:23;;;;;;;;:::i;:::-;;;;;;;;;;44522:38;;;;;42960:1619;;;;;;:::o;40981:223::-;41028:7;41048:30;:18;:28;:30::i;:::-;41091:17;41111:23;:21;:23::i;:::-;41091:43;;41150:19;41159:9;41150:19;;;;;;:::i;:::-;;;;;;;;41187:9;41180:16;;;40981:223;:::o;42330:622::-;42473:44;42500:4;42506:2;42510:6;42473:26;:44::i;:::-;42550:1;42534:18;;:4;:18;;;42530:415;;42590:26;42613:2;42590:22;:26::i;:::-;42631:28;:26;:28::i;:::-;42530:415;;;42695:1;42681:16;;:2;:16;;;42677:268;;42735:28;42758:4;42735:22;:28::i;:::-;42778;:26;:28::i;:::-;42677:268;;;42864:28;42887:4;42864:22;:28::i;:::-;42907:26;42930:2;42907:22;:26::i;:::-;42677:268;42530:415;42330:622;;;:::o;36340: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;41270:127::-;41334:7;41361:28;:18;:26;:28::i;:::-;41354:35;;41270:127;:::o;10522:918::-;10611:7;10651:1;10635:5;:12;;;;:17;10631:58;;10676:1;10669:8;;;;10631:58;10701:11;10727:12;10742:5;:12;;;;10727:27;;10767:424;10780:4;10774:3;:10;10767:424;;;10801:11;10815:23;10828:3;10833:4;10815:12;:23::i;:::-;10801:37;;11072:7;11059:5;11065:3;11059:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;11055:125;;;11107:3;11100:10;;11055:125;;;11163:1;11157:3;:7;;;;:::i;:::-;11151:13;;11055:125;10786:405;10767:424;;;11317:1;11311:3;:7;:36;;;;;11340:7;11322:5;11334:1;11328:3;:7;;;;:::i;:::-;11322:14;;;;;;;;:::i;:::-;;;;;;;;;;:25;11311:36;11307:126;;;11377:1;11371:3;:7;;;;:::i;:::-;11364:14;;;;;;11307:126;11418:3;11411:10;;;;10522:918;;;;;:::o;8105:127::-;8212:1;8194:7;:14;;;:19;;;;;;;;;;;8105:127;:::o;44587:146::-;44655:70;44671:24;:33;44696:7;44671:33;;;;;;;;;;;;;;;44706:18;44716:7;44706:9;:18::i;:::-;44655:15;:70::i;:::-;44587:146;:::o;44741:118::-;44798:53;44814:21;44837:13;:11;:13::i;:::-;44798:15;:53::i;:::-;44741:118::o;9306:156::-;9368:7;9453:1;9448;9444;:5;9443:11;;;;:::i;:::-;9438:1;9434;:5;9433:21;;;;:::i;:::-;9426:28;;9306:156;;;;:::o;44867:310::-;44962:17;44982:23;:21;:23::i;:::-;44962:43;;45053:9;45020:30;45036:9;:13;;45020:15;:30::i;:::-;:42;45016:154;;;45079:9;:13;;45098:9;45079:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45123:9;:16;;45145:12;45123:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45016:154;44951:226;44867:310;;:::o;45185:212::-;45255:7;45293:1;45279:3;:10;;;;:15;45275:115;;45318:1;45311:8;;;;45275:115;45359:3;45376:1;45363:3;:10;;;;:14;;;;:::i;:::-;45359:19;;;;;;;;:::i;:::-;;;;;;;;;;45352:26;;45185:212;;;;:::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:118::-;10464:24;10482:5;10464:24;:::i;:::-;10459:3;10452:37;10377:118;;:::o;10501:222::-;10594:4;10632:2;10621:9;10617:18;10609:26;;10645:71;10713:1;10702:9;10698:17;10689:6;10645:71;:::i;:::-;10501:222;;;;:::o;10729:224::-;10869:34;10865:1;10857:6;10853:14;10846:58;10938:7;10933:2;10925:6;10921:15;10914:32;10729:224;:::o;10959:366::-;11101:3;11122:67;11186:2;11181:3;11122:67;:::i;:::-;11115:74;;11198:93;11287:3;11198:93;:::i;:::-;11316:2;11311:3;11307:12;11300:19;;10959:366;;;:::o;11331:419::-;11497:4;11535:2;11524:9;11520:18;11512:26;;11584:9;11578:4;11574:20;11570:1;11559:9;11555:17;11548:47;11612:131;11738:4;11612:131;:::i;:::-;11604:139;;11331:419;;;:::o;11756:223::-;11896:34;11892:1;11884:6;11880:14;11873:58;11965:6;11960:2;11952:6;11948:15;11941:31;11756:223;:::o;11985:366::-;12127:3;12148:67;12212:2;12207:3;12148:67;:::i;:::-;12141:74;;12224:93;12313:3;12224:93;:::i;:::-;12342:2;12337:3;12333:12;12326:19;;11985:366;;;:::o;12357:419::-;12523:4;12561:2;12550:9;12546:18;12538:26;;12610:9;12604:4;12600:20;12596:1;12585:9;12581:17;12574:47;12638:131;12764:4;12638:131;:::i;:::-;12630:139;;12357:419;;;:::o;12782:221::-;12922:34;12918:1;12910:6;12906:14;12899:58;12991:4;12986:2;12978:6;12974:15;12967:29;12782:221;:::o;13009:366::-;13151:3;13172:67;13236:2;13231:3;13172:67;:::i;:::-;13165:74;;13248:93;13337:3;13248:93;:::i;:::-;13366:2;13361:3;13357:12;13350:19;;13009:366;;;:::o;13381:419::-;13547:4;13585:2;13574:9;13570:18;13562:26;;13634:9;13628:4;13624:20;13620:1;13609:9;13605:17;13598:47;13662:131;13788:4;13662:131;:::i;:::-;13654:139;;13381:419;;;:::o;13806:224::-;13946:34;13942:1;13934:6;13930:14;13923:58;14015:7;14010:2;14002:6;13998:15;13991:32;13806:224;:::o;14036:366::-;14178:3;14199:67;14263:2;14258:3;14199:67;:::i;:::-;14192:74;;14275:93;14364:3;14275:93;:::i;:::-;14393:2;14388:3;14384:12;14377:19;;14036:366;;;:::o;14408:419::-;14574:4;14612:2;14601:9;14597:18;14589:26;;14661:9;14655:4;14651:20;14647:1;14636:9;14632:17;14625:47;14689:131;14815:4;14689:131;:::i;:::-;14681:139;;14408:419;;;:::o;14833:222::-;14973:34;14969:1;14961:6;14957:14;14950:58;15042:5;15037:2;15029:6;15025:15;15018:30;14833:222;:::o;15061:366::-;15203:3;15224:67;15288:2;15283:3;15224:67;:::i;:::-;15217:74;;15300:93;15389:3;15300:93;:::i;:::-;15418:2;15413:3;15409:12;15402:19;;15061:366;;;:::o;15433:419::-;15599:4;15637:2;15626:9;15622:18;15614:26;;15686:9;15680:4;15676:20;15672:1;15661:9;15657:17;15650:47;15714:131;15840:4;15714:131;:::i;:::-;15706:139;;15433:419;;;:::o;15858:225::-;15998:34;15994:1;15986:6;15982:14;15975:58;16067:8;16062:2;16054:6;16050:15;16043:33;15858:225;:::o;16089:366::-;16231:3;16252:67;16316:2;16311:3;16252:67;:::i;:::-;16245:74;;16328:93;16417:3;16328:93;:::i;:::-;16446:2;16441:3;16437:12;16430:19;;16089:366;;;:::o;16461:419::-;16627:4;16665:2;16654:9;16650:18;16642:26;;16714:9;16708:4;16704:20;16700:1;16689:9;16685:17;16678:47;16742:131;16868:4;16742:131;:::i;:::-;16734:139;;16461:419;;;:::o;16886:148::-;16988:11;17025:3;17010:18;;16886:148;;;;:::o;17040:173::-;17180:25;17176:1;17168:6;17164:14;17157:49;17040:173;:::o;17219:402::-;17379:3;17400:85;17482:2;17477:3;17400:85;:::i;:::-;17393:92;;17494:93;17583:3;17494:93;:::i;:::-;17612:2;17607:3;17603:12;17596:19;;17219:402;;;:::o;17627:377::-;17733:3;17761:39;17794:5;17761:39;:::i;:::-;17816:89;17898:6;17893:3;17816:89;:::i;:::-;17809:96;;17914:52;17959:6;17954:3;17947:4;17940:5;17936:16;17914:52;:::i;:::-;17991:6;17986:3;17982:16;17975:23;;17737:267;17627:377;;;;:::o;18010:167::-;18150:19;18146:1;18138:6;18134:14;18127:43;18010:167;:::o;18183:402::-;18343:3;18364:85;18446:2;18441:3;18364:85;:::i;:::-;18357:92;;18458:93;18547:3;18458:93;:::i;:::-;18576:2;18571:3;18567:12;18560:19;;18183:402;;;:::o;18591:967::-;18973:3;18995:148;19139:3;18995:148;:::i;:::-;18988:155;;19160:95;19251:3;19242:6;19160:95;:::i;:::-;19153:102;;19272:148;19416:3;19272:148;:::i;:::-;19265:155;;19437:95;19528:3;19519:6;19437:95;:::i;:::-;19430:102;;19549:3;19542:10;;18591:967;;;;;:::o;19564:220::-;19704:34;19700:1;19692:6;19688:14;19681:58;19773:3;19768:2;19760:6;19756:15;19749:28;19564:220;:::o;19790:366::-;19932:3;19953:67;20017:2;20012:3;19953:67;:::i;:::-;19946:74;;20029:93;20118:3;20029:93;:::i;:::-;20147:2;20142:3;20138:12;20131:19;;19790:366;;;:::o;20162:419::-;20328:4;20366:2;20355:9;20351:18;20343:26;;20415:9;20409:4;20405:20;20401:1;20390:9;20386:17;20379:47;20443:131;20569:4;20443:131;:::i;:::-;20435:139;;20162:419;;;:::o;20587:221::-;20727:34;20723:1;20715:6;20711:14;20704:58;20796:4;20791:2;20783:6;20779:15;20772:29;20587:221;:::o;20814:366::-;20956:3;20977:67;21041:2;21036:3;20977:67;:::i;:::-;20970:74;;21053:93;21142:3;21053:93;:::i;:::-;21171:2;21166:3;21162:12;21155:19;;20814:366;;;:::o;21186:419::-;21352:4;21390:2;21379:9;21375:18;21367:26;;21439:9;21433:4;21429:20;21425:1;21414:9;21410:17;21403:47;21467:131;21593:4;21467:131;:::i;:::-;21459:139;;21186:419;;;:::o;21611:191::-;21651:4;21671:20;21689:1;21671:20;:::i;:::-;21666:25;;21705:20;21723:1;21705:20;:::i;:::-;21700:25;;21744:1;21741;21738:8;21735:34;;;21749:18;;:::i;:::-;21735:34;21794:1;21791;21787:9;21779:17;;21611:191;;;;:::o;21808:172::-;21948:24;21944:1;21936:6;21932:14;21925:48;21808:172;:::o;21986:366::-;22128:3;22149:67;22213:2;22208:3;22149:67;:::i;:::-;22142:74;;22225:93;22314:3;22225:93;:::i;:::-;22343:2;22338:3;22334:12;22327:19;;21986:366;;;:::o;22358:419::-;22524:4;22562:2;22551:9;22547:18;22539:26;;22611:9;22605:4;22601:20;22597:1;22586:9;22582:17;22575:47;22639:131;22765:4;22639:131;:::i;:::-;22631:139;;22358:419;;;:::o;22783:179::-;22923:31;22919:1;22911:6;22907:14;22900:55;22783:179;:::o;22968:366::-;23110:3;23131:67;23195:2;23190:3;23131:67;:::i;:::-;23124:74;;23207:93;23296:3;23207:93;:::i;:::-;23325:2;23320:3;23316:12;23309:19;;22968:366;;;:::o;23340:419::-;23506:4;23544:2;23533:9;23529:18;23521:26;;23593:9;23587:4;23583:20;23579:1;23568:9;23564:17;23557:47;23621:131;23747:4;23621:131;:::i;:::-;23613:139;;23340:419;;;:::o;23765:180::-;23813:77;23810:1;23803:88;23910:4;23907:1;23900:15;23934:4;23931:1;23924:15;23951:348;23991:7;24014:20;24032:1;24014:20;:::i;:::-;24009:25;;24048:20;24066:1;24048:20;:::i;:::-;24043:25;;24236:1;24168:66;24164:74;24161:1;24158:81;24153:1;24146:9;24139:17;24135:105;24132:131;;;24243:18;;:::i;:::-;24132:131;24291:1;24288;24284:9;24273:20;;23951:348;;;;:::o;24305:180::-;24353:77;24350:1;24343:88;24450:4;24447:1;24440:15;24474:4;24471:1;24464:15;24491:171;24530:3;24553:24;24571:5;24553:24;:::i;:::-;24544:33;;24599:4;24592:5;24589:15;24586:41;;24607:18;;:::i;:::-;24586:41;24654:1;24647:5;24643:13;24636:20;;24491:171;;;:::o;24668:182::-;24808:34;24804:1;24796:6;24792:14;24785:58;24668:182;:::o;24856:366::-;24998:3;25019:67;25083:2;25078:3;25019:67;:::i;:::-;25012:74;;25095:93;25184:3;25095:93;:::i;:::-;25213:2;25208:3;25204:12;25197:19;;24856:366;;;:::o;25228:419::-;25394:4;25432:2;25421:9;25417:18;25409:26;;25481:9;25475:4;25471:20;25467:1;25456:9;25452:17;25445:47;25509:131;25635:4;25509:131;:::i;:::-;25501:139;;25228:419;;;:::o;25653:180::-;25701:77;25698:1;25691:88;25798:4;25795:1;25788:15;25822:4;25819:1;25812:15;25839:185;25879:1;25896:20;25914:1;25896:20;:::i;:::-;25891:25;;25930:20;25948:1;25930:20;:::i;:::-;25925:25;;25969:1;25959:35;;25974:18;;:::i;:::-;25959:35;26016:1;26013;26009:9;26004:14;;25839:185;;;;:::o

Swarm Source

ipfs://e1243d7583417ddb304820f2b93b4ddf73bda4b3077f8a109c43a2199dc01c27
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.