ETH Price: $3,386.92 (-2.09%)
Gas: 4 Gwei

Token

Travel (TRVL)
 

Overview

Max Total Supply

655,050.500000000000000005 TRVL

Holders

574

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,650 TRVL

Value
$0.00
0x7E7188e88586a3528D629985ADC91482F7Aa0aea
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TRVL

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-10
*/

// SPDX-License-Identifier: MIT


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/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/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/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// 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 v4.4.1 (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 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 {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

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

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been 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 v4.4.1 (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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: interfaces/IBurnableERC20.sol


pragma solidity =0.8.10;


/**
 * @notice ERC20-compliant interface with added
 *         function for burning tokens from addresses
 *
 * See {IERC20}
 */
interface IBurnableERC20 is IERC20 {
  /**
   * @dev Allows burning tokens from an address
   *
   * @dev Should have restricted access
   */
  function burn(address _from, uint256 _amount) external;
}
// File: interfaces/IMintableERC20.sol


pragma solidity =0.8.10;


/**
 * @notice ERC20-compliant interface with added
 *         function for minting new tokens to addresses
 *
 * See {IERC20}
 */
interface IMintableERC20 is IERC20 {
  /**
   * @dev Allows issuing new tokens to an address
   *
   * @dev Should have restricted access
   */
  function mint(address _to, uint256 _amount) external;
}
// 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 v4.4.1 (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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: TRVL.sol

pragma solidity =0.8.10;


/**
 * @notice This token contract is minted as a reward by staking
 *         NFTs based on TokenRewardStaking contract
 *         and is burned when merging TokenRewardStaking
 *         or adding accessories to them
 *
 * @dev Supports minting new tokens to an address
 *      from authorized addresses restricted by
 *      the `MINTER_ROLE` role
 *
 * @dev Supports burning tokens from an address from
 *      authorized addresses restricted by the
 *      `BURNER_ROLE` role
 *
 * @dev Supports EIP-2612 permits for gas-less approvals
 */
contract TRVL is ERC20, ERC20Permit, IMintableERC20, IBurnableERC20, AccessControl {
  /**
   * @notice AccessControl role that allows other EOAs or contracts
   *         to mint tokens
   *
   * @dev Checked in mint()
   */
  bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

  /**
   * @notice AccessControl role that allows other EOAs or contracts
   *         to burn tokens
   *
   * @dev Checked in burn()
   */
  bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");

  /**
   * @dev Smart contract unique identifier, a random number
   *
   * @dev Should be regenerated each time smart contact source code is changed
   *      and changes smart contract itself is to be redeployed
   *
   * @dev Generated using https://www.random.org/bytes/
   */
	uint256 public constant UID = 0x78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa;

  /**
   * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `BURNER_ROLE` to the
   *      account that deploys the contract.
   *
   * @param _name Full name of the NFT
   * @param _symbol Symbol of the NFT
   *
   * See {ERC20-constructor}.
   */
  constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) ERC20Permit(_name) {
    _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

    _setupRole(MINTER_ROLE, _msgSender());
    _setupRole(BURNER_ROLE, _msgSender());
  }

  /**
   * @dev Mints new tokens to an address
   *
   * @dev Restricted by `MINTER_ROLE` role
   *
   * @param _to the address the new tokens will be minted to
   * @param _amount how many new tokens will be minted
   */
  function mint(address _to, uint256 _amount) public {
    require(hasRole(MINTER_ROLE, _msgSender()), "must have minter role to mint");

    _mint(_to, _amount);
  }

  /**
   * @dev Burns some tokens from an address
   *
   * @dev Restricted by `BURNER_ROLE` role
   *
   * @param _from the address the tokens will be burned from
   * @param _amount how many tokens will be burned
   */
  function burn(address _from, uint256 _amount) public {
    require(hasRole(BURNER_ROLE, _msgSender()), "must have burner role to burn");

    _burn(_from, _amount);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"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":"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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152503480156200003a57600080fd5b5060405162003d8d38038062003d8d833981810160405281019062000060919062000633565b81806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525084848160039080519060200190620000b2929190620003e6565b508060049080519060200190620000cb929190620003e6565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001378184846200022f60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001a56000801b620001996200026b60201b60201c565b6200027360201b60201c565b620001e67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001da6200026b60201b60201c565b6200027360201b60201c565b620002277f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486200021b6200026b60201b60201c565b6200027360201b60201c565b5050620007f5565b600083838346306040516020016200024c95949392919062000733565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6200028582826200028960201b60201c565b5050565b6200029b82826200037b60201b60201c565b620003775760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200031c6200026b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003f490620007bf565b90600052602060002090601f01602090048101928262000418576000855562000464565b82601f106200043357805160ff191683800117855562000464565b8280016001018555821562000464579182015b828111156200046357825182559160200191906001019062000446565b5b50905062000473919062000477565b5090565b5b808211156200049257600081600090555060010162000478565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ff82620004b4565b810181811067ffffffffffffffff82111715620005215762000520620004c5565b5b80604052505050565b60006200053662000496565b9050620005448282620004f4565b919050565b600067ffffffffffffffff821115620005675762000566620004c5565b5b6200057282620004b4565b9050602081019050919050565b60005b838110156200059f57808201518184015260208101905062000582565b83811115620005af576000848401525b50505050565b6000620005cc620005c68462000549565b6200052a565b905082815260208101848484011115620005eb57620005ea620004af565b5b620005f88482856200057f565b509392505050565b600082601f830112620006185762000617620004aa565b5b81516200062a848260208601620005b5565b91505092915050565b600080604083850312156200064d576200064c620004a0565b5b600083015167ffffffffffffffff8111156200066e576200066d620004a5565b5b6200067c8582860162000600565b925050602083015167ffffffffffffffff811115620006a0576200069f620004a5565b5b620006ae8582860162000600565b9150509250929050565b6000819050919050565b620006cd81620006b8565b82525050565b6000819050919050565b620006e881620006d3565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200071b82620006ee565b9050919050565b6200072d816200070e565b82525050565b600060a0820190506200074a6000830188620006c2565b620007596020830187620006c2565b620007686040830186620006c2565b620007776060830185620006dd565b62000786608083018462000722565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007d857607f821691505b60208210811415620007ef57620007ee62000790565b5b50919050565b60805160a05160c05160e05161010051610120516101405161353d620008506000396000610d45015260006115fe015260006116400152600061161f01526000611554015260006115aa015260006115d3015261353d6000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635cc99e35116100de578063a217fddf11610097578063d505accf11610071578063d505accf146104d3578063d5391393146104ef578063d547741f1461050d578063dd62ed3e146105295761018e565b8063a217fddf14610455578063a457c2d714610473578063a9059cbb146104a35761018e565b80635cc99e351461036d57806370a082311461038b5780637ecebe00146103bb57806391d14854146103eb57806395d89b411461041b5780639dc29fac146104395761018e565b8063282c51f31161014b5780633644e515116101255780633644e515146102e757806336568abe14610305578063395093511461032157806340c10f19146103515761018e565b8063282c51f31461028f5780632f2ff15d146102ad578063313ce567146102c95761018e565b806301ffc9a71461019357806306fdde03146101c3578063095ea7b3146101e157806318160ddd1461021157806323b872dd1461022f578063248a9ca31461025f575b600080fd5b6101ad60048036038101906101a8919061213c565b610559565b6040516101ba9190612184565b60405180910390f35b6101cb6105d3565b6040516101d89190612238565b60405180910390f35b6101fb60048036038101906101f691906122ee565b610665565b6040516102089190612184565b60405180910390f35b610219610683565b604051610226919061233d565b60405180910390f35b61024960048036038101906102449190612358565b61068d565b6040516102569190612184565b60405180910390f35b610279600480360381019061027491906123e1565b610785565b604051610286919061241d565b60405180910390f35b6102976107a5565b6040516102a4919061241d565b60405180910390f35b6102c760048036038101906102c29190612438565b6107c9565b005b6102d16107f2565b6040516102de9190612494565b60405180910390f35b6102ef6107fb565b6040516102fc919061241d565b60405180910390f35b61031f600480360381019061031a9190612438565b61080a565b005b61033b600480360381019061033691906122ee565b61088d565b6040516103489190612184565b60405180910390f35b61036b600480360381019061036691906122ee565b610939565b005b6103756109b7565b604051610382919061233d565b60405180910390f35b6103a560048036038101906103a091906124af565b6109db565b6040516103b2919061233d565b60405180910390f35b6103d560048036038101906103d091906124af565b610a23565b6040516103e2919061233d565b60405180910390f35b61040560048036038101906104009190612438565b610a73565b6040516104129190612184565b60405180910390f35b610423610ade565b6040516104309190612238565b60405180910390f35b610453600480360381019061044e91906122ee565b610b70565b005b61045d610bee565b60405161046a919061241d565b60405180910390f35b61048d600480360381019061048891906122ee565b610bf5565b60405161049a9190612184565b60405180910390f35b6104bd60048036038101906104b891906122ee565b610ce0565b6040516104ca9190612184565b60405180910390f35b6104ed60048036038101906104e89190612508565b610cfe565b005b6104f7610e40565b604051610504919061241d565b60405180910390f35b61052760048036038101906105229190612438565b610e64565b005b610543600480360381019061053e91906125aa565b610e8d565b604051610550919061233d565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cc57506105cb82610f14565b5b9050919050565b6060600380546105e290612619565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90612619565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b6000610679610672610f7e565b8484610f86565b6001905092915050565b6000600254905090565b600061069a848484611151565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106e5610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c906126bd565b60405180910390fd5b61077985610771610f7e565b858403610f86565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107d282610785565b6107e3816107de610f7e565b6113d2565b6107ed838361146f565b505050565b60006012905090565b6000610805611550565b905090565b610812610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461087f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769061274f565b60405180910390fd5b610889828261166a565b5050565b600061092f61089a610f7e565b8484600160006108a8610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461092a919061279e565b610f86565b6001905092915050565b61096a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610965610f7e565b610a73565b6109a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a090612840565b60405180910390fd5b6109b3828261174c565b5050565b7f78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610a6c600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118ac565b9050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610aed90612619565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1990612619565b8015610b665780601f10610b3b57610100808354040283529160200191610b66565b820191906000526020600020905b815481529060010190602001808311610b4957829003601f168201915b5050505050905090565b610ba17f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610b9c610f7e565b610a73565b610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906128ac565b60405180910390fd5b610bea82826118ba565b5050565b6000801b81565b60008060016000610c04610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb89061293e565b60405180910390fd5b610cd5610ccc610f7e565b85858403610f86565b600191505092915050565b6000610cf4610ced610f7e565b8484611151565b6001905092915050565b83421115610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d38906129aa565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610d708c611a91565b89604051602001610d86969594939291906129d9565b6040516020818303038152906040528051906020012090506000610da982611aef565b90506000610db982878787611b09565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090612a86565b60405180910390fd5b610e348a8a8a610f86565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610e6d82610785565b610e7e81610e79610f7e565b6113d2565b610e88838361166a565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90612b18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612baa565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611144919061233d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612c3c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890612cce565b60405180910390fd5b61123c838383611b34565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990612d60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611355919061279e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113b9919061233d565b60405180910390a36113cc848484611b39565b50505050565b6113dc8282610a73565b61146b576114018173ffffffffffffffffffffffffffffffffffffffff166014611b3e565b61140f8360001c6020611b3e565b604051602001611420929190612e54565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114629190612238565b60405180910390fd5b5050565b6114798282610a73565b61154c5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114f1610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156115cc57507f000000000000000000000000000000000000000000000000000000000000000046145b156115f9577f00000000000000000000000000000000000000000000000000000000000000009050611667565b6116647f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611d7a565b90505b90565b6116748282610a73565b156117485760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116ed610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390612eda565b60405180910390fd5b6117c860008383611b34565b80600260008282546117da919061279e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182f919061279e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611894919061233d565b60405180910390a36118a860008383611b39565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190612f6c565b60405180910390fd5b61193682600083611b34565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390612ffe565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a13919061301e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a78919061233d565b60405180910390a3611a8c83600084611b39565b505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ade816118ac565b9150611ae981611db4565b50919050565b6000611b02611afc611550565b83611dca565b9050919050565b6000806000611b1a87878787611dfd565b91509150611b2781611f0a565b8192505050949350505050565b505050565b505050565b606060006002836002611b519190613052565b611b5b919061279e565b67ffffffffffffffff811115611b7457611b736130ac565b5b6040519080825280601f01601f191660200182016040528015611ba65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611bde57611bdd6130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c4257611c416130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c829190613052565b611c8c919061279e565b90505b6001811115611d2c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cce57611ccd6130db565b5b1a60f81b828281518110611ce557611ce46130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d259061310a565b9050611c8f565b5060008414611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790613180565b60405180910390fd5b8091505092915050565b60008383834630604051602001611d959594939291906131a0565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611ddf929190613260565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611e38576000600391509150611f01565b601b8560ff1614158015611e505750601c8560ff1614155b15611e62576000600491509150611f01565b600060018787878760405160008152602001604052604051611e879493929190613297565b6020604051602081039080840390855afa158015611ea9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ef857600060019250925050611f01565b80600092509250505b94509492505050565b60006004811115611f1e57611f1d6132dc565b5b816004811115611f3157611f306132dc565b5b1415611f3c576120dc565b60016004811115611f5057611f4f6132dc565b5b816004811115611f6357611f626132dc565b5b1415611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613357565b60405180910390fd5b60026004811115611fb857611fb76132dc565b5b816004811115611fcb57611fca6132dc565b5b141561200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906133c3565b60405180910390fd5b600360048111156120205761201f6132dc565b5b816004811115612033576120326132dc565b5b1415612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613455565b60405180910390fd5b600480811115612087576120866132dc565b5b81600481111561209a576120996132dc565b5b14156120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d2906134e7565b60405180910390fd5b5b50565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612119816120e4565b811461212457600080fd5b50565b60008135905061213681612110565b92915050565b600060208284031215612152576121516120df565b5b600061216084828501612127565b91505092915050565b60008115159050919050565b61217e81612169565b82525050565b60006020820190506121996000830184612175565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d95780820151818401526020810190506121be565b838111156121e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061220a8261219f565b61221481856121aa565b93506122248185602086016121bb565b61222d816121ee565b840191505092915050565b6000602082019050818103600083015261225281846121ff565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122858261225a565b9050919050565b6122958161227a565b81146122a057600080fd5b50565b6000813590506122b28161228c565b92915050565b6000819050919050565b6122cb816122b8565b81146122d657600080fd5b50565b6000813590506122e8816122c2565b92915050565b60008060408385031215612305576123046120df565b5b6000612313858286016122a3565b9250506020612324858286016122d9565b9150509250929050565b612337816122b8565b82525050565b6000602082019050612352600083018461232e565b92915050565b600080600060608486031215612371576123706120df565b5b600061237f868287016122a3565b9350506020612390868287016122a3565b92505060406123a1868287016122d9565b9150509250925092565b6000819050919050565b6123be816123ab565b81146123c957600080fd5b50565b6000813590506123db816123b5565b92915050565b6000602082840312156123f7576123f66120df565b5b6000612405848285016123cc565b91505092915050565b612417816123ab565b82525050565b6000602082019050612432600083018461240e565b92915050565b6000806040838503121561244f5761244e6120df565b5b600061245d858286016123cc565b925050602061246e858286016122a3565b9150509250929050565b600060ff82169050919050565b61248e81612478565b82525050565b60006020820190506124a96000830184612485565b92915050565b6000602082840312156124c5576124c46120df565b5b60006124d3848285016122a3565b91505092915050565b6124e581612478565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b600080600080600080600060e0888a031215612527576125266120df565b5b60006125358a828b016122a3565b97505060206125468a828b016122a3565b96505060406125578a828b016122d9565b95505060606125688a828b016122d9565b94505060806125798a828b016124f3565b93505060a061258a8a828b016123cc565b92505060c061259b8a828b016123cc565b91505092959891949750929550565b600080604083850312156125c1576125c06120df565b5b60006125cf858286016122a3565b92505060206125e0858286016122a3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061263157607f821691505b60208210811415612645576126446125ea565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006126a76028836121aa565b91506126b28261264b565b604082019050919050565b600060208201905081810360008301526126d68161269a565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612739602f836121aa565b9150612744826126dd565b604082019050919050565b600060208201905081810360008301526127688161272c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a9826122b8565b91506127b4836122b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e9576127e861276f565b5b828201905092915050565b7f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000600082015250565b600061282a601d836121aa565b9150612835826127f4565b602082019050919050565b600060208201905081810360008301526128598161281d565b9050919050565b7f6d7573742068617665206275726e657220726f6c6520746f206275726e000000600082015250565b6000612896601d836121aa565b91506128a182612860565b602082019050919050565b600060208201905081810360008301526128c581612889565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129286025836121aa565b9150612933826128cc565b604082019050919050565b600060208201905081810360008301526129578161291b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612994601d836121aa565b915061299f8261295e565b602082019050919050565b600060208201905081810360008301526129c381612987565b9050919050565b6129d38161227a565b82525050565b600060c0820190506129ee600083018961240e565b6129fb60208301886129ca565b612a0860408301876129ca565b612a15606083018661232e565b612a22608083018561232e565b612a2f60a083018461232e565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612a70601e836121aa565b9150612a7b82612a3a565b602082019050919050565b60006020820190508181036000830152612a9f81612a63565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612b026024836121aa565b9150612b0d82612aa6565b604082019050919050565b60006020820190508181036000830152612b3181612af5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b946022836121aa565b9150612b9f82612b38565b604082019050919050565b60006020820190508181036000830152612bc381612b87565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c266025836121aa565b9150612c3182612bca565b604082019050919050565b60006020820190508181036000830152612c5581612c19565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb86023836121aa565b9150612cc382612c5c565b604082019050919050565b60006020820190508181036000830152612ce781612cab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d4a6026836121aa565b9150612d5582612cee565b604082019050919050565b60006020820190508181036000830152612d7981612d3d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dc1601783612d80565b9150612dcc82612d8b565b601782019050919050565b6000612de28261219f565b612dec8185612d80565b9350612dfc8185602086016121bb565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3e601183612d80565b9150612e4982612e08565b601182019050919050565b6000612e5f82612db4565b9150612e6b8285612dd7565b9150612e7682612e31565b9150612e828284612dd7565b91508190509392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612ec4601f836121aa565b9150612ecf82612e8e565b602082019050919050565b60006020820190508181036000830152612ef381612eb7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f566021836121aa565b9150612f6182612efa565b604082019050919050565b60006020820190508181036000830152612f8581612f49565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fe86022836121aa565b9150612ff382612f8c565b604082019050919050565b6000602082019050818103600083015261301781612fdb565b9050919050565b6000613029826122b8565b9150613034836122b8565b9250828210156130475761304661276f565b5b828203905092915050565b600061305d826122b8565b9150613068836122b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130a1576130a061276f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613115826122b8565b915060008214156131295761312861276f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061316a6020836121aa565b915061317582613134565b602082019050919050565b600060208201905081810360008301526131998161315d565b9050919050565b600060a0820190506131b5600083018861240e565b6131c2602083018761240e565b6131cf604083018661240e565b6131dc606083018561232e565b6131e960808301846129ca565b9695505050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613229600283612d80565b9150613234826131f3565b600282019050919050565b6000819050919050565b61325a613255826123ab565b61323f565b82525050565b600061326b8261321c565b91506132778285613249565b6020820191506132878284613249565b6020820191508190509392505050565b60006080820190506132ac600083018761240e565b6132b96020830186612485565b6132c6604083018561240e565b6132d3606083018461240e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006133416018836121aa565b915061334c8261330b565b602082019050919050565b6000602082019050818103600083015261337081613334565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006133ad601f836121aa565b91506133b882613377565b602082019050919050565b600060208201905081810360008301526133dc816133a0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061343f6022836121aa565b915061344a826133e3565b604082019050919050565b6000602082019050818103600083015261346e81613432565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006134d16022836121aa565b91506134dc82613475565b604082019050919050565b60006020820190508181036000830152613500816134c4565b905091905056fea26469706673582212201278d850547a56183148c46e16450578f05a166c9fa461655d305eb6a66c82d264736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000654726176656c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045452564c00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635cc99e35116100de578063a217fddf11610097578063d505accf11610071578063d505accf146104d3578063d5391393146104ef578063d547741f1461050d578063dd62ed3e146105295761018e565b8063a217fddf14610455578063a457c2d714610473578063a9059cbb146104a35761018e565b80635cc99e351461036d57806370a082311461038b5780637ecebe00146103bb57806391d14854146103eb57806395d89b411461041b5780639dc29fac146104395761018e565b8063282c51f31161014b5780633644e515116101255780633644e515146102e757806336568abe14610305578063395093511461032157806340c10f19146103515761018e565b8063282c51f31461028f5780632f2ff15d146102ad578063313ce567146102c95761018e565b806301ffc9a71461019357806306fdde03146101c3578063095ea7b3146101e157806318160ddd1461021157806323b872dd1461022f578063248a9ca31461025f575b600080fd5b6101ad60048036038101906101a8919061213c565b610559565b6040516101ba9190612184565b60405180910390f35b6101cb6105d3565b6040516101d89190612238565b60405180910390f35b6101fb60048036038101906101f691906122ee565b610665565b6040516102089190612184565b60405180910390f35b610219610683565b604051610226919061233d565b60405180910390f35b61024960048036038101906102449190612358565b61068d565b6040516102569190612184565b60405180910390f35b610279600480360381019061027491906123e1565b610785565b604051610286919061241d565b60405180910390f35b6102976107a5565b6040516102a4919061241d565b60405180910390f35b6102c760048036038101906102c29190612438565b6107c9565b005b6102d16107f2565b6040516102de9190612494565b60405180910390f35b6102ef6107fb565b6040516102fc919061241d565b60405180910390f35b61031f600480360381019061031a9190612438565b61080a565b005b61033b600480360381019061033691906122ee565b61088d565b6040516103489190612184565b60405180910390f35b61036b600480360381019061036691906122ee565b610939565b005b6103756109b7565b604051610382919061233d565b60405180910390f35b6103a560048036038101906103a091906124af565b6109db565b6040516103b2919061233d565b60405180910390f35b6103d560048036038101906103d091906124af565b610a23565b6040516103e2919061233d565b60405180910390f35b61040560048036038101906104009190612438565b610a73565b6040516104129190612184565b60405180910390f35b610423610ade565b6040516104309190612238565b60405180910390f35b610453600480360381019061044e91906122ee565b610b70565b005b61045d610bee565b60405161046a919061241d565b60405180910390f35b61048d600480360381019061048891906122ee565b610bf5565b60405161049a9190612184565b60405180910390f35b6104bd60048036038101906104b891906122ee565b610ce0565b6040516104ca9190612184565b60405180910390f35b6104ed60048036038101906104e89190612508565b610cfe565b005b6104f7610e40565b604051610504919061241d565b60405180910390f35b61052760048036038101906105229190612438565b610e64565b005b610543600480360381019061053e91906125aa565b610e8d565b604051610550919061233d565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cc57506105cb82610f14565b5b9050919050565b6060600380546105e290612619565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90612619565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b6000610679610672610f7e565b8484610f86565b6001905092915050565b6000600254905090565b600061069a848484611151565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106e5610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c906126bd565b60405180910390fd5b61077985610771610f7e565b858403610f86565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6107d282610785565b6107e3816107de610f7e565b6113d2565b6107ed838361146f565b505050565b60006012905090565b6000610805611550565b905090565b610812610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461087f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769061274f565b60405180910390fd5b610889828261166a565b5050565b600061092f61089a610f7e565b8484600160006108a8610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461092a919061279e565b610f86565b6001905092915050565b61096a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610965610f7e565b610a73565b6109a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a090612840565b60405180910390fd5b6109b3828261174c565b5050565b7f78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610a6c600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118ac565b9050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610aed90612619565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1990612619565b8015610b665780601f10610b3b57610100808354040283529160200191610b66565b820191906000526020600020905b815481529060010190602001808311610b4957829003601f168201915b5050505050905090565b610ba17f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610b9c610f7e565b610a73565b610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906128ac565b60405180910390fd5b610bea82826118ba565b5050565b6000801b81565b60008060016000610c04610f7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb89061293e565b60405180910390fd5b610cd5610ccc610f7e565b85858403610f86565b600191505092915050565b6000610cf4610ced610f7e565b8484611151565b6001905092915050565b83421115610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d38906129aa565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d708c611a91565b89604051602001610d86969594939291906129d9565b6040516020818303038152906040528051906020012090506000610da982611aef565b90506000610db982878787611b09565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090612a86565b60405180910390fd5b610e348a8a8a610f86565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610e6d82610785565b610e7e81610e79610f7e565b6113d2565b610e88838361166a565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90612b18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612baa565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611144919061233d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612c3c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890612cce565b60405180910390fd5b61123c838383611b34565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990612d60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611355919061279e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113b9919061233d565b60405180910390a36113cc848484611b39565b50505050565b6113dc8282610a73565b61146b576114018173ffffffffffffffffffffffffffffffffffffffff166014611b3e565b61140f8360001c6020611b3e565b604051602001611420929190612e54565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114629190612238565b60405180910390fd5b5050565b6114798282610a73565b61154c5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114f1610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156115cc57507f000000000000000000000000000000000000000000000000000000000000000146145b156115f9577f7e50d22bb1ac0a4b8a93cb01d43e389ecff1d1c2505597004b299873922da3fc9050611667565b6116647f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f06b4e2e755cbddd238cffe8dd2b9fd3b0fbb2767b1cf4f1168553431c9eb5cf07fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611d7a565b90505b90565b6116748282610a73565b156117485760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116ed610f7e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390612eda565b60405180910390fd5b6117c860008383611b34565b80600260008282546117da919061279e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182f919061279e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611894919061233d565b60405180910390a36118a860008383611b39565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190612f6c565b60405180910390fd5b61193682600083611b34565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390612ffe565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a13919061301e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a78919061233d565b60405180910390a3611a8c83600084611b39565b505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ade816118ac565b9150611ae981611db4565b50919050565b6000611b02611afc611550565b83611dca565b9050919050565b6000806000611b1a87878787611dfd565b91509150611b2781611f0a565b8192505050949350505050565b505050565b505050565b606060006002836002611b519190613052565b611b5b919061279e565b67ffffffffffffffff811115611b7457611b736130ac565b5b6040519080825280601f01601f191660200182016040528015611ba65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611bde57611bdd6130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c4257611c416130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c829190613052565b611c8c919061279e565b90505b6001811115611d2c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cce57611ccd6130db565b5b1a60f81b828281518110611ce557611ce46130db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d259061310a565b9050611c8f565b5060008414611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790613180565b60405180910390fd5b8091505092915050565b60008383834630604051602001611d959594939291906131a0565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611ddf929190613260565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611e38576000600391509150611f01565b601b8560ff1614158015611e505750601c8560ff1614155b15611e62576000600491509150611f01565b600060018787878760405160008152602001604052604051611e879493929190613297565b6020604051602081039080840390855afa158015611ea9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ef857600060019250925050611f01565b80600092509250505b94509492505050565b60006004811115611f1e57611f1d6132dc565b5b816004811115611f3157611f306132dc565b5b1415611f3c576120dc565b60016004811115611f5057611f4f6132dc565b5b816004811115611f6357611f626132dc565b5b1415611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613357565b60405180910390fd5b60026004811115611fb857611fb76132dc565b5b816004811115611fcb57611fca6132dc565b5b141561200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906133c3565b60405180910390fd5b600360048111156120205761201f6132dc565b5b816004811115612033576120326132dc565b5b1415612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613455565b60405180910390fd5b600480811115612087576120866132dc565b5b81600481111561209a576120996132dc565b5b14156120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d2906134e7565b60405180910390fd5b5b50565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612119816120e4565b811461212457600080fd5b50565b60008135905061213681612110565b92915050565b600060208284031215612152576121516120df565b5b600061216084828501612127565b91505092915050565b60008115159050919050565b61217e81612169565b82525050565b60006020820190506121996000830184612175565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d95780820151818401526020810190506121be565b838111156121e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061220a8261219f565b61221481856121aa565b93506122248185602086016121bb565b61222d816121ee565b840191505092915050565b6000602082019050818103600083015261225281846121ff565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122858261225a565b9050919050565b6122958161227a565b81146122a057600080fd5b50565b6000813590506122b28161228c565b92915050565b6000819050919050565b6122cb816122b8565b81146122d657600080fd5b50565b6000813590506122e8816122c2565b92915050565b60008060408385031215612305576123046120df565b5b6000612313858286016122a3565b9250506020612324858286016122d9565b9150509250929050565b612337816122b8565b82525050565b6000602082019050612352600083018461232e565b92915050565b600080600060608486031215612371576123706120df565b5b600061237f868287016122a3565b9350506020612390868287016122a3565b92505060406123a1868287016122d9565b9150509250925092565b6000819050919050565b6123be816123ab565b81146123c957600080fd5b50565b6000813590506123db816123b5565b92915050565b6000602082840312156123f7576123f66120df565b5b6000612405848285016123cc565b91505092915050565b612417816123ab565b82525050565b6000602082019050612432600083018461240e565b92915050565b6000806040838503121561244f5761244e6120df565b5b600061245d858286016123cc565b925050602061246e858286016122a3565b9150509250929050565b600060ff82169050919050565b61248e81612478565b82525050565b60006020820190506124a96000830184612485565b92915050565b6000602082840312156124c5576124c46120df565b5b60006124d3848285016122a3565b91505092915050565b6124e581612478565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b600080600080600080600060e0888a031215612527576125266120df565b5b60006125358a828b016122a3565b97505060206125468a828b016122a3565b96505060406125578a828b016122d9565b95505060606125688a828b016122d9565b94505060806125798a828b016124f3565b93505060a061258a8a828b016123cc565b92505060c061259b8a828b016123cc565b91505092959891949750929550565b600080604083850312156125c1576125c06120df565b5b60006125cf858286016122a3565b92505060206125e0858286016122a3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061263157607f821691505b60208210811415612645576126446125ea565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006126a76028836121aa565b91506126b28261264b565b604082019050919050565b600060208201905081810360008301526126d68161269a565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612739602f836121aa565b9150612744826126dd565b604082019050919050565b600060208201905081810360008301526127688161272c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a9826122b8565b91506127b4836122b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e9576127e861276f565b5b828201905092915050565b7f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000600082015250565b600061282a601d836121aa565b9150612835826127f4565b602082019050919050565b600060208201905081810360008301526128598161281d565b9050919050565b7f6d7573742068617665206275726e657220726f6c6520746f206275726e000000600082015250565b6000612896601d836121aa565b91506128a182612860565b602082019050919050565b600060208201905081810360008301526128c581612889565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129286025836121aa565b9150612933826128cc565b604082019050919050565b600060208201905081810360008301526129578161291b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612994601d836121aa565b915061299f8261295e565b602082019050919050565b600060208201905081810360008301526129c381612987565b9050919050565b6129d38161227a565b82525050565b600060c0820190506129ee600083018961240e565b6129fb60208301886129ca565b612a0860408301876129ca565b612a15606083018661232e565b612a22608083018561232e565b612a2f60a083018461232e565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612a70601e836121aa565b9150612a7b82612a3a565b602082019050919050565b60006020820190508181036000830152612a9f81612a63565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612b026024836121aa565b9150612b0d82612aa6565b604082019050919050565b60006020820190508181036000830152612b3181612af5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b946022836121aa565b9150612b9f82612b38565b604082019050919050565b60006020820190508181036000830152612bc381612b87565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c266025836121aa565b9150612c3182612bca565b604082019050919050565b60006020820190508181036000830152612c5581612c19565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb86023836121aa565b9150612cc382612c5c565b604082019050919050565b60006020820190508181036000830152612ce781612cab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d4a6026836121aa565b9150612d5582612cee565b604082019050919050565b60006020820190508181036000830152612d7981612d3d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612dc1601783612d80565b9150612dcc82612d8b565b601782019050919050565b6000612de28261219f565b612dec8185612d80565b9350612dfc8185602086016121bb565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612e3e601183612d80565b9150612e4982612e08565b601182019050919050565b6000612e5f82612db4565b9150612e6b8285612dd7565b9150612e7682612e31565b9150612e828284612dd7565b91508190509392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612ec4601f836121aa565b9150612ecf82612e8e565b602082019050919050565b60006020820190508181036000830152612ef381612eb7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f566021836121aa565b9150612f6182612efa565b604082019050919050565b60006020820190508181036000830152612f8581612f49565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fe86022836121aa565b9150612ff382612f8c565b604082019050919050565b6000602082019050818103600083015261301781612fdb565b9050919050565b6000613029826122b8565b9150613034836122b8565b9250828210156130475761304661276f565b5b828203905092915050565b600061305d826122b8565b9150613068836122b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130a1576130a061276f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613115826122b8565b915060008214156131295761312861276f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061316a6020836121aa565b915061317582613134565b602082019050919050565b600060208201905081810360008301526131998161315d565b9050919050565b600060a0820190506131b5600083018861240e565b6131c2602083018761240e565b6131cf604083018661240e565b6131dc606083018561232e565b6131e960808301846129ca565b9695505050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613229600283612d80565b9150613234826131f3565b600282019050919050565b6000819050919050565b61325a613255826123ab565b61323f565b82525050565b600061326b8261321c565b91506132778285613249565b6020820191506132878284613249565b6020820191508190509392505050565b60006080820190506132ac600083018761240e565b6132b96020830186612485565b6132c6604083018561240e565b6132d3606083018461240e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006133416018836121aa565b915061334c8261330b565b602082019050919050565b6000602082019050818103600083015261337081613334565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006133ad601f836121aa565b91506133b882613377565b602082019050919050565b600060208201905081810360008301526133dc816133a0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061343f6022836121aa565b915061344a826133e3565b604082019050919050565b6000602082019050818103600083015261346e81613432565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006134d16022836121aa565b91506134dc82613475565b604082019050919050565b60006020820190508181036000830152613500816134c4565b905091905056fea26469706673582212201278d850547a56183148c46e16450578f05a166c9fa461655d305eb6a66c82d264736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000654726176656c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045452564c00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Travel
Arg [1] : _symbol (string): TRVL

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 54726176656c0000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5452564c00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53665:2230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28640:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40203:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42370:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41323:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43021:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30051:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54116:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30436:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41165:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52586:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31484:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43922:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55317:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54473:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41494:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52328:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28936:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40422:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55720:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28027:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44640:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41834:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51617:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53900:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30828:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42072:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28640:204;28725:4;28764:32;28749:47;;;:11;:47;;;;:87;;;;28800:36;28824:11;28800:23;:36::i;:::-;28749:87;28742:94;;28640:204;;;:::o;40203:100::-;40257:13;40290:5;40283:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40203:100;:::o;42370:169::-;42453:4;42470:39;42479:12;:10;:12::i;:::-;42493:7;42502:6;42470:8;:39::i;:::-;42527:4;42520:11;;42370:169;;;;:::o;41323:108::-;41384:7;41411:12;;41404:19;;41323:108;:::o;43021:492::-;43161:4;43178:36;43188:6;43196:9;43207:6;43178:9;:36::i;:::-;43227:24;43254:11;:19;43266:6;43254:19;;;;;;;;;;;;;;;:33;43274:12;:10;:12::i;:::-;43254:33;;;;;;;;;;;;;;;;43227:60;;43326:6;43306:16;:26;;43298:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;43413:57;43422:6;43430:12;:10;:12::i;:::-;43463:6;43444:16;:25;43413:8;:57::i;:::-;43501:4;43494:11;;;43021:492;;;;;:::o;30051:123::-;30117:7;30144:6;:12;30151:4;30144:12;;;;;;;;;;;:22;;;30137:29;;30051:123;;;:::o;54116:62::-;54154:24;54116:62;:::o;30436:147::-;30519:18;30532:4;30519:12;:18::i;:::-;28518:30;28529:4;28535:12;:10;:12::i;:::-;28518:10;:30::i;:::-;30550:25:::1;30561:4;30567:7;30550:10;:25::i;:::-;30436:147:::0;;;:::o;41165:93::-;41223:5;41248:2;41241:9;;41165:93;:::o;52586:115::-;52646:7;52673:20;:18;:20::i;:::-;52666:27;;52586:115;:::o;31484:218::-;31591:12;:10;:12::i;:::-;31580:23;;:7;:23;;;31572:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31668:26;31680:4;31686:7;31668:11;:26::i;:::-;31484:218;;:::o;43922:215::-;44010:4;44027:80;44036:12;:10;:12::i;:::-;44050:7;44096:10;44059:11;:25;44071:12;:10;:12::i;:::-;44059:25;;;;;;;;;;;;;;;:34;44085:7;44059:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;44027:8;:80::i;:::-;44125:4;44118:11;;43922:215;;;;:::o;55317:168::-;55383:34;53938:24;55404:12;:10;:12::i;:::-;55383:7;:34::i;:::-;55375:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55460:19;55466:3;55471:7;55460:5;:19::i;:::-;55317:168;;:::o;54473:96::-;54503:66;54473:96;:::o;41494:127::-;41568:7;41595:9;:18;41605:7;41595:18;;;;;;;;;;;;;;;;41588:25;;41494:127;;;:::o;52328:128::-;52397:7;52424:24;:7;:14;52432:5;52424:14;;;;;;;;;;;;;;;:22;:24::i;:::-;52417:31;;52328:128;;;:::o;28936:139::-;29014:4;29038:6;:12;29045:4;29038:12;;;;;;;;;;;:20;;:29;29059:7;29038:29;;;;;;;;;;;;;;;;;;;;;;;;;29031:36;;28936:139;;;;:::o;40422:104::-;40478:13;40511:7;40504:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40422:104;:::o;55720:172::-;55788:34;54154:24;55809:12;:10;:12::i;:::-;55788:7;:34::i;:::-;55780:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55865:21;55871:5;55878:7;55865:5;:21::i;:::-;55720:172;;:::o;28027:49::-;28072:4;28027:49;;;:::o;44640:413::-;44733:4;44750:24;44777:11;:25;44789:12;:10;:12::i;:::-;44777:25;;;;;;;;;;;;;;;:34;44803:7;44777:34;;;;;;;;;;;;;;;;44750:61;;44850:15;44830:16;:35;;44822:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44943:67;44952:12;:10;:12::i;:::-;44966:7;44994:15;44975:16;:34;44943:8;:67::i;:::-;45041:4;45034:11;;;44640:413;;;;:::o;41834:175::-;41920:4;41937:42;41947:12;:10;:12::i;:::-;41961:9;41972:6;41937:9;:42::i;:::-;41997:4;41990:11;;41834:175;;;;:::o;51617:645::-;51861:8;51842:15;:27;;51834:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51916:18;51958:16;51976:5;51983:7;51992:5;51999:16;52009:5;51999:9;:16::i;:::-;52017:8;51947:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51937:90;;;;;;51916:111;;52040:12;52055:28;52072:10;52055:16;:28::i;:::-;52040:43;;52096:14;52113:28;52127:4;52133:1;52136;52139;52113:13;:28::i;:::-;52096:45;;52170:5;52160:15;;:6;:15;;;52152:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52223:31;52232:5;52239:7;52248:5;52223:8;:31::i;:::-;51823:439;;;51617:645;;;;;;;:::o;53900:62::-;53938:24;53900:62;:::o;30828:149::-;30912:18;30925:4;30912:12;:18::i;:::-;28518:30;28529:4;28535:12;:10;:12::i;:::-;28518:10;:30::i;:::-;30943:26:::1;30955:4;30961:7;30943:11;:26::i;:::-;30828:149:::0;;;:::o;42072:151::-;42161:7;42188:11;:18;42200:5;42188:18;;;;;;;;;;;;;;;:27;42207:7;42188:27;;;;;;;;;;;;;;;;42181:34;;42072:151;;;;:::o;1815:157::-;1900:4;1939:25;1924:40;;;:11;:40;;;;1917:47;;1815:157;;;:::o;25850:98::-;25903:7;25930:10;25923:17;;25850:98;:::o;48324:380::-;48477:1;48460:19;;:5;:19;;;;48452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48558:1;48539:21;;:7;:21;;;;48531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48642:6;48612:11;:18;48624:5;48612:18;;;;;;;;;;;;;;;:27;48631:7;48612:27;;;;;;;;;;;;;;;:36;;;;48680:7;48664:32;;48673:5;48664:32;;;48689:6;48664:32;;;;;;:::i;:::-;;;;;;;;48324:380;;;:::o;45543:733::-;45701:1;45683:20;;:6;:20;;;;45675:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;45785:1;45764:23;;:9;:23;;;;45756:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45840:47;45861:6;45869:9;45880:6;45840:20;:47::i;:::-;45900:21;45924:9;:17;45934:6;45924:17;;;;;;;;;;;;;;;;45900:41;;45977:6;45960:13;:23;;45952:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46098:6;46082:13;:22;46062:9;:17;46072:6;46062:17;;;;;;;;;;;;;;;:42;;;;46150:6;46126:9;:20;46136:9;46126:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;46191:9;46174:35;;46183:6;46174:35;;;46202:6;46174:35;;;;;;:::i;:::-;;;;;;;;46222:46;46242:6;46250:9;46261:6;46222:19;:46::i;:::-;45664:612;45543:733;;;:::o;29365:497::-;29446:22;29454:4;29460:7;29446;:22::i;:::-;29441:414;;29634:41;29662:7;29634:41;;29672:2;29634:19;:41::i;:::-;29748:38;29776:4;29768:13;;29783:2;29748:19;:38::i;:::-;29539:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29485:358;;;;;;;;;;;:::i;:::-;;;;;;;;29441:414;29365:497;;:::o;32985:238::-;33069:22;33077:4;33083:7;33069;:22::i;:::-;33064:152;;33140:4;33108:6;:12;33115:4;33108:12;;;;;;;;;;;:20;;:29;33129:7;33108:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;33191:12;:10;:12::i;:::-;33164:40;;33182:7;33164:40;;33176:4;33164:40;;;;;;;;;;33064:152;32985:238;;:::o;21405:314::-;21458:7;21499:12;21482:29;;21490:4;21482:29;;;:66;;;;;21532:16;21515:13;:33;21482:66;21478:234;;;21572:24;21565:31;;;;21478:234;21636:64;21658:10;21670:12;21684:15;21636:21;:64::i;:::-;21629:71;;21405:314;;:::o;33355:239::-;33439:22;33447:4;33453:7;33439;:22::i;:::-;33435:152;;;33510:5;33478:6;:12;33485:4;33478:12;;;;;;;;;;;:20;;:29;33499:7;33478:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33562:12;:10;:12::i;:::-;33535:40;;33553:7;33535:40;;33547:4;33535:40;;;;;;;;;;33435:152;33355:239;;:::o;46563:399::-;46666:1;46647:21;;:7;:21;;;;46639:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46717:49;46746:1;46750:7;46759:6;46717:20;:49::i;:::-;46795:6;46779:12;;:22;;;;;;;:::i;:::-;;;;;;;;46834:6;46812:9;:18;46822:7;46812:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;46877:7;46856:37;;46873:1;46856:37;;;46886:6;46856:37;;;;;;:::i;:::-;;;;;;;;46906:48;46934:1;46938:7;46947:6;46906:19;:48::i;:::-;46563:399;;:::o;5892:114::-;5957:7;5984;:14;;;5977:21;;5892:114;;;:::o;47295:591::-;47398:1;47379:21;;:7;:21;;;;47371:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47451:49;47472:7;47489:1;47493:6;47451:20;:49::i;:::-;47513:22;47538:9;:18;47548:7;47538:18;;;;;;;;;;;;;;;;47513:43;;47593:6;47575:14;:24;;47567:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47712:6;47695:14;:23;47674:9;:18;47684:7;47674:18;;;;;;;;;;;;;;;:44;;;;47756:6;47740:12;;:22;;;;;;;:::i;:::-;;;;;;;;47806:1;47780:37;;47789:7;47780:37;;;47810:6;47780:37;;;;;;:::i;:::-;;;;;;;;47830:48;47850:7;47867:1;47871:6;47830:19;:48::i;:::-;47360:526;47295:591;;:::o;52839:207::-;52899:15;52927:30;52960:7;:14;52968:5;52960:14;;;;;;;;;;;;;;;52927:47;;52995:15;:5;:13;:15::i;:::-;52985:25;;53021:17;:5;:15;:17::i;:::-;52916:130;52839:207;;;:::o;22632:167::-;22709:7;22736:55;22758:20;:18;:20::i;:::-;22780:10;22736:21;:55::i;:::-;22729:62;;22632:167;;;:::o;16281:279::-;16409:7;16430:17;16449:18;16471:25;16482:4;16488:1;16491;16494;16471:10;:25::i;:::-;16429:67;;;;16507:18;16519:5;16507:11;:18::i;:::-;16543:9;16536:16;;;;16281:279;;;;;;:::o;49304:125::-;;;;:::o;50033:124::-;;;;:::o;8151:451::-;8226:13;8252:19;8297:1;8288:6;8284:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;8274:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8252:47;;8310:15;:6;8317:1;8310:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;8336;:6;8343:1;8336:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;8367:9;8392:1;8383:6;8379:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;8367:26;;8362:135;8399:1;8395;:5;8362:135;;;8434:12;8455:3;8447:5;:11;8434:25;;;;;;;:::i;:::-;;;;;8422:6;8429:1;8422:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;8484:1;8474:11;;;;;8402:3;;;;:::i;:::-;;;8362:135;;;;8524:1;8515:5;:10;8507:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;8587:6;8573:21;;;8151:451;;;;:::o;21727:263::-;21871:7;21919:8;21929;21939:11;21952:13;21975:4;21908:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21898:84;;;;;;21891:91;;21727:263;;;;;:::o;6014:127::-;6121:1;6103:7;:14;;;:19;;;;;;;;;;;6014:127;:::o;17972:196::-;18065:7;18131:15;18148:10;18102:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18092:68;;;;;;18085:75;;17972:196;;;;:::o;14510:1632::-;14641:7;14650:12;15575:66;15570:1;15562:10;;:79;15558:163;;;15674:1;15678:30;15658:51;;;;;;15558:163;15740:2;15735:1;:7;;;;:18;;;;;15751:2;15746:1;:7;;;;15735:18;15731:102;;;15786:1;15790:30;15770:51;;;;;;15731:102;15930:14;15947:24;15957:4;15963:1;15966;15969;15947:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15930:41;;16004:1;15986:20;;:6;:20;;;15982:103;;;16039:1;16043:29;16023:50;;;;;;;15982:103;16105:6;16113:20;16097:37;;;;;14510:1632;;;;;;;;:::o;9172:643::-;9250:20;9241:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9237:571;;;9287:7;;9237:571;9348:29;9339:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;9335:473;;;9394:34;;;;;;;;;;:::i;:::-;;;;;;;;9335:473;9459:35;9450:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;9446:362;;;9511:41;;;;;;;;;;:::i;:::-;;;;;;;;9446:362;9583:30;9574:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;9570:238;;;9630:44;;;;;;;;;;:::i;:::-;;;;;;;;9570:238;9705:30;9696:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;9692:116;;;9752:44;;;;;;;;;;:::i;:::-;;;;;;;;9692:116;9172:643;;:::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:118::-;7587:22;7603:5;7587:22;:::i;:::-;7580:5;7577:33;7567:61;;7624:1;7621;7614:12;7567:61;7516:118;:::o;7640:135::-;7684:5;7722:6;7709:20;7700:29;;7738:31;7763:5;7738:31;:::i;:::-;7640:135;;;;:::o;7781:1199::-;7892:6;7900;7908;7916;7924;7932;7940;7989:3;7977:9;7968:7;7964:23;7960:33;7957:120;;;7996:79;;:::i;:::-;7957:120;8116:1;8141:53;8186:7;8177:6;8166:9;8162:22;8141:53;:::i;:::-;8131:63;;8087:117;8243:2;8269:53;8314:7;8305:6;8294:9;8290:22;8269:53;:::i;:::-;8259:63;;8214:118;8371:2;8397:53;8442:7;8433:6;8422:9;8418:22;8397:53;:::i;:::-;8387:63;;8342:118;8499:2;8525:53;8570:7;8561:6;8550:9;8546:22;8525:53;:::i;:::-;8515:63;;8470:118;8627:3;8654:51;8697:7;8688:6;8677:9;8673:22;8654:51;:::i;:::-;8644:61;;8598:117;8754:3;8781:53;8826:7;8817:6;8806:9;8802:22;8781:53;:::i;:::-;8771:63;;8725:119;8883:3;8910:53;8955:7;8946:6;8935:9;8931:22;8910:53;:::i;:::-;8900:63;;8854:119;7781:1199;;;;;;;;;;:::o;8986:474::-;9054:6;9062;9111:2;9099:9;9090:7;9086:23;9082:32;9079:119;;;9117:79;;:::i;:::-;9079:119;9237:1;9262:53;9307:7;9298:6;9287:9;9283:22;9262:53;:::i;:::-;9252:63;;9208:117;9364:2;9390:53;9435:7;9426:6;9415:9;9411:22;9390:53;:::i;:::-;9380:63;;9335:118;8986:474;;;;;:::o;9466:180::-;9514:77;9511:1;9504:88;9611:4;9608:1;9601:15;9635:4;9632:1;9625:15;9652:320;9696:6;9733:1;9727:4;9723:12;9713:22;;9780:1;9774:4;9770:12;9801:18;9791:81;;9857:4;9849:6;9845:17;9835:27;;9791:81;9919:2;9911:6;9908:14;9888:18;9885:38;9882:84;;;9938:18;;:::i;:::-;9882:84;9703:269;9652:320;;;:::o;9978:227::-;10118:34;10114:1;10106:6;10102:14;10095:58;10187:10;10182:2;10174:6;10170:15;10163:35;9978:227;:::o;10211:366::-;10353:3;10374:67;10438:2;10433:3;10374:67;:::i;:::-;10367:74;;10450:93;10539:3;10450:93;:::i;:::-;10568:2;10563:3;10559:12;10552:19;;10211:366;;;:::o;10583:419::-;10749:4;10787:2;10776:9;10772:18;10764:26;;10836:9;10830:4;10826:20;10822:1;10811:9;10807:17;10800:47;10864:131;10990:4;10864:131;:::i;:::-;10856:139;;10583:419;;;:::o;11008:234::-;11148:34;11144:1;11136:6;11132:14;11125:58;11217:17;11212:2;11204:6;11200:15;11193:42;11008:234;:::o;11248:366::-;11390:3;11411:67;11475:2;11470:3;11411:67;:::i;:::-;11404:74;;11487:93;11576:3;11487:93;:::i;:::-;11605:2;11600:3;11596:12;11589:19;;11248:366;;;:::o;11620:419::-;11786:4;11824:2;11813:9;11809:18;11801:26;;11873:9;11867:4;11863:20;11859:1;11848:9;11844:17;11837:47;11901:131;12027:4;11901:131;:::i;:::-;11893:139;;11620:419;;;:::o;12045:180::-;12093:77;12090:1;12083:88;12190:4;12187:1;12180:15;12214:4;12211:1;12204:15;12231:305;12271:3;12290:20;12308:1;12290:20;:::i;:::-;12285:25;;12324:20;12342:1;12324:20;:::i;:::-;12319:25;;12478:1;12410:66;12406:74;12403:1;12400:81;12397:107;;;12484:18;;:::i;:::-;12397:107;12528:1;12525;12521:9;12514:16;;12231:305;;;;:::o;12542:179::-;12682:31;12678:1;12670:6;12666:14;12659:55;12542:179;:::o;12727:366::-;12869:3;12890:67;12954:2;12949:3;12890:67;:::i;:::-;12883:74;;12966:93;13055:3;12966:93;:::i;:::-;13084:2;13079:3;13075:12;13068:19;;12727:366;;;:::o;13099:419::-;13265:4;13303:2;13292:9;13288:18;13280:26;;13352:9;13346:4;13342:20;13338:1;13327:9;13323:17;13316:47;13380:131;13506:4;13380:131;:::i;:::-;13372:139;;13099:419;;;:::o;13524:179::-;13664:31;13660:1;13652:6;13648:14;13641:55;13524:179;:::o;13709:366::-;13851:3;13872:67;13936:2;13931:3;13872:67;:::i;:::-;13865:74;;13948:93;14037:3;13948:93;:::i;:::-;14066:2;14061:3;14057:12;14050:19;;13709:366;;;:::o;14081:419::-;14247:4;14285:2;14274:9;14270:18;14262:26;;14334:9;14328:4;14324:20;14320:1;14309:9;14305:17;14298:47;14362:131;14488:4;14362:131;:::i;:::-;14354:139;;14081:419;;;:::o;14506:224::-;14646:34;14642:1;14634:6;14630:14;14623:58;14715:7;14710:2;14702:6;14698:15;14691:32;14506:224;:::o;14736:366::-;14878:3;14899:67;14963:2;14958:3;14899:67;:::i;:::-;14892:74;;14975:93;15064:3;14975:93;:::i;:::-;15093:2;15088:3;15084:12;15077:19;;14736:366;;;:::o;15108:419::-;15274:4;15312:2;15301:9;15297:18;15289:26;;15361:9;15355:4;15351:20;15347:1;15336:9;15332:17;15325:47;15389:131;15515:4;15389:131;:::i;:::-;15381:139;;15108:419;;;:::o;15533:179::-;15673:31;15669:1;15661:6;15657:14;15650:55;15533:179;:::o;15718:366::-;15860:3;15881:67;15945:2;15940:3;15881:67;:::i;:::-;15874:74;;15957:93;16046:3;15957:93;:::i;:::-;16075:2;16070:3;16066:12;16059:19;;15718:366;;;:::o;16090:419::-;16256:4;16294:2;16283:9;16279:18;16271:26;;16343:9;16337:4;16333:20;16329:1;16318:9;16314:17;16307:47;16371:131;16497:4;16371:131;:::i;:::-;16363:139;;16090:419;;;:::o;16515:118::-;16602:24;16620:5;16602:24;:::i;:::-;16597:3;16590:37;16515:118;;:::o;16639:775::-;16872:4;16910:3;16899:9;16895:19;16887:27;;16924:71;16992:1;16981:9;16977:17;16968:6;16924:71;:::i;:::-;17005:72;17073:2;17062:9;17058:18;17049:6;17005:72;:::i;:::-;17087;17155:2;17144:9;17140:18;17131:6;17087:72;:::i;:::-;17169;17237:2;17226:9;17222:18;17213:6;17169:72;:::i;:::-;17251:73;17319:3;17308:9;17304:19;17295:6;17251:73;:::i;:::-;17334;17402:3;17391:9;17387:19;17378:6;17334:73;:::i;:::-;16639:775;;;;;;;;;:::o;17420:180::-;17560:32;17556:1;17548:6;17544:14;17537:56;17420:180;:::o;17606:366::-;17748:3;17769:67;17833:2;17828:3;17769:67;:::i;:::-;17762:74;;17845:93;17934:3;17845:93;:::i;:::-;17963:2;17958:3;17954:12;17947:19;;17606:366;;;:::o;17978:419::-;18144:4;18182:2;18171:9;18167:18;18159:26;;18231:9;18225:4;18221:20;18217:1;18206:9;18202:17;18195:47;18259:131;18385:4;18259:131;:::i;:::-;18251:139;;17978:419;;;:::o;18403:223::-;18543:34;18539:1;18531:6;18527:14;18520:58;18612:6;18607:2;18599:6;18595:15;18588:31;18403:223;:::o;18632:366::-;18774:3;18795:67;18859:2;18854:3;18795:67;:::i;:::-;18788:74;;18871:93;18960:3;18871:93;:::i;:::-;18989:2;18984:3;18980:12;18973:19;;18632:366;;;:::o;19004:419::-;19170:4;19208:2;19197:9;19193:18;19185:26;;19257:9;19251:4;19247:20;19243:1;19232:9;19228:17;19221:47;19285:131;19411:4;19285:131;:::i;:::-;19277:139;;19004:419;;;:::o;19429:221::-;19569:34;19565:1;19557:6;19553:14;19546:58;19638:4;19633:2;19625:6;19621:15;19614:29;19429:221;:::o;19656:366::-;19798:3;19819:67;19883:2;19878:3;19819:67;:::i;:::-;19812:74;;19895:93;19984:3;19895:93;:::i;:::-;20013:2;20008:3;20004:12;19997:19;;19656:366;;;:::o;20028:419::-;20194:4;20232:2;20221:9;20217:18;20209:26;;20281:9;20275:4;20271:20;20267:1;20256:9;20252:17;20245:47;20309:131;20435:4;20309:131;:::i;:::-;20301:139;;20028:419;;;:::o;20453:224::-;20593:34;20589:1;20581:6;20577:14;20570:58;20662:7;20657:2;20649:6;20645:15;20638:32;20453:224;:::o;20683:366::-;20825:3;20846:67;20910:2;20905:3;20846:67;:::i;:::-;20839:74;;20922:93;21011:3;20922:93;:::i;:::-;21040:2;21035:3;21031:12;21024:19;;20683:366;;;:::o;21055:419::-;21221:4;21259:2;21248:9;21244:18;21236:26;;21308:9;21302:4;21298:20;21294:1;21283:9;21279:17;21272:47;21336:131;21462:4;21336:131;:::i;:::-;21328:139;;21055:419;;;:::o;21480:222::-;21620:34;21616:1;21608:6;21604:14;21597:58;21689:5;21684:2;21676:6;21672:15;21665:30;21480:222;:::o;21708:366::-;21850:3;21871:67;21935:2;21930:3;21871:67;:::i;:::-;21864:74;;21947:93;22036:3;21947:93;:::i;:::-;22065:2;22060:3;22056:12;22049:19;;21708:366;;;:::o;22080:419::-;22246:4;22284:2;22273:9;22269:18;22261:26;;22333:9;22327:4;22323:20;22319:1;22308:9;22304:17;22297:47;22361:131;22487:4;22361:131;:::i;:::-;22353:139;;22080:419;;;:::o;22505:225::-;22645:34;22641:1;22633:6;22629:14;22622:58;22714:8;22709:2;22701:6;22697:15;22690:33;22505:225;:::o;22736:366::-;22878:3;22899:67;22963:2;22958:3;22899:67;:::i;:::-;22892:74;;22975:93;23064:3;22975:93;:::i;:::-;23093:2;23088:3;23084:12;23077:19;;22736:366;;;:::o;23108:419::-;23274:4;23312:2;23301:9;23297:18;23289:26;;23361:9;23355:4;23351:20;23347:1;23336:9;23332:17;23325:47;23389:131;23515:4;23389:131;:::i;:::-;23381:139;;23108:419;;;:::o;23533:148::-;23635:11;23672:3;23657:18;;23533:148;;;;:::o;23687:173::-;23827:25;23823:1;23815:6;23811:14;23804:49;23687:173;:::o;23866:402::-;24026:3;24047:85;24129:2;24124:3;24047:85;:::i;:::-;24040:92;;24141:93;24230:3;24141:93;:::i;:::-;24259:2;24254:3;24250:12;24243:19;;23866:402;;;:::o;24274:377::-;24380:3;24408:39;24441:5;24408:39;:::i;:::-;24463:89;24545:6;24540:3;24463:89;:::i;:::-;24456:96;;24561:52;24606:6;24601:3;24594:4;24587:5;24583:16;24561:52;:::i;:::-;24638:6;24633:3;24629:16;24622:23;;24384:267;24274:377;;;;:::o;24657:167::-;24797:19;24793:1;24785:6;24781:14;24774:43;24657:167;:::o;24830:402::-;24990:3;25011:85;25093:2;25088:3;25011:85;:::i;:::-;25004:92;;25105:93;25194:3;25105:93;:::i;:::-;25223:2;25218:3;25214:12;25207:19;;24830:402;;;:::o;25238:967::-;25620:3;25642:148;25786:3;25642:148;:::i;:::-;25635:155;;25807:95;25898:3;25889:6;25807:95;:::i;:::-;25800:102;;25919:148;26063:3;25919:148;:::i;:::-;25912:155;;26084:95;26175:3;26166:6;26084:95;:::i;:::-;26077:102;;26196:3;26189:10;;25238:967;;;;;:::o;26211:181::-;26351:33;26347:1;26339:6;26335:14;26328:57;26211:181;:::o;26398:366::-;26540:3;26561:67;26625:2;26620:3;26561:67;:::i;:::-;26554:74;;26637:93;26726:3;26637:93;:::i;:::-;26755:2;26750:3;26746:12;26739:19;;26398:366;;;:::o;26770:419::-;26936:4;26974:2;26963:9;26959:18;26951:26;;27023:9;27017:4;27013:20;27009:1;26998:9;26994:17;26987:47;27051:131;27177:4;27051:131;:::i;:::-;27043:139;;26770:419;;;:::o;27195:220::-;27335:34;27331:1;27323:6;27319:14;27312:58;27404:3;27399:2;27391:6;27387:15;27380:28;27195:220;:::o;27421:366::-;27563:3;27584:67;27648:2;27643:3;27584:67;:::i;:::-;27577:74;;27660:93;27749:3;27660:93;:::i;:::-;27778:2;27773:3;27769:12;27762:19;;27421:366;;;:::o;27793:419::-;27959:4;27997:2;27986:9;27982:18;27974:26;;28046:9;28040:4;28036:20;28032:1;28021:9;28017:17;28010:47;28074:131;28200:4;28074:131;:::i;:::-;28066:139;;27793:419;;;:::o;28218:221::-;28358:34;28354:1;28346:6;28342:14;28335:58;28427:4;28422:2;28414:6;28410:15;28403:29;28218:221;:::o;28445:366::-;28587:3;28608:67;28672:2;28667:3;28608:67;:::i;:::-;28601:74;;28684:93;28773:3;28684:93;:::i;:::-;28802:2;28797:3;28793:12;28786:19;;28445:366;;;:::o;28817:419::-;28983:4;29021:2;29010:9;29006:18;28998:26;;29070:9;29064:4;29060:20;29056:1;29045:9;29041:17;29034:47;29098:131;29224:4;29098:131;:::i;:::-;29090:139;;28817:419;;;:::o;29242:191::-;29282:4;29302:20;29320:1;29302:20;:::i;:::-;29297:25;;29336:20;29354:1;29336:20;:::i;:::-;29331:25;;29375:1;29372;29369:8;29366:34;;;29380:18;;:::i;:::-;29366:34;29425:1;29422;29418:9;29410:17;;29242:191;;;;:::o;29439:348::-;29479:7;29502:20;29520:1;29502:20;:::i;:::-;29497:25;;29536:20;29554:1;29536:20;:::i;:::-;29531:25;;29724:1;29656:66;29652:74;29649:1;29646:81;29641:1;29634:9;29627:17;29623:105;29620:131;;;29731:18;;:::i;:::-;29620:131;29779:1;29776;29772:9;29761:20;;29439:348;;;;:::o;29793:180::-;29841:77;29838:1;29831:88;29938:4;29935:1;29928:15;29962:4;29959:1;29952:15;29979:180;30027:77;30024:1;30017:88;30124:4;30121:1;30114:15;30148:4;30145:1;30138:15;30165:171;30204:3;30227:24;30245:5;30227:24;:::i;:::-;30218:33;;30273:4;30266:5;30263:15;30260:41;;;30281:18;;:::i;:::-;30260:41;30328:1;30321:5;30317:13;30310:20;;30165:171;;;:::o;30342:182::-;30482:34;30478:1;30470:6;30466:14;30459:58;30342:182;:::o;30530:366::-;30672:3;30693:67;30757:2;30752:3;30693:67;:::i;:::-;30686:74;;30769:93;30858:3;30769:93;:::i;:::-;30887:2;30882:3;30878:12;30871:19;;30530:366;;;:::o;30902:419::-;31068:4;31106:2;31095:9;31091:18;31083:26;;31155:9;31149:4;31145:20;31141:1;31130:9;31126:17;31119:47;31183:131;31309:4;31183:131;:::i;:::-;31175:139;;30902:419;;;:::o;31327:664::-;31532:4;31570:3;31559:9;31555:19;31547:27;;31584:71;31652:1;31641:9;31637:17;31628:6;31584:71;:::i;:::-;31665:72;31733:2;31722:9;31718:18;31709:6;31665:72;:::i;:::-;31747;31815:2;31804:9;31800:18;31791:6;31747:72;:::i;:::-;31829;31897:2;31886:9;31882:18;31873:6;31829:72;:::i;:::-;31911:73;31979:3;31968:9;31964:19;31955:6;31911:73;:::i;:::-;31327:664;;;;;;;;:::o;31997:214::-;32137:66;32133:1;32125:6;32121:14;32114:90;31997:214;:::o;32217:400::-;32377:3;32398:84;32480:1;32475:3;32398:84;:::i;:::-;32391:91;;32491:93;32580:3;32491:93;:::i;:::-;32609:1;32604:3;32600:11;32593:18;;32217:400;;;:::o;32623:79::-;32662:7;32691:5;32680:16;;32623:79;;;:::o;32708:157::-;32813:45;32833:24;32851:5;32833:24;:::i;:::-;32813:45;:::i;:::-;32808:3;32801:58;32708:157;;:::o;32871:663::-;33112:3;33134:148;33278:3;33134:148;:::i;:::-;33127:155;;33292:75;33363:3;33354:6;33292:75;:::i;:::-;33392:2;33387:3;33383:12;33376:19;;33405:75;33476:3;33467:6;33405:75;:::i;:::-;33505:2;33500:3;33496:12;33489:19;;33525:3;33518:10;;32871:663;;;;;:::o;33540:545::-;33713:4;33751:3;33740:9;33736:19;33728:27;;33765:71;33833:1;33822:9;33818:17;33809:6;33765:71;:::i;:::-;33846:68;33910:2;33899:9;33895:18;33886:6;33846:68;:::i;:::-;33924:72;33992:2;33981:9;33977:18;33968:6;33924:72;:::i;:::-;34006;34074:2;34063:9;34059:18;34050:6;34006:72;:::i;:::-;33540:545;;;;;;;:::o;34091:180::-;34139:77;34136:1;34129:88;34236:4;34233:1;34226:15;34260:4;34257:1;34250:15;34277:174;34417:26;34413:1;34405:6;34401:14;34394:50;34277:174;:::o;34457:366::-;34599:3;34620:67;34684:2;34679:3;34620:67;:::i;:::-;34613:74;;34696:93;34785:3;34696:93;:::i;:::-;34814:2;34809:3;34805:12;34798:19;;34457:366;;;:::o;34829:419::-;34995:4;35033:2;35022:9;35018:18;35010:26;;35082:9;35076:4;35072:20;35068:1;35057:9;35053:17;35046:47;35110:131;35236:4;35110:131;:::i;:::-;35102:139;;34829:419;;;:::o;35254:181::-;35394:33;35390:1;35382:6;35378:14;35371:57;35254:181;:::o;35441:366::-;35583:3;35604:67;35668:2;35663:3;35604:67;:::i;:::-;35597:74;;35680:93;35769:3;35680:93;:::i;:::-;35798:2;35793:3;35789:12;35782:19;;35441:366;;;:::o;35813:419::-;35979:4;36017:2;36006:9;36002:18;35994:26;;36066:9;36060:4;36056:20;36052:1;36041:9;36037:17;36030:47;36094:131;36220:4;36094:131;:::i;:::-;36086:139;;35813:419;;;:::o;36238:221::-;36378:34;36374:1;36366:6;36362:14;36355:58;36447:4;36442:2;36434:6;36430:15;36423:29;36238:221;:::o;36465:366::-;36607:3;36628:67;36692:2;36687:3;36628:67;:::i;:::-;36621:74;;36704:93;36793:3;36704:93;:::i;:::-;36822:2;36817:3;36813:12;36806:19;;36465:366;;;:::o;36837:419::-;37003:4;37041:2;37030:9;37026:18;37018:26;;37090:9;37084:4;37080:20;37076:1;37065:9;37061:17;37054:47;37118:131;37244:4;37118:131;:::i;:::-;37110:139;;36837:419;;;:::o;37262:221::-;37402:34;37398:1;37390:6;37386:14;37379:58;37471:4;37466:2;37458:6;37454:15;37447:29;37262:221;:::o;37489:366::-;37631:3;37652:67;37716:2;37711:3;37652:67;:::i;:::-;37645:74;;37728:93;37817:3;37728:93;:::i;:::-;37846:2;37841:3;37837:12;37830:19;;37489:366;;;:::o;37861:419::-;38027:4;38065:2;38054:9;38050:18;38042:26;;38114:9;38108:4;38104:20;38100:1;38089:9;38085:17;38078:47;38142:131;38268:4;38142:131;:::i;:::-;38134:139;;37861:419;;;:::o

Swarm Source

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