Token Avalanche Hills Muscle Cars

Overview ERC721

Total Supply:
4,000 AHMC

Holders:
228 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Nfvs

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.11.2 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

//  -License-Identifier: MIT
// 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/security/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/access/[email protected]

//  -License-Identifier: MIT
// 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/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

//  -License-Identifier: MIT
// 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/[email protected]

//  -License-Identifier: MIT
// 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/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

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

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

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

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

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

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

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

//  -License-Identifier: MIT
// 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/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC1155/utils/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}


// File @openzeppelin/contracts/token/ERC1155/utils/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/interfaces/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

//  -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File contracts/Nfvs.sol

//  -License-Identifier: MIT
pragma solidity 0.8.17;








// import "hardhat/console.sol";

contract Nfvs is ERC721, ERC721Enumerable, ERC721Royalty, ERC1155Holder, Pausable, AccessControl {

    struct Rent {
        bool inProgress;
        address owner;
        uint endsAt;
    }

    using Counters for Counters.Counter;

    bytes32 public constant RENTER_ROLE = keccak256("RENTER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant EQUIPPER_ROLE = keccak256("EQUIPPER_ROLE");
    Counters.Counter private tokenIdCounter;
    string private baseUri;

    uint256 constant public MAX_LAMBOS = 10000;
    string[] private attributeKeys;
    mapping(uint => Rent) private _rents;

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        _grantRole(RENTER_ROLE, msg.sender);
        _setBaseURI("https://todo.wen.lambo/");
    }

    function setRoyalty(address receiver, uint96 feeNumerator) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function mintOne(address to) public onlyRole(MINTER_ROLE) {
        _mintOne(to);
    }

    function mint(address to, uint numberOf) external {
        for(uint i; i < numberOf; i ++) mintOne(to);
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    //renting
    function rentTo(uint tokenId, address to, uint period) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(!rent.inProgress, "Currently rented.");
        address owner = ownerOf(tokenId);
        rent.owner = owner;
        rent.endsAt = block.timestamp + period;
        _transfer(owner, to, tokenId);
        rent.inProgress = true;
    }

    function cancelRent(uint tokenId) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Not under rent.");
        rent.endsAt = block.timestamp;
    }

    function isUnderRent(uint tokenId) external view returns(bool) {
        return _rents[tokenId].inProgress;
    }

    function rentInfo(uint tokenId) external view returns(address originalOwner, uint endsAt) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Not rented currently.");
        return (rent.owner, rent.endsAt);
    }

    function returnRented(uint tokenId) external onlyRole(RENTER_ROLE) {
        Rent storage rent = _rents[tokenId];
        require(rent.inProgress, "Rent not in progress.");
        require(block.timestamp >= rent.endsAt, "Rent period not over.");
        rent.inProgress = false;
        _transfer(ownerOf(tokenId), rent.owner, tokenId);
    }

    // pausable and sale states

    function pause() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }

    function setBaseURI(string memory _newUri) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _setBaseURI(_newUri);
    }

    function _setBaseURI(string memory _newUri) private {
        baseUri = _newUri;
    }

    // util
    function _isStringValid(string memory str) private pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 3 || b.length > 10) 
            return false;

        for(uint256 i; i < b.length; i++){
            bytes1 char = b[i];

            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) // (space)
            )
                return false;
        }

        return true;
    }

    //misc

    function _mintOne(address to) private {
        uint256 _tokenId = tokenIdCounter.current();
        tokenIdCounter.increment();
        _safeMint(to, _tokenId);
    }

    // hooks / overrides

    function _mint(address to, uint tokenId) internal override {
        super._mint(to, tokenId);
        require(totalSupply() <= MAX_LAMBOS, "Max supply reached.");
    }

    function _baseURI() internal override view returns(string memory) {
        return baseUri;
    }

    function _transfer(address from, address to, uint tokenId) internal override {
        super._transfer(from, to, tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        require(!_rents[tokenId].inProgress, "Currently rented.");
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, AccessControl, ERC721Royalty, ERC1155Receiver)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _burn(uint tokenId) internal override(ERC721, ERC721Royalty) {
        return super._burn(tokenId);
    }

}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EQUIPPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LAMBOS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RENTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cancelRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isUnderRent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOf","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rentInfo","outputs":[{"internalType":"address","name":"originalOwner","type":"address"},{"internalType":"uint256","name":"endsAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"rentTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"returnRented","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setRoyalty","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005cd138038062005cd183398181016040528101906200003791906200044e565b818181600290816200004a91906200071e565b5080600390816200005c91906200071e565b5050506000600c60006101000a81548160ff0219169083151502179055506200008f6000801b336200014160201b60201c565b620000c17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200014160201b60201c565b620000f37f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d336200014160201b60201c565b620001396040518060400160405280601781526020017f68747470733a2f2f746f646f2e77656e2e6c616d626f2f0000000000000000008152506200023360201b60201c565b505062000805565b6200015382826200024860201b60201c565b6200022f576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001d4620002b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80600f90816200024491906200071e565b5050565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200032482620002d9565b810181811067ffffffffffffffff82111715620003465762000345620002ea565b5b80604052505050565b60006200035b620002bb565b905062000369828262000319565b919050565b600067ffffffffffffffff8211156200038c576200038b620002ea565b5b6200039782620002d9565b9050602081019050919050565b60005b83811015620003c4578082015181840152602081019050620003a7565b60008484015250505050565b6000620003e7620003e1846200036e565b6200034f565b905082815260208101848484011115620004065762000405620002d4565b5b62000413848285620003a4565b509392505050565b600082601f830112620004335762000432620002cf565b5b815162000445848260208601620003d0565b91505092915050565b60008060408385031215620004685762000467620002c5565b5b600083015167ffffffffffffffff811115620004895762000488620002ca565b5b62000497858286016200041b565b925050602083015167ffffffffffffffff811115620004bb57620004ba620002ca565b5b620004c9858286016200041b565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052657607f821691505b6020821081036200053c576200053b620004de565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005a67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000567565b620005b2868362000567565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ff620005f9620005f384620005ca565b620005d4565b620005ca565b9050919050565b6000819050919050565b6200061b83620005de565b620006336200062a8262000606565b84845462000574565b825550505050565b600090565b6200064a6200063b565b6200065781848462000610565b505050565b5b818110156200067f576200067360008262000640565b6001810190506200065d565b5050565b601f821115620006ce57620006988162000542565b620006a38462000557565b81016020851015620006b3578190505b620006cb620006c28562000557565b8301826200065c565b50505b505050565b600082821c905092915050565b6000620006f360001984600802620006d3565b1980831691505092915050565b60006200070e8383620006e0565b9150826002028217905092915050565b6200072982620004d3565b67ffffffffffffffff811115620007455762000744620002ea565b5b6200075182546200050d565b6200075e82828562000683565b600060209050601f83116001811462000796576000841562000781578287015190505b6200078d858262000700565b865550620007fd565b601f198416620007a68662000542565b60005b82811015620007d057848901518255600182019150602085019450602081019050620007a9565b86831015620007f05784890151620007ec601f891682620006e0565b8355505b6001600288020188555050505b505050505050565b6154bc80620008156000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80638456cb5911610146578063b3916fcf116100c3578063c87b56dd11610087578063c87b56dd14610745578063d539139314610775578063d547741f14610793578063e985e9c5146107af578063f23a6e61146107df578063fa695a971461080f5761025e565b8063b3916fcf1461067a578063b88d4fde146106aa578063b97c9f77146106c6578063bc197c81146106e4578063c5430a9d146107145761025e565b806395d89b411161010a57806395d89b41146105e8578063a217fddf14610606578063a22cb46514610624578063a53bb99014610640578063a55bb43b1461065c5761025e565b80638456cb59146105465780638462151c14610550578063857529f1146105805780638f2fc60b1461059c57806391d14854146105b85761025e565b806336568abe116101df578063475970d3116101a3578063475970d3146104605780634f6ccce71461047c57806355f804b3146104ac5780635c975abb146104c85780636352211e146104e657806370a08231146105165761025e565b806336568abe146103e45780633bd70868146104005780633f4ba83a1461041e57806340c10f191461042857806342842e0e146104445761025e565b806323b872dd1161022657806323b872dd1461031b578063248a9ca3146103375780632a55205a146103675780632f2ff15d146103985780632f745c59146103b45761025e565b806301ffc9a71461026357806306fdde0314610293578063081812fc146102b1578063095ea7b3146102e157806318160ddd146102fd575b600080fd5b61027d600480360381019061027891906135af565b61082b565b60405161028a91906135f7565b60405180910390f35b61029b61083d565b6040516102a891906136a2565b60405180910390f35b6102cb60048036038101906102c691906136fa565b6108cf565b6040516102d89190613768565b60405180910390f35b6102fb60048036038101906102f691906137af565b610915565b005b610305610a2c565b60405161031291906137fe565b60405180910390f35b61033560048036038101906103309190613819565b610a39565b005b610351600480360381019061034c91906138a2565b610a99565b60405161035e91906138de565b60405180910390f35b610381600480360381019061037c91906138f9565b610ab9565b60405161038f929190613939565b60405180910390f35b6103b260048036038101906103ad9190613962565b610ca3565b005b6103ce60048036038101906103c991906137af565b610cc4565b6040516103db91906137fe565b60405180910390f35b6103fe60048036038101906103f99190613962565b610d69565b005b610408610dec565b60405161041591906138de565b60405180910390f35b610426610e10565b005b610442600480360381019061043d91906137af565b610e28565b005b61045e60048036038101906104599190613819565b610e54565b005b61047a600480360381019061047591906136fa565b610e74565b005b610496600480360381019061049191906136fa565b610fa6565b6040516104a391906137fe565b60405180910390f35b6104c660048036038101906104c19190613ad7565b611017565b005b6104d0611031565b6040516104dd91906135f7565b60405180910390f35b61050060048036038101906104fb91906136fa565b611048565b60405161050d9190613768565b60405180910390f35b610530600480360381019061052b9190613b20565b6110f9565b60405161053d91906137fe565b60405180910390f35b61054e6111b0565b005b61056a60048036038101906105659190613b20565b6111c8565b6040516105779190613c0b565b60405180910390f35b61059a600480360381019061059591906136fa565b6112d1565b005b6105b660048036038101906105b19190613c71565b611371565b005b6105d260048036038101906105cd9190613962565b61138d565b6040516105df91906135f7565b60405180910390f35b6105f06113f8565b6040516105fd91906136a2565b60405180910390f35b61060e61148a565b60405161061b91906138de565b60405180910390f35b61063e60048036038101906106399190613cdd565b611491565b005b61065a60048036038101906106559190613d1d565b6114a7565b005b6106646115ce565b60405161067191906137fe565b60405180910390f35b610694600480360381019061068f91906136fa565b6115d4565b6040516106a191906135f7565b60405180910390f35b6106c460048036038101906106bf9190613e11565b611601565b005b6106ce611663565b6040516106db91906138de565b60405180910390f35b6106fe60048036038101906106f99190613f5c565b611687565b60405161070b919061403a565b60405180910390f35b61072e600480360381019061072991906136fa565b61169c565b60405161073c929190613939565b60405180910390f35b61075f600480360381019061075a91906136fa565b61173b565b60405161076c91906136a2565b60405180910390f35b61077d6117a3565b60405161078a91906138de565b60405180910390f35b6107ad60048036038101906107a89190613962565b6117c7565b005b6107c960048036038101906107c49190614055565b6117e8565b6040516107d691906135f7565b60405180910390f35b6107f960048036038101906107f49190614095565b61187c565b604051610806919061403a565b60405180910390f35b61082960048036038101906108249190613b20565b611891565b005b6000610836826118c8565b9050919050565b60606002805461084c9061415b565b80601f01602080910402602001604051908101604052809291908181526020018280546108789061415b565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da82611942565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092082611048565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906141fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109af61198d565b73ffffffffffffffffffffffffffffffffffffffff1614806109de57506109dd816109d861198d565b6117e8565b5b610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490614290565b60405180910390fd5b610a278383611995565b505050565b6000600a80549050905090565b610a4a610a4461198d565b82611a4e565b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090614322565b60405180910390fd5b610a94838383611ae3565b505050565b6000600d6000838152602001908152602001600020600101549050919050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610c4e5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610c58611af3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c849190614371565b610c8e91906143e2565b90508160000151819350935050509250929050565b610cac82610a99565b610cb581611afd565b610cbf8383611b11565b505050565b6000610ccf836110f9565b8210610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790614485565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d7161198d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590614517565b60405180910390fd5b610de88282611bf2565b5050565b7fb379d9535b5ae7800ada8f473bd7d55f753e8023b1ed709eab5f121d2b9807be81565b6000801b610e1d81611afd565b610e25611cd4565b50565b60005b81811015610e4f57610e3c83611891565b8080610e4790614537565b915050610e2b565b505050565b610e6f83838360405180602001604052806000815250611601565b505050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d610e9e81611afd565b60006011600084815260200190815260200160002090508060000160009054906101000a900460ff16610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd906145cb565b60405180910390fd5b8060010154421015610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614637565b60405180910390fd5b60008160000160006101000a81548160ff021916908315150217905550610fa1610f7684611048565b8260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611ae3565b505050565b6000610fb0610a2c565b8210610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe8906146c9565b60405180910390fd5b600a8281548110611005576110046146e9565b5b90600052602060002001549050919050565b6000801b61102481611afd565b61102d82611d37565b5050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790614764565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611160906147f6565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b6111bd81611afd565b6111c5611d4a565b50565b606060006111d5836110f9565b90506000810361123157600067ffffffffffffffff8111156111fa576111f96139ac565b5b6040519080825280602002602001820160405280156112285781602001602082028036833780820191505090505b509150506112cc565b60008167ffffffffffffffff81111561124d5761124c6139ac565b5b60405190808252806020026020018201604052801561127b5781602001602082028036833780820191505090505b50905060005b828110156112c5576112938582610cc4565b8282815181106112a6576112a56146e9565b5b60200260200101818152505080806112bd90614537565b915050611281565b8193505050505b919050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d6112fb81611afd565b60006011600084815260200190815260200160002090508060000160009054906101000a900460ff16611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a90614862565b60405180910390fd5b428160010181905550505050565b6000801b61137e81611afd565b6113888383611dad565b505050565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546114079061415b565b80601f01602080910402602001604051908101604052809291908181526020018280546114339061415b565b80156114805780601f1061145557610100808354040283529160200191611480565b820191906000526020600020905b81548152906001019060200180831161146357829003601f168201915b5050505050905090565b6000801b81565b6114a361149c61198d565b8383611f41565b5050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d6114d181611afd565b60006011600086815260200190815260200160002090508060000160009054906101000a900460ff161561153a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611531906148ce565b60405180910390fd5b600061154586611048565b9050808260000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550834261159691906148ee565b82600101819055506115a9818688611ae3565b60018260000160006101000a81548160ff021916908315150217905550505050505050565b61271081565b60006011600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b61161261160c61198d565b83611a4e565b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890614322565b60405180910390fd5b61165d848484846120ad565b50505050565b7f3b652633b3026fa70803ad50b58b0ae884cefe3497643f62c67c466f41a6e88d81565b600063bc197c8160e01b905095945050505050565b60008060006011600085815260200190815260200160002090508060000160009054906101000a900460ff16611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe9061496e565b60405180910390fd5b8060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101549250925050915091565b606061174682611942565b6000611750612109565b90506000815111611770576040518060200160405280600081525061179b565b8061177a8461219b565b60405160200161178b9291906149ca565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6117d082610a99565b6117d981611afd565b6117e38383611bf2565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118bb81611afd565b6118c4826122fb565b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061193b575061193a82612321565b5b9050919050565b61194b8161239b565b61198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190614764565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0883611048565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611a5a83611048565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a9c5750611a9b81856117e8565b5b80611ada57508373ffffffffffffffffffffffffffffffffffffffff16611ac2846108cf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b611aee838383612407565b505050565b6000612710905090565b611b0e81611b0961198d565b61266d565b50565b611b1b828261138d565b611bee576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b9361198d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611bfc828261138d565b15611cd0576000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c7561198d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611cdc61270a565b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d2061198d565b604051611d2d9190613768565b60405180910390a1565b80600f9081611d469190614b9a565b5050565b611d52612753565b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d9661198d565b604051611da39190613768565b60405180910390a1565b611db5611af3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90614cde565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614d4a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614db6565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120a091906135f7565b60405180910390a3505050565b6120b8848484611ae3565b6120c48484848461279d565b612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90614e48565b60405180910390fd5b50505050565b6060600f80546121189061415b565b80601f01602080910402602001604051908101604052809291908181526020018280546121449061415b565b80156121915780601f1061216657610100808354040283529160200191612191565b820191906000526020600020905b81548152906001019060200180831161217457829003601f168201915b5050505050905090565b6060600082036121e2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122f6565b600082905060005b600082146122145780806121fd90614537565b915050600a8261220d91906143e2565b91506121ea565b60008167ffffffffffffffff8111156122305761222f6139ac565b5b6040519080825280601f01601f1916602001820160405280156122625781602001600182028036833780820191505090505b5090505b600085146122ef5760018261227b9190614e68565b9150600a8561228a9190614e9c565b603061229691906148ee565b60f81b8183815181106122ac576122ab6146e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122e891906143e2565b9450612266565b8093505050505b919050565b6000612307600e612924565b9050612313600e612932565b61231d8282612948565b5050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612394575061239382612966565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661242782611048565b73ffffffffffffffffffffffffffffffffffffffff161461247d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247490614f3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e390614fd1565b60405180910390fd5b6124f7838383612978565b612502600082611995565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125529190614e68565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a991906148ee565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126688383836129f4565b505050565b612677828261138d565b6127065761269c8173ffffffffffffffffffffffffffffffffffffffff1660146129f9565b6126aa8360001c60206129f9565b6040516020016126bb929190615089565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fd91906136a2565b60405180910390fd5b5050565b612712611031565b612751576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127489061510f565b60405180910390fd5b565b61275b611031565b1561279b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127929061517b565b60405180910390fd5b565b60006127be8473ffffffffffffffffffffffffffffffffffffffff16612c35565b15612917578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127e761198d565b8786866040518563ffffffff1660e01b815260040161280994939291906151f0565b6020604051808303816000875af192505050801561284557506040513d601f19601f820116820180604052508101906128429190615251565b60015b6128c7573d8060008114612875576040519150601f19603f3d011682016040523d82523d6000602084013e61287a565b606091505b5060008151036128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690614e48565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291c565b600190505b949350505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612962828260405180602001604052806000815250612c58565b5050565b600061297182612cb3565b9050919050565b612980612753565b6011600082815260200190815260200160002060000160009054906101000a900460ff16156129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129db906148ce565b60405180910390fd5b6129ef838383612d2d565b505050565b505050565b606060006002836002612a0c9190614371565b612a1691906148ee565b67ffffffffffffffff811115612a2f57612a2e6139ac565b5b6040519080825280601f01601f191660200182016040528015612a615781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612a9957612a986146e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612afd57612afc6146e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b3d9190614371565b612b4791906148ee565b90505b6001811115612be7577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b8957612b886146e9565b5b1a60f81b828281518110612ba057612b9f6146e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612be09061527e565b9050612b4a565b5060008414612c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c22906152f3565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612c628383612e3f565b612c6f600084848461279d565b612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614e48565b60405180910390fd5b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d265750612d2582612e99565b5b9050919050565b612d38838383612f7b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d7a57612d7581612f80565b612db9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612db857612db78382612fc9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dfb57612df681613136565b612e3a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e3957612e388282613207565b5b5b505050565b612e498282613286565b612710612e54610a2c565b1115612e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8c9061535f565b60405180910390fd5b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f6457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f745750612f738261345f565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fd6846110f9565b612fe09190614e68565b90506000600960008481526020019081526020016000205490508181146130c5576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905061314a9190614e68565b90506000600b60008481526020019081526020016000205490506000600a838154811061317a576131796146e9565b5b9060005260206000200154905080600a838154811061319c5761319b6146e9565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806131eb576131ea61537f565b5b6001900381819060005260206000200160009055905550505050565b6000613212836110f9565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ec906153fa565b60405180910390fd5b6132fe8161239b565b1561333e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333590615466565b60405180910390fd5b61334a60008383612978565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461339a91906148ee565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461345b600083836129f4565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134d257506134d1826134d9565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61358c81613557565b811461359757600080fd5b50565b6000813590506135a981613583565b92915050565b6000602082840312156135c5576135c461354d565b5b60006135d38482850161359a565b91505092915050565b60008115159050919050565b6135f1816135dc565b82525050565b600060208201905061360c60008301846135e8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561364c578082015181840152602081019050613631565b60008484015250505050565b6000601f19601f8301169050919050565b600061367482613612565b61367e818561361d565b935061368e81856020860161362e565b61369781613658565b840191505092915050565b600060208201905081810360008301526136bc8184613669565b905092915050565b6000819050919050565b6136d7816136c4565b81146136e257600080fd5b50565b6000813590506136f4816136ce565b92915050565b6000602082840312156137105761370f61354d565b5b600061371e848285016136e5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061375282613727565b9050919050565b61376281613747565b82525050565b600060208201905061377d6000830184613759565b92915050565b61378c81613747565b811461379757600080fd5b50565b6000813590506137a981613783565b92915050565b600080604083850312156137c6576137c561354d565b5b60006137d48582860161379a565b92505060206137e5858286016136e5565b9150509250929050565b6137f8816136c4565b82525050565b600060208201905061381360008301846137ef565b92915050565b6000806000606084860312156138325761383161354d565b5b60006138408682870161379a565b93505060206138518682870161379a565b9250506040613862868287016136e5565b9150509250925092565b6000819050919050565b61387f8161386c565b811461388a57600080fd5b50565b60008135905061389c81613876565b92915050565b6000602082840312156138b8576138b761354d565b5b60006138c68482850161388d565b91505092915050565b6138d88161386c565b82525050565b60006020820190506138f360008301846138cf565b92915050565b600080604083850312156139105761390f61354d565b5b600061391e858286016136e5565b925050602061392f858286016136e5565b9150509250929050565b600060408201905061394e6000830185613759565b61395b60208301846137ef565b9392505050565b600080604083850312156139795761397861354d565b5b60006139878582860161388d565b92505060206139988582860161379a565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139e482613658565b810181811067ffffffffffffffff82111715613a0357613a026139ac565b5b80604052505050565b6000613a16613543565b9050613a2282826139db565b919050565b600067ffffffffffffffff821115613a4257613a416139ac565b5b613a4b82613658565b9050602081019050919050565b82818337600083830152505050565b6000613a7a613a7584613a27565b613a0c565b905082815260208101848484011115613a9657613a956139a7565b5b613aa1848285613a58565b509392505050565b600082601f830112613abe57613abd6139a2565b5b8135613ace848260208601613a67565b91505092915050565b600060208284031215613aed57613aec61354d565b5b600082013567ffffffffffffffff811115613b0b57613b0a613552565b5b613b1784828501613aa9565b91505092915050565b600060208284031215613b3657613b3561354d565b5b6000613b448482850161379a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b82816136c4565b82525050565b6000613b948383613b79565b60208301905092915050565b6000602082019050919050565b6000613bb882613b4d565b613bc28185613b58565b9350613bcd83613b69565b8060005b83811015613bfe578151613be58882613b88565b9750613bf083613ba0565b925050600181019050613bd1565b5085935050505092915050565b60006020820190508181036000830152613c258184613bad565b905092915050565b60006bffffffffffffffffffffffff82169050919050565b613c4e81613c2d565b8114613c5957600080fd5b50565b600081359050613c6b81613c45565b92915050565b60008060408385031215613c8857613c8761354d565b5b6000613c968582860161379a565b9250506020613ca785828601613c5c565b9150509250929050565b613cba816135dc565b8114613cc557600080fd5b50565b600081359050613cd781613cb1565b92915050565b60008060408385031215613cf457613cf361354d565b5b6000613d028582860161379a565b9250506020613d1385828601613cc8565b9150509250929050565b600080600060608486031215613d3657613d3561354d565b5b6000613d44868287016136e5565b9350506020613d558682870161379a565b9250506040613d66868287016136e5565b9150509250925092565b600067ffffffffffffffff821115613d8b57613d8a6139ac565b5b613d9482613658565b9050602081019050919050565b6000613db4613daf84613d70565b613a0c565b905082815260208101848484011115613dd057613dcf6139a7565b5b613ddb848285613a58565b509392505050565b600082601f830112613df857613df76139a2565b5b8135613e08848260208601613da1565b91505092915050565b60008060008060808587031215613e2b57613e2a61354d565b5b6000613e398782880161379a565b9450506020613e4a8782880161379a565b9350506040613e5b878288016136e5565b925050606085013567ffffffffffffffff811115613e7c57613e7b613552565b5b613e8887828801613de3565b91505092959194509250565b600067ffffffffffffffff821115613eaf57613eae6139ac565b5b602082029050602081019050919050565b600080fd5b6000613ed8613ed384613e94565b613a0c565b90508083825260208201905060208402830185811115613efb57613efa613ec0565b5b835b81811015613f245780613f1088826136e5565b845260208401935050602081019050613efd565b5050509392505050565b600082601f830112613f4357613f426139a2565b5b8135613f53848260208601613ec5565b91505092915050565b600080600080600060a08688031215613f7857613f7761354d565b5b6000613f868882890161379a565b9550506020613f978882890161379a565b945050604086013567ffffffffffffffff811115613fb857613fb7613552565b5b613fc488828901613f2e565b935050606086013567ffffffffffffffff811115613fe557613fe4613552565b5b613ff188828901613f2e565b925050608086013567ffffffffffffffff81111561401257614011613552565b5b61401e88828901613de3565b9150509295509295909350565b61403481613557565b82525050565b600060208201905061404f600083018461402b565b92915050565b6000806040838503121561406c5761406b61354d565b5b600061407a8582860161379a565b925050602061408b8582860161379a565b9150509250929050565b600080600080600060a086880312156140b1576140b061354d565b5b60006140bf8882890161379a565b95505060206140d08882890161379a565b94505060406140e1888289016136e5565b93505060606140f2888289016136e5565b925050608086013567ffffffffffffffff81111561411357614112613552565b5b61411f88828901613de3565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061417357607f821691505b6020821081036141865761418561412c565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141e860218361361d565b91506141f38261418c565b604082019050919050565b60006020820190508181036000830152614217816141db565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061427a603e8361361d565b91506142858261421e565b604082019050919050565b600060208201905081810360008301526142a98161426d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061430c602e8361361d565b9150614317826142b0565b604082019050919050565b6000602082019050818103600083015261433b816142ff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061437c826136c4565b9150614387836136c4565b9250828202614395816136c4565b915082820484148315176143ac576143ab614342565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143ed826136c4565b91506143f8836136c4565b925082614408576144076143b3565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061446f602b8361361d565b915061447a82614413565b604082019050919050565b6000602082019050818103600083015261449e81614462565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614501602f8361361d565b915061450c826144a5565b604082019050919050565b60006020820190508181036000830152614530816144f4565b9050919050565b6000614542826136c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457457614573614342565b5b600182019050919050565b7f52656e74206e6f7420696e2070726f67726573732e0000000000000000000000600082015250565b60006145b560158361361d565b91506145c08261457f565b602082019050919050565b600060208201905081810360008301526145e4816145a8565b9050919050565b7f52656e7420706572696f64206e6f74206f7665722e0000000000000000000000600082015250565b600061462160158361361d565b915061462c826145eb565b602082019050919050565b6000602082019050818103600083015261465081614614565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006146b3602c8361361d565b91506146be82614657565b604082019050919050565b600060208201905081810360008301526146e2816146a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061474e60188361361d565b915061475982614718565b602082019050919050565b6000602082019050818103600083015261477d81614741565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006147e060298361361d565b91506147eb82614784565b604082019050919050565b6000602082019050818103600083015261480f816147d3565b9050919050565b7f4e6f7420756e6465722072656e742e0000000000000000000000000000000000600082015250565b600061484c600f8361361d565b915061485782614816565b602082019050919050565b6000602082019050818103600083015261487b8161483f565b9050919050565b7f43757272656e746c792072656e7465642e000000000000000000000000000000600082015250565b60006148b860118361361d565b91506148c382614882565b602082019050919050565b600060208201905081810360008301526148e7816148ab565b9050919050565b60006148f9826136c4565b9150614904836136c4565b925082820190508082111561491c5761491b614342565b5b92915050565b7f4e6f742072656e7465642063757272656e746c792e0000000000000000000000600082015250565b600061495860158361361d565b915061496382614922565b602082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b600081905092915050565b60006149a482613612565b6149ae818561498e565b93506149be81856020860161362e565b80840191505092915050565b60006149d68285614999565b91506149e28284614999565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a13565b614a5a8683614a13565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a97614a92614a8d846136c4565b614a72565b6136c4565b9050919050565b6000819050919050565b614ab183614a7c565b614ac5614abd82614a9e565b848454614a20565b825550505050565b600090565b614ada614acd565b614ae5818484614aa8565b505050565b5b81811015614b0957614afe600082614ad2565b600181019050614aeb565b5050565b601f821115614b4e57614b1f816149ee565b614b2884614a03565b81016020851015614b37578190505b614b4b614b4385614a03565b830182614aea565b50505b505050565b600082821c905092915050565b6000614b7160001984600802614b53565b1980831691505092915050565b6000614b8a8383614b60565b9150826002028217905092915050565b614ba382613612565b67ffffffffffffffff811115614bbc57614bbb6139ac565b5b614bc6825461415b565b614bd1828285614b0d565b600060209050601f831160018114614c045760008415614bf2578287015190505b614bfc8582614b7e565b865550614c64565b601f198416614c12866149ee565b60005b82811015614c3a57848901518255600182019150602085019450602081019050614c15565b86831015614c575784890151614c53601f891682614b60565b8355505b6001600288020188555050505b505050505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614cc8602a8361361d565b9150614cd382614c6c565b604082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614d3460198361361d565b9150614d3f82614cfe565b602082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614da060198361361d565b9150614dab82614d6a565b602082019050919050565b60006020820190508181036000830152614dcf81614d93565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e3260328361361d565b9150614e3d82614dd6565b604082019050919050565b60006020820190508181036000830152614e6181614e25565b9050919050565b6000614e73826136c4565b9150614e7e836136c4565b9250828203905081811115614e9657614e95614342565b5b92915050565b6000614ea7826136c4565b9150614eb2836136c4565b925082614ec257614ec16143b3565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614f2960258361361d565b9150614f3482614ecd565b604082019050919050565b60006020820190508181036000830152614f5881614f1c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614fbb60248361361d565b9150614fc682614f5f565b604082019050919050565b60006020820190508181036000830152614fea81614fae565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061502760178361498e565b915061503282614ff1565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061507360118361498e565b915061507e8261503d565b601182019050919050565b60006150948261501a565b91506150a08285614999565b91506150ab82615066565b91506150b78284614999565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006150f960148361361d565b9150615104826150c3565b602082019050919050565b60006020820190508181036000830152615128816150ec565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061516560108361361d565b91506151708261512f565b602082019050919050565b6000602082019050818103600083015261519481615158565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006151c28261519b565b6151cc81856151a6565b93506151dc81856020860161362e565b6151e581613658565b840191505092915050565b60006080820190506152056000830187613759565b6152126020830186613759565b61521f60408301856137ef565b818103606083015261523181846151b7565b905095945050505050565b60008151905061524b81613583565b92915050565b6000602082840312156152675761526661354d565b5b60006152758482850161523c565b91505092915050565b6000615289826136c4565b91506000820361529c5761529b614342565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006152dd60208361361d565b91506152e8826152a7565b602082019050919050565b6000602082019050818103600083015261530c816152d0565b9050919050565b7f4d617820737570706c7920726561636865642e00000000000000000000000000600082015250565b600061534960138361361d565b915061535482615313565b602082019050919050565b600060208201905081810360008301526153788161533c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006153e460208361361d565b91506153ef826153ae565b602082019050919050565b60006020820190508181036000830152615413816153d7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615450601c8361361d565b915061545b8261541a565b602082019050919050565b6000602082019050818103600083015261547f81615443565b905091905056fea264697066735822122003811144d4079ca6afdefc8f4fd5ded4872a6accc3421f3572f0645ee0484e6464736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b4176616c616e6368652048696c6c73204d7573636c6520436172730000000000000000000000000000000000000000000000000000000000000000000000000441484d4300000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b4176616c616e6368652048696c6c73204d7573636c6520436172730000000000000000000000000000000000000000000000000000000000000000000000000441484d4300000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Avalanche Hills Muscle Cars
Arg [1] : symbol (string): AHMC

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [3] : 4176616c616e6368652048696c6c73204d7573636c6520436172730000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 41484d4300000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

