ETH Price: $2,277.98 (-5.77%)

Token

XTRA for LIONS (XTRALIONS)
 

Overview

Max Total Supply

300 XTRALIONS

Holders

126

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 XTRALIONS
0x5be96ca3d76d78b041b6be3c34bec13a82f9ffb8
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
XtraForLions

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-06
*/

// SPDX-License-Identifier: MIT

// 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/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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/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/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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/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/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/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/leafdao.sol


pragma solidity >=0.7.0 <0.9.0;

/// ================= Imports ==================









/// @title This is the LazyLion interface.
 interface lazyLionI{
    function balanceOf(address owner) external view returns (uint256 balance);
 }

//.-.  .-.   .-.   .-. .----. .-. .-. .----.
// \ \/ /    | |   | |/  {}  \|  `| |{ {__  
//  }  {     | `--.| |\      /| |\  |.-._} }
// / /\ \     `----'`-' `----' `-' `-'`----'


/// @title XTRA_for_LIONS
/// @notice XTRALIONS claimable by LazyLion owners
/// @dev ERC721 claimable by members of a merkle tree
contract XtraForLions is ERC721, ERC721Enumerable, ReentrancyGuard, AccessControl, ERC721URIStorage {
 using Counters for Counters.Counter;

 Counters.Counter private _tokenIdCounter;

     /// ==================== State Variables  =======================

    bytes32 public constant MANAGER_ROLE = keccak256(abi.encodePacked("manager"));

    bool public whitelistState;

    //gnosis safe is one of the admin
    address private admin_one;
    address private admin_two;
    address private admin_three;
    address private gnosis_addr;


    uint256 public MINT_PRICE = 80000000000000000; // 0.08 ether;

    uint public maxMintKingAmount = 10;

    uint public maxMintLazyAmount = 1;

    string public baseURI;

    uint public constant MAX_TOKEN_SUPPLY = 500;

    /// @notice whitelist address inclusion root
     bytes32 public  merkleRoot;

     //lazyLion mainnet address
    lazyLionI _lazyLion = lazyLionI(0x8943C7bAC1914C9A7ABa750Bf2B6B09Fd21037E0);


    /// ==================== mappings =======================
             mapping(address => bool) public isWhitelisted;

             mapping(address => uint) public lazyTokenMinted;

              mapping(address => uint) public kingTokensMinted;



    /// ==================== constructor =======================
    /// @dev _merkleRoot must append "0x" prefix with the hash
    /// @dev Grants `DEFAULT_ADMIN_ROLE` to the account that deploys the contract.
    /// See {ERC20-constructor}.
    constructor(
      bytes32 _merkleRoot,
      address _admin_one, 
      address _admin_two,
      address _admin_three,
      address _gnosis_addr, 
      string memory _initBaseURI)ERC721
      ("XTRA for LIONS", "XTRALIONS"){
            baseURI =_initBaseURI;
          admin_one = _admin_one;
          admin_two = _admin_two;
          admin_three = _admin_three;
          gnosis_addr = _gnosis_addr;
          merkleRoot = _merkleRoot;
      _setRoleAdmin(MANAGER_ROLE, DEFAULT_ADMIN_ROLE);//only default admin can add manager

      _setupRole(DEFAULT_ADMIN_ROLE,admin_one);
      _setupRole(DEFAULT_ADMIN_ROLE,admin_two);
      _setupRole(DEFAULT_ADMIN_ROLE,admin_three);
      _setupRole(DEFAULT_ADMIN_ROLE,gnosis_addr);
  
    }



       /// ====================== events =======================
      event UpdatedRoot(bytes32 _newRoot);
      event managerAdded(address account);
      event mintedLazyEdition(address addr, uint256 _mintAmount);
      event mintedKingEdition(address addr, uint256 _mintAmount);



    /// ====================== functions ========================
     function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

     /// @notice Updates the merkleRoot with the given new root
    /// @param _newRoot new merkleRoot 
  function updateMerkleRoot(bytes32 _newRoot) onlyRole(MANAGER_ROLE) external {
    merkleRoot = _newRoot;
    emit UpdatedRoot(_newRoot);
  }

   /// @notice checks if the address is a member of the tree
   /// @dev the proof and root are gotten from the MerkleTree script
   /// @param _merkleProof to check if to is part of merkle tree
    /// @notice Only whitelisted users can mint
    ///@param uri is 1.json and 2.json
   function mintLazyEdition(uint _mintAmount, string calldata uri, bytes32[] calldata _merkleProof) nonReentrant external{
  //generate a leaf node to verify merkle proof
     bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

    require(MerkleProof.verify(_merkleProof,merkleRoot,leaf), "Xtralion:invalid merkle proof"); //checks for valid proof
                 isWhitelisted[msg.sender] = true;

       require(_mintAmount != 0, "token:Cannot mint 0 tokens");     // Number of tokens can't be 0.

       lazyTokenMinted[msg.sender] += _mintAmount; //update users record

       require(lazyTokenMinted[msg.sender] <= maxMintLazyAmount,"xtralion:you have exceeded mint limit per wallet"); 

               uint256 supply = totalSupply() +_mintAmount;

       require(supply <= 120 && supply <= MAX_TOKEN_SUPPLY,"xtralion:Minting would exceed max. supply"); //make sure supply is still avail to mint

              for(uint256 i = 1; i <= _mintAmount; i++){
            uint256 tokenId = _tokenIdCounter.current();
             _safeMint(msg.sender, tokenId);// For each token requested, mint one.
             _setTokenURI(tokenId, uri);
            _tokenIdCounter.increment();
        }
      
        emit mintedLazyEdition(msg.sender, _mintAmount);
   }

    /// @notice only whitelisted address can mint if whitelist is disabled
    /// @notice members can only mint this edition if they pay the MINT_PRICE
    /// @param _mintAmount is the min token amount
    /// @param _merkleProof to make sure address is whitelisted
     ///@param uri is 1.json and 2.json respectively for the lazy and king collection
   function mintKingEdition(uint _mintAmount, string calldata uri, bytes32[] calldata _merkleProof) nonReentrant external payable{
     //generate a leaf node to verify merkle proof
     bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

    require(MerkleProof.verify(_merkleProof,merkleRoot,leaf),"invalid merkle proof");
                 isWhitelisted[msg.sender] = true;
        if(whitelistState == true){
            require(
            isWhitelisted[msg.sender] = true,"whitelist Enabled: only whiteListedAddress can mint"
           ); 
         }else{
          (_lazyLion.balanceOf(msg.sender) > 0, "Whitelist disabled:not a lazy lion owner");     
         }
         // Number of tokens can't be 0.
        require(_mintAmount != 0, "Cannot mint 0 tokens");
             kingTokensMinted[msg.sender]  += _mintAmount;//update users record

        //check if address has minted
        require(kingTokensMinted[msg.sender] <= maxMintKingAmount, "you have exceeded mint limit per wallet");
        uint mintIndex = totalSupply() + _mintAmount;
        uint pricePerToken = MINT_PRICE * _mintAmount;
        // Check that the right amount of Ether was sent.
        require(pricePerToken <= msg.value, "Not enough Ether sent."); 

       require(mintIndex <= 380 && mintIndex <= MAX_TOKEN_SUPPLY,"Minting would exceed max. supply"); //make sure supply is still avail to mint
                  uint256 tokenId = _tokenIdCounter.current();

              for(uint256 i = 1; i <= _mintAmount; i++){

             _safeMint(msg.sender, tokenId);
              _setTokenURI(tokenId, uri);
              _tokenIdCounter.increment(); // For each token requested, mint one.
              }
  
                emit mintedKingEdition(msg.sender, _mintAmount);

   }


      function changeWhitelistState() public onlyRole(MANAGER_ROLE){
       whitelistState = !whitelistState;

        }
      function getBalance() onlyRole(MANAGER_ROLE) public view returns(uint256) {
        return address(this).balance;
        }

       function changeLazyMintAmt(uint256 _newMint) public onlyRole(MANAGER_ROLE) {
        maxMintLazyAmount = _newMint;
        }
       function changeKingMintAmt(uint256 _newMint) public onlyRole(MANAGER_ROLE) {
        maxMintKingAmount = _newMint;
         }
       function changeMintPrice(uint256 _newPrice) public onlyRole(DEFAULT_ADMIN_ROLE) {
        MINT_PRICE = _newPrice;
        }
    ///@notice deposit in gnosis for mulsig to sig
    ///@notice admins set at the constructor also needs to be a manager
         function withdraw() onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant external returns(bool){
               (bool sent,) = payable(gnosis_addr).call{value: getBalance()}("");
            require(sent,"Ether not sent:failed transaction");
                return true;
         }
    /// @dev Add an account to the manager role. Restricted to admins.
        function addAsManager(address account) public onlyRole(DEFAULT_ADMIN_ROLE)
       {
         require(hasRole(MANAGER_ROLE,account) == false,"Already a manager");
           grantRole(MANAGER_ROLE, account);

            emit managerAdded(account);
       }
        
      // Create a bool check to see if a account address has the role admin
      function isAdmin(address account) public view returns(bool)
      {
           return hasRole(DEFAULT_ADMIN_ROLE, account);
      }
        // Create a bool check to see if a account address has the role admin
      function isManager(address account) public view returns(bool)
      {
           return hasRole(MANAGER_ROLE, account);
       }

         ///@custom:interface The following functions are overrides required by Solidity.
       function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, AccessControl,ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
       }


        function _beforeTokenTransfer(address from, address to,uint256 tokenId) internal virtual override(ERC721Enumerable,ERC721) {
                  super._beforeTokenTransfer(from, to, tokenId);
        }

        function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
       }

        function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory)
       {
           return super.tokenURI(tokenId);

        }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"_admin_one","type":"address"},{"internalType":"address","name":"_admin_two","type":"address"},{"internalType":"address","name":"_admin_three","type":"address"},{"internalType":"address","name":"_gnosis_addr","type":"address"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"UpdatedRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"managerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintedKingEdition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintedLazyEdition","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAsManager","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMint","type":"uint256"}],"name":"changeKingMintAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMint","type":"uint256"}],"name":"changeLazyMintAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeWhitelistState","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":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"isAdmin","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":"account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"kingTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lazyTokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintKingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintLazyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintKingEdition","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintLazyEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405267011c37937e080000601255600a6013556001601455738943c7bac1914c9a7aba750bf2b6b09fd21037e0601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007c57600080fd5b5060405162006679380380620066798339818101604052810190620000a29190620006ec565b6040518060400160405280600e81526020017f5854524120666f72204c494f4e530000000000000000000000000000000000008152506040518060400160405280600981526020017f585452414c494f4e53000000000000000000000000000000000000000000000081525081600090805190602001906200012692919062000590565b5080600190805190602001906200013f92919062000590565b5050506001600a8190555080601590805190602001906200016292919062000590565b5084600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085601681905550620002a96040516020016200028390620007ce565b604051602081830303815290604052805190602001206000801b6200039160201b60201c565b620002e06000801b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003f560201b60201c565b620003176000801b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003f560201b60201c565b6200034e6000801b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003f560201b60201c565b620003856000801b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003f560201b60201c565b50505050505062000a0f565b6000620003a4836200040b60201b60201c565b905081600b6000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200040782826200042b60201b60201c565b5050565b6000600b6000838152602001908152602001600020600101549050919050565b6200043d82826200051d60201b60201c565b62000519576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004be6200058860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200059e90620008c3565b90600052602060002090601f016020900481019282620005c257600085556200060e565b82601f10620005dd57805160ff19168380011785556200060e565b828001600101855582156200060e579182015b828111156200060d578251825591602001919060010190620005f0565b5b5090506200061d919062000621565b5090565b5b808211156200063c57600081600090555060010162000622565b5090565b60006200065762000651846200080e565b620007e5565b90508281526020810184848401111562000676576200067562000992565b5b620006838482856200088d565b509392505050565b6000815190506200069c81620009db565b92915050565b600081519050620006b381620009f5565b92915050565b600082601f830112620006d157620006d06200098d565b5b8151620006e384826020860162000640565b91505092915050565b60008060008060008060c087890312156200070c576200070b6200099c565b5b60006200071c89828a01620006a2565b96505060206200072f89828a016200068b565b95505060406200074289828a016200068b565b94505060606200075589828a016200068b565b93505060806200076889828a016200068b565b92505060a087015167ffffffffffffffff8111156200078c576200078b62000997565b5b6200079a89828a01620006b9565b9150509295509295509295565b6000620007b660078362000844565b9150620007c382620009b2565b600782019050919050565b6000620007db82620007a7565b9150819050919050565b6000620007f162000804565b9050620007ff8282620008f9565b919050565b6000604051905090565b600067ffffffffffffffff8211156200082c576200082b6200095e565b5b6200083782620009a1565b9050602081019050919050565b600081905092915050565b60006200085c826200086d565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620008ad57808201518184015260208101905062000890565b83811115620008bd576000848401525b50505050565b60006002820490506001821680620008dc57607f821691505b60208210811415620008f357620008f26200092f565b5b50919050565b6200090482620009a1565b810181811067ffffffffffffffff821117156200092657620009256200095e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6d616e6167657200000000000000000000000000000000000000000000000000600082015250565b620009e6816200084f565b8114620009f257600080fd5b50565b62000a008162000863565b811462000a0c57600080fd5b50565b615c5a8062000a1f6000396000f3fe6080604052600436106102725760003560e01c80634783f0ef1161014f578063a78bc398116100c1578063d58d9a231161007a578063d58d9a23146109b1578063e489d510146109dc578063e985e9c514610a07578063ec87621c14610a44578063f3ae241514610a6f578063fdfa81f514610aac57610272565b8063a78bc3981461088f578063b88d4fde146108ba578063c002d23d146108e3578063c560156b1461090e578063c87b56dd1461094b578063d547741f1461098857610272565b806370a082311161011357806370a082311461076d5780637108ed46146107aa57806391d14854146107d357806395d89b4114610810578063a217fddf1461083b578063a22cb4651461086657610272565b80634783f0ef146106835780634f6ccce7146106ac5780635521b3fe146106e95780636352211e146107055780636c0360eb1461074257610272565b80632eb4a7ab116101e85780633715d694116101ac5780633715d694146105755780633af32abf1461059e5780633ccfd60b146105db5780633fd173661461060657806342842e0e1461062f5780634293516d1461065857610272565b80632eb4a7ab1461047e5780632f2ff15d146104a95780632f745c59146104d2578063348545e91461050f57806336568abe1461054c57610272565b80630e6246341161023a5780630e6246341461036e57806312065fe01461038557806318160ddd146103b057806323b872dd146103db578063248a9ca31461040457806324d7806c1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630a658b5214610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906140be565b610ad5565b6040516102ab919061493f565b60405180910390f35b3480156102c057600080fd5b506102c9610ae7565b6040516102d69190614975565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614118565b610b79565b60405161031391906148af565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190614011565b610bfe565b005b34801561035157600080fd5b5061036c60048036038101906103679190614118565b610d16565b005b34801561037a57600080fd5b50610383610d4f565b005b34801561039157600080fd5b5061039a610daa565b6040516103a79190614db7565b60405180910390f35b3480156103bc57600080fd5b506103c5610de1565b6040516103d29190614db7565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd9190613efb565b610dee565b005b34801561041057600080fd5b5061042b60048036038101906104269190614051565b610e4e565b604051610438919061495a565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190613e8e565b610e6e565b604051610475919061493f565b60405180910390f35b34801561048a57600080fd5b50610493610e84565b6040516104a0919061495a565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb919061407e565b610e8a565b005b3480156104de57600080fd5b506104f960048036038101906104f49190614011565b610eab565b6040516105069190614db7565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613e8e565b610f50565b6040516105439190614db7565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e919061407e565b610f68565b005b34801561058157600080fd5b5061059c60048036038101906105979190614172565b610feb565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613e8e565b6113ad565b6040516105d2919061493f565b60405180910390f35b3480156105e757600080fd5b506105f06113cd565b6040516105fd919061493f565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614118565b611510565b005b34801561063b57600080fd5b5061065660048036038101906106519190613efb565b611528565b005b34801561066457600080fd5b5061066d611548565b60405161067a919061493f565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190614051565b61155b565b005b3480156106b857600080fd5b506106d360048036038101906106ce9190614118565b6115cb565b6040516106e09190614db7565b60405180910390f35b61070360048036038101906106fe9190614172565b61163c565b005b34801561071157600080fd5b5061072c60048036038101906107279190614118565b611bbc565b60405161073991906148af565b60405180910390f35b34801561074e57600080fd5b50610757611c6e565b6040516107649190614975565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613e8e565b611cfc565b6040516107a19190614db7565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190614118565b611db4565b005b3480156107df57600080fd5b506107fa60048036038101906107f5919061407e565b611ded565b604051610807919061493f565b60405180910390f35b34801561081c57600080fd5b50610825611e58565b6040516108329190614975565b60405180910390f35b34801561084757600080fd5b50610850611eea565b60405161085d919061495a565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613fd1565b611ef1565b005b34801561089b57600080fd5b506108a4611f07565b6040516108b19190614db7565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613f4e565b611f0d565b005b3480156108ef57600080fd5b506108f8611f6f565b6040516109059190614db7565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190613e8e565b611f75565b6040516109429190614db7565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190614118565b611f8d565b60405161097f9190614975565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa919061407e565b611f9f565b005b3480156109bd57600080fd5b506109c6611fc0565b6040516109d39190614db7565b60405180910390f35b3480156109e857600080fd5b506109f1611fc6565b6040516109fe9190614db7565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613ebb565b611fcc565b604051610a3b919061493f565b60405180910390f35b348015610a5057600080fd5b50610a59612060565b604051610a66919061495a565b60405180910390f35b348015610a7b57600080fd5b50610a966004803603810190610a919190613e8e565b612088565b604051610aa3919061493f565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace9190613e8e565b6120bf565b005b6000610ae0826121a9565b9050919050565b606060008054610af690615075565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290615075565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b5050505050905090565b6000610b8482612223565b610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614bf7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0982611bbc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190614c97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9961228f565b73ffffffffffffffffffffffffffffffffffffffff161480610cc85750610cc781610cc261228f565b611fcc565b5b610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614b37565b60405180910390fd5b610d118383612297565b505050565b604051602001610d259061484b565b60405160208183030381529060405280519060200120610d4481612350565b816013819055505050565b604051602001610d5e9061484b565b60405160208183030381529060405280519060200120610d7d81612350565b600e60009054906101000a900460ff1615600e60006101000a81548160ff02191690831515021790555050565b6000604051602001610dbb9061484b565b60405160208183030381529060405280519060200120610dda81612350565b4791505090565b6000600880549050905090565b610dff610df961228f565b82612364565b610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614cb7565b60405180910390fd5b610e49838383612442565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000610e7d6000801b83611ded565b9050919050565b60165481565b610e9382610e4e565b610e9c81612350565b610ea683836126a9565b505050565b6000610eb683611cfc565b8210610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906149f7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601a6020528060005260406000206000915090505481565b610f7061228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490614d97565b60405180910390fd5b610fe7828261278a565b5050565b6002600a541415611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890614d57565b60405180910390fd5b6002600a8190555060003360405160200161104c919061480c565b6040516020818303038152906040528051906020012090506110b2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506016548361286c565b6110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614a37565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600086141561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614d17565b60405180910390fd5b85601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111dc9190614e76565b92505081905550601454601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90614c37565b60405180910390fd5b600086611272610de1565b61127c9190614e76565b90506078811115801561129157506101f48111155b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614d77565b60405180910390fd5b6000600190505b8781116113625760006112ea600d612883565b90506112f63382612891565b6113448189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b61134e600d612923565b50808061135a906150d8565b9150506112d7565b507f39ca0e6b7842129df740acb4b4bdb6873314c330d3ced101b231cd524fe3b6b43388604051611394929190614916565b60405180910390a150506001600a819055505050505050565b60186020528060005260406000206000915054906101000a900460ff1681565b60008060001b6113dc81612350565b6002600a541415611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614d57565b60405180910390fd5b6002600a819055506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661146d610daa565b60405161147990614860565b60006040518083038185875af1925050503d80600081146114b6576040519150601f19603f3d011682016040523d82523d6000602084013e6114bb565b606091505b50509050806114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690614ab7565b60405180910390fd5b60019250506001600a819055505090565b6000801b61151d81612350565b816012819055505050565b61154383838360405180602001604052806000815250611f0d565b505050565b600e60009054906101000a900460ff1681565b60405160200161156a9061484b565b6040516020818303038152906040528051906020012061158981612350565b816016819055507f440a23eec1e4294124e8a3a37a4ab6a4bfb06ef472a9defb103297c060f915c8826040516115bf919061495a565b60405180910390a15050565b60006115d5610de1565b8210611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614cd7565b60405180910390fd5b6008828154811061162a57611629615232565b5b90600052602060002001549050919050565b6002600a541415611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990614d57565b60405180910390fd5b6002600a8190555060003360405160200161169d919061480c565b604051602081830303815290604052805190602001209050611703838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506016548361286c565b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614a57565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060011515600e60009054906101000a900460ff1615151415611851576001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390614cf7565b60405180910390fd5b611901565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016118ae91906148af565b60206040518083038186803b1580156118c657600080fd5b505afa1580156118da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fe9190614145565b50505b6000861415611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90614c77565b60405180910390fd5b85601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119949190614e76565b92505081905550601354601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a16906149d7565b60405180910390fd5b600086611a2a610de1565b611a349190614e76565b9050600087601254611a469190614efd565b905034811115611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290614c57565b60405180910390fd5b61017c8211158015611a9f57506101f48211155b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590614d37565b60405180910390fd5b6000611aea600d612883565b90506000600190505b898111611b6f57611b043383612891565b611b52828a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b611b5c600d612923565b8080611b67906150d8565b915050611af3565b507f1d07e32c1762df9f4be731069b8feea488d16413b40aa051450529b3a5337c84338a604051611ba1929190614916565b60405180910390a1505050506001600a819055505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90614b77565b60405180910390fd5b80915050919050565b60158054611c7b90615075565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790615075565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490614b57565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b604051602001611dc39061484b565b60405160208183030381529060405280519060200120611de281612350565b816014819055505050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611e6790615075565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9390615075565b8015611ee05780601f10611eb557610100808354040283529160200191611ee0565b820191906000526020600020905b815481529060010190602001808311611ec357829003601f168201915b5050505050905090565b6000801b81565b611f03611efc61228f565b8383612939565b5050565b60145481565b611f1e611f1861228f565b83612364565b611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614cb7565b60405180910390fd5b611f6984848484612aa6565b50505050565b60125481565b60196020528060005260406000206000915090505481565b6060611f9882612b02565b9050919050565b611fa882610e4e565b611fb181612350565b611fbb838361278a565b505050565b60135481565b6101f481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60405160200161206f9061484b565b6040516020818303038152906040528051906020012081565b60006120b860405160200161209c9061484b565b6040516020818303038152906040528051906020012083611ded565b9050919050565b6000801b6120cc81612350565b600015156120fe6040516020016120e29061484b565b6040516020818303038152906040528051906020012084611ded565b151514612140576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612137906149b7565b60405180910390fd5b61216e6040516020016121529061484b565b6040516020818303038152906040528051906020012083610e8a565b7fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575178260405161219d91906148af565b60405180910390a15050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221c575061221b82612c54565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661230a83611bbc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123618161235c61228f565b612cce565b50565b600061236f82612223565b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614b17565b60405180910390fd5b60006123b983611bbc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242857508373ffffffffffffffffffffffffffffffffffffffff1661241084610b79565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243957506124388185611fcc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661246282611bbc565b73ffffffffffffffffffffffffffffffffffffffff16146124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90614a77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614ad7565b60405180910390fd5b612533838383612d6b565b61253e600082612297565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258e9190614f57565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e59190614e76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126a4838383612d7b565b505050565b6126b38282611ded565b612786576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061272b61228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6127948282611ded565b15612868576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061280d61228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000826128798584612d80565b1490509392505050565b600081600001549050919050565b6128ab828260405180602001604052806000815250612df5565b5050565b6128b882612223565b6128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90614b97565b60405180910390fd5b80600c6000848152602001908152602001600020908051906020019061291e929190613c3c565b505050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f90614af7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a99919061493f565b60405180910390a3505050565b612ab1848484612442565b612abd84848484612e50565b612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af390614a17565b60405180910390fd5b50505050565b6060612b0d82612223565b612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4390614bd7565b60405180910390fd5b6000600c60008481526020019081526020016000208054612b6c90615075565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9890615075565b8015612be55780601f10612bba57610100808354040283529160200191612be5565b820191906000526020600020905b815481529060010190602001808311612bc857829003601f168201915b505050505090506000612bf6612fe7565b9050600081511415612c0c578192505050612c4f565b600082511115612c41578082604051602001612c29929190614827565b60405160208183030381529060405292505050612c4f565b612c4a84613079565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc75750612cc682613120565b5b9050919050565b612cd88282611ded565b612d6757612cfd8173ffffffffffffffffffffffffffffffffffffffff166014613202565b612d0b8360001c6020613202565b604051602001612d1c929190614875565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e9190614975565b60405180910390fd5b5050565b612d7683838361343e565b505050565b505050565b60008082905060005b8451811015612dea576000858281518110612da757612da6615232565b5b60200260200101519050808311612dc957612dc28382613552565b9250612dd6565b612dd38184613552565b92505b508080612de2906150d8565b915050612d89565b508091505092915050565b612dff8383613569565b612e0c6000848484612e50565b612e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4290614a17565b60405180910390fd5b505050565b6000612e718473ffffffffffffffffffffffffffffffffffffffff16613743565b15612fda578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9a61228f565b8786866040518563ffffffff1660e01b8152600401612ebc94939291906148ca565b602060405180830381600087803b158015612ed657600080fd5b505af1925050508015612f0757506040513d601f19601f82011682018060405250810190612f0491906140eb565b60015b612f8a573d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b50600081511415612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7990614a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fdf565b600190505b949350505050565b606060158054612ff690615075565b80601f016020809104026020016040519081016040528092919081815260200182805461302290615075565b801561306f5780601f106130445761010080835404028352916020019161306f565b820191906000526020600020905b81548152906001019060200180831161305257829003601f168201915b5050505050905090565b606061308482612223565b6130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba90614c17565b60405180910390fd5b60006130cd612fe7565b905060008151116130ed5760405180602001604052806000815250613118565b806130f784613766565b604051602001613108929190614827565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131fb57506131fa826138c7565b5b9050919050565b6060600060028360026132159190614efd565b61321f9190614e76565b67ffffffffffffffff81111561323857613237615261565b5b6040519080825280601f01601f19166020018201604052801561326a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132a2576132a1615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061330657613305615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133469190614efd565b6133509190614e76565b90505b60018111156133f0577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061339257613391615232565b5b1a60f81b8282815181106133a9576133a8615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806133e99061504b565b9050613353565b5060008414613434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342b90614997565b60405180910390fd5b8091505092915050565b613449838383613931565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561348c5761348781613936565b6134cb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134ca576134c9838261397f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561350e5761350981613aec565b61354d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461354c5761354b8282613bbd565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d090614bb7565b60405180910390fd5b6135e281612223565b15613622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361990614a97565b60405180910390fd5b61362e60008383612d6b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367e9190614e76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461373f60008383612d7b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156137ae576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138c2565b600082905060005b600082146137e05780806137c9906150d8565b915050600a826137d99190614ecc565b91506137b6565b60008167ffffffffffffffff8111156137fc576137fb615261565b5b6040519080825280601f01601f19166020018201604052801561382e5781602001600182028036833780820191505090505b5090505b600085146138bb576001826138479190614f57565b9150600a856138569190615145565b60306138629190614e76565b60f81b81838151811061387857613877615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138b49190614ecc565b9450613832565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161398c84611cfc565b6139969190614f57565b9050600060076000848152602001908152602001600020549050818114613a7b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b009190614f57565b9050600060096000848152602001908152602001600020549050600060088381548110613b3057613b2f615232565b5b906000526020600020015490508060088381548110613b5257613b51615232565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ba157613ba0615203565b5b6001900381819060005260206000200160009055905550505050565b6000613bc883611cfc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613c4890615075565b90600052602060002090601f016020900481019282613c6a5760008555613cb1565b82601f10613c8357805160ff1916838001178555613cb1565b82800160010185558215613cb1579182015b82811115613cb0578251825591602001919060010190613c95565b5b509050613cbe9190613cc2565b5090565b5b80821115613cdb576000816000905550600101613cc3565b5090565b6000613cf2613ced84614df7565b614dd2565b905082815260208101848484011115613d0e57613d0d61529f565b5b613d19848285615009565b509392505050565b600081359050613d3081615bb1565b92915050565b60008083601f840112613d4c57613d4b615295565b5b8235905067ffffffffffffffff811115613d6957613d68615290565b5b602083019150836020820283011115613d8557613d8461529a565b5b9250929050565b600081359050613d9b81615bc8565b92915050565b600081359050613db081615bdf565b92915050565b600081359050613dc581615bf6565b92915050565b600081519050613dda81615bf6565b92915050565b600082601f830112613df557613df4615295565b5b8135613e05848260208601613cdf565b91505092915050565b60008083601f840112613e2457613e23615295565b5b8235905067ffffffffffffffff811115613e4157613e40615290565b5b602083019150836001820283011115613e5d57613e5c61529a565b5b9250929050565b600081359050613e7381615c0d565b92915050565b600081519050613e8881615c0d565b92915050565b600060208284031215613ea457613ea36152a9565b5b6000613eb284828501613d21565b91505092915050565b60008060408385031215613ed257613ed16152a9565b5b6000613ee085828601613d21565b9250506020613ef185828601613d21565b9150509250929050565b600080600060608486031215613f1457613f136152a9565b5b6000613f2286828701613d21565b9350506020613f3386828701613d21565b9250506040613f4486828701613e64565b9150509250925092565b60008060008060808587031215613f6857613f676152a9565b5b6000613f7687828801613d21565b9450506020613f8787828801613d21565b9350506040613f9887828801613e64565b925050606085013567ffffffffffffffff811115613fb957613fb86152a4565b5b613fc587828801613de0565b91505092959194509250565b60008060408385031215613fe857613fe76152a9565b5b6000613ff685828601613d21565b925050602061400785828601613d8c565b9150509250929050565b60008060408385031215614028576140276152a9565b5b600061403685828601613d21565b925050602061404785828601613e64565b9150509250929050565b600060208284031215614067576140666152a9565b5b600061407584828501613da1565b91505092915050565b60008060408385031215614095576140946152a9565b5b60006140a385828601613da1565b92505060206140b485828601613d21565b9150509250929050565b6000602082840312156140d4576140d36152a9565b5b60006140e284828501613db6565b91505092915050565b600060208284031215614101576141006152a9565b5b600061410f84828501613dcb565b91505092915050565b60006020828403121561412e5761412d6152a9565b5b600061413c84828501613e64565b91505092915050565b60006020828403121561415b5761415a6152a9565b5b600061416984828501613e79565b91505092915050565b60008060008060006060868803121561418e5761418d6152a9565b5b600061419c88828901613e64565b955050602086013567ffffffffffffffff8111156141bd576141bc6152a4565b5b6141c988828901613e0e565b9450945050604086013567ffffffffffffffff8111156141ec576141eb6152a4565b5b6141f888828901613d36565b92509250509295509295909350565b61421081614f8b565b82525050565b61422761422282614f8b565b615121565b82525050565b61423681614f9d565b82525050565b61424581614fa9565b82525050565b600061425682614e28565b6142608185614e3e565b9350614270818560208601615018565b614279816152ae565b840191505092915050565b600061428f82614e33565b6142998185614e5a565b93506142a9818560208601615018565b6142b2816152ae565b840191505092915050565b60006142c882614e33565b6142d28185614e6b565b93506142e2818560208601615018565b80840191505092915050565b60006142fb602083614e5a565b9150614306826152cc565b602082019050919050565b600061431e601183614e5a565b9150614329826152f5565b602082019050919050565b6000614341602783614e5a565b915061434c8261531e565b604082019050919050565b6000614364602b83614e5a565b915061436f8261536d565b604082019050919050565b6000614387603283614e5a565b9150614392826153bc565b604082019050919050565b60006143aa601d83614e5a565b91506143b58261540b565b602082019050919050565b60006143cd600783614e6b565b91506143d882615434565b600782019050919050565b60006143f0601483614e5a565b91506143fb8261545d565b602082019050919050565b6000614413602583614e5a565b915061441e82615486565b604082019050919050565b6000614436601c83614e5a565b9150614441826154d5565b602082019050919050565b6000614459602183614e5a565b9150614464826154fe565b604082019050919050565b600061447c602483614e5a565b91506144878261554d565b604082019050919050565b600061449f601983614e5a565b91506144aa8261559c565b602082019050919050565b60006144c2602c83614e5a565b91506144cd826155c5565b604082019050919050565b60006144e5603883614e5a565b91506144f082615614565b604082019050919050565b6000614508602a83614e5a565b915061451382615663565b604082019050919050565b600061452b602983614e5a565b9150614536826156b2565b604082019050919050565b600061454e602e83614e5a565b915061455982615701565b604082019050919050565b6000614571602083614e5a565b915061457c82615750565b602082019050919050565b6000614594603183614e5a565b915061459f82615779565b604082019050919050565b60006145b7602c83614e5a565b91506145c2826157c8565b604082019050919050565b60006145da602f83614e5a565b91506145e582615817565b604082019050919050565b60006145fd603083614e5a565b915061460882615866565b604082019050919050565b6000614620601683614e5a565b915061462b826158b5565b602082019050919050565b6000614643601483614e5a565b915061464e826158de565b602082019050919050565b6000614666602183614e5a565b915061467182615907565b604082019050919050565b6000614689600083614e4f565b915061469482615956565b600082019050919050565b60006146ac603183614e5a565b91506146b782615959565b604082019050919050565b60006146cf602c83614e5a565b91506146da826159a8565b604082019050919050565b60006146f2603383614e5a565b91506146fd826159f7565b604082019050919050565b6000614715601a83614e5a565b915061472082615a46565b602082019050919050565b6000614738602083614e5a565b915061474382615a6f565b602082019050919050565b600061475b601783614e6b565b915061476682615a98565b601782019050919050565b600061477e601f83614e5a565b915061478982615ac1565b602082019050919050565b60006147a1602983614e5a565b91506147ac82615aea565b604082019050919050565b60006147c4601183614e6b565b91506147cf82615b39565b601182019050919050565b60006147e7602f83614e5a565b91506147f282615b62565b604082019050919050565b61480681614fff565b82525050565b60006148188284614216565b60148201915081905092915050565b600061483382856142bd565b915061483f82846142bd565b91508190509392505050565b6000614856826143c0565b9150819050919050565b600061486b8261467c565b9150819050919050565b60006148808261474e565b915061488c82856142bd565b9150614897826147b7565b91506148a382846142bd565b91508190509392505050565b60006020820190506148c46000830184614207565b92915050565b60006080820190506148df6000830187614207565b6148ec6020830186614207565b6148f960408301856147fd565b818103606083015261490b818461424b565b905095945050505050565b600060408201905061492b6000830185614207565b61493860208301846147fd565b9392505050565b6000602082019050614954600083018461422d565b92915050565b600060208201905061496f600083018461423c565b92915050565b6000602082019050818103600083015261498f8184614284565b905092915050565b600060208201905081810360008301526149b0816142ee565b9050919050565b600060208201905081810360008301526149d081614311565b9050919050565b600060208201905081810360008301526149f081614334565b9050919050565b60006020820190508181036000830152614a1081614357565b9050919050565b60006020820190508181036000830152614a308161437a565b9050919050565b60006020820190508181036000830152614a508161439d565b9050919050565b60006020820190508181036000830152614a70816143e3565b9050919050565b60006020820190508181036000830152614a9081614406565b9050919050565b60006020820190508181036000830152614ab081614429565b9050919050565b60006020820190508181036000830152614ad08161444c565b9050919050565b60006020820190508181036000830152614af08161446f565b9050919050565b60006020820190508181036000830152614b1081614492565b9050919050565b60006020820190508181036000830152614b30816144b5565b9050919050565b60006020820190508181036000830152614b50816144d8565b9050919050565b60006020820190508181036000830152614b70816144fb565b9050919050565b60006020820190508181036000830152614b908161451e565b9050919050565b60006020820190508181036000830152614bb081614541565b9050919050565b60006020820190508181036000830152614bd081614564565b9050919050565b60006020820190508181036000830152614bf081614587565b9050919050565b60006020820190508181036000830152614c10816145aa565b9050919050565b60006020820190508181036000830152614c30816145cd565b9050919050565b60006020820190508181036000830152614c50816145f0565b9050919050565b60006020820190508181036000830152614c7081614613565b9050919050565b60006020820190508181036000830152614c9081614636565b9050919050565b60006020820190508181036000830152614cb081614659565b9050919050565b60006020820190508181036000830152614cd08161469f565b9050919050565b60006020820190508181036000830152614cf0816146c2565b9050919050565b60006020820190508181036000830152614d10816146e5565b9050919050565b60006020820190508181036000830152614d3081614708565b9050919050565b60006020820190508181036000830152614d508161472b565b9050919050565b60006020820190508181036000830152614d7081614771565b9050919050565b60006020820190508181036000830152614d9081614794565b9050919050565b60006020820190508181036000830152614db0816147da565b9050919050565b6000602082019050614dcc60008301846147fd565b92915050565b6000614ddc614ded565b9050614de882826150a7565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1257614e11615261565b5b614e1b826152ae565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8182614fff565b9150614e8c83614fff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ec157614ec0615176565b5b828201905092915050565b6000614ed782614fff565b9150614ee283614fff565b925082614ef257614ef16151a5565b5b828204905092915050565b6000614f0882614fff565b9150614f1383614fff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f4c57614f4b615176565b5b828202905092915050565b6000614f6282614fff565b9150614f6d83614fff565b925082821015614f8057614f7f615176565b5b828203905092915050565b6000614f9682614fdf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561503657808201518184015260208101905061501b565b83811115615045576000848401525b50505050565b600061505682614fff565b9150600082141561506a57615069615176565b5b600182039050919050565b6000600282049050600182168061508d57607f821691505b602082108114156150a1576150a06151d4565b5b50919050565b6150b0826152ae565b810181811067ffffffffffffffff821117156150cf576150ce615261565b5b80604052505050565b60006150e382614fff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561511657615115615176565b5b600182019050919050565b600061512c82615133565b9050919050565b600061513e826152bf565b9050919050565b600061515082614fff565b915061515b83614fff565b92508261516b5761516a6151a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416c72656164792061206d616e61676572000000000000000000000000000000600082015250565b7f796f752068617665206578636565646564206d696e74206c696d69742070657260008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f587472616c696f6e3a696e76616c6964206d65726b6c652070726f6f66000000600082015250565b7f6d616e6167657200000000000000000000000000000000000000000000000000600082015250565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4574686572206e6f742073656e743a6661696c6564207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f787472616c696f6e3a796f752068617665206578636565646564206d696e742060008201527f6c696d6974207065722077616c6c657400000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045746865722073656e742e00000000000000000000600082015250565b7f43616e6e6f74206d696e74203020746f6b656e73000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f77686974656c69737420456e61626c65643a206f6e6c792077686974654c697360008201527f746564416464726573732063616e206d696e7400000000000000000000000000602082015250565b7f746f6b656e3a43616e6e6f74206d696e74203020746f6b656e73000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d61782e20737570706c79600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f787472616c696f6e3a4d696e74696e6720776f756c6420657863656564206d6160008201527f782e20737570706c790000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615bba81614f8b565b8114615bc557600080fd5b50565b615bd181614f9d565b8114615bdc57600080fd5b50565b615be881614fa9565b8114615bf357600080fd5b50565b615bff81614fb3565b8114615c0a57600080fd5b50565b615c1681614fff565b8114615c2157600080fd5b5056fea26469706673582212202b1084cf3f2ff5a84839dfdca4a289841a45cfb39eb1a4a571fa00169ea1ce0b64736f6c634300080700337b93fbffd791989028c8093e1dcfb72e117bb0ee3bb9114eb19f97d5edc88a900000000000000000000000001af2642d14465aff49f8b36c7930b744d36307b20000000000000000000000002195dc90ff5c042faec70c8cc18a2737f0348975000000000000000000000000e442b32eb559435a842b0bc740ac7bbea9cb6d84000000000000000000000000994f4fbdad11902876fc8119a90d3a24dd1ef4c200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5239534c6a5443746a7956584646476353346543557343683161795276444c42785932394573336a746645482f00000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c80634783f0ef1161014f578063a78bc398116100c1578063d58d9a231161007a578063d58d9a23146109b1578063e489d510146109dc578063e985e9c514610a07578063ec87621c14610a44578063f3ae241514610a6f578063fdfa81f514610aac57610272565b8063a78bc3981461088f578063b88d4fde146108ba578063c002d23d146108e3578063c560156b1461090e578063c87b56dd1461094b578063d547741f1461098857610272565b806370a082311161011357806370a082311461076d5780637108ed46146107aa57806391d14854146107d357806395d89b4114610810578063a217fddf1461083b578063a22cb4651461086657610272565b80634783f0ef146106835780634f6ccce7146106ac5780635521b3fe146106e95780636352211e146107055780636c0360eb1461074257610272565b80632eb4a7ab116101e85780633715d694116101ac5780633715d694146105755780633af32abf1461059e5780633ccfd60b146105db5780633fd173661461060657806342842e0e1461062f5780634293516d1461065857610272565b80632eb4a7ab1461047e5780632f2ff15d146104a95780632f745c59146104d2578063348545e91461050f57806336568abe1461054c57610272565b80630e6246341161023a5780630e6246341461036e57806312065fe01461038557806318160ddd146103b057806323b872dd146103db578063248a9ca31461040457806324d7806c1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630a658b5214610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906140be565b610ad5565b6040516102ab919061493f565b60405180910390f35b3480156102c057600080fd5b506102c9610ae7565b6040516102d69190614975565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614118565b610b79565b60405161031391906148af565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190614011565b610bfe565b005b34801561035157600080fd5b5061036c60048036038101906103679190614118565b610d16565b005b34801561037a57600080fd5b50610383610d4f565b005b34801561039157600080fd5b5061039a610daa565b6040516103a79190614db7565b60405180910390f35b3480156103bc57600080fd5b506103c5610de1565b6040516103d29190614db7565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd9190613efb565b610dee565b005b34801561041057600080fd5b5061042b60048036038101906104269190614051565b610e4e565b604051610438919061495a565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190613e8e565b610e6e565b604051610475919061493f565b60405180910390f35b34801561048a57600080fd5b50610493610e84565b6040516104a0919061495a565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb919061407e565b610e8a565b005b3480156104de57600080fd5b506104f960048036038101906104f49190614011565b610eab565b6040516105069190614db7565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613e8e565b610f50565b6040516105439190614db7565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e919061407e565b610f68565b005b34801561058157600080fd5b5061059c60048036038101906105979190614172565b610feb565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613e8e565b6113ad565b6040516105d2919061493f565b60405180910390f35b3480156105e757600080fd5b506105f06113cd565b6040516105fd919061493f565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614118565b611510565b005b34801561063b57600080fd5b5061065660048036038101906106519190613efb565b611528565b005b34801561066457600080fd5b5061066d611548565b60405161067a919061493f565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190614051565b61155b565b005b3480156106b857600080fd5b506106d360048036038101906106ce9190614118565b6115cb565b6040516106e09190614db7565b60405180910390f35b61070360048036038101906106fe9190614172565b61163c565b005b34801561071157600080fd5b5061072c60048036038101906107279190614118565b611bbc565b60405161073991906148af565b60405180910390f35b34801561074e57600080fd5b50610757611c6e565b6040516107649190614975565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613e8e565b611cfc565b6040516107a19190614db7565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190614118565b611db4565b005b3480156107df57600080fd5b506107fa60048036038101906107f5919061407e565b611ded565b604051610807919061493f565b60405180910390f35b34801561081c57600080fd5b50610825611e58565b6040516108329190614975565b60405180910390f35b34801561084757600080fd5b50610850611eea565b60405161085d919061495a565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613fd1565b611ef1565b005b34801561089b57600080fd5b506108a4611f07565b6040516108b19190614db7565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613f4e565b611f0d565b005b3480156108ef57600080fd5b506108f8611f6f565b6040516109059190614db7565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190613e8e565b611f75565b6040516109429190614db7565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190614118565b611f8d565b60405161097f9190614975565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa919061407e565b611f9f565b005b3480156109bd57600080fd5b506109c6611fc0565b6040516109d39190614db7565b60405180910390f35b3480156109e857600080fd5b506109f1611fc6565b6040516109fe9190614db7565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613ebb565b611fcc565b604051610a3b919061493f565b60405180910390f35b348015610a5057600080fd5b50610a59612060565b604051610a66919061495a565b60405180910390f35b348015610a7b57600080fd5b50610a966004803603810190610a919190613e8e565b612088565b604051610aa3919061493f565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace9190613e8e565b6120bf565b005b6000610ae0826121a9565b9050919050565b606060008054610af690615075565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290615075565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b5050505050905090565b6000610b8482612223565b610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614bf7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0982611bbc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190614c97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9961228f565b73ffffffffffffffffffffffffffffffffffffffff161480610cc85750610cc781610cc261228f565b611fcc565b5b610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614b37565b60405180910390fd5b610d118383612297565b505050565b604051602001610d259061484b565b60405160208183030381529060405280519060200120610d4481612350565b816013819055505050565b604051602001610d5e9061484b565b60405160208183030381529060405280519060200120610d7d81612350565b600e60009054906101000a900460ff1615600e60006101000a81548160ff02191690831515021790555050565b6000604051602001610dbb9061484b565b60405160208183030381529060405280519060200120610dda81612350565b4791505090565b6000600880549050905090565b610dff610df961228f565b82612364565b610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614cb7565b60405180910390fd5b610e49838383612442565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000610e7d6000801b83611ded565b9050919050565b60165481565b610e9382610e4e565b610e9c81612350565b610ea683836126a9565b505050565b6000610eb683611cfc565b8210610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906149f7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601a6020528060005260406000206000915090505481565b610f7061228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490614d97565b60405180910390fd5b610fe7828261278a565b5050565b6002600a541415611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890614d57565b60405180910390fd5b6002600a8190555060003360405160200161104c919061480c565b6040516020818303038152906040528051906020012090506110b2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506016548361286c565b6110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614a37565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600086141561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614d17565b60405180910390fd5b85601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111dc9190614e76565b92505081905550601454601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90614c37565b60405180910390fd5b600086611272610de1565b61127c9190614e76565b90506078811115801561129157506101f48111155b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614d77565b60405180910390fd5b6000600190505b8781116113625760006112ea600d612883565b90506112f63382612891565b6113448189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b61134e600d612923565b50808061135a906150d8565b9150506112d7565b507f39ca0e6b7842129df740acb4b4bdb6873314c330d3ced101b231cd524fe3b6b43388604051611394929190614916565b60405180910390a150506001600a819055505050505050565b60186020528060005260406000206000915054906101000a900460ff1681565b60008060001b6113dc81612350565b6002600a541415611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614d57565b60405180910390fd5b6002600a819055506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661146d610daa565b60405161147990614860565b60006040518083038185875af1925050503d80600081146114b6576040519150601f19603f3d011682016040523d82523d6000602084013e6114bb565b606091505b50509050806114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690614ab7565b60405180910390fd5b60019250506001600a819055505090565b6000801b61151d81612350565b816012819055505050565b61154383838360405180602001604052806000815250611f0d565b505050565b600e60009054906101000a900460ff1681565b60405160200161156a9061484b565b6040516020818303038152906040528051906020012061158981612350565b816016819055507f440a23eec1e4294124e8a3a37a4ab6a4bfb06ef472a9defb103297c060f915c8826040516115bf919061495a565b60405180910390a15050565b60006115d5610de1565b8210611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614cd7565b60405180910390fd5b6008828154811061162a57611629615232565b5b90600052602060002001549050919050565b6002600a541415611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990614d57565b60405180910390fd5b6002600a8190555060003360405160200161169d919061480c565b604051602081830303815290604052805190602001209050611703838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506016548361286c565b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614a57565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060011515600e60009054906101000a900460ff1615151415611851576001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390614cf7565b60405180910390fd5b611901565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016118ae91906148af565b60206040518083038186803b1580156118c657600080fd5b505afa1580156118da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fe9190614145565b50505b6000861415611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90614c77565b60405180910390fd5b85601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119949190614e76565b92505081905550601354601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a16906149d7565b60405180910390fd5b600086611a2a610de1565b611a349190614e76565b9050600087601254611a469190614efd565b905034811115611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290614c57565b60405180910390fd5b61017c8211158015611a9f57506101f48211155b611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad590614d37565b60405180910390fd5b6000611aea600d612883565b90506000600190505b898111611b6f57611b043383612891565b611b52828a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b611b5c600d612923565b8080611b67906150d8565b915050611af3565b507f1d07e32c1762df9f4be731069b8feea488d16413b40aa051450529b3a5337c84338a604051611ba1929190614916565b60405180910390a1505050506001600a819055505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90614b77565b60405180910390fd5b80915050919050565b60158054611c7b90615075565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790615075565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490614b57565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b604051602001611dc39061484b565b60405160208183030381529060405280519060200120611de281612350565b816014819055505050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611e6790615075565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9390615075565b8015611ee05780601f10611eb557610100808354040283529160200191611ee0565b820191906000526020600020905b815481529060010190602001808311611ec357829003601f168201915b5050505050905090565b6000801b81565b611f03611efc61228f565b8383612939565b5050565b60145481565b611f1e611f1861228f565b83612364565b611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614cb7565b60405180910390fd5b611f6984848484612aa6565b50505050565b60125481565b60196020528060005260406000206000915090505481565b6060611f9882612b02565b9050919050565b611fa882610e4e565b611fb181612350565b611fbb838361278a565b505050565b60135481565b6101f481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60405160200161206f9061484b565b6040516020818303038152906040528051906020012081565b60006120b860405160200161209c9061484b565b6040516020818303038152906040528051906020012083611ded565b9050919050565b6000801b6120cc81612350565b600015156120fe6040516020016120e29061484b565b6040516020818303038152906040528051906020012084611ded565b151514612140576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612137906149b7565b60405180910390fd5b61216e6040516020016121529061484b565b6040516020818303038152906040528051906020012083610e8a565b7fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575178260405161219d91906148af565b60405180910390a15050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221c575061221b82612c54565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661230a83611bbc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123618161235c61228f565b612cce565b50565b600061236f82612223565b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614b17565b60405180910390fd5b60006123b983611bbc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242857508373ffffffffffffffffffffffffffffffffffffffff1661241084610b79565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243957506124388185611fcc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661246282611bbc565b73ffffffffffffffffffffffffffffffffffffffff16146124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90614a77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614ad7565b60405180910390fd5b612533838383612d6b565b61253e600082612297565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258e9190614f57565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e59190614e76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126a4838383612d7b565b505050565b6126b38282611ded565b612786576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061272b61228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6127948282611ded565b15612868576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061280d61228f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000826128798584612d80565b1490509392505050565b600081600001549050919050565b6128ab828260405180602001604052806000815250612df5565b5050565b6128b882612223565b6128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90614b97565b60405180910390fd5b80600c6000848152602001908152602001600020908051906020019061291e929190613c3c565b505050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f90614af7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a99919061493f565b60405180910390a3505050565b612ab1848484612442565b612abd84848484612e50565b612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af390614a17565b60405180910390fd5b50505050565b6060612b0d82612223565b612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4390614bd7565b60405180910390fd5b6000600c60008481526020019081526020016000208054612b6c90615075565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9890615075565b8015612be55780601f10612bba57610100808354040283529160200191612be5565b820191906000526020600020905b815481529060010190602001808311612bc857829003601f168201915b505050505090506000612bf6612fe7565b9050600081511415612c0c578192505050612c4f565b600082511115612c41578082604051602001612c29929190614827565b60405160208183030381529060405292505050612c4f565b612c4a84613079565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc75750612cc682613120565b5b9050919050565b612cd88282611ded565b612d6757612cfd8173ffffffffffffffffffffffffffffffffffffffff166014613202565b612d0b8360001c6020613202565b604051602001612d1c929190614875565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e9190614975565b60405180910390fd5b5050565b612d7683838361343e565b505050565b505050565b60008082905060005b8451811015612dea576000858281518110612da757612da6615232565b5b60200260200101519050808311612dc957612dc28382613552565b9250612dd6565b612dd38184613552565b92505b508080612de2906150d8565b915050612d89565b508091505092915050565b612dff8383613569565b612e0c6000848484612e50565b612e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4290614a17565b60405180910390fd5b505050565b6000612e718473ffffffffffffffffffffffffffffffffffffffff16613743565b15612fda578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9a61228f565b8786866040518563ffffffff1660e01b8152600401612ebc94939291906148ca565b602060405180830381600087803b158015612ed657600080fd5b505af1925050508015612f0757506040513d601f19601f82011682018060405250810190612f0491906140eb565b60015b612f8a573d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b50600081511415612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7990614a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fdf565b600190505b949350505050565b606060158054612ff690615075565b80601f016020809104026020016040519081016040528092919081815260200182805461302290615075565b801561306f5780601f106130445761010080835404028352916020019161306f565b820191906000526020600020905b81548152906001019060200180831161305257829003601f168201915b5050505050905090565b606061308482612223565b6130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba90614c17565b60405180910390fd5b60006130cd612fe7565b905060008151116130ed5760405180602001604052806000815250613118565b806130f784613766565b604051602001613108929190614827565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131fb57506131fa826138c7565b5b9050919050565b6060600060028360026132159190614efd565b61321f9190614e76565b67ffffffffffffffff81111561323857613237615261565b5b6040519080825280601f01601f19166020018201604052801561326a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132a2576132a1615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061330657613305615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133469190614efd565b6133509190614e76565b90505b60018111156133f0577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061339257613391615232565b5b1a60f81b8282815181106133a9576133a8615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806133e99061504b565b9050613353565b5060008414613434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342b90614997565b60405180910390fd5b8091505092915050565b613449838383613931565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561348c5761348781613936565b6134cb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134ca576134c9838261397f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561350e5761350981613aec565b61354d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461354c5761354b8282613bbd565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d090614bb7565b60405180910390fd5b6135e281612223565b15613622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361990614a97565b60405180910390fd5b61362e60008383612d6b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367e9190614e76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461373f60008383612d7b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156137ae576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138c2565b600082905060005b600082146137e05780806137c9906150d8565b915050600a826137d99190614ecc565b91506137b6565b60008167ffffffffffffffff8111156137fc576137fb615261565b5b6040519080825280601f01601f19166020018201604052801561382e5781602001600182028036833780820191505090505b5090505b600085146138bb576001826138479190614f57565b9150600a856138569190615145565b60306138629190614e76565b60f81b81838151811061387857613877615232565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138b49190614ecc565b9450613832565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161398c84611cfc565b6139969190614f57565b9050600060076000848152602001908152602001600020549050818114613a7b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b009190614f57565b9050600060096000848152602001908152602001600020549050600060088381548110613b3057613b2f615232565b5b906000526020600020015490508060088381548110613b5257613b51615232565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ba157613ba0615203565b5b6001900381819060005260206000200160009055905550505050565b6000613bc883611cfc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613c4890615075565b90600052602060002090601f016020900481019282613c6a5760008555613cb1565b82601f10613c8357805160ff1916838001178555613cb1565b82800160010185558215613cb1579182015b82811115613cb0578251825591602001919060010190613c95565b5b509050613cbe9190613cc2565b5090565b5b80821115613cdb576000816000905550600101613cc3565b5090565b6000613cf2613ced84614df7565b614dd2565b905082815260208101848484011115613d0e57613d0d61529f565b5b613d19848285615009565b509392505050565b600081359050613d3081615bb1565b92915050565b60008083601f840112613d4c57613d4b615295565b5b8235905067ffffffffffffffff811115613d6957613d68615290565b5b602083019150836020820283011115613d8557613d8461529a565b5b9250929050565b600081359050613d9b81615bc8565b92915050565b600081359050613db081615bdf565b92915050565b600081359050613dc581615bf6565b92915050565b600081519050613dda81615bf6565b92915050565b600082601f830112613df557613df4615295565b5b8135613e05848260208601613cdf565b91505092915050565b60008083601f840112613e2457613e23615295565b5b8235905067ffffffffffffffff811115613e4157613e40615290565b5b602083019150836001820283011115613e5d57613e5c61529a565b5b9250929050565b600081359050613e7381615c0d565b92915050565b600081519050613e8881615c0d565b92915050565b600060208284031215613ea457613ea36152a9565b5b6000613eb284828501613d21565b91505092915050565b60008060408385031215613ed257613ed16152a9565b5b6000613ee085828601613d21565b9250506020613ef185828601613d21565b9150509250929050565b600080600060608486031215613f1457613f136152a9565b5b6000613f2286828701613d21565b9350506020613f3386828701613d21565b9250506040613f4486828701613e64565b9150509250925092565b60008060008060808587031215613f6857613f676152a9565b5b6000613f7687828801613d21565b9450506020613f8787828801613d21565b9350506040613f9887828801613e64565b925050606085013567ffffffffffffffff811115613fb957613fb86152a4565b5b613fc587828801613de0565b91505092959194509250565b60008060408385031215613fe857613fe76152a9565b5b6000613ff685828601613d21565b925050602061400785828601613d8c565b9150509250929050565b60008060408385031215614028576140276152a9565b5b600061403685828601613d21565b925050602061404785828601613e64565b9150509250929050565b600060208284031215614067576140666152a9565b5b600061407584828501613da1565b91505092915050565b60008060408385031215614095576140946152a9565b5b60006140a385828601613da1565b92505060206140b485828601613d21565b9150509250929050565b6000602082840312156140d4576140d36152a9565b5b60006140e284828501613db6565b91505092915050565b600060208284031215614101576141006152a9565b5b600061410f84828501613dcb565b91505092915050565b60006020828403121561412e5761412d6152a9565b5b600061413c84828501613e64565b91505092915050565b60006020828403121561415b5761415a6152a9565b5b600061416984828501613e79565b91505092915050565b60008060008060006060868803121561418e5761418d6152a9565b5b600061419c88828901613e64565b955050602086013567ffffffffffffffff8111156141bd576141bc6152a4565b5b6141c988828901613e0e565b9450945050604086013567ffffffffffffffff8111156141ec576141eb6152a4565b5b6141f888828901613d36565b92509250509295509295909350565b61421081614f8b565b82525050565b61422761422282614f8b565b615121565b82525050565b61423681614f9d565b82525050565b61424581614fa9565b82525050565b600061425682614e28565b6142608185614e3e565b9350614270818560208601615018565b614279816152ae565b840191505092915050565b600061428f82614e33565b6142998185614e5a565b93506142a9818560208601615018565b6142b2816152ae565b840191505092915050565b60006142c882614e33565b6142d28185614e6b565b93506142e2818560208601615018565b80840191505092915050565b60006142fb602083614e5a565b9150614306826152cc565b602082019050919050565b600061431e601183614e5a565b9150614329826152f5565b602082019050919050565b6000614341602783614e5a565b915061434c8261531e565b604082019050919050565b6000614364602b83614e5a565b915061436f8261536d565b604082019050919050565b6000614387603283614e5a565b9150614392826153bc565b604082019050919050565b60006143aa601d83614e5a565b91506143b58261540b565b602082019050919050565b60006143cd600783614e6b565b91506143d882615434565b600782019050919050565b60006143f0601483614e5a565b91506143fb8261545d565b602082019050919050565b6000614413602583614e5a565b915061441e82615486565b604082019050919050565b6000614436601c83614e5a565b9150614441826154d5565b602082019050919050565b6000614459602183614e5a565b9150614464826154fe565b604082019050919050565b600061447c602483614e5a565b91506144878261554d565b604082019050919050565b600061449f601983614e5a565b91506144aa8261559c565b602082019050919050565b60006144c2602c83614e5a565b91506144cd826155c5565b604082019050919050565b60006144e5603883614e5a565b91506144f082615614565b604082019050919050565b6000614508602a83614e5a565b915061451382615663565b604082019050919050565b600061452b602983614e5a565b9150614536826156b2565b604082019050919050565b600061454e602e83614e5a565b915061455982615701565b604082019050919050565b6000614571602083614e5a565b915061457c82615750565b602082019050919050565b6000614594603183614e5a565b915061459f82615779565b604082019050919050565b60006145b7602c83614e5a565b91506145c2826157c8565b604082019050919050565b60006145da602f83614e5a565b91506145e582615817565b604082019050919050565b60006145fd603083614e5a565b915061460882615866565b604082019050919050565b6000614620601683614e5a565b915061462b826158b5565b602082019050919050565b6000614643601483614e5a565b915061464e826158de565b602082019050919050565b6000614666602183614e5a565b915061467182615907565b604082019050919050565b6000614689600083614e4f565b915061469482615956565b600082019050919050565b60006146ac603183614e5a565b91506146b782615959565b604082019050919050565b60006146cf602c83614e5a565b91506146da826159a8565b604082019050919050565b60006146f2603383614e5a565b91506146fd826159f7565b604082019050919050565b6000614715601a83614e5a565b915061472082615a46565b602082019050919050565b6000614738602083614e5a565b915061474382615a6f565b602082019050919050565b600061475b601783614e6b565b915061476682615a98565b601782019050919050565b600061477e601f83614e5a565b915061478982615ac1565b602082019050919050565b60006147a1602983614e5a565b91506147ac82615aea565b604082019050919050565b60006147c4601183614e6b565b91506147cf82615b39565b601182019050919050565b60006147e7602f83614e5a565b91506147f282615b62565b604082019050919050565b61480681614fff565b82525050565b60006148188284614216565b60148201915081905092915050565b600061483382856142bd565b915061483f82846142bd565b91508190509392505050565b6000614856826143c0565b9150819050919050565b600061486b8261467c565b9150819050919050565b60006148808261474e565b915061488c82856142bd565b9150614897826147b7565b91506148a382846142bd565b91508190509392505050565b60006020820190506148c46000830184614207565b92915050565b60006080820190506148df6000830187614207565b6148ec6020830186614207565b6148f960408301856147fd565b818103606083015261490b818461424b565b905095945050505050565b600060408201905061492b6000830185614207565b61493860208301846147fd565b9392505050565b6000602082019050614954600083018461422d565b92915050565b600060208201905061496f600083018461423c565b92915050565b6000602082019050818103600083015261498f8184614284565b905092915050565b600060208201905081810360008301526149b0816142ee565b9050919050565b600060208201905081810360008301526149d081614311565b9050919050565b600060208201905081810360008301526149f081614334565b9050919050565b60006020820190508181036000830152614a1081614357565b9050919050565b60006020820190508181036000830152614a308161437a565b9050919050565b60006020820190508181036000830152614a508161439d565b9050919050565b60006020820190508181036000830152614a70816143e3565b9050919050565b60006020820190508181036000830152614a9081614406565b9050919050565b60006020820190508181036000830152614ab081614429565b9050919050565b60006020820190508181036000830152614ad08161444c565b9050919050565b60006020820190508181036000830152614af08161446f565b9050919050565b60006020820190508181036000830152614b1081614492565b9050919050565b60006020820190508181036000830152614b30816144b5565b9050919050565b60006020820190508181036000830152614b50816144d8565b9050919050565b60006020820190508181036000830152614b70816144fb565b9050919050565b60006020820190508181036000830152614b908161451e565b9050919050565b60006020820190508181036000830152614bb081614541565b9050919050565b60006020820190508181036000830152614bd081614564565b9050919050565b60006020820190508181036000830152614bf081614587565b9050919050565b60006020820190508181036000830152614c10816145aa565b9050919050565b60006020820190508181036000830152614c30816145cd565b9050919050565b60006020820190508181036000830152614c50816145f0565b9050919050565b60006020820190508181036000830152614c7081614613565b9050919050565b60006020820190508181036000830152614c9081614636565b9050919050565b60006020820190508181036000830152614cb081614659565b9050919050565b60006020820190508181036000830152614cd08161469f565b9050919050565b60006020820190508181036000830152614cf0816146c2565b9050919050565b60006020820190508181036000830152614d10816146e5565b9050919050565b60006020820190508181036000830152614d3081614708565b9050919050565b60006020820190508181036000830152614d508161472b565b9050919050565b60006020820190508181036000830152614d7081614771565b9050919050565b60006020820190508181036000830152614d9081614794565b9050919050565b60006020820190508181036000830152614db0816147da565b9050919050565b6000602082019050614dcc60008301846147fd565b92915050565b6000614ddc614ded565b9050614de882826150a7565b919050565b6000604051905090565b600067ffffffffffffffff821115614e1257614e11615261565b5b614e1b826152ae565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8182614fff565b9150614e8c83614fff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ec157614ec0615176565b5b828201905092915050565b6000614ed782614fff565b9150614ee283614fff565b925082614ef257614ef16151a5565b5b828204905092915050565b6000614f0882614fff565b9150614f1383614fff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f4c57614f4b615176565b5b828202905092915050565b6000614f6282614fff565b9150614f6d83614fff565b925082821015614f8057614f7f615176565b5b828203905092915050565b6000614f9682614fdf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561503657808201518184015260208101905061501b565b83811115615045576000848401525b50505050565b600061505682614fff565b9150600082141561506a57615069615176565b5b600182039050919050565b6000600282049050600182168061508d57607f821691505b602082108114156150a1576150a06151d4565b5b50919050565b6150b0826152ae565b810181811067ffffffffffffffff821117156150cf576150ce615261565b5b80604052505050565b60006150e382614fff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561511657615115615176565b5b600182019050919050565b600061512c82615133565b9050919050565b600061513e826152bf565b9050919050565b600061515082614fff565b915061515b83614fff565b92508261516b5761516a6151a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416c72656164792061206d616e61676572000000000000000000000000000000600082015250565b7f796f752068617665206578636565646564206d696e74206c696d69742070657260008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f587472616c696f6e3a696e76616c6964206d65726b6c652070726f6f66000000600082015250565b7f6d616e6167657200000000000000000000000000000000000000000000000000600082015250565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4574686572206e6f742073656e743a6661696c6564207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f787472616c696f6e3a796f752068617665206578636565646564206d696e742060008201527f6c696d6974207065722077616c6c657400000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045746865722073656e742e00000000000000000000600082015250565b7f43616e6e6f74206d696e74203020746f6b656e73000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f77686974656c69737420456e61626c65643a206f6e6c792077686974654c697360008201527f746564416464726573732063616e206d696e7400000000000000000000000000602082015250565b7f746f6b656e3a43616e6e6f74206d696e74203020746f6b656e73000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d61782e20737570706c79600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f787472616c696f6e3a4d696e74696e6720776f756c6420657863656564206d6160008201527f782e20737570706c790000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615bba81614f8b565b8114615bc557600080fd5b50565b615bd181614f9d565b8114615bdc57600080fd5b50565b615be881614fa9565b8114615bf357600080fd5b50565b615bff81614fb3565b8114615c0a57600080fd5b50565b615c1681614fff565b8114615c2157600080fd5b5056fea26469706673582212202b1084cf3f2ff5a84839dfdca4a289841a45cfb39eb1a4a571fa00169ea1ce0b64736f6c63430008070033

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

7b93fbffd791989028c8093e1dcfb72e117bb0ee3bb9114eb19f97d5edc88a900000000000000000000000001af2642d14465aff49f8b36c7930b744d36307b20000000000000000000000002195dc90ff5c042faec70c8cc18a2737f0348975000000000000000000000000e442b32eb559435a842b0bc740ac7bbea9cb6d84000000000000000000000000994f4fbdad11902876fc8119a90d3a24dd1ef4c200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5239534c6a5443746a7956584646476353346543557343683161795276444c42785932394573336a746645482f00000000000000000000

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x7b93fbffd791989028c8093e1dcfb72e117bb0ee3bb9114eb19f97d5edc88a90
Arg [1] : _admin_one (address): 0x1af2642D14465Aff49F8B36C7930B744D36307B2
Arg [2] : _admin_two (address): 0x2195Dc90fF5c042FaeC70c8Cc18a2737f0348975
Arg [3] : _admin_three (address): 0xe442B32eb559435A842B0BC740AC7BbEA9cb6d84
Arg [4] : _gnosis_addr (address): 0x994f4FBdAd11902876Fc8119a90d3a24DD1ef4C2
Arg [5] : _initBaseURI (string): ipfs://QmR9SLjTCtjyVXFFGcS4eCUsCh1ayRvDLBxY29Es3jtfEH/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 7b93fbffd791989028c8093e1dcfb72e117bb0ee3bb9114eb19f97d5edc88a90
Arg [1] : 0000000000000000000000001af2642d14465aff49f8b36c7930b744d36307b2
Arg [2] : 0000000000000000000000002195dc90ff5c042faec70c8cc18a2737f0348975
Arg [3] : 000000000000000000000000e442b32eb559435a842b0bc740ac7bbea9cb6d84
Arg [4] : 000000000000000000000000994f4fbdad11902876fc8119a90d3a24dd1ef4c2
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [7] : 697066733a2f2f516d5239534c6a5443746a7956584646476353346543557343
Arg [8] : 683161795276444c42785932394573336a746645482f00000000000000000000


Deployed Bytecode Sourcemap

63507:9457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72236:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41560:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43119:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42642:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70672:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70276:117;;;;;;;;;;;;;:::i;:::-;;70401:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57385:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43869:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28895:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71782:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64358:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29288:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57053:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64713:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30336:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66806:1288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64584:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71069:274;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70808:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44279:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63861:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66369:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57575:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68460:1804;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41254:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64225:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40984:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70537:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27355:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41729:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26460:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43412:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64183:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44535:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64071:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64647:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72789:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29680:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64140:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64255:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43638:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63775:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72003:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71425:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72236:196;72361:4;72385:36;72409:11;72385:23;:36::i;:::-;72378:43;;72236:196;;;:::o;41560:100::-;41614:13;41647:5;41640:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41560:100;:::o;43119:221::-;43195:7;43223:16;43231:7;43223;:16::i;:::-;43215:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43308:15;:24;43324:7;43308:24;;;;;;;;;;;;;;;;;;;;;43301:31;;43119:221;;;:::o;42642:411::-;42723:13;42739:23;42754:7;42739:14;:23::i;:::-;42723:39;;42787:5;42781:11;;:2;:11;;;;42773:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42881:5;42865:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42890:37;42907:5;42914:12;:10;:12::i;:::-;42890:16;:37::i;:::-;42865:62;42843:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;43024:21;43033:2;43037:7;43024:8;:21::i;:::-;42712:341;42642:411;;:::o;70672:127::-;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;26951:16;26962:4;26951:10;:16::i;:::-;70778:8:::1;70758:17;:28;;;;70672:127:::0;;:::o;70276:117::-;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;26951:16;26962:4;26951:10;:16::i;:::-;70365:14:::1;;;;;;;;;;;70364:15;70347:14;;:32;;;;;;;;;;;;;;;;;;70276:117:::0;:::o;70401:125::-;70466:7;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;26951:16;26962:4;26951:10;:16::i;:::-;70493:21:::1;70486:28;;70401:125:::0;;:::o;57385:113::-;57446:7;57473:10;:17;;;;57466:24;;57385:113;:::o;43869:339::-;44064:41;44083:12;:10;:12::i;:::-;44097:7;44064:18;:41::i;:::-;44056:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44172:28;44182:4;44188:2;44192:7;44172:9;:28::i;:::-;43869:339;;;:::o;28895:131::-;28969:7;28996:6;:12;29003:4;28996:12;;;;;;;;;;;:22;;;28989:29;;28895:131;;;:::o;71782:134::-;71836:4;71870:36;26505:4;71878:18;;71898:7;71870;:36::i;:::-;71863:43;;71782:134;;;:::o;64358:26::-;;;;:::o;29288:147::-;29371:18;29384:4;29371:12;:18::i;:::-;26951:16;26962:4;26951:10;:16::i;:::-;29402:25:::1;29413:4;29419:7;29402:10;:25::i;:::-;29288:147:::0;;;:::o;57053:256::-;57150:7;57186:23;57203:5;57186:16;:23::i;:::-;57178:5;:31;57170:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57275:12;:19;57288:5;57275:19;;;;;;;;;;;;;;;:26;57295:5;57275:26;;;;;;;;;;;;57268:33;;57053:256;;;;:::o;64713:48::-;;;;;;;;;;;;;;;;;:::o;30336:218::-;30443:12;:10;:12::i;:::-;30432:23;;:7;:23;;;30424:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30520:26;30532:4;30538:7;30520:11;:26::i;:::-;30336:218;;:::o;66806:1288::-;6353:1;6951:7;;:19;;6943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6353:1;7084:7;:18;;;;66981:12:::1;67023:10;67006:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;66996:39;;;;;;66981:54;;67052:48;67071:12;;67052:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67084:10;;67095:4;67052:18;:48::i;:::-;67044:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;67207:4;67179:13;:25;67193:10;67179:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;67246:1;67231:11;:16;;67223:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;67357:11;67326:15;:27;67342:10;67326:27;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;67441:17;;67410:15;:27;67426:10;67410:27;;;;;;;;;;;;;;;;:48;;67402:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;67531:14;67563:11;67548:13;:11;:13::i;:::-;:26;;;;:::i;:::-;67531:43;;67604:3;67594:6;:13;;:43;;;;;64295:3;67611:6;:26;;67594:43;67586:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;67747:9;67759:1;67747:13;;67743:279;67767:11;67762:1;:16;67743:279;;67799:15;67817:25;:15;:23;:25::i;:::-;67799:43;;67858:30;67868:10;67880:7;67858:9;:30::i;:::-;67942:26;67955:7;67964:3;;67942:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:26::i;:::-;67983:27;:15;:25;:27::i;:::-;67784:238;67780:3;;;;;:::i;:::-;;;;67743:279;;;;68045:42;68063:10;68075:11;68045:42;;;;;;;:::i;:::-;;;;;;;;66924:1170;;6309:1:::0;7263:7;:22;;;;66806:1288;;;;;:::o;64584:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;71069:274::-;71148:4;26505;71098:18;;26951:16;26962:4;26951:10;:16::i;:::-;6353:1:::1;6951:7;;:19;;6943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6353:1;7084:7;:18;;;;71172:9:::2;71194:11;;;;;;;;;;;71186:25;;71219:12;:10;:12::i;:::-;71186:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71171:65;;;71259:4;71251:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;71326:4;71319:11;;;6309:1:::1;7263:7;:22;;;;71069:274:::0;;:::o;70808:125::-;26505:4;70868:18;;26951:16;26962:4;26951:10;:16::i;:::-;70912:9:::1;70899:10;:22;;;;70808:125:::0;;:::o;44279:185::-;44417:39;44434:4;44440:2;44444:7;44417:39;;;;;;;;;;;;:16;:39::i;:::-;44279:185;;;:::o;63861:26::-;;;;;;;;;;;;;:::o;66369:143::-;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;26951:16;26962:4;26951:10;:16::i;:::-;66465:8:::1;66452:10;:21;;;;66485;66497:8;66485:21;;;;;;:::i;:::-;;;;;;;;66369:143:::0;;:::o;57575:233::-;57650:7;57686:30;:28;:30::i;:::-;57678:5;:38;57670:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57783:10;57794:5;57783:17;;;;;;;;:::i;:::-;;;;;;;;;;57776:24;;57575:233;;;:::o;68460:1804::-;6353:1;6951:7;;:19;;6943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6353:1;7084:7;:18;;;;68646:12:::1;68688:10;68671:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;68661:39;;;;;;68646:54;;68717:48;68736:12;;68717:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68749:10;;68760:4;68717:18;:48::i;:::-;68709:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;68837:4;68809:13;:25;68823:10;68809:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;68873:4;68855:22;;:14;;;;;;;;;;;:22;;;68852:293;;;68943:4;68915:13;:25;68929:10;68915:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;68893:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;68852:293;;;69081:1;69047:9;;;;;;;;;;;:19;;;69067:10;69047:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35:::0;;68852:293:::1;69220:1;69205:11;:16;;69197:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;69295:11;69262:16;:28;69279:10;69262:28;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;69419:17;;69387:16;:28;69404:10;69387:28;;;;;;;;;;;;;;;;:49;;69379:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;69491:14;69524:11;69508:13;:11;:13::i;:::-;:27;;;;:::i;:::-;69491:44;;69546:18;69580:11;69567:10;;:24;;;;:::i;:::-;69546:45;;69686:9;69669:13;:26;;69661:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69756:3;69743:9;:16;;:49;;;;;64295:3;69763:9;:29;;69743:49;69735:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;69891:15;69909:25;:15;:23;:25::i;:::-;69891:43;;69957:9;69969:1;69957:13;;69953:233;69977:11;69972:1;:16;69953:233;;70012:30;70022:10;70034:7;70012:9;:30::i;:::-;70059:26;70072:7;70081:3;;70059:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:26::i;:::-;70102:27;:15;:25;:27::i;:::-;69990:3;;;;;:::i;:::-;;;;69953:233;;;;70213:42;70231:10;70243:11;70213:42;;;;;;;:::i;:::-;;;;;;;;68586:1678;;;;6309:1:::0;7263:7;:22;;;;68460:1804;;;;;:::o;41254:239::-;41326:7;41346:13;41362:7;:16;41370:7;41362:16;;;;;;;;;;;;;;;;;;;;;41346:32;;41414:1;41397:19;;:5;:19;;;;41389:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41480:5;41473:12;;;41254:239;;;:::o;64225:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40984:208::-;41056:7;41101:1;41084:19;;:5;:19;;;;41076:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41168:9;:16;41178:5;41168:16;;;;;;;;;;;;;;;;41161:23;;40984:208;;;:::o;70537:126::-;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;26951:16;26962:4;26951:10;:16::i;:::-;70643:8:::1;70623:17;:28;;;;70537:126:::0;;:::o;27355:147::-;27441:4;27465:6;:12;27472:4;27465:12;;;;;;;;;;;:20;;:29;27486:7;27465:29;;;;;;;;;;;;;;;;;;;;;;;;;27458:36;;27355:147;;;;:::o;41729:104::-;41785:13;41818:7;41811:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41729:104;:::o;26460:49::-;26505:4;26460:49;;;:::o;43412:155::-;43507:52;43526:12;:10;:12::i;:::-;43540:8;43550;43507:18;:52::i;:::-;43412:155;;:::o;64183:33::-;;;;:::o;44535:328::-;44710:41;44729:12;:10;:12::i;:::-;44743:7;44710:18;:41::i;:::-;44702:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44816:39;44830:4;44836:2;44840:7;44849:5;44816:13;:39::i;:::-;44535:328;;;;:::o;64071:45::-;;;;:::o;64647:47::-;;;;;;;;;;;;;;;;;:::o;72789:172::-;72880:13;72924:23;72939:7;72924:14;:23::i;:::-;72917:30;;72789:172;;;:::o;29680:149::-;29764:18;29777:4;29764:12;:18::i;:::-;26951:16;26962:4;26951:10;:16::i;:::-;29795:26:::1;29807:4;29813:7;29795:11;:26::i;:::-;29680:149:::0;;;:::o;64140:34::-;;;;:::o;64255:43::-;64295:3;64255:43;:::o;43638:164::-;43735:4;43759:18;:25;43778:5;43759:25;;;;;;;;;;;;;;;:35;43785:8;43759:35;;;;;;;;;;;;;;;;;;;;;;;;;43752:42;;43638:164;;;;:::o;63775:77::-;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;63775:77;:::o;72003:131::-;72059:4;72093:30;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;72115:7;72093;:30::i;:::-;72086:37;;72003:131;;;:::o;71425:262::-;26505:4;71480:18;;26951:16;26962:4;26951:10;:16::i;:::-;71561:5:::1;71528:38;;:29;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;71549:7;71528;:29::i;:::-;:38;;;71520:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;71601:32;63824:27;;;;;;;:::i;:::-;;;;;;;;;;;;;63814:38;;;;;;71625:7;71601:9;:32::i;:::-;71655:21;71668:7;71655:21;;;;;;:::i;:::-;;;;;;;;71425:262:::0;;:::o;27059:204::-;27144:4;27183:32;27168:47;;;:11;:47;;;;:87;;;;27219:36;27243:11;27219:23;:36::i;:::-;27168:87;27161:94;;27059:204;;;:::o;46373:127::-;46438:4;46490:1;46462:30;;:7;:16;46470:7;46462:16;;;;;;;;;;;;;;;;;;;;;:30;;;;46455:37;;46373:127;;;:::o;12788:98::-;12841:7;12868:10;12861:17;;12788:98;:::o;50519:174::-;50621:2;50594:15;:24;50610:7;50594:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50677:7;50673:2;50639:46;;50648:23;50663:7;50648:14;:23::i;:::-;50639:46;;;;;;;;;;;;50519:174;;:::o;27806:105::-;27873:30;27884:4;27890:12;:10;:12::i;:::-;27873:10;:30::i;:::-;27806:105;:::o;46667:348::-;46760:4;46785:16;46793:7;46785;:16::i;:::-;46777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46861:13;46877:23;46892:7;46877:14;:23::i;:::-;46861:39;;46930:5;46919:16;;:7;:16;;;:51;;;;46963:7;46939:31;;:20;46951:7;46939:11;:20::i;:::-;:31;;;46919:51;:87;;;;46974:32;46991:5;46998:7;46974:16;:32::i;:::-;46919:87;46911:96;;;46667:348;;;;:::o;49776:625::-;49935:4;49908:31;;:23;49923:7;49908:14;:23::i;:::-;:31;;;49900:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50014:1;50000:16;;:2;:16;;;;49992:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50070:39;50091:4;50097:2;50101:7;50070:20;:39::i;:::-;50174:29;50191:1;50195:7;50174:8;:29::i;:::-;50235:1;50216:9;:15;50226:4;50216:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50264:1;50247:9;:13;50257:2;50247:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50295:2;50276:7;:16;50284:7;50276:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50334:7;50330:2;50315:27;;50324:4;50315:27;;;;;;;;;;;;50355:38;50375:4;50381:2;50385:7;50355:19;:38::i;:::-;49776:625;;;:::o;31837:238::-;31921:22;31929:4;31935:7;31921;:22::i;:::-;31916:152;;31992:4;31960:6;:12;31967:4;31960:12;;;;;;;;;;;:20;;:29;31981:7;31960:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;32043:12;:10;:12::i;:::-;32016:40;;32034:7;32016:40;;32028:4;32016:40;;;;;;;;;;31916:152;31837:238;;:::o;32207:239::-;32291:22;32299:4;32305:7;32291;:22::i;:::-;32287:152;;;32362:5;32330:6;:12;32337:4;32330:12;;;;;;;;;;;:20;;:29;32351:7;32330:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32414:12;:10;:12::i;:::-;32387:40;;32405:7;32387:40;;32399:4;32387:40;;;;;;;;;;32287:152;32207:239;;:::o;8520:190::-;8645:4;8698;8669:25;8682:5;8689:4;8669:12;:25::i;:::-;:33;8662:40;;8520:190;;;;;:::o;907:114::-;972:7;999;:14;;;992:21;;907:114;;;:::o;47357:110::-;47433:26;47443:2;47447:7;47433:26;;;;;;;;;;;;:9;:26::i;:::-;47357:110;;:::o;55075:217::-;55175:16;55183:7;55175;:16::i;:::-;55167:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55275:9;55253:10;:19;55264:7;55253:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;55075:217;;:::o;1029:127::-;1136:1;1118:7;:14;;;:19;;;;;;;;;;;1029:127;:::o;50835:315::-;50990:8;50981:17;;:5;:17;;;;50973:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51077:8;51039:18;:25;51058:5;51039:25;;;;;;;;;;;;;;;:35;51065:8;51039:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51123:8;51101:41;;51116:5;51101:41;;;51133:8;51101:41;;;;;;:::i;:::-;;;;;;;;50835:315;;;:::o;45745:::-;45902:28;45912:4;45918:2;45922:7;45902:9;:28::i;:::-;45949:48;45972:4;45978:2;45982:7;45991:5;45949:22;:48::i;:::-;45941:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45745:315;;;;:::o;54240:679::-;54313:13;54347:16;54355:7;54347;:16::i;:::-;54339:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54430:23;54456:10;:19;54467:7;54456:19;;;;;;;;;;;54430:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54486:18;54507:10;:8;:10::i;:::-;54486:31;;54615:1;54599:4;54593:18;:23;54589:72;;;54640:9;54633:16;;;;;;54589:72;54791:1;54771:9;54765:23;:27;54761:108;;;54840:4;54846:9;54823:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54809:48;;;;;;54761:108;54888:23;54903:7;54888:14;:23::i;:::-;54881:30;;;;54240:679;;;;:::o;56745:224::-;56847:4;56886:35;56871:50;;;:11;:50;;;;:90;;;;56925:36;56949:11;56925:23;:36::i;:::-;56871:90;56864:97;;56745:224;;;:::o;28201:505::-;28290:22;28298:4;28304:7;28290;:22::i;:::-;28285:414;;28478:41;28506:7;28478:41;;28516:2;28478:19;:41::i;:::-;28592:38;28620:4;28612:13;;28627:2;28592:19;:38::i;:::-;28383:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28329:358;;;;;;;;;;;:::i;:::-;;;;;;;;28285:414;28201:505;;:::o;72446:201::-;72590:45;72617:4;72623:2;72627:7;72590:26;:45::i;:::-;72446:201;;;:::o;53597:125::-;;;;:::o;9071:675::-;9154:7;9174:20;9197:4;9174:27;;9217:9;9212:497;9236:5;:12;9232:1;:16;9212:497;;;9270:20;9293:5;9299:1;9293:8;;;;;;;;:::i;:::-;;;;;;;;9270:31;;9336:12;9320;:28;9316:382;;9463:42;9478:12;9492;9463:14;:42::i;:::-;9448:57;;9316:382;;;9640:42;9655:12;9669;9640:14;:42::i;:::-;9625:57;;9316:382;9255:454;9250:3;;;;;:::i;:::-;;;;9212:497;;;;9726:12;9719:19;;;9071:675;;;;:::o;47694:321::-;47824:18;47830:2;47834:7;47824:5;:18::i;:::-;47875:54;47906:1;47910:2;47914:7;47923:5;47875:22;:54::i;:::-;47853:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;47694:321;;;:::o;51715:799::-;51870:4;51891:15;:2;:13;;;:15::i;:::-;51887:620;;;51943:2;51927:36;;;51964:12;:10;:12::i;:::-;51978:4;51984:7;51993:5;51927:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51923:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52186:1;52169:6;:13;:18;52165:272;;;52212:60;;;;;;;;;;:::i;:::-;;;;;;;;52165:272;52387:6;52381:13;52372:6;52368:2;52364:15;52357:38;51923:529;52060:41;;;52050:51;;;:6;:51;;;;52043:58;;;;;51887:620;52491:4;52484:11;;51715:799;;;;;;;:::o;66157:100::-;66209:13;66242:7;66235:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66157:100;:::o;41904:334::-;41977:13;42011:16;42019:7;42011;:16::i;:::-;42003:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42092:21;42116:10;:8;:10::i;:::-;42092:34;;42168:1;42150:7;42144:21;:25;:86;;;;;;;;;;;;;;;;;42196:7;42205:18;:7;:16;:18::i;:::-;42179:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42144:86;42137:93;;;41904:334;;;:::o;40615:305::-;40717:4;40769:25;40754:40;;;:11;:40;;;;:105;;;;40826:33;40811:48;;;:11;:48;;;;40754:105;:158;;;;40876:36;40900:11;40876:23;:36::i;:::-;40754:158;40734:178;;40615:305;;;:::o;11651:451::-;11726:13;11752:19;11797:1;11788:6;11784:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;11774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11752:47;;11810:15;:6;11817:1;11810:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;11836;:6;11843:1;11836:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;11867:9;11892:1;11883:6;11879:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;11867:26;;11862:135;11899:1;11895;:5;11862:135;;;11934:12;11955:3;11947:5;:11;11934:25;;;;;;;:::i;:::-;;;;;11922:6;11929:1;11922:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;11984:1;11974:11;;;;;11902:3;;;;:::i;:::-;;;11862:135;;;;12024:1;12015:5;:10;12007:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;12087:6;12073:21;;;11651:451;;;;:::o;58421:589::-;58565:45;58592:4;58598:2;58602:7;58565:26;:45::i;:::-;58643:1;58627:18;;:4;:18;;;58623:187;;;58662:40;58694:7;58662:31;:40::i;:::-;58623:187;;;58732:2;58724:10;;:4;:10;;;58720:90;;58751:47;58784:4;58790:7;58751:32;:47::i;:::-;58720:90;58623:187;58838:1;58824:16;;:2;:16;;;58820:183;;;58857:45;58894:7;58857:36;:45::i;:::-;58820:183;;;58930:4;58924:10;;:2;:10;;;58920:83;;58951:40;58979:2;58983:7;58951:27;:40::i;:::-;58920:83;58820:183;58421:589;;;:::o;9754:224::-;9822:13;9885:1;9879:4;9872:15;9914:1;9908:4;9901:15;9955:4;9949;9939:21;9930:30;;9754:224;;;;:::o;48351:439::-;48445:1;48431:16;;:2;:16;;;;48423:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48504:16;48512:7;48504;:16::i;:::-;48503:17;48495:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48566:45;48595:1;48599:2;48603:7;48566:20;:45::i;:::-;48641:1;48624:9;:13;48634:2;48624:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48672:2;48653:7;:16;48661:7;48653:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48717:7;48713:2;48692:33;;48709:1;48692:33;;;;;;;;;;;;48738:44;48766:1;48770:2;48774:7;48738:19;:44::i;:::-;48351:439;;:::o;14235:326::-;14295:4;14552:1;14530:7;:19;;;:23;14523:30;;14235:326;;;:::o;10350:723::-;10406:13;10636:1;10627:5;:10;10623:53;;;10654:10;;;;;;;;;;;;;;;;;;;;;10623:53;10686:12;10701:5;10686:20;;10717:14;10742:78;10757:1;10749:4;:9;10742:78;;10775:8;;;;;:::i;:::-;;;;10806:2;10798:10;;;;;:::i;:::-;;;10742:78;;;10830:19;10862:6;10852:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10830:39;;10880:154;10896:1;10887:5;:10;10880:154;;10924:1;10914:11;;;;;:::i;:::-;;;10991:2;10983:5;:10;;;;:::i;:::-;10970:2;:24;;;;:::i;:::-;10957:39;;10940:6;10947;10940:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11020:2;11011:11;;;;;:::i;:::-;;;10880:154;;;11058:6;11044:21;;;;;10350:723;;;;:::o;24318:157::-;24403:4;24442:25;24427:40;;;:11;:40;;;;24420:47;;24318:157;;;:::o;53086:126::-;;;;:::o;59733:164::-;59837:10;:17;;;;59810:15;:24;59826:7;59810:24;;;;;;;;;;;:44;;;;59865:10;59881:7;59865:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59733:164;:::o;60524:988::-;60790:22;60840:1;60815:22;60832:4;60815:16;:22::i;:::-;:26;;;;:::i;:::-;60790:51;;60852:18;60873:17;:26;60891:7;60873:26;;;;;;;;;;;;60852:47;;61020:14;61006:10;:28;61002:328;;61051:19;61073:12;:18;61086:4;61073:18;;;;;;;;;;;;;;;:34;61092:14;61073:34;;;;;;;;;;;;61051:56;;61157:11;61124:12;:18;61137:4;61124:18;;;;;;;;;;;;;;;:30;61143:10;61124:30;;;;;;;;;;;:44;;;;61274:10;61241:17;:30;61259:11;61241:30;;;;;;;;;;;:43;;;;61036:294;61002:328;61426:17;:26;61444:7;61426:26;;;;;;;;;;;61419:33;;;61470:12;:18;61483:4;61470:18;;;;;;;;;;;;;;;:34;61489:14;61470:34;;;;;;;;;;;61463:41;;;60605:907;;60524:988;;:::o;61807:1079::-;62060:22;62105:1;62085:10;:17;;;;:21;;;;:::i;:::-;62060:46;;62117:18;62138:15;:24;62154:7;62138:24;;;;;;;;;;;;62117:45;;62489:19;62511:10;62522:14;62511:26;;;;;;;;:::i;:::-;;;;;;;;;;62489:48;;62575:11;62550:10;62561;62550:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;62686:10;62655:15;:28;62671:11;62655:28;;;;;;;;;;;:41;;;;62827:15;:24;62843:7;62827:24;;;;;;;;;;;62820:31;;;62862:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61878:1008;;;61807:1079;:::o;59311:221::-;59396:14;59413:20;59430:2;59413:16;:20::i;:::-;59396:37;;59471:7;59444:12;:16;59457:2;59444:16;;;;;;;;;;;;;;;:24;59461:6;59444:24;;;;;;;;;;;:34;;;;59518:6;59489:17;:26;59507:7;59489:26;;;;;;;;;;;:35;;;;59385:147;59311:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:143::-;2865:5;2896:6;2890:13;2881:22;;2912:33;2939:5;2912:33;:::i;:::-;2808:143;;;;:::o;2957:329::-;3016:6;3065:2;3053:9;3044:7;3040:23;3036:32;3033:119;;;3071:79;;:::i;:::-;3033:119;3191:1;3216:53;3261:7;3252:6;3241:9;3237:22;3216:53;:::i;:::-;3206:63;;3162:117;2957:329;;;;:::o;3292:474::-;3360:6;3368;3417:2;3405:9;3396:7;3392:23;3388:32;3385:119;;;3423:79;;:::i;:::-;3385:119;3543:1;3568:53;3613:7;3604:6;3593:9;3589:22;3568:53;:::i;:::-;3558:63;;3514:117;3670:2;3696:53;3741:7;3732:6;3721:9;3717:22;3696:53;:::i;:::-;3686:63;;3641:118;3292:474;;;;;:::o;3772:619::-;3849:6;3857;3865;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;4167:2;4193:53;4238:7;4229:6;4218:9;4214:22;4193:53;:::i;:::-;4183:63;;4138:118;4295:2;4321:53;4366:7;4357:6;4346:9;4342:22;4321:53;:::i;:::-;4311:63;;4266:118;3772:619;;;;;:::o;4397:943::-;4492:6;4500;4508;4516;4565:3;4553:9;4544:7;4540:23;4536:33;4533:120;;;4572:79;;:::i;:::-;4533:120;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4819:2;4845:53;4890:7;4881:6;4870:9;4866:22;4845:53;:::i;:::-;4835:63;;4790:118;4947:2;4973:53;5018:7;5009:6;4998:9;4994:22;4973:53;:::i;:::-;4963:63;;4918:118;5103:2;5092:9;5088:18;5075:32;5134:18;5126:6;5123:30;5120:117;;;5156:79;;:::i;:::-;5120:117;5261:62;5315:7;5306:6;5295:9;5291:22;5261:62;:::i;:::-;5251:72;;5046:287;4397:943;;;;;;;:::o;5346:468::-;5411:6;5419;5468:2;5456:9;5447:7;5443:23;5439:32;5436:119;;;5474:79;;:::i;:::-;5436:119;5594:1;5619:53;5664:7;5655:6;5644:9;5640:22;5619:53;:::i;:::-;5609:63;;5565:117;5721:2;5747:50;5789:7;5780:6;5769:9;5765:22;5747:50;:::i;:::-;5737:60;;5692:115;5346:468;;;;;:::o;5820:474::-;5888:6;5896;5945:2;5933:9;5924:7;5920:23;5916:32;5913:119;;;5951:79;;:::i;:::-;5913:119;6071:1;6096:53;6141:7;6132:6;6121:9;6117:22;6096:53;:::i;:::-;6086:63;;6042:117;6198:2;6224:53;6269:7;6260:6;6249:9;6245:22;6224:53;:::i;:::-;6214:63;;6169:118;5820:474;;;;;:::o;6300:329::-;6359:6;6408:2;6396:9;6387:7;6383:23;6379:32;6376:119;;;6414:79;;:::i;:::-;6376:119;6534:1;6559:53;6604:7;6595:6;6584:9;6580:22;6559:53;:::i;:::-;6549:63;;6505:117;6300:329;;;;:::o;6635:474::-;6703:6;6711;6760:2;6748:9;6739:7;6735:23;6731:32;6728:119;;;6766:79;;:::i;:::-;6728:119;6886:1;6911:53;6956:7;6947:6;6936:9;6932:22;6911:53;:::i;:::-;6901:63;;6857:117;7013:2;7039:53;7084:7;7075:6;7064:9;7060:22;7039:53;:::i;:::-;7029:63;;6984:118;6635:474;;;;;:::o;7115:327::-;7173:6;7222:2;7210:9;7201:7;7197:23;7193:32;7190:119;;;7228:79;;:::i;:::-;7190:119;7348:1;7373:52;7417:7;7408:6;7397:9;7393:22;7373:52;:::i;:::-;7363:62;;7319:116;7115:327;;;;:::o;7448:349::-;7517:6;7566:2;7554:9;7545:7;7541:23;7537:32;7534:119;;;7572:79;;:::i;:::-;7534:119;7692:1;7717:63;7772:7;7763:6;7752:9;7748:22;7717:63;:::i;:::-;7707:73;;7663:127;7448:349;;;;:::o;7803:329::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8037:1;8062:53;8107:7;8098:6;8087:9;8083:22;8062:53;:::i;:::-;8052:63;;8008:117;7803:329;;;;:::o;8138:351::-;8208:6;8257:2;8245:9;8236:7;8232:23;8228:32;8225:119;;;8263:79;;:::i;:::-;8225:119;8383:1;8408:64;8464:7;8455:6;8444:9;8440:22;8408:64;:::i;:::-;8398:74;;8354:128;8138:351;;;;:::o;8495:1049::-;8611:6;8619;8627;8635;8643;8692:2;8680:9;8671:7;8667:23;8663:32;8660:119;;;8698:79;;:::i;:::-;8660:119;8818:1;8843:53;8888:7;8879:6;8868:9;8864:22;8843:53;:::i;:::-;8833:63;;8789:117;8973:2;8962:9;8958:18;8945:32;9004:18;8996:6;8993:30;8990:117;;;9026:79;;:::i;:::-;8990:117;9139:65;9196:7;9187:6;9176:9;9172:22;9139:65;:::i;:::-;9121:83;;;;8916:298;9281:2;9270:9;9266:18;9253:32;9312:18;9304:6;9301:30;9298:117;;;9334:79;;:::i;:::-;9298:117;9447:80;9519:7;9510:6;9499:9;9495:22;9447:80;:::i;:::-;9429:98;;;;9224:313;8495:1049;;;;;;;;:::o;9550:118::-;9637:24;9655:5;9637:24;:::i;:::-;9632:3;9625:37;9550:118;;:::o;9674:157::-;9779:45;9799:24;9817:5;9799:24;:::i;:::-;9779:45;:::i;:::-;9774:3;9767:58;9674:157;;:::o;9837:109::-;9918:21;9933:5;9918:21;:::i;:::-;9913:3;9906:34;9837:109;;:::o;9952:118::-;10039:24;10057:5;10039:24;:::i;:::-;10034:3;10027:37;9952:118;;:::o;10076:360::-;10162:3;10190:38;10222:5;10190:38;:::i;:::-;10244:70;10307:6;10302:3;10244:70;:::i;:::-;10237:77;;10323:52;10368:6;10363:3;10356:4;10349:5;10345:16;10323:52;:::i;:::-;10400:29;10422:6;10400:29;:::i;:::-;10395:3;10391:39;10384:46;;10166:270;10076:360;;;;:::o;10442:364::-;10530:3;10558:39;10591:5;10558:39;:::i;:::-;10613:71;10677:6;10672:3;10613:71;:::i;:::-;10606:78;;10693:52;10738:6;10733:3;10726:4;10719:5;10715:16;10693:52;:::i;:::-;10770:29;10792:6;10770:29;:::i;:::-;10765:3;10761:39;10754:46;;10534:272;10442:364;;;;:::o;10812:377::-;10918:3;10946:39;10979:5;10946:39;:::i;:::-;11001:89;11083:6;11078:3;11001:89;:::i;:::-;10994:96;;11099:52;11144:6;11139:3;11132:4;11125:5;11121:16;11099:52;:::i;:::-;11176:6;11171:3;11167:16;11160:23;;10922:267;10812:377;;;;:::o;11195:366::-;11337:3;11358:67;11422:2;11417:3;11358:67;:::i;:::-;11351:74;;11434:93;11523:3;11434:93;:::i;:::-;11552:2;11547:3;11543:12;11536:19;;11195:366;;;:::o;11567:::-;11709:3;11730:67;11794:2;11789:3;11730:67;:::i;:::-;11723:74;;11806:93;11895:3;11806:93;:::i;:::-;11924:2;11919:3;11915:12;11908:19;;11567:366;;;:::o;11939:::-;12081:3;12102:67;12166:2;12161:3;12102:67;:::i;:::-;12095:74;;12178:93;12267:3;12178:93;:::i;:::-;12296:2;12291:3;12287:12;12280:19;;11939:366;;;:::o;12311:::-;12453:3;12474:67;12538:2;12533:3;12474:67;:::i;:::-;12467:74;;12550:93;12639:3;12550:93;:::i;:::-;12668:2;12663:3;12659:12;12652:19;;12311:366;;;:::o;12683:::-;12825:3;12846:67;12910:2;12905:3;12846:67;:::i;:::-;12839:74;;12922:93;13011:3;12922:93;:::i;:::-;13040:2;13035:3;13031:12;13024:19;;12683:366;;;:::o;13055:::-;13197:3;13218:67;13282:2;13277:3;13218:67;:::i;:::-;13211:74;;13294:93;13383:3;13294:93;:::i;:::-;13412:2;13407:3;13403:12;13396:19;;13055:366;;;:::o;13427:400::-;13587:3;13608:84;13690:1;13685:3;13608:84;:::i;:::-;13601:91;;13701:93;13790:3;13701:93;:::i;:::-;13819:1;13814:3;13810:11;13803:18;;13427:400;;;:::o;13833:366::-;13975:3;13996:67;14060:2;14055:3;13996:67;:::i;:::-;13989:74;;14072:93;14161:3;14072:93;:::i;:::-;14190:2;14185:3;14181:12;14174:19;;13833:366;;;:::o;14205:::-;14347:3;14368:67;14432:2;14427:3;14368:67;:::i;:::-;14361:74;;14444:93;14533:3;14444:93;:::i;:::-;14562:2;14557:3;14553:12;14546:19;;14205:366;;;:::o;14577:::-;14719:3;14740:67;14804:2;14799:3;14740:67;:::i;:::-;14733:74;;14816:93;14905:3;14816:93;:::i;:::-;14934:2;14929:3;14925:12;14918:19;;14577:366;;;:::o;14949:::-;15091:3;15112:67;15176:2;15171:3;15112:67;:::i;:::-;15105:74;;15188:93;15277:3;15188:93;:::i;:::-;15306:2;15301:3;15297:12;15290:19;;14949:366;;;:::o;15321:::-;15463:3;15484:67;15548:2;15543:3;15484:67;:::i;:::-;15477:74;;15560:93;15649:3;15560:93;:::i;:::-;15678:2;15673:3;15669:12;15662:19;;15321:366;;;:::o;15693:::-;15835:3;15856:67;15920:2;15915:3;15856:67;:::i;:::-;15849:74;;15932:93;16021:3;15932:93;:::i;:::-;16050:2;16045:3;16041:12;16034:19;;15693:366;;;:::o;16065:::-;16207:3;16228:67;16292:2;16287:3;16228:67;:::i;:::-;16221:74;;16304:93;16393:3;16304:93;:::i;:::-;16422:2;16417:3;16413:12;16406:19;;16065:366;;;:::o;16437:::-;16579:3;16600:67;16664:2;16659:3;16600:67;:::i;:::-;16593:74;;16676:93;16765:3;16676:93;:::i;:::-;16794:2;16789:3;16785:12;16778:19;;16437:366;;;:::o;16809:::-;16951:3;16972:67;17036:2;17031:3;16972:67;:::i;:::-;16965:74;;17048:93;17137:3;17048:93;:::i;:::-;17166:2;17161:3;17157:12;17150:19;;16809:366;;;:::o;17181:::-;17323:3;17344:67;17408:2;17403:3;17344:67;:::i;:::-;17337:74;;17420:93;17509:3;17420:93;:::i;:::-;17538:2;17533:3;17529:12;17522:19;;17181:366;;;:::o;17553:::-;17695:3;17716:67;17780:2;17775:3;17716:67;:::i;:::-;17709:74;;17792:93;17881:3;17792:93;:::i;:::-;17910:2;17905:3;17901:12;17894:19;;17553:366;;;:::o;17925:::-;18067:3;18088:67;18152:2;18147:3;18088:67;:::i;:::-;18081:74;;18164:93;18253:3;18164:93;:::i;:::-;18282:2;18277:3;18273:12;18266:19;;17925:366;;;:::o;18297:::-;18439:3;18460:67;18524:2;18519:3;18460:67;:::i;:::-;18453:74;;18536:93;18625:3;18536:93;:::i;:::-;18654:2;18649:3;18645:12;18638:19;;18297:366;;;:::o;18669:::-;18811:3;18832:67;18896:2;18891:3;18832:67;:::i;:::-;18825:74;;18908:93;18997:3;18908:93;:::i;:::-;19026:2;19021:3;19017:12;19010:19;;18669:366;;;:::o;19041:::-;19183:3;19204:67;19268:2;19263:3;19204:67;:::i;:::-;19197:74;;19280:93;19369:3;19280:93;:::i;:::-;19398:2;19393:3;19389:12;19382:19;;19041:366;;;:::o;19413:::-;19555:3;19576:67;19640:2;19635:3;19576:67;:::i;:::-;19569:74;;19652:93;19741:3;19652:93;:::i;:::-;19770:2;19765:3;19761:12;19754:19;;19413:366;;;:::o;19785:::-;19927:3;19948:67;20012:2;20007:3;19948:67;:::i;:::-;19941:74;;20024:93;20113:3;20024:93;:::i;:::-;20142:2;20137:3;20133:12;20126:19;;19785:366;;;:::o;20157:::-;20299:3;20320:67;20384:2;20379:3;20320:67;:::i;:::-;20313:74;;20396:93;20485:3;20396:93;:::i;:::-;20514:2;20509:3;20505:12;20498:19;;20157:366;;;:::o;20529:::-;20671:3;20692:67;20756:2;20751:3;20692:67;:::i;:::-;20685:74;;20768:93;20857:3;20768:93;:::i;:::-;20886:2;20881:3;20877:12;20870:19;;20529:366;;;:::o;20901:398::-;21060:3;21081:83;21162:1;21157:3;21081:83;:::i;:::-;21074:90;;21173:93;21262:3;21173:93;:::i;:::-;21291:1;21286:3;21282:11;21275:18;;20901:398;;;:::o;21305:366::-;21447:3;21468:67;21532:2;21527:3;21468:67;:::i;:::-;21461:74;;21544:93;21633:3;21544:93;:::i;:::-;21662:2;21657:3;21653:12;21646:19;;21305:366;;;:::o;21677:::-;21819:3;21840:67;21904:2;21899:3;21840:67;:::i;:::-;21833:74;;21916:93;22005:3;21916:93;:::i;:::-;22034:2;22029:3;22025:12;22018:19;;21677:366;;;:::o;22049:::-;22191:3;22212:67;22276:2;22271:3;22212:67;:::i;:::-;22205:74;;22288:93;22377:3;22288:93;:::i;:::-;22406:2;22401:3;22397:12;22390:19;;22049:366;;;:::o;22421:::-;22563:3;22584:67;22648:2;22643:3;22584:67;:::i;:::-;22577:74;;22660:93;22749:3;22660:93;:::i;:::-;22778:2;22773:3;22769:12;22762:19;;22421:366;;;:::o;22793:::-;22935:3;22956:67;23020:2;23015:3;22956:67;:::i;:::-;22949:74;;23032:93;23121:3;23032:93;:::i;:::-;23150:2;23145:3;23141:12;23134:19;;22793:366;;;:::o;23165:402::-;23325:3;23346:85;23428:2;23423:3;23346:85;:::i;:::-;23339:92;;23440:93;23529:3;23440:93;:::i;:::-;23558:2;23553:3;23549:12;23542:19;;23165:402;;;:::o;23573:366::-;23715:3;23736:67;23800:2;23795:3;23736:67;:::i;:::-;23729:74;;23812:93;23901:3;23812:93;:::i;:::-;23930:2;23925:3;23921:12;23914:19;;23573:366;;;:::o;23945:::-;24087:3;24108:67;24172:2;24167:3;24108:67;:::i;:::-;24101:74;;24184:93;24273:3;24184:93;:::i;:::-;24302:2;24297:3;24293:12;24286:19;;23945:366;;;:::o;24317:402::-;24477:3;24498:85;24580:2;24575:3;24498:85;:::i;:::-;24491:92;;24592:93;24681:3;24592:93;:::i;:::-;24710:2;24705:3;24701:12;24694:19;;24317:402;;;:::o;24725:366::-;24867:3;24888:67;24952:2;24947:3;24888:67;:::i;:::-;24881:74;;24964:93;25053:3;24964:93;:::i;:::-;25082:2;25077:3;25073:12;25066:19;;24725:366;;;:::o;25097:118::-;25184:24;25202:5;25184:24;:::i;:::-;25179:3;25172:37;25097:118;;:::o;25221:256::-;25333:3;25348:75;25419:3;25410:6;25348:75;:::i;:::-;25448:2;25443:3;25439:12;25432:19;;25468:3;25461:10;;25221:256;;;;:::o;25483:435::-;25663:3;25685:95;25776:3;25767:6;25685:95;:::i;:::-;25678:102;;25797:95;25888:3;25879:6;25797:95;:::i;:::-;25790:102;;25909:3;25902:10;;25483:435;;;;;:::o;25924:381::-;26109:3;26131:148;26275:3;26131:148;:::i;:::-;26124:155;;26296:3;26289:10;;25924:381;;;:::o;26311:379::-;26495:3;26517:147;26660:3;26517:147;:::i;:::-;26510:154;;26681:3;26674:10;;26311:379;;;:::o;26696:967::-;27078:3;27100:148;27244:3;27100:148;:::i;:::-;27093:155;;27265:95;27356:3;27347:6;27265:95;:::i;:::-;27258:102;;27377:148;27521:3;27377:148;:::i;:::-;27370:155;;27542:95;27633:3;27624:6;27542:95;:::i;:::-;27535:102;;27654:3;27647:10;;26696:967;;;;;:::o;27669:222::-;27762:4;27800:2;27789:9;27785:18;27777:26;;27813:71;27881:1;27870:9;27866:17;27857:6;27813:71;:::i;:::-;27669:222;;;;:::o;27897:640::-;28092:4;28130:3;28119:9;28115:19;28107:27;;28144:71;28212:1;28201:9;28197:17;28188:6;28144:71;:::i;:::-;28225:72;28293:2;28282:9;28278:18;28269:6;28225:72;:::i;:::-;28307;28375:2;28364:9;28360:18;28351:6;28307:72;:::i;:::-;28426:9;28420:4;28416:20;28411:2;28400:9;28396:18;28389:48;28454:76;28525:4;28516:6;28454:76;:::i;:::-;28446:84;;27897:640;;;;;;;:::o;28543:332::-;28664:4;28702:2;28691:9;28687:18;28679:26;;28715:71;28783:1;28772:9;28768:17;28759:6;28715:71;:::i;:::-;28796:72;28864:2;28853:9;28849:18;28840:6;28796:72;:::i;:::-;28543:332;;;;;:::o;28881:210::-;28968:4;29006:2;28995:9;28991:18;28983:26;;29019:65;29081:1;29070:9;29066:17;29057:6;29019:65;:::i;:::-;28881:210;;;;:::o;29097:222::-;29190:4;29228:2;29217:9;29213:18;29205:26;;29241:71;29309:1;29298:9;29294:17;29285:6;29241:71;:::i;:::-;29097:222;;;;:::o;29325:313::-;29438:4;29476:2;29465:9;29461:18;29453:26;;29525:9;29519:4;29515:20;29511:1;29500:9;29496:17;29489:47;29553:78;29626:4;29617:6;29553:78;:::i;:::-;29545:86;;29325:313;;;;:::o;29644:419::-;29810:4;29848:2;29837:9;29833:18;29825:26;;29897:9;29891:4;29887:20;29883:1;29872:9;29868:17;29861:47;29925:131;30051:4;29925:131;:::i;:::-;29917:139;;29644:419;;;:::o;30069:::-;30235:4;30273:2;30262:9;30258:18;30250:26;;30322:9;30316:4;30312:20;30308:1;30297:9;30293:17;30286:47;30350:131;30476:4;30350:131;:::i;:::-;30342:139;;30069:419;;;:::o;30494:::-;30660:4;30698:2;30687:9;30683:18;30675:26;;30747:9;30741:4;30737:20;30733:1;30722:9;30718:17;30711:47;30775:131;30901:4;30775:131;:::i;:::-;30767:139;;30494:419;;;:::o;30919:::-;31085:4;31123:2;31112:9;31108:18;31100:26;;31172:9;31166:4;31162:20;31158:1;31147:9;31143:17;31136:47;31200:131;31326:4;31200:131;:::i;:::-;31192:139;;30919:419;;;:::o;31344:::-;31510:4;31548:2;31537:9;31533:18;31525:26;;31597:9;31591:4;31587:20;31583:1;31572:9;31568:17;31561:47;31625:131;31751:4;31625:131;:::i;:::-;31617:139;;31344:419;;;:::o;31769:::-;31935:4;31973:2;31962:9;31958:18;31950:26;;32022:9;32016:4;32012:20;32008:1;31997:9;31993:17;31986:47;32050:131;32176:4;32050:131;:::i;:::-;32042:139;;31769:419;;;:::o;32194:::-;32360:4;32398:2;32387:9;32383:18;32375:26;;32447:9;32441:4;32437:20;32433:1;32422:9;32418:17;32411:47;32475:131;32601:4;32475:131;:::i;:::-;32467:139;;32194:419;;;:::o;32619:::-;32785:4;32823:2;32812:9;32808:18;32800:26;;32872:9;32866:4;32862:20;32858:1;32847:9;32843:17;32836:47;32900:131;33026:4;32900:131;:::i;:::-;32892:139;;32619:419;;;:::o;33044:::-;33210:4;33248:2;33237:9;33233:18;33225:26;;33297:9;33291:4;33287:20;33283:1;33272:9;33268:17;33261:47;33325:131;33451:4;33325:131;:::i;:::-;33317:139;;33044:419;;;:::o;33469:::-;33635:4;33673:2;33662:9;33658:18;33650:26;;33722:9;33716:4;33712:20;33708:1;33697:9;33693:17;33686:47;33750:131;33876:4;33750:131;:::i;:::-;33742:139;;33469:419;;;:::o;33894:::-;34060:4;34098:2;34087:9;34083:18;34075:26;;34147:9;34141:4;34137:20;34133:1;34122:9;34118:17;34111:47;34175:131;34301:4;34175:131;:::i;:::-;34167:139;;33894:419;;;:::o;34319:::-;34485:4;34523:2;34512:9;34508:18;34500:26;;34572:9;34566:4;34562:20;34558:1;34547:9;34543:17;34536:47;34600:131;34726:4;34600:131;:::i;:::-;34592:139;;34319:419;;;:::o;34744:::-;34910:4;34948:2;34937:9;34933:18;34925:26;;34997:9;34991:4;34987:20;34983:1;34972:9;34968:17;34961:47;35025:131;35151:4;35025:131;:::i;:::-;35017:139;;34744:419;;;:::o;35169:::-;35335:4;35373:2;35362:9;35358:18;35350:26;;35422:9;35416:4;35412:20;35408:1;35397:9;35393:17;35386:47;35450:131;35576:4;35450:131;:::i;:::-;35442:139;;35169:419;;;:::o;35594:::-;35760:4;35798:2;35787:9;35783:18;35775:26;;35847:9;35841:4;35837:20;35833:1;35822:9;35818:17;35811:47;35875:131;36001:4;35875:131;:::i;:::-;35867:139;;35594:419;;;:::o;36019:::-;36185:4;36223:2;36212:9;36208:18;36200:26;;36272:9;36266:4;36262:20;36258:1;36247:9;36243:17;36236:47;36300:131;36426:4;36300:131;:::i;:::-;36292:139;;36019:419;;;:::o;36444:::-;36610:4;36648:2;36637:9;36633:18;36625:26;;36697:9;36691:4;36687:20;36683:1;36672:9;36668:17;36661:47;36725:131;36851:4;36725:131;:::i;:::-;36717:139;;36444:419;;;:::o;36869:::-;37035:4;37073:2;37062:9;37058:18;37050:26;;37122:9;37116:4;37112:20;37108:1;37097:9;37093:17;37086:47;37150:131;37276:4;37150:131;:::i;:::-;37142:139;;36869:419;;;:::o;37294:::-;37460:4;37498:2;37487:9;37483:18;37475:26;;37547:9;37541:4;37537:20;37533:1;37522:9;37518:17;37511:47;37575:131;37701:4;37575:131;:::i;:::-;37567:139;;37294:419;;;:::o;37719:::-;37885:4;37923:2;37912:9;37908:18;37900:26;;37972:9;37966:4;37962:20;37958:1;37947:9;37943:17;37936:47;38000:131;38126:4;38000:131;:::i;:::-;37992:139;;37719:419;;;:::o;38144:::-;38310:4;38348:2;38337:9;38333:18;38325:26;;38397:9;38391:4;38387:20;38383:1;38372:9;38368:17;38361:47;38425:131;38551:4;38425:131;:::i;:::-;38417:139;;38144:419;;;:::o;38569:::-;38735:4;38773:2;38762:9;38758:18;38750:26;;38822:9;38816:4;38812:20;38808:1;38797:9;38793:17;38786:47;38850:131;38976:4;38850:131;:::i;:::-;38842:139;;38569:419;;;:::o;38994:::-;39160:4;39198:2;39187:9;39183:18;39175:26;;39247:9;39241:4;39237:20;39233:1;39222:9;39218:17;39211:47;39275:131;39401:4;39275:131;:::i;:::-;39267:139;;38994:419;;;:::o;39419:::-;39585:4;39623:2;39612:9;39608:18;39600:26;;39672:9;39666:4;39662:20;39658:1;39647:9;39643:17;39636:47;39700:131;39826:4;39700:131;:::i;:::-;39692:139;;39419:419;;;:::o;39844:::-;40010:4;40048:2;40037:9;40033:18;40025:26;;40097:9;40091:4;40087:20;40083:1;40072:9;40068:17;40061:47;40125:131;40251:4;40125:131;:::i;:::-;40117:139;;39844:419;;;:::o;40269:::-;40435:4;40473:2;40462:9;40458:18;40450:26;;40522:9;40516:4;40512:20;40508:1;40497:9;40493:17;40486:47;40550:131;40676:4;40550:131;:::i;:::-;40542:139;;40269:419;;;:::o;40694:::-;40860:4;40898:2;40887:9;40883:18;40875:26;;40947:9;40941:4;40937:20;40933:1;40922:9;40918:17;40911:47;40975:131;41101:4;40975:131;:::i;:::-;40967:139;;40694:419;;;:::o;41119:::-;41285:4;41323:2;41312:9;41308:18;41300:26;;41372:9;41366:4;41362:20;41358:1;41347:9;41343:17;41336:47;41400:131;41526:4;41400:131;:::i;:::-;41392:139;;41119:419;;;:::o;41544:::-;41710:4;41748:2;41737:9;41733:18;41725:26;;41797:9;41791:4;41787:20;41783:1;41772:9;41768:17;41761:47;41825:131;41951:4;41825:131;:::i;:::-;41817:139;;41544:419;;;:::o;41969:::-;42135:4;42173:2;42162:9;42158:18;42150:26;;42222:9;42216:4;42212:20;42208:1;42197:9;42193:17;42186:47;42250:131;42376:4;42250:131;:::i;:::-;42242:139;;41969:419;;;:::o;42394:::-;42560:4;42598:2;42587:9;42583:18;42575:26;;42647:9;42641:4;42637:20;42633:1;42622:9;42618:17;42611:47;42675:131;42801:4;42675:131;:::i;:::-;42667:139;;42394:419;;;:::o;42819:::-;42985:4;43023:2;43012:9;43008:18;43000:26;;43072:9;43066:4;43062:20;43058:1;43047:9;43043:17;43036:47;43100:131;43226:4;43100:131;:::i;:::-;43092:139;;42819:419;;;:::o;43244:::-;43410:4;43448:2;43437:9;43433:18;43425:26;;43497:9;43491:4;43487:20;43483:1;43472:9;43468:17;43461:47;43525:131;43651:4;43525:131;:::i;:::-;43517:139;;43244:419;;;:::o;43669:222::-;43762:4;43800:2;43789:9;43785:18;43777:26;;43813:71;43881:1;43870:9;43866:17;43857:6;43813:71;:::i;:::-;43669:222;;;;:::o;43897:129::-;43931:6;43958:20;;:::i;:::-;43948:30;;43987:33;44015:4;44007:6;43987:33;:::i;:::-;43897:129;;;:::o;44032:75::-;44065:6;44098:2;44092:9;44082:19;;44032:75;:::o;44113:307::-;44174:4;44264:18;44256:6;44253:30;44250:56;;;44286:18;;:::i;:::-;44250:56;44324:29;44346:6;44324:29;:::i;:::-;44316:37;;44408:4;44402;44398:15;44390:23;;44113:307;;;:::o;44426:98::-;44477:6;44511:5;44505:12;44495:22;;44426:98;;;:::o;44530:99::-;44582:6;44616:5;44610:12;44600:22;;44530:99;;;:::o;44635:168::-;44718:11;44752:6;44747:3;44740:19;44792:4;44787:3;44783:14;44768:29;;44635:168;;;;:::o;44809:147::-;44910:11;44947:3;44932:18;;44809:147;;;;:::o;44962:169::-;45046:11;45080:6;45075:3;45068:19;45120:4;45115:3;45111:14;45096:29;;44962:169;;;;:::o;45137:148::-;45239:11;45276:3;45261:18;;45137:148;;;;:::o;45291:305::-;45331:3;45350:20;45368:1;45350:20;:::i;:::-;45345:25;;45384:20;45402:1;45384:20;:::i;:::-;45379:25;;45538:1;45470:66;45466:74;45463:1;45460:81;45457:107;;;45544:18;;:::i;:::-;45457:107;45588:1;45585;45581:9;45574:16;;45291:305;;;;:::o;45602:185::-;45642:1;45659:20;45677:1;45659:20;:::i;:::-;45654:25;;45693:20;45711:1;45693:20;:::i;:::-;45688:25;;45732:1;45722:35;;45737:18;;:::i;:::-;45722:35;45779:1;45776;45772:9;45767:14;;45602:185;;;;:::o;45793:348::-;45833:7;45856:20;45874:1;45856:20;:::i;:::-;45851:25;;45890:20;45908:1;45890:20;:::i;:::-;45885:25;;46078:1;46010:66;46006:74;46003:1;46000:81;45995:1;45988:9;45981:17;45977:105;45974:131;;;46085:18;;:::i;:::-;45974:131;46133:1;46130;46126:9;46115:20;;45793:348;;;;:::o;46147:191::-;46187:4;46207:20;46225:1;46207:20;:::i;:::-;46202:25;;46241:20;46259:1;46241:20;:::i;:::-;46236:25;;46280:1;46277;46274:8;46271:34;;;46285:18;;:::i;:::-;46271:34;46330:1;46327;46323:9;46315:17;;46147:191;;;;:::o;46344:96::-;46381:7;46410:24;46428:5;46410:24;:::i;:::-;46399:35;;46344:96;;;:::o;46446:90::-;46480:7;46523:5;46516:13;46509:21;46498:32;;46446:90;;;:::o;46542:77::-;46579:7;46608:5;46597:16;;46542:77;;;:::o;46625:149::-;46661:7;46701:66;46694:5;46690:78;46679:89;;46625:149;;;:::o;46780:126::-;46817:7;46857:42;46850:5;46846:54;46835:65;;46780:126;;;:::o;46912:77::-;46949:7;46978:5;46967:16;;46912:77;;;:::o;46995:154::-;47079:6;47074:3;47069;47056:30;47141:1;47132:6;47127:3;47123:16;47116:27;46995:154;;;:::o;47155:307::-;47223:1;47233:113;47247:6;47244:1;47241:13;47233:113;;;47332:1;47327:3;47323:11;47317:18;47313:1;47308:3;47304:11;47297:39;47269:2;47266:1;47262:10;47257:15;;47233:113;;;47364:6;47361:1;47358:13;47355:101;;;47444:1;47435:6;47430:3;47426:16;47419:27;47355:101;47204:258;47155:307;;;:::o;47468:171::-;47507:3;47530:24;47548:5;47530:24;:::i;:::-;47521:33;;47576:4;47569:5;47566:15;47563:41;;;47584:18;;:::i;:::-;47563:41;47631:1;47624:5;47620:13;47613:20;;47468:171;;;:::o;47645:320::-;47689:6;47726:1;47720:4;47716:12;47706:22;;47773:1;47767:4;47763:12;47794:18;47784:81;;47850:4;47842:6;47838:17;47828:27;;47784:81;47912:2;47904:6;47901:14;47881:18;47878:38;47875:84;;;47931:18;;:::i;:::-;47875:84;47696:269;47645:320;;;:::o;47971:281::-;48054:27;48076:4;48054:27;:::i;:::-;48046:6;48042:40;48184:6;48172:10;48169:22;48148:18;48136:10;48133:34;48130:62;48127:88;;;48195:18;;:::i;:::-;48127:88;48235:10;48231:2;48224:22;48014:238;47971:281;;:::o;48258:233::-;48297:3;48320:24;48338:5;48320:24;:::i;:::-;48311:33;;48366:66;48359:5;48356:77;48353:103;;;48436:18;;:::i;:::-;48353:103;48483:1;48476:5;48472:13;48465:20;;48258:233;;;:::o;48497:100::-;48536:7;48565:26;48585:5;48565:26;:::i;:::-;48554:37;;48497:100;;;:::o;48603:94::-;48642:7;48671:20;48685:5;48671:20;:::i;:::-;48660:31;;48603:94;;;:::o;48703:176::-;48735:1;48752:20;48770:1;48752:20;:::i;:::-;48747:25;;48786:20;48804:1;48786:20;:::i;:::-;48781:25;;48825:1;48815:35;;48830:18;;:::i;:::-;48815:35;48871:1;48868;48864:9;48859:14;;48703:176;;;;:::o;48885:180::-;48933:77;48930:1;48923:88;49030:4;49027:1;49020:15;49054:4;49051:1;49044:15;49071:180;49119:77;49116:1;49109:88;49216:4;49213:1;49206:15;49240:4;49237:1;49230:15;49257:180;49305:77;49302:1;49295:88;49402:4;49399:1;49392:15;49426:4;49423:1;49416:15;49443:180;49491:77;49488:1;49481:88;49588:4;49585:1;49578:15;49612:4;49609:1;49602:15;49629:180;49677:77;49674:1;49667:88;49774:4;49771:1;49764:15;49798:4;49795:1;49788:15;49815:180;49863:77;49860:1;49853:88;49960:4;49957:1;49950:15;49984:4;49981:1;49974:15;50001:117;50110:1;50107;50100:12;50124:117;50233:1;50230;50223:12;50247:117;50356:1;50353;50346:12;50370:117;50479:1;50476;50469:12;50493:117;50602:1;50599;50592:12;50616:117;50725:1;50722;50715:12;50739:102;50780:6;50831:2;50827:7;50822:2;50815:5;50811:14;50807:28;50797:38;;50739:102;;;:::o;50847:94::-;50880:8;50928:5;50924:2;50920:14;50899:35;;50847:94;;;:::o;50947:182::-;51087:34;51083:1;51075:6;51071:14;51064:58;50947:182;:::o;51135:167::-;51275:19;51271:1;51263:6;51259:14;51252:43;51135:167;:::o;51308:226::-;51448:34;51444:1;51436:6;51432:14;51425:58;51517:9;51512:2;51504:6;51500:15;51493:34;51308:226;:::o;51540:230::-;51680:34;51676:1;51668:6;51664:14;51657:58;51749:13;51744:2;51736:6;51732:15;51725:38;51540:230;:::o;51776:237::-;51916:34;51912:1;51904:6;51900:14;51893:58;51985:20;51980:2;51972:6;51968:15;51961:45;51776:237;:::o;52019:179::-;52159:31;52155:1;52147:6;52143:14;52136:55;52019:179;:::o;52204:157::-;52344:9;52340:1;52332:6;52328:14;52321:33;52204:157;:::o;52367:170::-;52507:22;52503:1;52495:6;52491:14;52484:46;52367:170;:::o;52543:224::-;52683:34;52679:1;52671:6;52667:14;52660:58;52752:7;52747:2;52739:6;52735:15;52728:32;52543:224;:::o;52773:178::-;52913:30;52909:1;52901:6;52897:14;52890:54;52773:178;:::o;52957:220::-;53097:34;53093:1;53085:6;53081:14;53074:58;53166:3;53161:2;53153:6;53149:15;53142:28;52957:220;:::o;53183:223::-;53323:34;53319:1;53311:6;53307:14;53300:58;53392:6;53387:2;53379:6;53375:15;53368:31;53183:223;:::o;53412:175::-;53552:27;53548:1;53540:6;53536:14;53529:51;53412:175;:::o;53593:231::-;53733:34;53729:1;53721:6;53717:14;53710:58;53802:14;53797:2;53789:6;53785:15;53778:39;53593:231;:::o;53830:243::-;53970:34;53966:1;53958:6;53954:14;53947:58;54039:26;54034:2;54026:6;54022:15;54015:51;53830:243;:::o;54079:229::-;54219:34;54215:1;54207:6;54203:14;54196:58;54288:12;54283:2;54275:6;54271:15;54264:37;54079:229;:::o;54314:228::-;54454:34;54450:1;54442:6;54438:14;54431:58;54523:11;54518:2;54510:6;54506:15;54499:36;54314:228;:::o;54548:233::-;54688:34;54684:1;54676:6;54672:14;54665:58;54757:16;54752:2;54744:6;54740:15;54733:41;54548:233;:::o;54787:182::-;54927:34;54923:1;54915:6;54911:14;54904:58;54787:182;:::o;54975:236::-;55115:34;55111:1;55103:6;55099:14;55092:58;55184:19;55179:2;55171:6;55167:15;55160:44;54975:236;:::o;55217:231::-;55357:34;55353:1;55345:6;55341:14;55334:58;55426:14;55421:2;55413:6;55409:15;55402:39;55217:231;:::o;55454:234::-;55594:34;55590:1;55582:6;55578:14;55571:58;55663:17;55658:2;55650:6;55646:15;55639:42;55454:234;:::o;55694:235::-;55834:34;55830:1;55822:6;55818:14;55811:58;55903:18;55898:2;55890:6;55886:15;55879:43;55694:235;:::o;55935:172::-;56075:24;56071:1;56063:6;56059:14;56052:48;55935:172;:::o;56113:170::-;56253:22;56249:1;56241:6;56237:14;56230:46;56113:170;:::o;56289:220::-;56429:34;56425:1;56417:6;56413:14;56406:58;56498:3;56493:2;56485:6;56481:15;56474:28;56289:220;:::o;56515:114::-;;:::o;56635:236::-;56775:34;56771:1;56763:6;56759:14;56752:58;56844:19;56839:2;56831:6;56827:15;56820:44;56635:236;:::o;56877:231::-;57017:34;57013:1;57005:6;57001:14;56994:58;57086:14;57081:2;57073:6;57069:15;57062:39;56877:231;:::o;57114:238::-;57254:34;57250:1;57242:6;57238:14;57231:58;57323:21;57318:2;57310:6;57306:15;57299:46;57114:238;:::o;57358:176::-;57498:28;57494:1;57486:6;57482:14;57475:52;57358:176;:::o;57540:182::-;57680:34;57676:1;57668:6;57664:14;57657:58;57540:182;:::o;57728:173::-;57868:25;57864:1;57856:6;57852:14;57845:49;57728:173;:::o;57907:181::-;58047:33;58043:1;58035:6;58031:14;58024:57;57907:181;:::o;58094:228::-;58234:34;58230:1;58222:6;58218:14;58211:58;58303:11;58298:2;58290:6;58286:15;58279:36;58094:228;:::o;58328:167::-;58468:19;58464:1;58456:6;58452:14;58445:43;58328:167;:::o;58501:234::-;58641:34;58637:1;58629:6;58625:14;58618:58;58710:17;58705:2;58697:6;58693:15;58686:42;58501:234;:::o;58741:122::-;58814:24;58832:5;58814:24;:::i;:::-;58807:5;58804:35;58794:63;;58853:1;58850;58843:12;58794:63;58741:122;:::o;58869:116::-;58939:21;58954:5;58939:21;:::i;:::-;58932:5;58929:32;58919:60;;58975:1;58972;58965:12;58919:60;58869:116;:::o;58991:122::-;59064:24;59082:5;59064:24;:::i;:::-;59057:5;59054:35;59044:63;;59103:1;59100;59093:12;59044:63;58991:122;:::o;59119:120::-;59191:23;59208:5;59191:23;:::i;:::-;59184:5;59181:34;59171:62;;59229:1;59226;59219:12;59171:62;59119:120;:::o;59245:122::-;59318:24;59336:5;59318:24;:::i;:::-;59311:5;59308:35;59298:63;;59357:1;59354;59347:12;59298:63;59245:122;:::o

Swarm Source

ipfs://2b1084cf3f2ff5a84839dfdca4a289841a45cfb39eb1a4a571fa00169ea1ce0b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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