Token Sanctum Pawn

 

Overview ERC-721

Total Supply:
0 PAWN

Holders:
404 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
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Pawn

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (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`, 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 be 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.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: balance query for the zero address");
        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: owner query for nonexistent token");
        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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 overriden 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        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: transfer caller is not 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: transfer caller is not 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) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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 a {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 a {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 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 {
                    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/ERC721/extensions/ERC721Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: Pawn.sol


pragma solidity ^0.8.0;








contract Pawn is ERC721URIStorage, AccessControl, Ownable, Pausable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    using Counters for Counters.Counter;
    Counters.Counter public _tokenIdCounter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER");
    bytes32 public constant BURNER_ROLE = keccak256("BURNER");
    bytes32 public constant URL_CONTROLLER_ROLE = keccak256("URLCONTROLLER");

    constructor() ERC721("Sanctum Pawn", "PAWN") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    function mint(address to) public whenNotPaused returns (uint256) {
        require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this");
        _safeMint(to, _tokenIdCounter.current());

        _tokenIdCounter.increment();

        return _tokenIdCounter.current();
    }

    function mint_id(address to, uint id) public whenNotPaused returns(uint256) {
        require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this");
        _safeMint(to, id);

        _tokenIdCounter.increment();

        return id;
    }

    function mint_url(address to, string memory _tokenUrl) public whenNotPaused returns (uint256) {
        require(hasRole(MINTER_ROLE, msg.sender), "Only Minter can do this");
        _safeMint(to, _tokenIdCounter.current());
        _setTokenURI(_tokenIdCounter.current(), _tokenUrl);

        _tokenIdCounter.increment();

        return _tokenIdCounter.current();
    }

    function burn(uint256 tokenId) public whenNotPaused {
        require(hasRole(BURNER_ROLE, msg.sender), "Only Burner can do this");

        _burn(tokenId);
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI) public whenNotPaused {
        require(hasRole(URL_CONTROLLER_ROLE, msg.sender), "Only Url Controller can do this");

        _setTokenURI(tokenId, _tokenURI);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URL_CONTROLLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"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":"burn","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":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mint_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"_tokenUrl","type":"string"}],"name":"mint_url","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f53616e6374756d205061776e00000000000000000000000000000000000000008152506040518060400160405280600481526020017f5041574e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000349565b508060019080519060200190620000af92919062000349565b505050620000d2620000c66200010860201b60201c565b6200011060201b60201c565b6000600860146101000a81548160ff021916908315150217905550620001026000801b33620001d660201b60201c565b6200045e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001e88282620001ec60201b60201c565b5050565b620001fe8282620002de60201b60201c565b620002da5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200027f6200010860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003579062000428565b90600052602060002090601f0160209004810192826200037b5760008555620003c7565b82601f106200039657805160ff1916838001178555620003c7565b82800160010185558215620003c7579182015b82811115620003c6578251825591602001919060010190620003a9565b5b509050620003d69190620003da565b5090565b5b80821115620003f5576000816000905550600101620003db565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044157607f821691505b60208210811415620004585762000457620003f9565b5b50919050565b6147af806200046e6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a578063a217fddf116100ad578063c87b56dd1161007c578063c87b56dd146105c5578063d5391393146105f5578063d547741f14610613578063e985e9c51461062f578063f2fde38b1461065f57610206565b8063a217fddf1461053f578063a22cb4651461055d578063b604149414610579578063b88d4fde146105a957610206565b80638da5cb5b116100e95780638da5cb5b146104b55780638fbddc10146104d357806391d14854146104f157806395d89b411461052157610206565b806370a0823114610453578063715018a6146104835780638456cb591461048d57806384c4bd4b1461049757610206565b80632f2ff15d1161019d57806342966c681161016c57806342966c68146103895780635c975abb146103a55780636352211e146103c35780636a627842146103f35780636e0710571461042357610206565b80632f2ff15d1461032b57806336568abe146103475780633f4ba83a1461036357806342842e0e1461036d57610206565b8063162094c4116101d9578063162094c4146102a557806323b872dd146102c1578063248a9ca3146102dd578063282c51f31461030d57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190612e7a565b61067b565b6040516102329190612ec2565b60405180910390f35b61024361068d565b6040516102509190612f76565b60405180910390f35b610273600480360381019061026e9190612fce565b61071f565b604051610280919061303c565b60405180910390f35b6102a3600480360381019061029e9190613083565b6107a4565b005b6102bf60048036038101906102ba91906131f8565b6108bc565b005b6102db60048036038101906102d69190613254565b61097b565b005b6102f760048036038101906102f291906132dd565b6109db565b6040516103049190613319565b60405180910390f35b6103156109fb565b6040516103229190613319565b60405180910390f35b61034560048036038101906103409190613334565b610a1f565b005b610361600480360381019061035c9190613334565b610a48565b005b61036b610acb565b005b61038760048036038101906103829190613254565b610b51565b005b6103a3600480360381019061039e9190612fce565b610b71565b005b6103ad610c2e565b6040516103ba9190612ec2565b60405180910390f35b6103dd60048036038101906103d89190612fce565b610c45565b6040516103ea919061303c565b60405180910390f35b61040d60048036038101906104089190613374565b610cf7565b60405161041a91906133b0565b60405180910390f35b61043d600480360381019061043891906133cb565b610dd8565b60405161044a91906133b0565b60405180910390f35b61046d60048036038101906104689190613374565b610ecd565b60405161047a91906133b0565b60405180910390f35b61048b610f85565b005b61049561100d565b005b61049f611093565b6040516104ac91906133b0565b60405180910390f35b6104bd61109f565b6040516104ca919061303c565b60405180910390f35b6104db6110c9565b6040516104e89190613319565b60405180910390f35b61050b60048036038101906105069190613334565b6110ed565b6040516105189190612ec2565b60405180910390f35b610529611158565b6040516105369190612f76565b60405180910390f35b6105476111ea565b6040516105549190613319565b60405180910390f35b61057760048036038101906105729190613453565b6111f1565b005b610593600480360381019061058e9190613083565b611207565b6040516105a091906133b0565b60405180910390f35b6105c360048036038101906105be9190613534565b6112d7565b005b6105df60048036038101906105da9190612fce565b611339565b6040516105ec9190612f76565b60405180910390f35b6105fd61148b565b60405161060a9190613319565b60405180910390f35b61062d60048036038101906106289190613334565b6114af565b005b610649600480360381019061064491906135b7565b6114d8565b6040516106569190612ec2565b60405180910390f35b61067960048036038101906106749190613374565b61156c565b005b600061068682611664565b9050919050565b60606000805461069c90613626565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890613626565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b5050505050905090565b600061072a826116de565b610769576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610760906136ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107af82610c45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061375c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083f61174a565b73ffffffffffffffffffffffffffffffffffffffff16148061086e575061086d8161086861174a565b6114d8565b5b6108ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a4906137ee565b60405180910390fd5b6108b78383611752565b505050565b6108c4610c2e565b15610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb9061385a565b60405180910390fd5b61092e7f134e1fb76e73429d75cabe756bf2a05412dc20ce0a9b6472d31f47cd7683aa36336110ed565b61096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906138c6565b60405180910390fd5b610977828261180b565b5050565b61098c61098661174a565b8261187f565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613958565b60405180910390fd5b6109d683838361195d565b505050565b600060076000838152602001908152602001600020600101549050919050565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610a28826109db565b610a3981610a3461174a565b611bc4565b610a438383611c61565b505050565b610a5061174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab4906139ea565b60405180910390fd5b610ac78282611d42565b5050565b610ad361174a565b73ffffffffffffffffffffffffffffffffffffffff16610af161109f565b73ffffffffffffffffffffffffffffffffffffffff1614610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e90613a56565b60405180910390fd5b610b4f611e24565b565b610b6c838383604051806020016040528060008152506112d7565b505050565b610b79610c2e565b15610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061385a565b60405180910390fd5b610be37f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336110ed565b610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613ac2565b60405180910390fd5b610c2b81611ec6565b50565b6000600860149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590613b54565b60405180910390fd5b80915050919050565b6000610d01610c2e565b15610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061385a565b60405180910390fd5b610d6b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190613bc0565b60405180910390fd5b610dbd82610db86009611f19565b611f27565b610dc76009611f45565b610dd16009611f19565b9050919050565b6000610de2610c2e565b15610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e199061385a565b60405180910390fd5b610e4c7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613bc0565b60405180910390fd5b610e9e83610e996009611f19565b611f27565b610eb1610eab6009611f19565b8361180b565b610ebb6009611f45565b610ec56009611f19565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613c52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8d61174a565b73ffffffffffffffffffffffffffffffffffffffff16610fab61109f565b73ffffffffffffffffffffffffffffffffffffffff1614611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890613a56565b60405180910390fd5b61100b6000611f5b565b565b61101561174a565b73ffffffffffffffffffffffffffffffffffffffff1661103361109f565b73ffffffffffffffffffffffffffffffffffffffff1614611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090613a56565b60405180910390fd5b611091612021565b565b60098060000154905081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f134e1fb76e73429d75cabe756bf2a05412dc20ce0a9b6472d31f47cd7683aa3681565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461116790613626565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613626565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6000801b81565b6112036111fc61174a565b83836120c4565b5050565b6000611211610c2e565b15611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061385a565b60405180910390fd5b61127b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336110ed565b6112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190613bc0565b60405180910390fd5b6112c48383611f27565b6112ce6009611f45565b81905092915050565b6112e86112e261174a565b8361187f565b611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613958565b60405180910390fd5b61133384848484612231565b50505050565b6060611344826116de565b611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613ce4565b60405180910390fd5b60006006600084815260200190815260200160002080546113a390613626565b80601f01602080910402602001604051908101604052809291908181526020018280546113cf90613626565b801561141c5780601f106113f15761010080835404028352916020019161141c565b820191906000526020600020905b8154815290600101906020018083116113ff57829003601f168201915b50505050509050600061142d61228d565b9050600081511415611443578192505050611486565b600082511115611478578082604051602001611460929190613d40565b60405160208183030381529060405292505050611486565b611481846122a4565b925050505b919050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b6114b8826109db565b6114c9816114c461174a565b611bc4565b6114d38383611d42565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61157461174a565b73ffffffffffffffffffffffffffffffffffffffff1661159261109f565b73ffffffffffffffffffffffffffffffffffffffff16146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90613a56565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90613dd6565b60405180910390fd5b61166181611f5b565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116d757506116d68261234b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117c583610c45565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611814826116de565b611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613e68565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061187a929190612d2b565b505050565b600061188a826116de565b6118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090613efa565b60405180910390fd5b60006118d483610c45565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061194357508373ffffffffffffffffffffffffffffffffffffffff1661192b8461071f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611954575061195381856114d8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197d82610c45565b73ffffffffffffffffffffffffffffffffffffffff16146119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca90613f8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a9061401e565b60405180910390fd5b611a4e83838361242d565b611a59600082611752565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa9919061406d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0091906140a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bbf838383612432565b505050565b611bce82826110ed565b611c5d57611bf38173ffffffffffffffffffffffffffffffffffffffff166014612437565b611c018360001c6020612437565b604051602001611c1292919061418f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549190612f76565b60405180910390fd5b5050565b611c6b82826110ed565b611d3e5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ce361174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611d4c82826110ed565b15611e205760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611dc561174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e2c610c2e565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290614215565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611eaf61174a565b604051611ebc919061303c565b60405180910390a1565b611ecf81612673565b6000600660008381526020019081526020016000208054611eef90613626565b905014611f1657600660008281526020019081526020016000206000611f159190612db1565b5b50565b600081600001549050919050565b611f41828260405180602001604052806000815250612790565b5050565b6001816000016000828254019250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612029610c2e565b15612069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120609061385a565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ad61174a565b6040516120ba919061303c565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a90614281565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122249190612ec2565b60405180910390a3505050565b61223c84848461195d565b612248848484846127eb565b612287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227e90614313565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606122af826116de565b6122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e5906143a5565b60405180910390fd5b60006122f861228d565b905060008151116123185760405180602001604052806000815250612343565b8061232284612973565b604051602001612333929190613d40565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612426575061242582612ad4565b5b9050919050565b505050565b505050565b60606000600283600261244a91906143c5565b61245491906140a1565b67ffffffffffffffff81111561246d5761246c6130cd565b5b6040519080825280601f01601f19166020018201604052801561249f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124d7576124d661441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061253b5761253a61441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261257b91906143c5565b61258591906140a1565b90505b6001811115612625577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125c7576125c661441f565b5b1a60f81b8282815181106125de576125dd61441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061261e9061444e565b9050612588565b5060008414612669576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612660906144c4565b60405180910390fd5b8091505092915050565b600061267e82610c45565b905061268c8160008461242d565b612697600083611752565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e7919061406d565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461278c81600084612432565b5050565b61279a8383612b3e565b6127a760008484846127eb565b6127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614313565b60405180910390fd5b505050565b600061280c8473ffffffffffffffffffffffffffffffffffffffff16612d18565b15612966578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261283561174a565b8786866040518563ffffffff1660e01b81526004016128579493929190614539565b6020604051808303816000875af192505050801561289357506040513d601f19601f82011682018060405250810190612890919061459a565b60015b612916573d80600081146128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5060008151141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590614313565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061296b565b600190505b949350505050565b606060008214156129bb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612acf565b600082905060005b600082146129ed5780806129d6906145c7565b915050600a826129e6919061463f565b91506129c3565b60008167ffffffffffffffff811115612a0957612a086130cd565b5b6040519080825280601f01601f191660200182016040528015612a3b5781602001600182028036833780820191505090505b5090505b60008514612ac857600182612a54919061406d565b9150600a85612a639190614670565b6030612a6f91906140a1565b60f81b818381518110612a8557612a8461441f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ac1919061463f565b9450612a3f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906146ed565b60405180910390fd5b612bb7816116de565b15612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90614759565b60405180910390fd5b612c036000838361242d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5391906140a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d1460008383612432565b5050565b600080823b905060008111915050919050565b828054612d3790613626565b90600052602060002090601f016020900481019282612d595760008555612da0565b82601f10612d7257805160ff1916838001178555612da0565b82800160010185558215612da0579182015b82811115612d9f578251825591602001919060010190612d84565b5b509050612dad9190612df1565b5090565b508054612dbd90613626565b6000825580601f10612dcf5750612dee565b601f016020900490600052602060002090810190612ded9190612df1565b5b50565b5b80821115612e0a576000816000905550600101612df2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5781612e22565b8114612e6257600080fd5b50565b600081359050612e7481612e4e565b92915050565b600060208284031215612e9057612e8f612e18565b5b6000612e9e84828501612e65565b91505092915050565b60008115159050919050565b612ebc81612ea7565b82525050565b6000602082019050612ed76000830184612eb3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f17578082015181840152602081019050612efc565b83811115612f26576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4882612edd565b612f528185612ee8565b9350612f62818560208601612ef9565b612f6b81612f2c565b840191505092915050565b60006020820190508181036000830152612f908184612f3d565b905092915050565b6000819050919050565b612fab81612f98565b8114612fb657600080fd5b50565b600081359050612fc881612fa2565b92915050565b600060208284031215612fe457612fe3612e18565b5b6000612ff284828501612fb9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302682612ffb565b9050919050565b6130368161301b565b82525050565b6000602082019050613051600083018461302d565b92915050565b6130608161301b565b811461306b57600080fd5b50565b60008135905061307d81613057565b92915050565b6000806040838503121561309a57613099612e18565b5b60006130a88582860161306e565b92505060206130b985828601612fb9565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310582612f2c565b810181811067ffffffffffffffff82111715613124576131236130cd565b5b80604052505050565b6000613137612e0e565b905061314382826130fc565b919050565b600067ffffffffffffffff821115613163576131626130cd565b5b61316c82612f2c565b9050602081019050919050565b82818337600083830152505050565b600061319b61319684613148565b61312d565b9050828152602081018484840111156131b7576131b66130c8565b5b6131c2848285613179565b509392505050565b600082601f8301126131df576131de6130c3565b5b81356131ef848260208601613188565b91505092915050565b6000806040838503121561320f5761320e612e18565b5b600061321d85828601612fb9565b925050602083013567ffffffffffffffff81111561323e5761323d612e1d565b5b61324a858286016131ca565b9150509250929050565b60008060006060848603121561326d5761326c612e18565b5b600061327b8682870161306e565b935050602061328c8682870161306e565b925050604061329d86828701612fb9565b9150509250925092565b6000819050919050565b6132ba816132a7565b81146132c557600080fd5b50565b6000813590506132d7816132b1565b92915050565b6000602082840312156132f3576132f2612e18565b5b6000613301848285016132c8565b91505092915050565b613313816132a7565b82525050565b600060208201905061332e600083018461330a565b92915050565b6000806040838503121561334b5761334a612e18565b5b6000613359858286016132c8565b925050602061336a8582860161306e565b9150509250929050565b60006020828403121561338a57613389612e18565b5b60006133988482850161306e565b91505092915050565b6133aa81612f98565b82525050565b60006020820190506133c560008301846133a1565b92915050565b600080604083850312156133e2576133e1612e18565b5b60006133f08582860161306e565b925050602083013567ffffffffffffffff81111561341157613410612e1d565b5b61341d858286016131ca565b9150509250929050565b61343081612ea7565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b6000806040838503121561346a57613469612e18565b5b60006134788582860161306e565b92505060206134898582860161343e565b9150509250929050565b600067ffffffffffffffff8211156134ae576134ad6130cd565b5b6134b782612f2c565b9050602081019050919050565b60006134d76134d284613493565b61312d565b9050828152602081018484840111156134f3576134f26130c8565b5b6134fe848285613179565b509392505050565b600082601f83011261351b5761351a6130c3565b5b813561352b8482602086016134c4565b91505092915050565b6000806000806080858703121561354e5761354d612e18565b5b600061355c8782880161306e565b945050602061356d8782880161306e565b935050604061357e87828801612fb9565b925050606085013567ffffffffffffffff81111561359f5761359e612e1d565b5b6135ab87828801613506565b91505092959194509250565b600080604083850312156135ce576135cd612e18565b5b60006135dc8582860161306e565b92505060206135ed8582860161306e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363e57607f821691505b60208210811415613652576136516135f7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006136b4602c83612ee8565b91506136bf82613658565b604082019050919050565b600060208201905081810360008301526136e3816136a7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613746602183612ee8565b9150613751826136ea565b604082019050919050565b6000602082019050818103600083015261377581613739565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006137d8603883612ee8565b91506137e38261377c565b604082019050919050565b60006020820190508181036000830152613807816137cb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613844601083612ee8565b915061384f8261380e565b602082019050919050565b6000602082019050818103600083015261387381613837565b9050919050565b7f4f6e6c792055726c20436f6e74726f6c6c65722063616e20646f207468697300600082015250565b60006138b0601f83612ee8565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613942603183612ee8565b915061394d826138e6565b604082019050919050565b6000602082019050818103600083015261397181613935565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006139d4602f83612ee8565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a40602083612ee8565b9150613a4b82613a0a565b602082019050919050565b60006020820190508181036000830152613a6f81613a33565b9050919050565b7f4f6e6c79204275726e65722063616e20646f2074686973000000000000000000600082015250565b6000613aac601783612ee8565b9150613ab782613a76565b602082019050919050565b60006020820190508181036000830152613adb81613a9f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613b3e602983612ee8565b9150613b4982613ae2565b604082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b7f4f6e6c79204d696e7465722063616e20646f2074686973000000000000000000600082015250565b6000613baa601783612ee8565b9150613bb582613b74565b602082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613c3c602a83612ee8565b9150613c4782613be0565b604082019050919050565b60006020820190508181036000830152613c6b81613c2f565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000613cce603183612ee8565b9150613cd982613c72565b604082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b600081905092915050565b6000613d1a82612edd565b613d248185613d04565b9350613d34818560208601612ef9565b80840191505092915050565b6000613d4c8285613d0f565b9150613d588284613d0f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dc0602683612ee8565b9150613dcb82613d64565b604082019050919050565b60006020820190508181036000830152613def81613db3565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613e52602e83612ee8565b9150613e5d82613df6565b604082019050919050565b60006020820190508181036000830152613e8181613e45565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ee4602c83612ee8565b9150613eef82613e88565b604082019050919050565b60006020820190508181036000830152613f1381613ed7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613f76602583612ee8565b9150613f8182613f1a565b604082019050919050565b60006020820190508181036000830152613fa581613f69565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614008602483612ee8565b915061401382613fac565b604082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061407882612f98565b915061408383612f98565b9250828210156140965761409561403e565b5b828203905092915050565b60006140ac82612f98565b91506140b783612f98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140ec576140eb61403e565b5b828201905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061412d601783613d04565b9150614138826140f7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614179601183613d04565b915061418482614143565b601182019050919050565b600061419a82614120565b91506141a68285613d0f565b91506141b18261416c565b91506141bd8284613d0f565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006141ff601483612ee8565b915061420a826141c9565b602082019050919050565b6000602082019050818103600083015261422e816141f2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061426b601983612ee8565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142fd603283612ee8565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061438f602f83612ee8565b915061439a82614333565b604082019050919050565b600060208201905081810360008301526143be81614382565b9050919050565b60006143d082612f98565b91506143db83612f98565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144145761441361403e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061445982612f98565b9150600082141561446d5761446c61403e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006144ae602083612ee8565b91506144b982614478565b602082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061450b826144e4565b61451581856144ef565b9350614525818560208601612ef9565b61452e81612f2c565b840191505092915050565b600060808201905061454e600083018761302d565b61455b602083018661302d565b61456860408301856133a1565b818103606083015261457a8184614500565b905095945050505050565b60008151905061459481612e4e565b92915050565b6000602082840312156145b0576145af612e18565b5b60006145be84828501614585565b91505092915050565b60006145d282612f98565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146055761460461403e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464a82612f98565b915061465583612f98565b92508261466557614664614610565b5b828204905092915050565b600061467b82612f98565b915061468683612f98565b92508261469657614695614610565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146d7602083612ee8565b91506146e2826146a1565b602082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614743601c83612ee8565b915061474e8261470d565b602082019050919050565b6000602082019050818103600083015261477281614736565b905091905056fea26469706673582212208c10d02ca6078e1dcf7163ad3773eba080539faaaf5d4d617db1624c2ff55c8764736f6c634300080b0033

Deployed ByteCode Sourcemap

54335:2166:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54410:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36607:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38166:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37689:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56124:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38916:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28379:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54748:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28772:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29820:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56433:65;;;:::i;:::-;;39326:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55950:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33069:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36301:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55007:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55564:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36031:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53454:103;;;:::i;:::-;;56364:61;;;:::i;:::-;;54636:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52803:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54812:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27248:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36776:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26339:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38459:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55303:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39582:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50247:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54684:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29164:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38685:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53712:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54410:176;54518:4;54542:36;54566:11;54542:23;:36::i;:::-;54535:43;;54410:176;;;:::o;36607:100::-;36661:13;36694:5;36687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36607:100;:::o;38166:221::-;38242:7;38270:16;38278:7;38270;:16::i;:::-;38262:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38355:15;:24;38371:7;38355:24;;;;;;;;;;;;;;;;;;;;;38348:31;;38166:221;;;:::o;37689:411::-;37770:13;37786:23;37801:7;37786:14;:23::i;:::-;37770:39;;37834:5;37828:11;;:2;:11;;;;37820:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37928:5;37912:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37937:37;37954:5;37961:12;:10;:12::i;:::-;37937:16;:37::i;:::-;37912:62;37890:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38071:21;38080:2;38084:7;38071:8;:21::i;:::-;37759:341;37689:411;;:::o;56124:232::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56227:40:::1;54858:26;56256:10;56227:7;:40::i;:::-;56219:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;56316:32;56329:7;56338:9;56316:12;:32::i;:::-;56124:232:::0;;:::o;38916:339::-;39111:41;39130:12;:10;:12::i;:::-;39144:7;39111:18;:41::i;:::-;39103:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39219:28;39229:4;39235:2;39239:7;39219:9;:28::i;:::-;38916:339;;;:::o;28379:131::-;28453:7;28480:6;:12;28487:4;28480:12;;;;;;;;;;;:22;;;28473:29;;28379:131;;;:::o;54748:57::-;54786:19;54748:57;:::o;28772:147::-;28855:18;28868:4;28855:12;:18::i;:::-;26830:30;26841:4;26847:12;:10;:12::i;:::-;26830:10;:30::i;:::-;28886:25:::1;28897:4;28903:7;28886:10;:25::i;:::-;28772:147:::0;;;:::o;29820:218::-;29927:12;:10;:12::i;:::-;29916:23;;:7;:23;;;29908:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30004:26;30016:4;30022:7;30004:11;:26::i;:::-;29820:218;;:::o;56433:65::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56480:10:::1;:8;:10::i;:::-;56433:65::o:0;39326:185::-;39464:39;39481:4;39487:2;39491:7;39464:39;;;;;;;;;;;;:16;:39::i;:::-;39326:185;;;:::o;55950:166::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56021:32:::1;54786:19;56042:10;56021:7;:32::i;:::-;56013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56094:14;56100:7;56094:5;:14::i;:::-;55950:166:::0;:::o;33069:86::-;33116:4;33140:7;;;;;;;;;;;33133:14;;33069:86;:::o;36301:239::-;36373:7;36393:13;36409:7;:16;36417:7;36409:16;;;;;;;;;;;;;;;;;;;;;36393:32;;36461:1;36444:19;;:5;:19;;;;36436:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36527:5;36520:12;;;36301:239;;;:::o;55007:288::-;55063:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55091:32:::1;54722:19;55112:10;55091:7;:32::i;:::-;55083:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55162:40;55172:2;55176:25;:15;:23;:25::i;:::-;55162:9;:40::i;:::-;55215:27;:15;:25;:27::i;:::-;55262:25;:15;:23;:25::i;:::-;55255:32;;55007:288:::0;;;:::o;55564:378::-;55649:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55677:32:::1;54722:19;55698:10;55677:7;:32::i;:::-;55669:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55748:40;55758:2;55762:25;:15;:23;:25::i;:::-;55748:9;:40::i;:::-;55799:50;55812:25;:15;:23;:25::i;:::-;55839:9;55799:12;:50::i;:::-;55862:27;:15;:25;:27::i;:::-;55909:25;:15;:23;:25::i;:::-;55902:32;;55564:378:::0;;;;:::o;36031:208::-;36103:7;36148:1;36131:19;;:5;:19;;;;36123:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36215:9;:16;36225:5;36215:16;;;;;;;;;;;;;;;;36208:23;;36031:208;;;:::o;53454:103::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53519:30:::1;53546:1;53519:18;:30::i;:::-;53454:103::o:0;56364:61::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56409:8:::1;:6;:8::i;:::-;56364:61::o:0;54636:39::-;;;;;;;;;:::o;52803:87::-;52849:7;52876:6;;;;;;;;;;;52869:13;;52803:87;:::o;54812:72::-;54858:26;54812:72;:::o;27248:147::-;27334:4;27358:6;:12;27365:4;27358:12;;;;;;;;;;;:20;;:29;27379:7;27358:29;;;;;;;;;;;;;;;;;;;;;;;;;27351:36;;27248:147;;;;:::o;36776:104::-;36832:13;36865:7;36858:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36776:104;:::o;26339:49::-;26384:4;26339:49;;;:::o;38459:155::-;38554:52;38573:12;:10;:12::i;:::-;38587:8;38597;38554:18;:52::i;:::-;38459:155;;:::o;55303:253::-;55370:7;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:32:::1;54722:19;55419:10;55398:7;:32::i;:::-;55390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55469:17;55479:2;55483;55469:9;:17::i;:::-;55499:27;:15;:25;:27::i;:::-;55546:2;55539:9;;55303:253:::0;;;;:::o;39582:328::-;39757:41;39776:12;:10;:12::i;:::-;39790:7;39757:18;:41::i;:::-;39749:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39863:39;39877:4;39883:2;39887:7;39896:5;39863:13;:39::i;:::-;39582:328;;;;:::o;50247:679::-;50320:13;50354:16;50362:7;50354;:16::i;:::-;50346:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50437:23;50463:10;:19;50474:7;50463:19;;;;;;;;;;;50437:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50493:18;50514:10;:8;:10::i;:::-;50493:31;;50622:1;50606:4;50600:18;:23;50596:72;;;50647:9;50640:16;;;;;;50596:72;50798:1;50778:9;50772:23;:27;50768:108;;;50847:4;50853:9;50830:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50816:48;;;;;;50768:108;50895:23;50910:7;50895:14;:23::i;:::-;50888:30;;;;50247:679;;;;:::o;54684:57::-;54722:19;54684:57;:::o;29164:149::-;29248:18;29261:4;29248:12;:18::i;:::-;26830:30;26841:4;26847:12;:10;:12::i;:::-;26830:10;:30::i;:::-;29279:26:::1;29291:4;29297:7;29279:11;:26::i;:::-;29164:149:::0;;;:::o;38685:164::-;38782:4;38806:18;:25;38825:5;38806:25;;;;;;;;;;;;;;;:35;38832:8;38806:35;;;;;;;;;;;;;;;;;;;;;;;;;38799:42;;38685:164;;;;:::o;53712:201::-;53034:12;:10;:12::i;:::-;53023:23;;:7;:5;:7::i;:::-;:23;;;53015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53821:1:::1;53801:22;;:8;:22;;;;53793:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53877:28;53896:8;53877:18;:28::i;:::-;53712:201:::0;:::o;26952:204::-;27037:4;27076:32;27061:47;;;:11;:47;;;;:87;;;;27112:36;27136:11;27112:23;:36::i;:::-;27061:87;27054:94;;26952:204;;;:::o;41420:127::-;41485:4;41537:1;41509:30;;:7;:16;41517:7;41509:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41502:37;;41420:127;;;:::o;24147:98::-;24200:7;24227:10;24220:17;;24147:98;:::o;45566:174::-;45668:2;45641:15;:24;45657:7;45641:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45724:7;45720:2;45686:46;;45695:23;45710:7;45695:14;:23::i;:::-;45686:46;;;;;;;;;;;;45566:174;;:::o;51082:217::-;51182:16;51190:7;51182;:16::i;:::-;51174:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;51282:9;51260:10;:19;51271:7;51260:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;51082:217;;:::o;41714:348::-;41807:4;41832:16;41840:7;41832;:16::i;:::-;41824:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41908:13;41924:23;41939:7;41924:14;:23::i;:::-;41908:39;;41977:5;41966:16;;:7;:16;;;:51;;;;42010:7;41986:31;;:20;41998:7;41986:11;:20::i;:::-;:31;;;41966:51;:87;;;;42021:32;42038:5;42045:7;42021:16;:32::i;:::-;41966:87;41958:96;;;41714:348;;;;:::o;44823:625::-;44982:4;44955:31;;:23;44970:7;44955:14;:23::i;:::-;:31;;;44947:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45061:1;45047:16;;:2;:16;;;;45039:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45117:39;45138:4;45144:2;45148:7;45117:20;:39::i;:::-;45221:29;45238:1;45242:7;45221:8;:29::i;:::-;45282:1;45263:9;:15;45273:4;45263:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45311:1;45294:9;:13;45304:2;45294:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45342:2;45323:7;:16;45331:7;45323:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45381:7;45377:2;45362:27;;45371:4;45362:27;;;;;;;;;;;;45402:38;45422:4;45428:2;45432:7;45402:19;:38::i;:::-;44823:625;;;:::o;27685:505::-;27774:22;27782:4;27788:7;27774;:22::i;:::-;27769:414;;27962:41;27990:7;27962:41;;28000:2;27962:19;:41::i;:::-;28076:38;28104:4;28096:13;;28111:2;28076:19;:38::i;:::-;27867:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27813:358;;;;;;;;;;;:::i;:::-;;;;;;;;27769:414;27685:505;;:::o;31321:238::-;31405:22;31413:4;31419:7;31405;:22::i;:::-;31400:152;;31476:4;31444:6;:12;31451:4;31444:12;;;;;;;;;;;:20;;:29;31465:7;31444:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;31527:12;:10;:12::i;:::-;31500:40;;31518:7;31500:40;;31512:4;31500:40;;;;;;;;;;31400:152;31321:238;;:::o;31691:239::-;31775:22;31783:4;31789:7;31775;:22::i;:::-;31771:152;;;31846:5;31814:6;:12;31821:4;31814:12;;;;;;;;;;;:20;;:29;31835:7;31814:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31898:12;:10;:12::i;:::-;31871:40;;31889:7;31871:40;;31883:4;31871:40;;;;;;;;;;31771:152;31691:239;;:::o;34128:120::-;33672:8;:6;:8::i;:::-;33664:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34197:5:::1;34187:7;;:15;;;;;;;;;;;;;;;;;;34218:22;34227:12;:10;:12::i;:::-;34218:22;;;;;;:::i;:::-;;;;;;;;34128:120::o:0;51528:206::-;51597:20;51609:7;51597:11;:20::i;:::-;51671:1;51640:10;:19;51651:7;51640:19;;;;;;;;;;;51634:33;;;;;:::i;:::-;;;:38;51630:97;;51696:10;:19;51707:7;51696:19;;;;;;;;;;;;51689:26;;;;:::i;:::-;51630:97;51528:206;:::o;3948:114::-;4013:7;4040;:14;;;4033:21;;3948:114;;;:::o;42404:110::-;42480:26;42490:2;42494:7;42480:26;;;;;;;;;;;;:9;:26::i;:::-;42404:110;;:::o;4070:127::-;4177:1;4159:7;:14;;;:19;;;;;;;;;;;4070:127;:::o;54073:191::-;54147:16;54166:6;;;;;;;;;;;54147:25;;54192:8;54183:6;;:17;;;;;;;;;;;;;;;;;;54247:8;54216:40;;54237:8;54216:40;;;;;;;;;;;;54136:128;54073:191;:::o;33869:118::-;33395:8;:6;:8::i;:::-;33394:9;33386:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33939:4:::1;33929:7;;:14;;;;;;;;;;;;;;;;;;33959:20;33966:12;:10;:12::i;:::-;33959:20;;;;;;:::i;:::-;;;;;;;;33869:118::o:0;45882:315::-;46037:8;46028:17;;:5;:17;;;;46020:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46124:8;46086:18;:25;46105:5;46086:25;;;;;;;;;;;;;;;:35;46112:8;46086:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46170:8;46148:41;;46163:5;46148:41;;;46180:8;46148:41;;;;;;:::i;:::-;;;;;;;;45882:315;;;:::o;40792:::-;40949:28;40959:4;40965:2;40969:7;40949:9;:28::i;:::-;40996:48;41019:4;41025:2;41029:7;41038:5;40996:22;:48::i;:::-;40988:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;40792:315;;;;:::o;37533:94::-;37584:13;37610:9;;;;;;;;;;;;;;37533:94;:::o;36951:334::-;37024:13;37058:16;37066:7;37058;:16::i;:::-;37050:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37139:21;37163:10;:8;:10::i;:::-;37139:34;;37215:1;37197:7;37191:21;:25;:86;;;;;;;;;;;;;;;;;37243:7;37252:18;:7;:16;:18::i;:::-;37226:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37191:86;37184:93;;;36951:334;;;:::o;35662:305::-;35764:4;35816:25;35801:40;;;:11;:40;;;;:105;;;;35873:33;35858:48;;;:11;:48;;;;35801:105;:158;;;;35923:36;35947:11;35923:23;:36::i;:::-;35801:158;35781:178;;35662:305;;;:::o;48133:126::-;;;;:::o;48644:125::-;;;;:::o;6207:451::-;6282:13;6308:19;6353:1;6344:6;6340:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6330:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6308:47;;6366:15;:6;6373:1;6366:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6392;:6;6399:1;6392:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6423:9;6448:1;6439:6;6435:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6423:26;;6418:135;6455:1;6451;:5;6418:135;;;6490:12;6511:3;6503:5;:11;6490:25;;;;;;;:::i;:::-;;;;;6478:6;6485:1;6478:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6540:1;6530:11;;;;;6458:3;;;;:::i;:::-;;;6418:135;;;;6580:1;6571:5;:10;6563:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6643:6;6629:21;;;6207:451;;;;:::o;44066:420::-;44126:13;44142:23;44157:7;44142:14;:23::i;:::-;44126:39;;44178:48;44199:5;44214:1;44218:7;44178:20;:48::i;:::-;44267:29;44284:1;44288:7;44267:8;:29::i;:::-;44329:1;44309:9;:16;44319:5;44309:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;44348:7;:16;44356:7;44348:16;;;;;;;;;;;;44341:23;;;;;;;;;;;44410:7;44406:1;44382:36;;44391:5;44382:36;;;;;;;;;;;;44431:47;44451:5;44466:1;44470:7;44431:19;:47::i;:::-;44115:371;44066:420;:::o;42741:321::-;42871:18;42877:2;42881:7;42871:5;:18::i;:::-;42922:54;42953:1;42957:2;42961:7;42970:5;42922:22;:54::i;:::-;42900:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42741:321;;;:::o;46762:799::-;46917:4;46938:15;:2;:13;;;:15::i;:::-;46934:620;;;46990:2;46974:36;;;47011:12;:10;:12::i;:::-;47025:4;47031:7;47040:5;46974:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46970:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47233:1;47216:6;:13;:18;47212:272;;;47259:60;;;;;;;;;;:::i;:::-;;;;;;;;47212:272;47434:6;47428:13;47419:6;47415:2;47411:15;47404:38;46970:529;47107:41;;;47097:51;;;:6;:51;;;;47090:58;;;;;46934:620;47538:4;47531:11;;46762:799;;;;;;;:::o;4906:723::-;4962:13;5192:1;5183:5;:10;5179:53;;;5210:10;;;;;;;;;;;;;;;;;;;;;5179:53;5242:12;5257:5;5242:20;;5273:14;5298:78;5313:1;5305:4;:9;5298:78;;5331:8;;;;;:::i;:::-;;;;5362:2;5354:10;;;;;:::i;:::-;;;5298:78;;;5386:19;5418:6;5408:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5386:39;;5436:154;5452:1;5443:5;:10;5436:154;;5480:1;5470:11;;;;;:::i;:::-;;;5547:2;5539:5;:10;;;;:::i;:::-;5526:2;:24;;;;:::i;:::-;5513:39;;5496:6;5503;5496:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5576:2;5567:11;;;;;:::i;:::-;;;5436:154;;;5614:6;5600:21;;;;;4906:723;;;;:::o;17629:157::-;17714:4;17753:25;17738:40;;;:11;:40;;;;17731:47;;17629:157;;;:::o;43398:439::-;43492:1;43478:16;;:2;:16;;;;43470:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43551:16;43559:7;43551;:16::i;:::-;43550:17;43542:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43613:45;43642:1;43646:2;43650:7;43613:20;:45::i;:::-;43688:1;43671:9;:13;43681:2;43671:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43719:2;43700:7;:16;43708:7;43700:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43764:7;43760:2;43739:33;;43756:1;43739:33;;;;;;;;;;;;43785:44;43813:1;43817:2;43821:7;43785:19;:44::i;:::-;43398:439;;:::o;7485:387::-;7545:4;7753:12;7820:7;7808:20;7800:28;;7863:1;7856:4;:8;7849:15;;;7485:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:654::-;7122:6;7130;7179:2;7167:9;7158:7;7154:23;7150:32;7147:119;;;7185:79;;:::i;:::-;7147:119;7305:1;7330:53;7375:7;7366:6;7355:9;7351:22;7330:53;:::i;:::-;7320:63;;7276:117;7460:2;7449:9;7445:18;7432:32;7491:18;7483:6;7480:30;7477:117;;;7513:79;;:::i;:::-;7477:117;7618:63;7673:7;7664:6;7653:9;7649:22;7618:63;:::i;:::-;7608:73;;7403:288;7044:654;;;;;:::o;7704:619::-;7781:6;7789;7797;7846:2;7834:9;7825:7;7821:23;7817:32;7814:119;;;7852:79;;:::i;:::-;7814:119;7972:1;7997:53;8042:7;8033:6;8022:9;8018:22;7997:53;:::i;:::-;7987:63;;7943:117;8099:2;8125:53;8170:7;8161:6;8150:9;8146:22;8125:53;:::i;:::-;8115:63;;8070:118;8227:2;8253:53;8298:7;8289:6;8278:9;8274:22;8253:53;:::i;:::-;8243:63;;8198:118;7704:619;;;;;:::o;8329:77::-;8366:7;8395:5;8384:16;;8329:77;;;:::o;8412:122::-;8485:24;8503:5;8485:24;:::i;:::-;8478:5;8475:35;8465:63;;8524:1;8521;8514:12;8465:63;8412:122;:::o;8540:139::-;8586:5;8624:6;8611:20;8602:29;;8640:33;8667:5;8640:33;:::i;:::-;8540:139;;;;:::o;8685:329::-;8744:6;8793:2;8781:9;8772:7;8768:23;8764:32;8761:119;;;8799:79;;:::i;:::-;8761:119;8919:1;8944:53;8989:7;8980:6;8969:9;8965:22;8944:53;:::i;:::-;8934:63;;8890:117;8685:329;;;;:::o;9020:118::-;9107:24;9125:5;9107:24;:::i;:::-;9102:3;9095:37;9020:118;;:::o;9144:222::-;9237:4;9275:2;9264:9;9260:18;9252:26;;9288:71;9356:1;9345:9;9341:17;9332:6;9288:71;:::i;:::-;9144:222;;;;:::o;9372:474::-;9440:6;9448;9497:2;9485:9;9476:7;9472:23;9468:32;9465:119;;;9503:79;;:::i;:::-;9465:119;9623:1;9648:53;9693:7;9684:6;9673:9;9669:22;9648:53;:::i;:::-;9638:63;;9594:117;9750:2;9776:53;9821:7;9812:6;9801:9;9797:22;9776:53;:::i;:::-;9766:63;;9721:118;9372:474;;;;;:::o;9852:329::-;9911:6;9960:2;9948:9;9939:7;9935:23;9931:32;9928:119;;;9966:79;;:::i;:::-;9928:119;10086:1;10111:53;10156:7;10147:6;10136:9;10132:22;10111:53;:::i;:::-;10101:63;;10057:117;9852:329;;;;:::o;10187:118::-;10274:24;10292:5;10274:24;:::i;:::-;10269:3;10262:37;10187:118;;:::o;10311:222::-;10404:4;10442:2;10431:9;10427:18;10419:26;;10455:71;10523:1;10512:9;10508:17;10499:6;10455:71;:::i;:::-;10311:222;;;;:::o;10539:654::-;10617:6;10625;10674:2;10662:9;10653:7;10649:23;10645:32;10642:119;;;10680:79;;:::i;:::-;10642:119;10800:1;10825:53;10870:7;10861:6;10850:9;10846:22;10825:53;:::i;:::-;10815:63;;10771:117;10955:2;10944:9;10940:18;10927:32;10986:18;10978:6;10975:30;10972:117;;;11008:79;;:::i;:::-;10972:117;11113:63;11168:7;11159:6;11148:9;11144:22;11113:63;:::i;:::-;11103:73;;10898:288;10539:654;;;;;:::o;11199:116::-;11269:21;11284:5;11269:21;:::i;:::-;11262:5;11259:32;11249:60;;11305:1;11302;11295:12;11249:60;11199:116;:::o;11321:133::-;11364:5;11402:6;11389:20;11380:29;;11418:30;11442:5;11418:30;:::i;:::-;11321:133;;;;:::o;11460:468::-;11525:6;11533;11582:2;11570:9;11561:7;11557:23;11553:32;11550:119;;;11588:79;;:::i;:::-;11550:119;11708:1;11733:53;11778:7;11769:6;11758:9;11754:22;11733:53;:::i;:::-;11723:63;;11679:117;11835:2;11861:50;11903:7;11894:6;11883:9;11879:22;11861:50;:::i;:::-;11851:60;;11806:115;11460:468;;;;;:::o;11934:307::-;11995:4;12085:18;12077:6;12074:30;12071:56;;;12107:18;;:::i;:::-;12071:56;12145:29;12167:6;12145:29;:::i;:::-;12137:37;;12229:4;12223;12219:15;12211:23;;11934:307;;;:::o;12247:410::-;12324:5;12349:65;12365:48;12406:6;12365:48;:::i;:::-;12349:65;:::i;:::-;12340:74;;12437:6;12430:5;12423:21;12475:4;12468:5;12464:16;12513:3;12504:6;12499:3;12495:16;12492:25;12489:112;;;12520:79;;:::i;:::-;12489:112;12610:41;12644:6;12639:3;12634;12610:41;:::i;:::-;12330:327;12247:410;;;;;:::o;12676:338::-;12731:5;12780:3;12773:4;12765:6;12761:17;12757:27;12747:122;;12788:79;;:::i;:::-;12747:122;12905:6;12892:20;12930:78;13004:3;12996:6;12989:4;12981:6;12977:17;12930:78;:::i;:::-;12921:87;;12737:277;12676:338;;;;:::o;13020:943::-;13115:6;13123;13131;13139;13188:3;13176:9;13167:7;13163:23;13159:33;13156:120;;;13195:79;;:::i;:::-;13156:120;13315:1;13340:53;13385:7;13376:6;13365:9;13361:22;13340:53;:::i;:::-;13330:63;;13286:117;13442:2;13468:53;13513:7;13504:6;13493:9;13489:22;13468:53;:::i;:::-;13458:63;;13413:118;13570:2;13596:53;13641:7;13632:6;13621:9;13617:22;13596:53;:::i;:::-;13586:63;;13541:118;13726:2;13715:9;13711:18;13698:32;13757:18;13749:6;13746:30;13743:117;;;13779:79;;:::i;:::-;13743:117;13884:62;13938:7;13929:6;13918:9;13914:22;13884:62;:::i;:::-;13874:72;;13669:287;13020:943;;;;;;;:::o;13969:474::-;14037:6;14045;14094:2;14082:9;14073:7;14069:23;14065:32;14062:119;;;14100:79;;:::i;:::-;14062:119;14220:1;14245:53;14290:7;14281:6;14270:9;14266:22;14245:53;:::i;:::-;14235:63;;14191:117;14347:2;14373:53;14418:7;14409:6;14398:9;14394:22;14373:53;:::i;:::-;14363:63;;14318:118;13969:474;;;;;:::o;14449:180::-;14497:77;14494:1;14487:88;14594:4;14591:1;14584:15;14618:4;14615:1;14608:15;14635:320;14679:6;14716:1;14710:4;14706:12;14696:22;;14763:1;14757:4;14753:12;14784:18;14774:81;;14840:4;14832:6;14828:17;14818:27;;14774:81;14902:2;14894:6;14891:14;14871:18;14868:38;14865:84;;;14921:18;;:::i;:::-;14865:84;14686:269;14635:320;;;:::o;14961:231::-;15101:34;15097:1;15089:6;15085:14;15078:58;15170:14;15165:2;15157:6;15153:15;15146:39;14961:231;:::o;15198:366::-;15340:3;15361:67;15425:2;15420:3;15361:67;:::i;:::-;15354:74;;15437:93;15526:3;15437:93;:::i;:::-;15555:2;15550:3;15546:12;15539:19;;15198:366;;;:::o;15570:419::-;15736:4;15774:2;15763:9;15759:18;15751:26;;15823:9;15817:4;15813:20;15809:1;15798:9;15794:17;15787:47;15851:131;15977:4;15851:131;:::i;:::-;15843:139;;15570:419;;;:::o;15995:220::-;16135:34;16131:1;16123:6;16119:14;16112:58;16204:3;16199:2;16191:6;16187:15;16180:28;15995:220;:::o;16221:366::-;16363:3;16384:67;16448:2;16443:3;16384:67;:::i;:::-;16377:74;;16460:93;16549:3;16460:93;:::i;:::-;16578:2;16573:3;16569:12;16562:19;;16221:366;;;:::o;16593:419::-;16759:4;16797:2;16786:9;16782:18;16774:26;;16846:9;16840:4;16836:20;16832:1;16821:9;16817:17;16810:47;16874:131;17000:4;16874:131;:::i;:::-;16866:139;;16593:419;;;:::o;17018:243::-;17158:34;17154:1;17146:6;17142:14;17135:58;17227:26;17222:2;17214:6;17210:15;17203:51;17018:243;:::o;17267:366::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:419::-;17805:4;17843:2;17832:9;17828:18;17820:26;;17892:9;17886:4;17882:20;17878:1;17867:9;17863:17;17856:47;17920:131;18046:4;17920:131;:::i;:::-;17912:139;;17639:419;;;:::o;18064:166::-;18204:18;18200:1;18192:6;18188:14;18181:42;18064:166;:::o;18236:366::-;18378:3;18399:67;18463:2;18458:3;18399:67;:::i;:::-;18392:74;;18475:93;18564:3;18475:93;:::i;:::-;18593:2;18588:3;18584:12;18577:19;;18236:366;;;:::o;18608:419::-;18774:4;18812:2;18801:9;18797:18;18789:26;;18861:9;18855:4;18851:20;18847:1;18836:9;18832:17;18825:47;18889:131;19015:4;18889:131;:::i;:::-;18881:139;;18608:419;;;:::o;19033:181::-;19173:33;19169:1;19161:6;19157:14;19150:57;19033:181;:::o;19220:366::-;19362:3;19383:67;19447:2;19442:3;19383:67;:::i;:::-;19376:74;;19459:93;19548:3;19459:93;:::i;:::-;19577:2;19572:3;19568:12;19561:19;;19220:366;;;:::o;19592:419::-;19758:4;19796:2;19785:9;19781:18;19773:26;;19845:9;19839:4;19835:20;19831:1;19820:9;19816:17;19809:47;19873:131;19999:4;19873:131;:::i;:::-;19865:139;;19592:419;;;:::o;20017:236::-;20157:34;20153:1;20145:6;20141:14;20134:58;20226:19;20221:2;20213:6;20209:15;20202:44;20017:236;:::o;20259:366::-;20401:3;20422:67;20486:2;20481:3;20422:67;:::i;:::-;20415:74;;20498:93;20587:3;20498:93;:::i;:::-;20616:2;20611:3;20607:12;20600:19;;20259:366;;;:::o;20631:419::-;20797:4;20835:2;20824:9;20820:18;20812:26;;20884:9;20878:4;20874:20;20870:1;20859:9;20855:17;20848:47;20912:131;21038:4;20912:131;:::i;:::-;20904:139;;20631:419;;;:::o;21056:234::-;21196:34;21192:1;21184:6;21180:14;21173:58;21265:17;21260:2;21252:6;21248:15;21241:42;21056:234;:::o;21296:366::-;21438:3;21459:67;21523:2;21518:3;21459:67;:::i;:::-;21452:74;;21535:93;21624:3;21535:93;:::i;:::-;21653:2;21648:3;21644:12;21637:19;;21296:366;;;:::o;21668:419::-;21834:4;21872:2;21861:9;21857:18;21849:26;;21921:9;21915:4;21911:20;21907:1;21896:9;21892:17;21885:47;21949:131;22075:4;21949:131;:::i;:::-;21941:139;;21668:419;;;:::o;22093:182::-;22233:34;22229:1;22221:6;22217:14;22210:58;22093:182;:::o;22281:366::-;22423:3;22444:67;22508:2;22503:3;22444:67;:::i;:::-;22437:74;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22281:366;;;:::o;22653:419::-;22819:4;22857:2;22846:9;22842:18;22834:26;;22906:9;22900:4;22896:20;22892:1;22881:9;22877:17;22870:47;22934:131;23060:4;22934:131;:::i;:::-;22926:139;;22653:419;;;:::o;23078:173::-;23218:25;23214:1;23206:6;23202:14;23195:49;23078:173;:::o;23257:366::-;23399:3;23420:67;23484:2;23479:3;23420:67;:::i;:::-;23413:74;;23496:93;23585:3;23496:93;:::i;:::-;23614:2;23609:3;23605:12;23598:19;;23257:366;;;:::o;23629:419::-;23795:4;23833:2;23822:9;23818:18;23810:26;;23882:9;23876:4;23872:20;23868:1;23857:9;23853:17;23846:47;23910:131;24036:4;23910:131;:::i;:::-;23902:139;;23629:419;;;:::o;24054:228::-;24194:34;24190:1;24182:6;24178:14;24171:58;24263:11;24258:2;24250:6;24246:15;24239:36;24054:228;:::o;24288:366::-;24430:3;24451:67;24515:2;24510:3;24451:67;:::i;:::-;24444:74;;24527:93;24616:3;24527:93;:::i;:::-;24645:2;24640:3;24636:12;24629:19;;24288:366;;;:::o;24660:419::-;24826:4;24864:2;24853:9;24849:18;24841:26;;24913:9;24907:4;24903:20;24899:1;24888:9;24884:17;24877:47;24941:131;25067:4;24941:131;:::i;:::-;24933:139;;24660:419;;;:::o;25085:173::-;25225:25;25221:1;25213:6;25209:14;25202:49;25085:173;:::o;25264:366::-;25406:3;25427:67;25491:2;25486:3;25427:67;:::i;:::-;25420:74;;25503:93;25592:3;25503:93;:::i;:::-;25621:2;25616:3;25612:12;25605:19;;25264:366;;;:::o;25636:419::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25889:9;25883:4;25879:20;25875:1;25864:9;25860:17;25853:47;25917:131;26043:4;25917:131;:::i;:::-;25909:139;;25636:419;;;:::o;26061:229::-;26201:34;26197:1;26189:6;26185:14;26178:58;26270:12;26265:2;26257:6;26253:15;26246:37;26061:229;:::o;26296:366::-;26438:3;26459:67;26523:2;26518:3;26459:67;:::i;:::-;26452:74;;26535:93;26624:3;26535:93;:::i;:::-;26653:2;26648:3;26644:12;26637:19;;26296:366;;;:::o;26668:419::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:236::-;27233:34;27229:1;27221:6;27217:14;27210:58;27302:19;27297:2;27289:6;27285:15;27278:44;27093:236;:::o;27335:366::-;27477:3;27498:67;27562:2;27557:3;27498:67;:::i;:::-;27491:74;;27574:93;27663:3;27574:93;:::i;:::-;27692:2;27687:3;27683:12;27676:19;;27335:366;;;:::o;27707:419::-;27873:4;27911:2;27900:9;27896:18;27888:26;;27960:9;27954:4;27950:20;27946:1;27935:9;27931:17;27924:47;27988:131;28114:4;27988:131;:::i;:::-;27980:139;;27707:419;;;:::o;28132:148::-;28234:11;28271:3;28256:18;;28132:148;;;;:::o;28286:377::-;28392:3;28420:39;28453:5;28420:39;:::i;:::-;28475:89;28557:6;28552:3;28475:89;:::i;:::-;28468:96;;28573:52;28618:6;28613:3;28606:4;28599:5;28595:16;28573:52;:::i;:::-;28650:6;28645:3;28641:16;28634:23;;28396:267;28286:377;;;;:::o;28669:435::-;28849:3;28871:95;28962:3;28953:6;28871:95;:::i;:::-;28864:102;;28983:95;29074:3;29065:6;28983:95;:::i;:::-;28976:102;;29095:3;29088:10;;28669:435;;;;;:::o;29110:225::-;29250:34;29246:1;29238:6;29234:14;29227:58;29319:8;29314:2;29306:6;29302:15;29295:33;29110:225;:::o;29341:366::-;29483:3;29504:67;29568:2;29563:3;29504:67;:::i;:::-;29497:74;;29580:93;29669:3;29580:93;:::i;:::-;29698:2;29693:3;29689:12;29682:19;;29341:366;;;:::o;29713:419::-;29879:4;29917:2;29906:9;29902:18;29894:26;;29966:9;29960:4;29956:20;29952:1;29941:9;29937:17;29930:47;29994:131;30120:4;29994:131;:::i;:::-;29986:139;;29713:419;;;:::o;30138:233::-;30278:34;30274:1;30266:6;30262:14;30255:58;30347:16;30342:2;30334:6;30330:15;30323:41;30138:233;:::o;30377:366::-;30519:3;30540:67;30604:2;30599:3;30540:67;:::i;:::-;30533:74;;30616:93;30705:3;30616:93;:::i;:::-;30734:2;30729:3;30725:12;30718:19;;30377:366;;;:::o;30749:419::-;30915:4;30953:2;30942:9;30938:18;30930:26;;31002:9;30996:4;30992:20;30988:1;30977:9;30973:17;30966:47;31030:131;31156:4;31030:131;:::i;:::-;31022:139;;30749:419;;;:::o;31174:231::-;31314:34;31310:1;31302:6;31298:14;31291:58;31383:14;31378:2;31370:6;31366:15;31359:39;31174:231;:::o;31411:366::-;31553:3;31574:67;31638:2;31633:3;31574:67;:::i;:::-;31567:74;;31650:93;31739:3;31650:93;:::i;:::-;31768:2;31763:3;31759:12;31752:19;;31411:366;;;:::o;31783:419::-;31949:4;31987:2;31976:9;31972:18;31964:26;;32036:9;32030:4;32026:20;32022:1;32011:9;32007:17;32000:47;32064:131;32190:4;32064:131;:::i;:::-;32056:139;;31783:419;;;:::o;32208:224::-;32348:34;32344:1;32336:6;32332:14;32325:58;32417:7;32412:2;32404:6;32400:15;32393:32;32208:224;:::o;32438:366::-;32580:3;32601:67;32665:2;32660:3;32601:67;:::i;:::-;32594:74;;32677:93;32766:3;32677:93;:::i;:::-;32795:2;32790:3;32786:12;32779:19;;32438:366;;;:::o;32810:419::-;32976:4;33014:2;33003:9;32999:18;32991:26;;33063:9;33057:4;33053:20;33049:1;33038:9;33034:17;33027:47;33091:131;33217:4;33091:131;:::i;:::-;33083:139;;32810:419;;;:::o;33235:223::-;33375:34;33371:1;33363:6;33359:14;33352:58;33444:6;33439:2;33431:6;33427:15;33420:31;33235:223;:::o;33464:366::-;33606:3;33627:67;33691:2;33686:3;33627:67;:::i;:::-;33620:74;;33703:93;33792:3;33703:93;:::i;:::-;33821:2;33816:3;33812:12;33805:19;;33464:366;;;:::o;33836:419::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34089:9;34083:4;34079:20;34075:1;34064:9;34060:17;34053:47;34117:131;34243:4;34117:131;:::i;:::-;34109:139;;33836:419;;;:::o;34261:180::-;34309:77;34306:1;34299:88;34406:4;34403:1;34396:15;34430:4;34427:1;34420:15;34447:191;34487:4;34507:20;34525:1;34507:20;:::i;:::-;34502:25;;34541:20;34559:1;34541:20;:::i;:::-;34536:25;;34580:1;34577;34574:8;34571:34;;;34585:18;;:::i;:::-;34571:34;34630:1;34627;34623:9;34615:17;;34447:191;;;;:::o;34644:305::-;34684:3;34703:20;34721:1;34703:20;:::i;:::-;34698:25;;34737:20;34755:1;34737:20;:::i;:::-;34732:25;;34891:1;34823:66;34819:74;34816:1;34813:81;34810:107;;;34897:18;;:::i;:::-;34810:107;34941:1;34938;34934:9;34927:16;;34644:305;;;;:::o;34955:173::-;35095:25;35091:1;35083:6;35079:14;35072:49;34955:173;:::o;35134:402::-;35294:3;35315:85;35397:2;35392:3;35315:85;:::i;:::-;35308:92;;35409:93;35498:3;35409:93;:::i;:::-;35527:2;35522:3;35518:12;35511:19;;35134:402;;;:::o;35542:167::-;35682:19;35678:1;35670:6;35666:14;35659:43;35542:167;:::o;35715:402::-;35875:3;35896:85;35978:2;35973:3;35896:85;:::i;:::-;35889:92;;35990:93;36079:3;35990:93;:::i;:::-;36108:2;36103:3;36099:12;36092:19;;35715:402;;;:::o;36123:967::-;36505:3;36527:148;36671:3;36527:148;:::i;:::-;36520:155;;36692:95;36783:3;36774:6;36692:95;:::i;:::-;36685:102;;36804:148;36948:3;36804:148;:::i;:::-;36797:155;;36969:95;37060:3;37051:6;36969:95;:::i;:::-;36962:102;;37081:3;37074:10;;36123:967;;;;;:::o;37096:170::-;37236:22;37232:1;37224:6;37220:14;37213:46;37096:170;:::o;37272:366::-;37414:3;37435:67;37499:2;37494:3;37435:67;:::i;:::-;37428:74;;37511:93;37600:3;37511:93;:::i;:::-;37629:2;37624:3;37620:12;37613:19;;37272:366;;;:::o;37644:419::-;37810:4;37848:2;37837:9;37833:18;37825:26;;37897:9;37891:4;37887:20;37883:1;37872:9;37868:17;37861:47;37925:131;38051:4;37925:131;:::i;:::-;37917:139;;37644:419;;;:::o;38069:175::-;38209:27;38205:1;38197:6;38193:14;38186:51;38069:175;:::o;38250:366::-;38392:3;38413:67;38477:2;38472:3;38413:67;:::i;:::-;38406:74;;38489:93;38578:3;38489:93;:::i;:::-;38607:2;38602:3;38598:12;38591:19;;38250:366;;;:::o;38622:419::-;38788:4;38826:2;38815:9;38811:18;38803:26;;38875:9;38869:4;38865:20;38861:1;38850:9;38846:17;38839:47;38903:131;39029:4;38903:131;:::i;:::-;38895:139;;38622:419;;;:::o;39047:237::-;39187:34;39183:1;39175:6;39171:14;39164:58;39256:20;39251:2;39243:6;39239:15;39232:45;39047:237;:::o;39290:366::-;39432:3;39453:67;39517:2;39512:3;39453:67;:::i;:::-;39446:74;;39529:93;39618:3;39529:93;:::i;:::-;39647:2;39642:3;39638:12;39631:19;;39290:366;;;:::o;39662:419::-;39828:4;39866:2;39855:9;39851:18;39843:26;;39915:9;39909:4;39905:20;39901:1;39890:9;39886:17;39879:47;39943:131;40069:4;39943:131;:::i;:::-;39935:139;;39662:419;;;:::o;40087:234::-;40227:34;40223:1;40215:6;40211:14;40204:58;40296:17;40291:2;40283:6;40279:15;40272:42;40087:234;:::o;40327:366::-;40469:3;40490:67;40554:2;40549:3;40490:67;:::i;:::-;40483:74;;40566:93;40655:3;40566:93;:::i;:::-;40684:2;40679:3;40675:12;40668:19;;40327:366;;;:::o;40699:419::-;40865:4;40903:2;40892:9;40888:18;40880:26;;40952:9;40946:4;40942:20;40938:1;40927:9;40923:17;40916:47;40980:131;41106:4;40980:131;:::i;:::-;40972:139;;40699:419;;;:::o;41124:348::-;41164:7;41187:20;41205:1;41187:20;:::i;:::-;41182:25;;41221:20;41239:1;41221:20;:::i;:::-;41216:25;;41409:1;41341:66;41337:74;41334:1;41331:81;41326:1;41319:9;41312:17;41308:105;41305:131;;;41416:18;;:::i;:::-;41305:131;41464:1;41461;41457:9;41446:20;;41124:348;;;;:::o;41478:180::-;41526:77;41523:1;41516:88;41623:4;41620:1;41613:15;41647:4;41644:1;41637:15;41664:171;41703:3;41726:24;41744:5;41726:24;:::i;:::-;41717:33;;41772:4;41765:5;41762:15;41759:41;;;41780:18;;:::i;:::-;41759:41;41827:1;41820:5;41816:13;41809:20;;41664:171;;;:::o;41841:182::-;41981:34;41977:1;41969:6;41965:14;41958:58;41841:182;:::o;42029:366::-;42171:3;42192:67;42256:2;42251:3;42192:67;:::i;:::-;42185:74;;42268:93;42357:3;42268:93;:::i;:::-;42386:2;42381:3;42377:12;42370:19;;42029:366;;;:::o;42401:419::-;42567:4;42605:2;42594:9;42590:18;42582:26;;42654:9;42648:4;42644:20;42640:1;42629:9;42625:17;42618:47;42682:131;42808:4;42682:131;:::i;:::-;42674:139;;42401:419;;;:::o;42826:98::-;42877:6;42911:5;42905:12;42895:22;;42826:98;;;:::o;42930:168::-;43013:11;43047:6;43042:3;43035:19;43087:4;43082:3;43078:14;43063:29;;42930:168;;;;:::o;43104:360::-;43190:3;43218:38;43250:5;43218:38;:::i;:::-;43272:70;43335:6;43330:3;43272:70;:::i;:::-;43265:77;;43351:52;43396:6;43391:3;43384:4;43377:5;43373:16;43351:52;:::i;:::-;43428:29;43450:6;43428:29;:::i;:::-;43423:3;43419:39;43412:46;;43194:270;43104:360;;;;:::o;43470:640::-;43665:4;43703:3;43692:9;43688:19;43680:27;;43717:71;43785:1;43774:9;43770:17;43761:6;43717:71;:::i;:::-;43798:72;43866:2;43855:9;43851:18;43842:6;43798:72;:::i;:::-;43880;43948:2;43937:9;43933:18;43924:6;43880:72;:::i;:::-;43999:9;43993:4;43989:20;43984:2;43973:9;43969:18;43962:48;44027:76;44098:4;44089:6;44027:76;:::i;:::-;44019:84;;43470:640;;;;;;;:::o;44116:141::-;44172:5;44203:6;44197:13;44188:22;;44219:32;44245:5;44219:32;:::i;:::-;44116:141;;;;:::o;44263:349::-;44332:6;44381:2;44369:9;44360:7;44356:23;44352:32;44349:119;;;44387:79;;:::i;:::-;44349:119;44507:1;44532:63;44587:7;44578:6;44567:9;44563:22;44532:63;:::i;:::-;44522:73;;44478:127;44263:349;;;;:::o;44618:233::-;44657:3;44680:24;44698:5;44680:24;:::i;:::-;44671:33;;44726:66;44719:5;44716:77;44713:103;;;44796:18;;:::i;:::-;44713:103;44843:1;44836:5;44832:13;44825:20;;44618:233;;;:::o;44857:180::-;44905:77;44902:1;44895:88;45002:4;44999:1;44992:15;45026:4;45023:1;45016:15;45043:185;45083:1;45100:20;45118:1;45100:20;:::i;:::-;45095:25;;45134:20;45152:1;45134:20;:::i;:::-;45129:25;;45173:1;45163:35;;45178:18;;:::i;:::-;45163:35;45220:1;45217;45213:9;45208:14;;45043:185;;;;:::o;45234:176::-;45266:1;45283:20;45301:1;45283:20;:::i;:::-;45278:25;;45317:20;45335:1;45317:20;:::i;:::-;45312:25;;45356:1;45346:35;;45361:18;;:::i;:::-;45346:35;45402:1;45399;45395:9;45390:14;;45234:176;;;;:::o;45416:182::-;45556:34;45552:1;45544:6;45540:14;45533:58;45416:182;:::o;45604:366::-;45746:3;45767:67;45831:2;45826:3;45767:67;:::i;:::-;45760:74;;45843:93;45932:3;45843:93;:::i;:::-;45961:2;45956:3;45952:12;45945:19;;45604:366;;;:::o;45976:419::-;46142:4;46180:2;46169:9;46165:18;46157:26;;46229:9;46223:4;46219:20;46215:1;46204:9;46200:17;46193:47;46257:131;46383:4;46257:131;:::i;:::-;46249:139;;45976:419;;;:::o;46401:178::-;46541:30;46537:1;46529:6;46525:14;46518:54;46401:178;:::o;46585:366::-;46727:3;46748:67;46812:2;46807:3;46748:67;:::i;:::-;46741:74;;46824:93;46913:3;46824:93;:::i;:::-;46942:2;46937:3;46933:12;46926:19;;46585:366;;;:::o;46957:419::-;47123:4;47161:2;47150:9;47146:18;47138:26;;47210:9;47204:4;47200:20;47196:1;47185:9;47181:17;47174:47;47238:131;47364:4;47238:131;:::i;:::-;47230:139;;46957:419;;;:::o

Swarm Source

ipfs://8c10d02ca6078e1dcf7163ad3773eba080539faaaf5d4d617db1624c2ff55c87
Loading