74753:5637:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80002:259;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38903:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40416:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39933:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62445:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41116:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15754:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70575:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16195:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62113:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17339:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75141:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78131:84;;;:::i;:::-;;75970:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41523:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77651:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62635:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78223:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2699:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38614:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38345:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78043:80;;;:::i;:::-;;76090:540;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77052:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75707:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14214:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39072:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13319:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40659:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76653:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75291:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77273:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41779:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75003:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59384:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77396:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;39247:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75072:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16635:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40885:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59149:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75873:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80002:259;80188:4;80217:36;80241:11;80217:23;:36::i;:::-;80210:43;;80002:259;;;:::o;38903:100::-;38957:13;38990:5;38983:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38903:100;:::o;40416:171::-;40492:7;40512:23;40527:7;40512:14;:23::i;:::-;40555:15;:24;40571:7;40555:24;;;;;;;;;;;;;;;;;;;;;40548:31;;40416:171;;;:::o;39933:417::-;40014:13;40030:23;40045:7;40030:14;:23::i;:::-;40014:39;;40078:5;40072:11;;:2;:11;;;40064:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40172:5;40156:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40181:37;40198:5;40205:12;:10;:12::i;:::-;40181:16;:37::i;:::-;40156:62;40134:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;40321:21;40330:2;40334:7;40321:8;:21::i;:::-;40003:347;39933:417;;:::o;62445:113::-;62506:7;62533:10;:17;;;;62526:24;;62445:113;:::o;41116:336::-;41311:41;41330:12;:10;:12::i;:::-;41344:7;41311:18;:41::i;:::-;41303:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41416:28;41426:4;41432:2;41436:7;41416:9;:28::i;:::-;41116:336;;;:::o;15754:131::-;15828:7;15855:6;:12;15862:4;15855:12;;;;;;;;;;;:22;;;15848:29;;15754:131;;;:::o;70575:442::-;70672:7;70681;70701:26;70730:17;:27;70748:8;70730:27;;;;;;;;;;;70701:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70802:1;70774:30;;:7;:16;;;:30;;;70770:92;;70831:19;70821:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70770:92;70874:21;70939:17;:15;:17::i;:::-;70898:58;;70912:7;:23;;;70899:36;;:10;:36;;;;:::i;:::-;70898:58;;;;:::i;:::-;70874:82;;70977:7;:16;;;70995:13;70969:40;;;;;;70575:442;;;;;:::o;16195:147::-;16278:18;16291:4;16278:12;:18::i;:::-;13810:16;13821:4;13810:10;:16::i;:::-;16309:25:::1;16320:4;16326:7;16309:10;:25::i;:::-;16195:147:::0;;;:::o;62113:256::-;62210:7;62246:23;62263:5;62246:16;:23::i;:::-;62238:5;:31;62230:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62335:12;:19;62348:5;62335:19;;;;;;;;;;;;;;;:26;62355:5;62335:26;;;;;;;;;;;;62328:33;;62113:256;;;;:::o;17339:218::-;17446:12;:10;:12::i;:::-;17435:23;;:7;:23;;;17427:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;17523:26;17535:4;17541:7;17523:11;:26::i;:::-;17339:218;;:::o;75141:66::-;75181:26;75141:66;:::o;78131:84::-;13364:4;78166:18;;13810:16;13821:4;13810:10;:16::i;:::-;78197:10:::1;:8;:10::i;:::-;78131:84:::0;:::o;75970:112::-;76035:6;76031:43;76047:8;76043:1;:12;76031:43;;;76063:11;76071:2;76063:7;:11::i;:::-;76057:4;;;;;:::i;:::-;;;;76031:43;;;;75970:112;;:::o;41523:185::-;41661:39;41678:4;41684:2;41688:7;41661:39;;;;;;;;;;;;:16;:39::i;:::-;41523:185;;;:::o;77651:349::-;75041:24;13810:16;13821:4;13810:10;:16::i;:::-;77729:17:::1;77749:6;:15;77756:7;77749:15;;;;;;;;;;;77729:35;;77783:4;:15;;;;;;;;;;;;77775:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;77862:4;:11;;;77843:15;:30;;77835:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;77928:5;77910:4;:15;;;:23;;;;;;;;;;;;;;;;;;77944:48;77954:16;77962:7;77954;:16::i;:::-;77972:4;:10;;;;;;;;;;;;77984:7;77944:9;:48::i;:::-;77718:282;77651:349:::0;;:::o;62635:233::-;62710:7;62746:30;:28;:30::i;:::-;62738:5;:38;62730:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62843:10;62854:5;62843:17;;;;;;;;:::i;:::-;;;;;;;;;;62836:24;;62635:233;;;:::o;78223:118::-;13364:4;78282:18;;13810:16;13821:4;13810:10;:16::i;:::-;78313:20:::1;78325:7;78313:11;:20::i;:::-;78223:118:::0;;:::o;2699:86::-;2746:4;2770:7;;;;;;;;;;;2763:14;;2699:86;:::o;38614:222::-;38686:7;38706:13;38722:7;:16;38730:7;38722:16;;;;;;;;;;;;;;;;;;;;;38706:32;;38774:1;38757:19;;:5;:19;;;38749:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38823:5;38816:12;;;38614:222;;;:::o;38345:207::-;38417:7;38462:1;38445:19;;:5;:19;;;38437:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38528:9;:16;38538:5;38528:16;;;;;;;;;;;;;;;;38521:23;;38345:207;;;:::o;78043:80::-;13364:4;78076:18;;13810:16;13821:4;13810:10;:16::i;:::-;78107:8:::1;:6;:8::i;:::-;78043:80:::0;:::o;76090:540::-;76152:16;76181:18;76202:17;76212:6;76202:9;:17::i;:::-;76181:38;;76248:1;76234:10;:15;76230:393;;76325:1;76311:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76304:23;;;;;76230:393;76360:23;76400:10;76386:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76360:51;;76426:13;76454:130;76478:10;76470:5;:18;76454:130;;;76534:34;76554:6;76562:5;76534:19;:34::i;:::-;76518:6;76525:5;76518:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;76490:7;;;;;:::i;:::-;;;;76454:130;;;76605:6;76598:13;;;;;76090:540;;;;:::o;77052:213::-;75041:24;13810:16;13821:4;13810:10;:16::i;:::-;77128:17:::1;77148:6;:15;77155:7;77148:15;;;;;;;;;;;77128:35;;77182:4;:15;;;;;;;;;;;;77174:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;77242:15;77228:4;:11;;:29;;;;77117:148;77052:213:::0;;:::o;75707:158::-;13364:4;75784:18;;13810:16;13821:4;13810:10;:16::i;:::-;75815:42:::1;75834:8;75844:12;75815:18;:42::i;:::-;75707:158:::0;;;:::o;14214:147::-;14300:4;14324:6;:12;14331:4;14324:12;;;;;;;;;;;:20;;:29;14345:7;14324:29;;;;;;;;;;;;;;;;;;;;;;;;;14317:36;;14214:147;;;;:::o;39072:104::-;39128:13;39161:7;39154:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39072:104;:::o;13319:49::-;13364:4;13319:49;;;:::o;40659:155::-;40754:52;40773:12;:10;:12::i;:::-;40787:8;40797;40754:18;:52::i;:::-;40659:155;;:::o;76653:391::-;75041:24;13810:16;13821:4;13810:10;:16::i;:::-;76750:17:::1;76770:6;:15;76777:7;76770:15;;;;;;;;;;;76750:35;;76805:4;:15;;;;;;;;;;;;76804:16;76796:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;76853:13;76869:16;76877:7;76869;:16::i;:::-;76853:32;;76909:5;76896:4;:10;;;:18;;;;;;;;;;;;;;;;;;76957:6;76939:15;:24;;;;:::i;:::-;76925:4;:11;;:38;;;;76974:29;76984:5;76991:2;76995:7;76974:9;:29::i;:::-;77032:4;77014;:15;;;:22;;;;;;;;;;;;;;;;;;76739:305;;76653:391:::0;;;;:::o;75291:42::-;75328:5;75291:42;:::o;77273:115::-;77330:4;77354:6;:15;77361:7;77354:15;;;;;;;;;;;:26;;;;;;;;;;;;77347:33;;77273:115;;;:::o;41779:323::-;41953:41;41972:12;:10;:12::i;:::-;41986:7;41953:18;:41::i;:::-;41945:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;42056:38;42070:4;42076:2;42080:7;42089:4;42056:13;:38::i;:::-;41779:323;;;;:::o;75003:62::-;75041:24;75003:62;:::o;59384:255::-;59569:6;59595:36;;;59588:43;;59384:255;;;;;;;:::o;77396:247::-;77450:21;77473:11;77497:17;77517:6;:15;77524:7;77517:15;;;;;;;;;;;77497:35;;77551:4;:15;;;;;;;;;;;;77543:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;77611:4;:10;;;;;;;;;;;;77623:4;:11;;;77603:32;;;;;77396:247;;;:::o;39247:281::-;39320:13;39346:23;39361:7;39346:14;:23::i;:::-;39382:21;39406:10;:8;:10::i;:::-;39382:34;;39458:1;39440:7;39434:21;:25;:86;;;;;;;;;;;;;;;;;39486:7;39495:18;:7;:16;:18::i;:::-;39469:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39434:86;39427:93;;;39247:281;;;:::o;75072:62::-;75110:24;75072:62;:::o;16635:149::-;16719:18;16732:4;16719:12;:18::i;:::-;13810:16;13821:4;13810:10;:16::i;:::-;16750:26:::1;16762:4;16768:7;16750:11;:26::i;:::-;16635:149:::0;;;:::o;40885:164::-;40982:4;41006:18;:25;41025:5;41006:25;;;;;;;;;;;;;;;:35;41032:8;41006:35;;;;;;;;;;;;;;;;;;;;;;;;;40999:42;;40885:164;;;;:::o;59149:227::-;59311:6;59337:31;;;59330:38;;59149:227;;;;;;;:::o;75873:89::-;75110:24;13810:16;13821:4;13810:10;:16::i;:::-;75942:12:::1;75951:2;75942:8;:12::i;:::-;75873:89:::0;;:::o;13918:204::-;14003:4;14042:32;14027:47;;;:11;:47;;;;:87;;;;14078:36;14102:11;14078:23;:36::i;:::-;14027:87;14020:94;;13918:204;;;:::o;48391:135::-;48473:16;48481:7;48473;:16::i;:::-;48465:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48391:135;:::o;778:98::-;831:7;858:10;851:17;;778:98;:::o;47670:174::-;47772:2;47745:15;:24;47761:7;47745:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47828:7;47824:2;47790:46;;47799:23;47814:7;47799:14;:23::i;:::-;47790:46;;;;;;;;;;;;47670:174;;:::o;43903:264::-;43996:4;44013:13;44029:23;44044:7;44029:14;:23::i;:::-;44013:39;;44082:5;44071:16;;:7;:16;;;:52;;;;44091:32;44108:5;44115:7;44091:16;:32::i;:::-;44071:52;:87;;;;44151:7;44127:31;;:20;44139:7;44127:11;:20::i;:::-;:31;;;44071:87;44063:96;;;43903:264;;;;:::o;79561:130::-;79649:34;79665:4;79671:2;79675:7;79649:15;:34::i;:::-;79561:130;;;:::o;71299:97::-;71357:6;71383:5;71376:12;;71299:97;:::o;14665:105::-;14732:30;14743:4;14749:12;:10;:12::i;:::-;14732:10;:30::i;:::-;14665:105;:::o;18936:238::-;19020:22;19028:4;19034:7;19020;:22::i;:::-;19015:152;;19091:4;19059:6;:12;19066:4;19059:12;;;;;;;;;;;:20;;:29;19080:7;19059:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;19142:12;:10;:12::i;:::-;19115:40;;19133:7;19115:40;;19127:4;19115:40;;;;;;;;;;19015:152;18936:238;;:::o;19354:239::-;19438:22;19446:4;19452:7;19438;:22::i;:::-;19434:152;;;19509:5;19477:6;:12;19484:4;19477:12;;;;;;;;;;;:20;;:29;19498:7;19477:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19561:12;:10;:12::i;:::-;19534:40;;19552:7;19534:40;;19546:4;19534:40;;;;;;;;;;19434:152;19354:239;;:::o;3554:120::-;2563:16;:14;:16::i;:::-;3623:5:::1;3613:7;;:15;;;;;;;;;;;;;;;;;;3644:22;3653:12;:10;:12::i;:::-;3644:22;;;;;;:::i;:::-;;;;;;;;3554:120::o:0;78349:88::-;78422:7;78412;:17;;;;;;:::i;:::-;;78349:88;:::o;3295:118::-;2304:19;:17;:19::i;:::-;3365:4:::1;3355:7;;:14;;;;;;;;;;;;;;;;;;3385:20;3392:12;:10;:12::i;:::-;3385:20;;;;;;:::i;:::-;;;;;;;;3295:118::o:0;71667:332::-;71786:17;:15;:17::i;:::-;71770:33;;:12;:33;;;;71762:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;71889:1;71869:22;;:8;:22;;;71861:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;71956:35;;;;;;;;71968:8;71956:35;;;;;;71978:12;71956:35;;;;;71934:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71667:332;;:::o;47987:315::-;48142:8;48133:17;;:5;:17;;;48125:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48229:8;48191:18;:25;48210:5;48191:25;;;;;;;;;;;;;;;:35;48217:8;48191:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48275:8;48253:41;;48268:5;48253:41;;;48285:8;48253:41;;;;;;:::i;:::-;;;;;;;;47987:315;;;:::o;42983:313::-;43139:28;43149:4;43155:2;43159:7;43139:9;:28::i;:::-;43186:47;43209:4;43215:2;43219:7;43228:4;43186:22;:47::i;:::-;43178:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42983:313;;;;:::o;79454:99::-;79505:13;79538:7;79531:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79454:99;:::o;7224:723::-;7280:13;7510:1;7501:5;:10;7497:53;;7528:10;;;;;;;;;;;;;;;;;;;;;7497:53;7560:12;7575:5;7560:20;;7591:14;7616:78;7631:1;7623:4;:9;7616:78;;7649:8;;;;;:::i;:::-;;;;7680:2;7672:10;;;;;:::i;:::-;;;7616:78;;;7704:19;7736:6;7726:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7704:39;;7754:154;7770:1;7761:5;:10;7754:154;;7798:1;7788:11;;;;;:::i;:::-;;;7865:2;7857:5;:10;;;;:::i;:::-;7844:2;:24;;;;:::i;:::-;7831:39;;7814:6;7821;7814:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7894:2;7885:11;;;;;:::i;:::-;;;7754:154;;;7932:6;7918:21;;;;;7224:723;;;;:::o;79067:171::-;79116:16;79135:24;:14;:22;:24::i;:::-;79116:43;;79170:26;:14;:24;:26::i;:::-;79207:23;79217:2;79221:8;79207:9;:23::i;:::-;79105:133;79067:171;:::o;58360:223::-;58462:4;58501:34;58486:49;;;:11;:49;;;;:89;;;;58539:36;58563:11;58539:23;:36::i;:::-;58486:89;58479:96;;58360:223;;;:::o;43609:127::-;43674:4;43726:1;43698:30;;:7;:16;43706:7;43698:16;;;;;;;;;;;;;;;;;;;;;:30;;;;43691:37;;43609:127;;;:::o;46926:625::-;47085:4;47058:31;;:23;47073:7;47058:14;:23::i;:::-;:31;;;47050:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47164:1;47150:16;;:2;:16;;;47142:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47220:39;47241:4;47247:2;47251:7;47220:20;:39::i;:::-;47324:29;47341:1;47345:7;47324:8;:29::i;:::-;47385:1;47366:9;:15;47376:4;47366:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;47414:1;47397:9;:13;47407:2;47397:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47445:2;47426:7;:16;47434:7;47426:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47484:7;47480:2;47465:27;;47474:4;47465:27;;;;;;;;;;;;47505:38;47525:4;47531:2;47535:7;47505:19;:38::i;:::-;46926:625;;;:::o;15060:505::-;15149:22;15157:4;15163:7;15149;:22::i;:::-;15144:414;;15337:41;15365:7;15337:41;;15375:2;15337:19;:41::i;:::-;15451:38;15479:4;15471:13;;15486:2;15451:19;:38::i;:::-;15242:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15188:358;;;;;;;;;;;:::i;:::-;;;;;;;;15144:414;15060:505;;:::o;3043:108::-;3110:8;:6;:8::i;:::-;3102:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;3043:108::o;2858:::-;2929:8;:6;:8::i;:::-;2928:9;2920:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2858:108::o;49090:853::-;49244:4;49265:15;:2;:13;;;:15::i;:::-;49261:675;;;49317:2;49301:36;;;49338:12;:10;:12::i;:::-;49352:4;49358:7;49367:4;49301:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49297:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49559:1;49542:6;:13;:18;49538:328;;49585:60;;;;;;;;;;:::i;:::-;;;;;;;;49538:328;49816:6;49810:13;49801:6;49797:2;49793:15;49786:38;49297:584;49433:41;;;49423:51;;;:6;:51;;;;49416:58;;;;;49261:675;49920:4;49913:11;;49090:853;;;;;;;:::o;20508:114::-;20573:7;20600;:14;;;20593:21;;20508:114;;;:::o;20630:127::-;20737:1;20719:7;:14;;;:19;;;;;;;;;;;20630:127;:::o;44509:110::-;44585:26;44595:2;44599:7;44585:26;;;;;;;;;;;;:9;:26::i;:::-;44509:110;;:::o;74170:170::-;74272:4;74296:36;74320:11;74296:23;:36::i;:::-;74289:43;;74170:170;;;:::o;79699:295::-;2304:19;:17;:19::i;:::-;79882:6:::1;:15;79889:7;79882:15;;;;;;;;;;;:26;;;;;;;;;;;;79881:27;79873:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;79941:45;79968:4;79974:2;79978:7;79941:26;:45::i;:::-;79699:295:::0;;;:::o;51026:125::-;;;;:::o;8525:451::-;8600:13;8626:19;8671:1;8662:6;8658:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;8648:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8626:47;;8684:15;:6;8691:1;8684:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;8710;:6;8717:1;8710:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;8741:9;8766:1;8757:6;8753:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;8741:26;;8736:135;8773:1;8769;:5;8736:135;;;8808:12;8829:3;8821:5;:11;8808:25;;;;;;;:::i;:::-;;;;;8796:6;8803:1;8796:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;8858:1;8848:11;;;;;8776:3;;;;:::i;:::-;;;8736:135;;;;8898:1;8889:5;:10;8881:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;8961:6;8947:21;;;8525:451;;;;:::o;22370:326::-;22430:4;22687:1;22665:7;:19;;;:23;22658:30;;22370:326;;;:::o;44846:319::-;44975:18;44981:2;44985:7;44975:5;:18::i;:::-;45026:53;45057:1;45061:2;45065:7;45074:4;45026:22;:53::i;:::-;45004:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;44846:319;;;:::o;61805:224::-;61907:4;61946:35;61931:50;;;:11;:50;;;;:90;;;;61985:36;62009:11;61985:23;:36::i;:::-;61931:90;61924:97;;61805:224;;;:::o;63481:589::-;63625:45;63652:4;63658:2;63662:7;63625:26;:45::i;:::-;63703:1;63687:18;;:4;:18;;;63683:187;;63722:40;63754:7;63722:31;:40::i;:::-;63683:187;;;63792:2;63784:10;;:4;:10;;;63780:90;;63811:47;63844:4;63850:7;63811:32;:47::i;:::-;63780:90;63683:187;63898:1;63884:16;;:2;:16;;;63880:183;;63917:45;63954:7;63917:36;:45::i;:::-;63880:183;;;63990:4;63984:10;;:2;:10;;;63980:83;;64011:40;64039:2;64043:7;64011:27;:40::i;:::-;63980:83;63880:183;63481:589;;;:::o;79274:172::-;79344:24;79356:2;79360:7;79344:11;:24::i;:::-;75328:5;79387:13;:11;:13::i;:::-;:27;;79379:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;79274:172;;:::o;37976:305::-;38078:4;38130:25;38115:40;;;:11;:40;;;;:105;;;;38187:33;38172:48;;;:11;:48;;;;38115:105;:158;;;;38237:36;38261:11;38237:23;:36::i;:::-;38115:158;38095:178;;37976:305;;;:::o;50515:126::-;;;;:::o;64793:164::-;64897:10;:17;;;;64870:15;:24;64886:7;64870:24;;;;;;;;;;;:44;;;;64925:10;64941:7;64925:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64793:164;:::o;65584:988::-;65850:22;65900:1;65875:22;65892:4;65875:16;:22::i;:::-;:26;;;;:::i;:::-;65850:51;;65912:18;65933:17;:26;65951:7;65933:26;;;;;;;;;;;;65912:47;;66080:14;66066:10;:28;66062:328;;66111:19;66133:12;:18;66146:4;66133:18;;;;;;;;;;;;;;;:34;66152:14;66133:34;;;;;;;;;;;;66111:56;;66217:11;66184:12;:18;66197:4;66184:18;;;;;;;;;;;;;;;:30;66203:10;66184:30;;;;;;;;;;;:44;;;;66334:10;66301:17;:30;66319:11;66301:30;;;;;;;;;;;:43;;;;66096:294;66062:328;66486:17;:26;66504:7;66486:26;;;;;;;;;;;66479:33;;;66530:12;:18;66543:4;66530:18;;;;;;;;;;;;;;;:34;66549:14;66530:34;;;;;;;;;;;66523:41;;;65665:907;;65584:988;;:::o;66867:1079::-;67120:22;67165:1;67145:10;:17;;;;:21;;;;:::i;:::-;67120:46;;67177:18;67198:15;:24;67214:7;67198:24;;;;;;;;;;;;67177:45;;67549:19;67571:10;67582:14;67571:26;;;;;;;;:::i;:::-;;;;;;;;;;67549:48;;67635:11;67610:10;67621;67610:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;67746:10;67715:15;:28;67731:11;67715:28;;;;;;;;;;;:41;;;;67887:15;:24;67903:7;67887:24;;;;;;;;;;;67880:31;;;67922:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66938:1008;;;66867:1079;:::o;64371:221::-;64456:14;64473:20;64490:2;64473:16;:20::i;:::-;64456:37;;64531:7;64504:12;:16;64517:2;64504:16;;;;;;;;;;;;;;;:24;64521:6;64504:24;;;;;;;;;;;:34;;;;64578:6;64549:17;:26;64567:7;64549:26;;;;;;;;;;;:35;;;;64445:147;64371:221;;:::o;45501:439::-;45595:1;45581:16;;:2;:16;;;45573:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45654:16;45662:7;45654;:16::i;:::-;45653:17;45645:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45716:45;45745:1;45749:2;45753:7;45716:20;:45::i;:::-;45791:1;45774:9;:13;45784:2;45774:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45822:2;45803:7;:16;45811:7;45803:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45867:7;45863:2;45842:33;;45859:1;45842:33;;;;;;;;;;;;45888:44;45916:1;45920:2;45924:7;45888:19;:44::i;:::-;45501:439;;:::o;70305:215::-;70407:4;70446:26;70431:41;;;:11;:41;;;;:81;;;;70476:36;70500:11;70476:23;:36::i;:::-;70431:81;70424:88;;70305:215;;;:::o;11143:157::-;11228:4;11267:25;11252:40;;;:11;:40;;;;11245:47;;11143:157;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:118::-;6645:24;6663:5;6645:24;:::i;:::-;6640:3;6633:37;6558:118;;:::o;6682:222::-;6775:4;6813:2;6802:9;6798:18;6790:26;;6826:71;6894:1;6883:9;6879:17;6870:6;6826:71;:::i;:::-;6682:222;;;;:::o;6910:474::-;6978:6;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7161:1;7186:53;7231:7;7222:6;7211:9;7207:22;7186:53;:::i;:::-;7176:63;;7132:117;7288:2;7314:53;7359:7;7350:6;7339:9;7335:22;7314:53;:::i;:::-;7304:63;;7259:118;6910:474;;;;;:::o;7390:332::-;7511:4;7549:2;7538:9;7534:18;7526:26;;7562:71;7630:1;7619:9;7615:17;7606:6;7562:71;:::i;:::-;7643:72;7711:2;7700:9;7696:18;7687:6;7643:72;:::i;:::-;7390:332;;;;;:::o;7728:474::-;7796:6;7804;7853:2;7841:9;7832:7;7828:23;7824:32;7821:119;;;7859:79;;:::i;:::-;7821:119;7979:1;8004:53;8049:7;8040:6;8029:9;8025:22;8004:53;:::i;:::-;7994:63;;7950:117;8106:2;8132:53;8177:7;8168:6;8157:9;8153:22;8132:53;:::i;:::-;8122:63;;8077:118;7728:474;;;;;:::o;8208:117::-;8317:1;8314;8307:12;8331:117;8440:1;8437;8430:12;8454:180;8502:77;8499:1;8492:88;8599:4;8596:1;8589:15;8623:4;8620:1;8613:15;8640:281;8723:27;8745:4;8723:27;:::i;:::-;8715:6;8711:40;8853:6;8841:10;8838:22;8817:18;8805:10;8802:34;8799:62;8796:88;;;8864:18;;:::i;:::-;8796:88;8904:10;8900:2;8893:22;8683:238;8640:281;;:::o;8927:129::-;8961:6;8988:20;;:::i;:::-;8978:30;;9017:33;9045:4;9037:6;9017:33;:::i;:::-;8927:129;;;:::o;9062:308::-;9124:4;9214:18;9206:6;9203:30;9200:56;;;9236:18;;:::i;:::-;9200:56;9274:29;9296:6;9274:29;:::i;:::-;9266:37;;9358:4;9352;9348:15;9340:23;;9062:308;;;:::o;9376:146::-;9473:6;9468:3;9463;9450:30;9514:1;9505:6;9500:3;9496:16;9489:27;9376:146;;;:::o;9528:425::-;9606:5;9631:66;9647:49;9689:6;9647:49;:::i;:::-;9631:66;:::i;:::-;9622:75;;9720:6;9713:5;9706:21;9758:4;9751:5;9747:16;9796:3;9787:6;9782:3;9778:16;9775:25;9772:112;;;9803:79;;:::i;:::-;9772:112;9893:54;9940:6;9935:3;9930;9893:54;:::i;:::-;9612:341;9528:425;;;;;:::o;9973:340::-;10029:5;10078:3;10071:4;10063:6;10059:17;10055:27;10045:122;;10086:79;;:::i;:::-;10045:122;10203:6;10190:20;10228:79;10303:3;10295:6;10288:4;10280:6;10276:17;10228:79;:::i;:::-;10219:88;;10035:278;9973:340;;;;:::o;10319:509::-;10388:6;10437:2;10425:9;10416:7;10412:23;10408:32;10405:119;;;10443:79;;:::i;:::-;10405:119;10591:1;10580:9;10576:17;10563:31;10621:18;10613:6;10610:30;10607:117;;;10643:79;;:::i;:::-;10607:117;10748:63;10803:7;10794:6;10783:9;10779:22;10748:63;:::i;:::-;10738:73;;10534:287;10319:509;;;;:::o;10834:329::-;10893:6;10942:2;10930:9;10921:7;10917:23;10913:32;10910:119;;;10948:79;;:::i;:::-;10910:119;11068:1;11093:53;11138:7;11129:6;11118:9;11114:22;11093:53;:::i;:::-;11083:63;;11039:117;10834:329;;;;:::o;11169:114::-;11236:6;11270:5;11264:12;11254:22;;11169:114;;;:::o;11289:184::-;11388:11;11422:6;11417:3;11410:19;11462:4;11457:3;11453:14;11438:29;;11289:184;;;;:::o;11479:132::-;11546:4;11569:3;11561:11;;11599:4;11594:3;11590:14;11582:22;;11479:132;;;:::o;11617:108::-;11694:24;11712:5;11694:24;:::i;:::-;11689:3;11682:37;11617:108;;:::o;11731:179::-;11800:10;11821:46;11863:3;11855:6;11821:46;:::i;:::-;11899:4;11894:3;11890:14;11876:28;;11731:179;;;;:::o;11916:113::-;11986:4;12018;12013:3;12009:14;12001:22;;11916:113;;;:::o;12065:732::-;12184:3;12213:54;12261:5;12213:54;:::i;:::-;12283:86;12362:6;12357:3;12283:86;:::i;:::-;12276:93;;12393:56;12443:5;12393:56;:::i;:::-;12472:7;12503:1;12488:284;12513:6;12510:1;12507:13;12488:284;;;12589:6;12583:13;12616:63;12675:3;12660:13;12616:63;:::i;:::-;12609:70;;12702:60;12755:6;12702:60;:::i;:::-;12692:70;;12548:224;12535:1;12532;12528:9;12523:14;;12488:284;;;12492:14;12788:3;12781:10;;12189:608;;;12065:732;;;;:::o;12803:373::-;12946:4;12984:2;12973:9;12969:18;12961:26;;13033:9;13027:4;13023:20;13019:1;13008:9;13004:17;12997:47;13061:108;13164:4;13155:6;13061:108;:::i;:::-;13053:116;;12803:373;;;;:::o;13182:109::-;13218:7;13258:26;13251:5;13247:38;13236:49;;13182:109;;;:::o;13297:120::-;13369:23;13386:5;13369:23;:::i;:::-;13362:5;13359:34;13349:62;;13407:1;13404;13397:12;13349:62;13297:120;:::o;13423:137::-;13468:5;13506:6;13493:20;13484:29;;13522:32;13548:5;13522:32;:::i;:::-;13423:137;;;;:::o;13566:472::-;13633:6;13641;13690:2;13678:9;13669:7;13665:23;13661:32;13658:119;;;13696:79;;:::i;:::-;13658:119;13816:1;13841:53;13886:7;13877:6;13866:9;13862:22;13841:53;:::i;:::-;13831:63;;13787:117;13943:2;13969:52;14013:7;14004:6;13993:9;13989:22;13969:52;:::i;:::-;13959:62;;13914:117;13566:472;;;;;:::o;14044:116::-;14114:21;14129:5;14114:21;:::i;:::-;14107:5;14104:32;14094:60;;14150:1;14147;14140:12;14094:60;14044:116;:::o;14166:133::-;14209:5;14247:6;14234:20;14225:29;;14263:30;14287:5;14263:30;:::i;:::-;14166:133;;;;:::o;14305:468::-;14370:6;14378;14427:2;14415:9;14406:7;14402:23;14398:32;14395:119;;;14433:79;;:::i;:::-;14395:119;14553:1;14578:53;14623:7;14614:6;14603:9;14599:22;14578:53;:::i;:::-;14568:63;;14524:117;14680:2;14706:50;14748:7;14739:6;14728:9;14724:22;14706:50;:::i;:::-;14696:60;;14651:115;14305:468;;;;;:::o;14779:619::-;14856:6;14864;14872;14921:2;14909:9;14900:7;14896:23;14892:32;14889:119;;;14927:79;;:::i;:::-;14889:119;15047:1;15072:53;15117:7;15108:6;15097:9;15093:22;15072:53;:::i;:::-;15062:63;;15018:117;15174:2;15200:53;15245:7;15236:6;15225:9;15221:22;15200:53;:::i;:::-;15190:63;;15145:118;15302:2;15328:53;15373:7;15364:6;15353:9;15349:22;15328:53;:::i;:::-;15318:63;;15273:118;14779:619;;;;;:::o;15404:307::-;15465:4;15555:18;15547:6;15544:30;15541:56;;;15577:18;;:::i;:::-;15541:56;15615:29;15637:6;15615:29;:::i;:::-;15607:37;;15699:4;15693;15689:15;15681:23;;15404:307;;;:::o;15717:423::-;15794:5;15819:65;15835:48;15876:6;15835:48;:::i;:::-;15819:65;:::i;:::-;15810:74;;15907:6;15900:5;15893:21;15945:4;15938:5;15934:16;15983:3;15974:6;15969:3;15965:16;15962:25;15959:112;;;15990:79;;:::i;:::-;15959:112;16080:54;16127:6;16122:3;16117;16080:54;:::i;:::-;15800:340;15717:423;;;;;:::o;16159:338::-;16214:5;16263:3;16256:4;16248:6;16244:17;16240:27;16230:122;;16271:79;;:::i;:::-;16230:122;16388:6;16375:20;16413:78;16487:3;16479:6;16472:4;16464:6;16460:17;16413:78;:::i;:::-;16404:87;;16220:277;16159:338;;;;:::o;16503:943::-;16598:6;16606;16614;16622;16671:3;16659:9;16650:7;16646:23;16642:33;16639:120;;;16678:79;;:::i;:::-;16639:120;16798:1;16823:53;16868:7;16859:6;16848:9;16844:22;16823:53;:::i;:::-;16813:63;;16769:117;16925:2;16951:53;16996:7;16987:6;16976:9;16972:22;16951:53;:::i;:::-;16941:63;;16896:118;17053:2;17079:53;17124:7;17115:6;17104:9;17100:22;17079:53;:::i;:::-;17069:63;;17024:118;17209:2;17198:9;17194:18;17181:32;17240:18;17232:6;17229:30;17226:117;;;17262:79;;:::i;:::-;17226:117;17367:62;17421:7;17412:6;17401:9;17397:22;17367:62;:::i;:::-;17357:72;;17152:287;16503:943;;;;;;;:::o;17452:311::-;17529:4;17619:18;17611:6;17608:30;17605:56;;;17641:18;;:::i;:::-;17605:56;17691:4;17683:6;17679:17;17671:25;;17751:4;17745;17741:15;17733:23;;17452:311;;;:::o;17769:117::-;17878:1;17875;17868:12;17909:710;18005:5;18030:81;18046:64;18103:6;18046:64;:::i;:::-;18030:81;:::i;:::-;18021:90;;18131:5;18160:6;18153:5;18146:21;18194:4;18187:5;18183:16;18176:23;;18247:4;18239:6;18235:17;18227:6;18223:30;18276:3;18268:6;18265:15;18262:122;;;18295:79;;:::i;:::-;18262:122;18410:6;18393:220;18427:6;18422:3;18419:15;18393:220;;;18502:3;18531:37;18564:3;18552:10;18531:37;:::i;:::-;18526:3;18519:50;18598:4;18593:3;18589:14;18582:21;;18469:144;18453:4;18448:3;18444:14;18437:21;;18393:220;;;18397:21;18011:608;;17909:710;;;;;:::o;18642:370::-;18713:5;18762:3;18755:4;18747:6;18743:17;18739:27;18729:122;;18770:79;;:::i;:::-;18729:122;18887:6;18874:20;18912:94;19002:3;18994:6;18987:4;18979:6;18975:17;18912:94;:::i;:::-;18903:103;;18719:293;18642:370;;;;:::o;19018:1509::-;19172:6;19180;19188;19196;19204;19253:3;19241:9;19232:7;19228:23;19224:33;19221:120;;;19260:79;;:::i;:::-;19221:120;19380:1;19405:53;19450:7;19441:6;19430:9;19426:22;19405:53;:::i;:::-;19395:63;;19351:117;19507:2;19533:53;19578:7;19569:6;19558:9;19554:22;19533:53;:::i;:::-;19523:63;;19478:118;19663:2;19652:9;19648:18;19635:32;19694:18;19686:6;19683:30;19680:117;;;19716:79;;:::i;:::-;19680:117;19821:78;19891:7;19882:6;19871:9;19867:22;19821:78;:::i;:::-;19811:88;;19606:303;19976:2;19965:9;19961:18;19948:32;20007:18;19999:6;19996:30;19993:117;;;20029:79;;:::i;:::-;19993:117;20134:78;20204:7;20195:6;20184:9;20180:22;20134:78;:::i;:::-;20124:88;;19919:303;20289:3;20278:9;20274:19;20261:33;20321:18;20313:6;20310:30;20307:117;;;20343:79;;:::i;:::-;20307:117;20448:62;20502:7;20493:6;20482:9;20478:22;20448:62;:::i;:::-;20438:72;;20232:288;19018:1509;;;;;;;;:::o;20533:115::-;20618:23;20635:5;20618:23;:::i;:::-;20613:3;20606:36;20533:115;;:::o;20654:218::-;20745:4;20783:2;20772:9;20768:18;20760:26;;20796:69;20862:1;20851:9;20847:17;20838:6;20796:69;:::i;:::-;20654:218;;;;:::o;20878:474::-;20946:6;20954;21003:2;20991:9;20982:7;20978:23;20974:32;20971:119;;;21009:79;;:::i;:::-;20971:119;21129:1;21154:53;21199:7;21190:6;21179:9;21175:22;21154:53;:::i;:::-;21144:63;;21100:117;21256:2;21282:53;21327:7;21318:6;21307:9;21303:22;21282:53;:::i;:::-;21272:63;;21227:118;20878:474;;;;;:::o;21358:1089::-;21462:6;21470;21478;21486;21494;21543:3;21531:9;21522:7;21518:23;21514:33;21511:120;;;21550:79;;:::i;:::-;21511:120;21670:1;21695:53;21740:7;21731:6;21720:9;21716:22;21695:53;:::i;:::-;21685:63;;21641:117;21797:2;21823:53;21868:7;21859:6;21848:9;21844:22;21823:53;:::i;:::-;21813:63;;21768:118;21925:2;21951:53;21996:7;21987:6;21976:9;21972:22;21951:53;:::i;:::-;21941:63;;21896:118;22053:2;22079:53;22124:7;22115:6;22104:9;22100:22;22079:53;:::i;:::-;22069:63;;22024:118;22209:3;22198:9;22194:19;22181:33;22241:18;22233:6;22230:30;22227:117;;;22263:79;;:::i;:::-;22227:117;22368:62;22422:7;22413:6;22402:9;22398:22;22368:62;:::i;:::-;22358:72;;22152:288;21358:1089;;;;;;;;:::o;22453:180::-;22501:77;22498:1;22491:88;22598:4;22595:1;22588:15;22622:4;22619:1;22612:15;22639:320;22683:6;22720:1;22714:4;22710:12;22700:22;;22767:1;22761:4;22757:12;22788:18;22778:81;;22844:4;22836:6;22832:17;22822:27;;22778:81;22906:2;22898:6;22895:14;22875:18;22872:38;22869:84;;22925:18;;:::i;:::-;22869:84;22690:269;22639:320;;;:::o;22965:220::-;23105:34;23101:1;23093:6;23089:14;23082:58;23174:3;23169:2;23161:6;23157:15;23150:28;22965:220;:::o;23191:366::-;23333:3;23354:67;23418:2;23413:3;23354:67;:::i;:::-;23347:74;;23430:93;23519:3;23430:93;:::i;:::-;23548:2;23543:3;23539:12;23532:19;;23191:366;;;:::o;23563:419::-;23729:4;23767:2;23756:9;23752:18;23744:26;;23816:9;23810:4;23806:20;23802:1;23791:9;23787:17;23780:47;23844:131;23970:4;23844:131;:::i;:::-;23836:139;;23563:419;;;:::o;23988:249::-;24128:34;24124:1;24116:6;24112:14;24105:58;24197:32;24192:2;24184:6;24180:15;24173:57;23988:249;:::o;24243:366::-;24385:3;24406:67;24470:2;24465:3;24406:67;:::i;:::-;24399:74;;24482:93;24571:3;24482:93;:::i;:::-;24600:2;24595:3;24591:12;24584:19;;24243:366;;;:::o;24615:419::-;24781:4;24819:2;24808:9;24804:18;24796:26;;24868:9;24862:4;24858:20;24854:1;24843:9;24839:17;24832:47;24896:131;25022:4;24896:131;:::i;:::-;24888:139;;24615:419;;;:::o;25040:233::-;25180:34;25176:1;25168:6;25164:14;25157:58;25249:16;25244:2;25236:6;25232:15;25225:41;25040:233;:::o;25279:366::-;25421:3;25442:67;25506:2;25501:3;25442:67;:::i;:::-;25435:74;;25518:93;25607:3;25518:93;:::i;:::-;25636:2;25631:3;25627:12;25620:19;;25279:366;;;:::o;25651:419::-;25817:4;25855:2;25844:9;25840:18;25832:26;;25904:9;25898:4;25894:20;25890:1;25879:9;25875:17;25868:47;25932:131;26058:4;25932:131;:::i;:::-;25924:139;;25651:419;;;:::o;26076:180::-;26124:77;26121:1;26114:88;26221:4;26218:1;26211:15;26245:4;26242:1;26235:15;26262:410;26302:7;26325:20;26343:1;26325:20;:::i;:::-;26320:25;;26359:20;26377:1;26359:20;:::i;:::-;26354:25;;26414:1;26411;26407:9;26436:30;26454:11;26436:30;:::i;:::-;26425:41;;26615:1;26606:7;26602:15;26599:1;26596:22;26576:1;26569:9;26549:83;26526:139;;26645:18;;:::i;:::-;26526:139;26310:362;26262:410;;;;:::o;26678:180::-;26726:77;26723:1;26716:88;26823:4;26820:1;26813:15;26847:4;26844:1;26837:15;26864:185;26904:1;26921:20;26939:1;26921:20;:::i;:::-;26916:25;;26955:20;26973:1;26955:20;:::i;:::-;26950:25;;26994:1;26984:35;;26999:18;;:::i;:::-;26984:35;27041:1;27038;27034:9;27029:14;;26864:185;;;;:::o;27055:230::-;27195:34;27191:1;27183:6;27179:14;27172:58;27264:13;27259:2;27251:6;27247:15;27240:38;27055:230;:::o;27291:366::-;27433:3;27454:67;27518:2;27513:3;27454:67;:::i;:::-;27447:74;;27530:93;27619:3;27530:93;:::i;:::-;27648:2;27643:3;27639:12;27632:19;;27291:366;;;:::o;27663:419::-;27829:4;27867:2;27856:9;27852:18;27844:26;;27916:9;27910:4;27906:20;27902:1;27891:9;27887:17;27880:47;27944:131;28070:4;27944:131;:::i;:::-;27936:139;;27663:419;;;:::o;28088:234::-;28228:34;28224:1;28216:6;28212:14;28205:58;28297:17;28292:2;28284:6;28280:15;28273:42;28088:234;:::o;28328:366::-;28470:3;28491:67;28555:2;28550:3;28491:67;:::i;:::-;28484:74;;28567:93;28656:3;28567:93;:::i;:::-;28685:2;28680:3;28676:12;28669:19;;28328:366;;;:::o;28700:419::-;28866:4;28904:2;28893:9;28889:18;28881:26;;28953:9;28947:4;28943:20;28939:1;28928:9;28924:17;28917:47;28981:131;29107:4;28981:131;:::i;:::-;28973:139;;28700:419;;;:::o;29125:233::-;29164:3;29187:24;29205:5;29187:24;:::i;:::-;29178:33;;29233:66;29226:5;29223:77;29220:103;;29303:18;;:::i;:::-;29220:103;29350:1;29343:5;29339:13;29332:20;;29125:233;;;:::o;29364:171::-;29504:23;29500:1;29492:6;29488:14;29481:47;29364:171;:::o;29541:366::-;29683:3;29704:67;29768:2;29763:3;29704:67;:::i;:::-;29697:74;;29780:93;29869:3;29780:93;:::i;:::-;29898:2;29893:3;29889:12;29882:19;;29541:366;;;:::o;29913:419::-;30079:4;30117:2;30106:9;30102:18;30094:26;;30166:9;30160:4;30156:20;30152:1;30141:9;30137:17;30130:47;30194:131;30320:4;30194:131;:::i;:::-;30186:139;;29913:419;;;:::o;30338:171::-;30478:23;30474:1;30466:6;30462:14;30455:47;30338:171;:::o;30515:366::-;30657:3;30678:67;30742:2;30737:3;30678:67;:::i;:::-;30671:74;;30754:93;30843:3;30754:93;:::i;:::-;30872:2;30867:3;30863:12;30856:19;;30515:366;;;:::o;30887:419::-;31053:4;31091:2;31080:9;31076:18;31068:26;;31140:9;31134:4;31130:20;31126:1;31115:9;31111:17;31104:47;31168:131;31294:4;31168:131;:::i;:::-;31160:139;;30887:419;;;:::o;31312:231::-;31452:34;31448:1;31440:6;31436:14;31429:58;31521:14;31516:2;31508:6;31504:15;31497:39;31312:231;:::o;31549:366::-;31691:3;31712:67;31776:2;31771:3;31712:67;:::i;:::-;31705:74;;31788:93;31877:3;31788:93;:::i;:::-;31906:2;31901:3;31897:12;31890:19;;31549:366;;;:::o;31921:419::-;32087:4;32125:2;32114:9;32110:18;32102:26;;32174:9;32168:4;32164:20;32160:1;32149:9;32145:17;32138:47;32202:131;32328:4;32202:131;:::i;:::-;32194:139;;31921:419;;;:::o;32346:180::-;32394:77;32391:1;32384:88;32491:4;32488:1;32481:15;32515:4;32512:1;32505:15;32532:174;32672:26;32668:1;32660:6;32656:14;32649:50;32532:174;:::o;32712:366::-;32854:3;32875:67;32939:2;32934:3;32875:67;:::i;:::-;32868:74;;32951:93;33040:3;32951:93;:::i;:::-;33069:2;33064:3;33060:12;33053:19;;32712:366;;;:::o;33084:419::-;33250:4;33288:2;33277:9;33273:18;33265:26;;33337:9;33331:4;33327:20;33323:1;33312:9;33308:17;33301:47;33365:131;33491:4;33365:131;:::i;:::-;33357:139;;33084:419;;;:::o;33509:228::-;33649:34;33645:1;33637:6;33633:14;33626:58;33718:11;33713:2;33705:6;33701:15;33694:36;33509:228;:::o;33743:366::-;33885:3;33906:67;33970:2;33965:3;33906:67;:::i;:::-;33899:74;;33982:93;34071:3;33982:93;:::i;:::-;34100:2;34095:3;34091:12;34084:19;;33743:366;;;:::o;34115:419::-;34281:4;34319:2;34308:9;34304:18;34296:26;;34368:9;34362:4;34358:20;34354:1;34343:9;34339:17;34332:47;34396:131;34522:4;34396:131;:::i;:::-;34388:139;;34115:419;;;:::o;34540:165::-;34680:17;34676:1;34668:6;34664:14;34657:41;34540:165;:::o;34711:366::-;34853:3;34874:67;34938:2;34933:3;34874:67;:::i;:::-;34867:74;;34950:93;35039:3;34950:93;:::i;:::-;35068:2;35063:3;35059:12;35052:19;;34711:366;;;:::o;35083:419::-;35249:4;35287:2;35276:9;35272:18;35264:26;;35336:9;35330:4;35326:20;35322:1;35311:9;35307:17;35300:47;35364:131;35490:4;35364:131;:::i;:::-;35356:139;;35083:419;;;:::o;35508:167::-;35648:19;35644:1;35636:6;35632:14;35625:43;35508:167;:::o;35681:366::-;35823:3;35844:67;35908:2;35903:3;35844:67;:::i;:::-;35837:74;;35920:93;36009:3;35920:93;:::i;:::-;36038:2;36033:3;36029:12;36022:19;;35681:366;;;:::o;36053:419::-;36219:4;36257:2;36246:9;36242:18;36234:26;;36306:9;36300:4;36296:20;36292:1;36281:9;36277:17;36270:47;36334:131;36460:4;36334:131;:::i;:::-;36326:139;;36053:419;;;:::o;36478:191::-;36518:3;36537:20;36555:1;36537:20;:::i;:::-;36532:25;;36571:20;36589:1;36571:20;:::i;:::-;36566:25;;36614:1;36611;36607:9;36600:16;;36635:3;36632:1;36629:10;36626:36;;;36642:18;;:::i;:::-;36626:36;36478:191;;;;:::o;36675:171::-;36815:23;36811:1;36803:6;36799:14;36792:47;36675:171;:::o;36852:366::-;36994:3;37015:67;37079:2;37074:3;37015:67;:::i;:::-;37008:74;;37091:93;37180:3;37091:93;:::i;:::-;37209:2;37204:3;37200:12;37193:19;;36852:366;;;:::o;37224:419::-;37390:4;37428:2;37417:9;37413:18;37405:26;;37477:9;37471:4;37467:20;37463:1;37452:9;37448:17;37441:47;37505:131;37631:4;37505:131;:::i;:::-;37497:139;;37224:419;;;:::o;37649:148::-;37751:11;37788:3;37773:18;;37649:148;;;;:::o;37803:390::-;37909:3;37937:39;37970:5;37937:39;:::i;:::-;37992:89;38074:6;38069:3;37992:89;:::i;:::-;37985:96;;38090:65;38148:6;38143:3;38136:4;38129:5;38125:16;38090:65;:::i;:::-;38180:6;38175:3;38171:16;38164:23;;37913:280;37803:390;;;;:::o;38199:435::-;38379:3;38401:95;38492:3;38483:6;38401:95;:::i;:::-;38394:102;;38513:95;38604:3;38595:6;38513:95;:::i;:::-;38506:102;;38625:3;38618:10;;38199:435;;;;;:::o;38640:141::-;38689:4;38712:3;38704:11;;38735:3;38732:1;38725:14;38769:4;38766:1;38756:18;38748:26;;38640:141;;;:::o;38787:93::-;38824:6;38871:2;38866;38859:5;38855:14;38851:23;38841:33;;38787:93;;;:::o;38886:107::-;38930:8;38980:5;38974:4;38970:16;38949:37;;38886:107;;;;:::o;38999:393::-;39068:6;39118:1;39106:10;39102:18;39141:97;39171:66;39160:9;39141:97;:::i;:::-;39259:39;39289:8;39278:9;39259:39;:::i;:::-;39247:51;;39331:4;39327:9;39320:5;39316:21;39307:30;;39380:4;39370:8;39366:19;39359:5;39356:30;39346:40;;39075:317;;38999:393;;;;;:::o;39398:60::-;39426:3;39447:5;39440:12;;39398:60;;;:::o;39464:142::-;39514:9;39547:53;39565:34;39574:24;39592:5;39574:24;:::i;:::-;39565:34;:::i;:::-;39547:53;:::i;:::-;39534:66;;39464:142;;;:::o;39612:75::-;39655:3;39676:5;39669:12;;39612:75;;;:::o;39693:269::-;39803:39;39834:7;39803:39;:::i;:::-;39864:91;39913:41;39937:16;39913:41;:::i;:::-;39905:6;39898:4;39892:11;39864:91;:::i;:::-;39858:4;39851:105;39769:193;39693:269;;;:::o;39968:73::-;40013:3;39968:73;:::o;40047:189::-;40124:32;;:::i;:::-;40165:65;40223:6;40215;40209:4;40165:65;:::i;:::-;40100:136;40047:189;;:::o;40242:186::-;40302:120;40319:3;40312:5;40309:14;40302:120;;;40373:39;40410:1;40403:5;40373:39;:::i;:::-;40346:1;40339:5;40335:13;40326:22;;40302:120;;;40242:186;;:::o;40434:543::-;40535:2;40530:3;40527:11;40524:446;;;40569:38;40601:5;40569:38;:::i;:::-;40653:29;40671:10;40653:29;:::i;:::-;40643:8;40639:44;40836:2;40824:10;40821:18;40818:49;;;40857:8;40842:23;;40818:49;40880:80;40936:22;40954:3;40936:22;:::i;:::-;40926:8;40922:37;40909:11;40880:80;:::i;:::-;40539:431;;40524:446;40434:543;;;:::o;40983:117::-;41037:8;41087:5;41081:4;41077:16;41056:37;;40983:117;;;;:::o;41106:169::-;41150:6;41183:51;41231:1;41227:6;41219:5;41216:1;41212:13;41183:51;:::i;:::-;41179:56;41264:4;41258;41254:15;41244:25;;41157:118;41106:169;;;;:::o;41280:295::-;41356:4;41502:29;41527:3;41521:4;41502:29;:::i;:::-;41494:37;;41564:3;41561:1;41557:11;41551:4;41548:21;41540:29;;41280:295;;;;:::o;41580:1395::-;41697:37;41730:3;41697:37;:::i;:::-;41799:18;41791:6;41788:30;41785:56;;;41821:18;;:::i;:::-;41785:56;41865:38;41897:4;41891:11;41865:38;:::i;:::-;41950:67;42010:6;42002;41996:4;41950:67;:::i;:::-;42044:1;42068:4;42055:17;;42100:2;42092:6;42089:14;42117:1;42112:618;;;;42774:1;42791:6;42788:77;;;42840:9;42835:3;42831:19;42825:26;42816:35;;42788:77;42891:67;42951:6;42944:5;42891:67;:::i;:::-;42885:4;42878:81;42747:222;42082:887;;42112:618;42164:4;42160:9;42152:6;42148:22;42198:37;42230:4;42198:37;:::i;:::-;42257:1;42271:208;42285:7;42282:1;42279:14;42271:208;;;42364:9;42359:3;42355:19;42349:26;42341:6;42334:42;42415:1;42407:6;42403:14;42393:24;;42462:2;42451:9;42447:18;42434:31;;42308:4;42305:1;42301:12;42296:17;;42271:208;;;42507:6;42498:7;42495:19;42492:179;;;42565:9;42560:3;42556:19;42550:26;42608:48;42650:4;42642:6;42638:17;42627:9;42608:48;:::i;:::-;42600:6;42593:64;42515:156;42492:179;42717:1;42713;42705:6;42701:14;42697:22;42691:4;42684:36;42119:611;;;42082:887;;41672:1303;;;41580:1395;;:::o;42981:229::-;43121:34;43117:1;43109:6;43105:14;43098:58;43190:12;43185:2;43177:6;43173:15;43166:37;42981:229;:::o;43216:366::-;43358:3;43379:67;43443:2;43438:3;43379:67;:::i;:::-;43372:74;;43455:93;43544:3;43455:93;:::i;:::-;43573:2;43568:3;43564:12;43557:19;;43216:366;;;:::o;43588:419::-;43754:4;43792:2;43781:9;43777:18;43769:26;;43841:9;43835:4;43831:20;43827:1;43816:9;43812:17;43805:47;43869:131;43995:4;43869:131;:::i;:::-;43861:139;;43588:419;;;:::o;44013:175::-;44153:27;44149:1;44141:6;44137:14;44130:51;44013:175;:::o;44194:366::-;44336:3;44357:67;44421:2;44416:3;44357:67;:::i;:::-;44350:74;;44433:93;44522:3;44433:93;:::i;:::-;44551:2;44546:3;44542:12;44535:19;;44194:366;;;:::o;44566:419::-;44732:4;44770:2;44759:9;44755:18;44747:26;;44819:9;44813:4;44809:20;44805:1;44794:9;44790:17;44783:47;44847:131;44973:4;44847:131;:::i;:::-;44839:139;;44566:419;;;:::o;44991:175::-;45131:27;45127:1;45119:6;45115:14;45108:51;44991:175;:::o;45172:366::-;45314:3;45335:67;45399:2;45394:3;45335:67;:::i;:::-;45328:74;;45411:93;45500:3;45411:93;:::i;:::-;45529:2;45524:3;45520:12;45513:19;;45172:366;;;:::o;45544:419::-;45710:4;45748:2;45737:9;45733:18;45725:26;;45797:9;45791:4;45787:20;45783:1;45772:9;45768:17;45761:47;45825:131;45951:4;45825:131;:::i;:::-;45817:139;;45544:419;;;:::o;45969:237::-;46109:34;46105:1;46097:6;46093:14;46086:58;46178:20;46173:2;46165:6;46161:15;46154:45;45969:237;:::o;46212:366::-;46354:3;46375:67;46439:2;46434:3;46375:67;:::i;:::-;46368:74;;46451:93;46540:3;46451:93;:::i;:::-;46569:2;46564:3;46560:12;46553:19;;46212:366;;;:::o;46584:419::-;46750:4;46788:2;46777:9;46773:18;46765:26;;46837:9;46831:4;46827:20;46823:1;46812:9;46808:17;46801:47;46865:131;46991:4;46865:131;:::i;:::-;46857:139;;46584:419;;;:::o;47009:194::-;47049:4;47069:20;47087:1;47069:20;:::i;:::-;47064:25;;47103:20;47121:1;47103:20;:::i;:::-;47098:25;;47147:1;47144;47140:9;47132:17;;47171:1;47165:4;47162:11;47159:37;;;47176:18;;:::i;:::-;47159:37;47009:194;;;;:::o;47209:176::-;47241:1;47258:20;47276:1;47258:20;:::i;:::-;47253:25;;47292:20;47310:1;47292:20;:::i;:::-;47287:25;;47331:1;47321:35;;47336:18;;:::i;:::-;47321:35;47377:1;47374;47370:9;47365:14;;47209:176;;;;:::o;47391:224::-;47531:34;47527:1;47519:6;47515:14;47508:58;47600:7;47595:2;47587:6;47583:15;47576:32;47391:224;:::o;47621:366::-;47763:3;47784:67;47848:2;47843:3;47784:67;:::i;:::-;47777:74;;47860:93;47949:3;47860:93;:::i;:::-;47978:2;47973:3;47969:12;47962:19;;47621:366;;;:::o;47993:419::-;48159:4;48197:2;48186:9;48182:18;48174:26;;48246:9;48240:4;48236:20;48232:1;48221:9;48217:17;48210:47;48274:131;48400:4;48274:131;:::i;:::-;48266:139;;47993:419;;;:::o;48418:223::-;48558:34;48554:1;48546:6;48542:14;48535:58;48627:6;48622:2;48614:6;48610:15;48603:31;48418:223;:::o;48647:366::-;48789:3;48810:67;48874:2;48869:3;48810:67;:::i;:::-;48803:74;;48886:93;48975:3;48886:93;:::i;:::-;49004:2;48999:3;48995:12;48988:19;;48647:366;;;:::o;49019:419::-;49185:4;49223:2;49212:9;49208:18;49200:26;;49272:9;49266:4;49262:20;49258:1;49247:9;49243:17;49236:47;49300:131;49426:4;49300:131;:::i;:::-;49292:139;;49019:419;;;:::o;49444:173::-;49584:25;49580:1;49572:6;49568:14;49561:49;49444:173;:::o;49623:402::-;49783:3;49804:85;49886:2;49881:3;49804:85;:::i;:::-;49797:92;;49898:93;49987:3;49898:93;:::i;:::-;50016:2;50011:3;50007:12;50000:19;;49623:402;;;:::o;50031:167::-;50171:19;50167:1;50159:6;50155:14;50148:43;50031:167;:::o;50204:402::-;50364:3;50385:85;50467:2;50462:3;50385:85;:::i;:::-;50378:92;;50479:93;50568:3;50479:93;:::i;:::-;50597:2;50592:3;50588:12;50581:19;;50204:402;;;:::o;50612:967::-;50994:3;51016:148;51160:3;51016:148;:::i;:::-;51009:155;;51181:95;51272:3;51263:6;51181:95;:::i;:::-;51174:102;;51293:148;51437:3;51293:148;:::i;:::-;51286:155;;51458:95;51549:3;51540:6;51458:95;:::i;:::-;51451:102;;51570:3;51563:10;;50612:967;;;;;:::o;51585:170::-;51725:22;51721:1;51713:6;51709:14;51702:46;51585:170;:::o;51761:366::-;51903:3;51924:67;51988:2;51983:3;51924:67;:::i;:::-;51917:74;;52000:93;52089:3;52000:93;:::i;:::-;52118:2;52113:3;52109:12;52102:19;;51761:366;;;:::o;52133:419::-;52299:4;52337:2;52326:9;52322:18;52314:26;;52386:9;52380:4;52376:20;52372:1;52361:9;52357:17;52350:47;52414:131;52540:4;52414:131;:::i;:::-;52406:139;;52133:419;;;:::o;52558:166::-;52698:18;52694:1;52686:6;52682:14;52675:42;52558:166;:::o;52730:366::-;52872:3;52893:67;52957:2;52952:3;52893:67;:::i;:::-;52886:74;;52969:93;53058:3;52969:93;:::i;:::-;53087:2;53082:3;53078:12;53071:19;;52730:366;;;:::o;53102:419::-;53268:4;53306:2;53295:9;53291:18;53283:26;;53355:9;53349:4;53345:20;53341:1;53330:9;53326:17;53319:47;53383:131;53509:4;53383:131;:::i;:::-;53375:139;;53102:419;;;:::o;53527:98::-;53578:6;53612:5;53606:12;53596:22;;53527:98;;;:::o;53631:168::-;53714:11;53748:6;53743:3;53736:19;53788:4;53783:3;53779:14;53764:29;;53631:168;;;;:::o;53805:373::-;53891:3;53919:38;53951:5;53919:38;:::i;:::-;53973:70;54036:6;54031:3;53973:70;:::i;:::-;53966:77;;54052:65;54110:6;54105:3;54098:4;54091:5;54087:16;54052:65;:::i;:::-;54142:29;54164:6;54142:29;:::i;:::-;54137:3;54133:39;54126:46;;53895:283;53805:373;;;;:::o;54184:640::-;54379:4;54417:3;54406:9;54402:19;54394:27;;54431:71;54499:1;54488:9;54484:17;54475:6;54431:71;:::i;:::-;54512:72;54580:2;54569:9;54565:18;54556:6;54512:72;:::i;:::-;54594;54662:2;54651:9;54647:18;54638:6;54594:72;:::i;:::-;54713:9;54707:4;54703:20;54698:2;54687:9;54683:18;54676:48;54741:76;54812:4;54803:6;54741:76;:::i;:::-;54733:84;;54184:640;;;;;;;:::o;54830:141::-;54886:5;54917:6;54911:13;54902:22;;54933:32;54959:5;54933:32;:::i;:::-;54830:141;;;;:::o;54977:349::-;55046:6;55095:2;55083:9;55074:7;55070:23;55066:32;55063:119;;;55101:79;;:::i;:::-;55063:119;55221:1;55246:63;55301:7;55292:6;55281:9;55277:22;55246:63;:::i;:::-;55236:73;;55192:127;54977:349;;;;:::o;55332:171::-;55371:3;55394:24;55412:5;55394:24;:::i;:::-;55385:33;;55440:4;55433:5;55430:15;55427:41;;55448:18;;:::i;:::-;55427:41;55495:1;55488:5;55484:13;55477:20;;55332:171;;;:::o;55509:182::-;55649:34;55645:1;55637:6;55633:14;55626:58;55509:182;:::o;55697:366::-;55839:3;55860:67;55924:2;55919:3;55860:67;:::i;:::-;55853:74;;55936:93;56025:3;55936:93;:::i;:::-;56054:2;56049:3;56045:12;56038:19;;55697:366;;;:::o;56069:419::-;56235:4;56273:2;56262:9;56258:18;56250:26;;56322:9;56316:4;56312:20;56308:1;56297:9;56293:17;56286:47;56350:131;56476:4;56350:131;:::i;:::-;56342:139;;56069:419;;;:::o;56494:169::-;56634:21;56630:1;56622:6;56618:14;56611:45;56494:169;:::o;56669:366::-;56811:3;56832:67;56896:2;56891:3;56832:67;:::i;:::-;56825:74;;56908:93;56997:3;56908:93;:::i;:::-;57026:2;57021:3;57017:12;57010:19;;56669:366;;;:::o;57041:419::-;57207:4;57245:2;57234:9;57230:18;57222:26;;57294:9;57288:4;57284:20;57280:1;57269:9;57265:17;57258:47;57322:131;57448:4;57322:131;:::i;:::-;57314:139;;57041:419;;;:::o;57466:180::-;57514:77;57511:1;57504:88;57611:4;57608:1;57601:15;57635:4;57632:1;57625:15;57652:182;57792:34;57788:1;57780:6;57776:14;57769:58;57652:182;:::o;57840:366::-;57982:3;58003:67;58067:2;58062:3;58003:67;:::i;:::-;57996:74;;58079:93;58168:3;58079:93;:::i;:::-;58197:2;58192:3;58188:12;58181:19;;57840:366;;;:::o;58212:419::-;58378:4;58416:2;58405:9;58401:18;58393:26;;58465:9;58459:4;58455:20;58451:1;58440:9;58436:17;58429:47;58493:131;58619:4;58493:131;:::i;:::-;58485:139;;58212:419;;;:::o;58637:178::-;58777:30;58773:1;58765:6;58761:14;58754:54;58637:178;:::o;58821:366::-;58963:3;58984:67;59048:2;59043:3;58984:67;:::i;:::-;58977:74;;59060:93;59149:3;59060:93;:::i;:::-;59178:2;59173:3;59169:12;59162:19;;58821:366;;;:::o;59193:419::-;59359:4;59397:2;59386:9;59382:18;59374:26;;59446:9;59440:4;59436:20;59432:1;59421:9;59417:17;59410:47;59474:131;59600:4;59474:131;:::i;:::-;59466:139;;59193:419;;;:::o

Swarm Source

ipfs://03811144d4079ca6afdefc8f4fd5ded4872a6accc3421f3572f0645ee0484e64
Loading