ETH Price: $3,586.48 (-2.92%)

Token

MONUmentals (MENTAL)
 

Overview

Max Total Supply

4,357 MENTAL

Holders

1,664

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MENTAL
0x37b0140d95d8145700b7c50ae3f4ca7426a54ff2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The MONUmentals is a collection of 10.000 uniquely generated avatar skyscrapers.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Monumentals

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/[email protected]/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.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/[email protected]/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/[email protected]/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/[email protected]/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/[email protected]/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/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/[email protected]/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.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/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.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/[email protected]/token/ERC721/extensions/ERC721Royalty.sol


// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (token/ERC721/extensions/ERC721Royalty.sol)

pragma solidity ^0.8.0;




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

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

// File: @openzeppelin/[email protected]/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/monumentals_doodle.sol


/*
 _, _  _, _, _ _,_ _, _ __, _, _ ___  _, _,   _,
 |\/| / \ |\ | | | |\/| |_  |\ |  |  /_\ |   (_ 
 |  | \ / | \| | | |  | |   | \|  |  | | | , , )
 ~  ~  ~  ~  ~ `~' ~  ~ ~~~ ~  ~  ~  ~ ~ ~~~  ~                                                 
*/
pragma solidity ^0.8.0;






contract Monumentals is ERC721, ERC721Enumerable, Ownable, ERC721Royalty {
    using SafeMath for uint256;

    bool public saleIsActive = false;
    bool public presaleIsActive = false;
    string public _baseURIextended;

  
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant MAX_PUBLIC_MINT = 20;

    uint256 public PRICE_PER_TOKEN = 0.05 ether;
    uint256 public PRICE_PER_TOKEN_PRESALE = 0.03 ether;
    uint256 public MAX_MINT_TOKEN_PRESALE = 15;

    address private immutable adminSigner = 0x64df27b9156fBe53C6Bb5335Ef3A676c28Aa0b86;
    address private immutable royaltyAddress = 0x440e36815d3b632a8905CF13C889E07B8436E57c;
    address private immutable devAddress = 0xF761957Ee9c182B9648D92Ee5775aBB627525Fb1;
    address private immutable creatorAddress = 0x33d14aECe255faEE718FBA7cb3bDD3C59B82F1a4;
    address private immutable marketingAddress = 0x5ae7E7DC71481821B758938832A775e514707Fd9;


    constructor() ERC721("MONUmentals", "MENTAL") {
        _setDefaultRoyalty(royaltyAddress, 300); 
    }

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

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

    function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721Royalty) {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setSaleState(bool newState) public onlyOwner {
        saleIsActive = newState;
    }

    function setPreSaleState(bool newState) public onlyOwner {
        presaleIsActive = newState;
    }

    function changePresaleSettings(uint256 price, uint256 mintSize) public onlyOwner {
        PRICE_PER_TOKEN_PRESALE = price;
        MAX_MINT_TOKEN_PRESALE = mintSize;
    }

    function changeSaleSettings(uint256 price) public onlyOwner {
        PRICE_PER_TOKEN = price;
    }

    function teamMint(
		uint256 numberOfMonumentals
	) public onlyOwner {
        uint256 ts = totalSupply();
        require((numberOfMonumentals * 3) <= (MAX_PUBLIC_MINT * 3), "Exceeded max token purchase");
        require(ts + (numberOfMonumentals * 3) <= MAX_SUPPLY, "Purchase would exceed max tokens");

        uint256 teamMintCounter = 0;
        for (uint256 i = 0; i < numberOfMonumentals; i++) {
            _safeMint(creatorAddress, ts + teamMintCounter);
            _safeMint(devAddress, ts + teamMintCounter+1);
            _safeMint(marketingAddress, ts + teamMintCounter+2);  
            teamMintCounter += 3;
        }
	}

    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        
        uint256 balanceSubstracedCharity = balance.mul(10).div(100); // every withdaw pulls 10% in royality address
        _widthdraw(royaltyAddress, balanceSubstracedCharity);
        balance = address(this).balance;
        uint256 balanceDivided = balance.mul(30).div(100); // development and marketing gets 30%
        _widthdraw(devAddress, balanceDivided);
        _widthdraw(marketingAddress, balanceDivided);
        _widthdraw(creatorAddress, address(this).balance); // creator gets rest 40%
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    struct Voucher {
		bytes32 r;
		bytes32 s;
		uint8 v;
     }
    enum VoucherType {
		Team,
        Presale
	}
    struct MintInfo {
        uint256 _allowedMints;
    }
    mapping(address => MintInfo) public addresOfMints;



    /** presale function **/
    function mintPresale(
		uint256 numberOfMonumentals,
		Voucher memory voucher
	) public payable {
        uint256 ts = totalSupply();
		require(presaleIsActive, "Presale must be active to mint tokens");
        require(numberOfMonumentals <= MAX_MINT_TOKEN_PRESALE, "Exceeded max token purchase per Presale");
        require(ts + numberOfMonumentals <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN_PRESALE * numberOfMonumentals <= msg.value, "Ether value sent is not correct");

		bytes32 digest = keccak256(
			abi.encode(VoucherType.Presale, msg.sender)
		);
		require(_isSigned(digest, voucher), 'Invalid voucher');
		require(numberOfMonumentals + addresOfMints[msg.sender]._allowedMints <= MAX_MINT_TOKEN_PRESALE, 'Exceeds number of MONUmentals you can mint in PRESALE' );
		
        addresOfMints[msg.sender]._allowedMints += numberOfMonumentals;
		for (uint256 i = 0; i < numberOfMonumentals; i++) {
            _safeMint(msg.sender, ts + i);
        }
	}
    /** public mint function **/
    function mint(uint numberOfMonumentals) public payable {
        uint256 ts = totalSupply();
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfMonumentals <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfMonumentals <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN * numberOfMonumentals <= msg.value, "Ether value sent is not correct");

        for (uint256 i = 0; i < numberOfMonumentals; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    /** signer function **/
    function _isSigned(bytes32 digest, Voucher memory voucher)
		internal
		view
		returns (bool)
	{
		address signer = ecrecover(digest, voucher.v, voucher.r, voucher.s);
		require(signer != address(0), 'ECDSA: invalid signature');
		return signer == adminSigner;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"MAX_MINT_TOKEN_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addresOfMints","outputs":[{"internalType":"uint256","name":"_allowedMints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"mintSize","type":"uint256"}],"name":"changePresaleSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changeSaleSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMonumentals","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMonumentals","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct Monumentals.Voucher","name":"voucher","type":"tuple"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","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":"numberOfMonumentals","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526000600c60146101000a81548160ff0219169083151502179055506000600c60156101000a81548160ff02191690831515021790555066b1a2bc2ec50000600e55666a94d74f430000600f55600f6010557364df27b9156fbe53c6bb5335ef3a676c28aa0b8673ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525073440e36815d3b632a8905cf13c889e07b8436e57c73ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff1681525073f761957ee9c182b9648d92ee5775abb627525fb173ffffffffffffffffffffffffffffffffffffffff1660c09073ffffffffffffffffffffffffffffffffffffffff168152507333d14aece255faee718fba7cb3bdd3c59b82f1a473ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff16815250735ae7e7dc71481821b758938832a775e514707fd973ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff16815250348015620001c757600080fd5b506040518060400160405280600b81526020017f4d4f4e556d656e74616c730000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d454e54414c000000000000000000000000000000000000000000000000000081525081600290805190602001906200024c9291906200051f565b508060039080519060200190620002659291906200051f565b505050620002886200027c620002a460201b60201c565b620002ac60201b60201c565b6200029e60a05161012c6200037260201b60201c565b6200074f565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003826200051560201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003da9062000656565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044d90620006c8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200052d9062000719565b90600052602060002090601f0160209004810192826200055157600085556200059d565b82601f106200056c57805160ff19168380011785556200059d565b828001600101855582156200059d579182015b828111156200059c5782518255916020019190600101906200057f565b5b509050620005ac9190620005b0565b5090565b5b80821115620005cb576000816000905550600101620005b1565b5090565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006200063e602a83620005cf565b91506200064b82620005e0565b604082019050919050565b6000602082019050818103600083015262000671816200062f565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000620006b0601983620005cf565b9150620006bd8262000678565b602082019050919050565b60006020820190508181036000830152620006e381620006a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073257607f821691505b60208210811415620007495762000748620006ea565b5b50919050565b60805160a05160c05160e05161010051615266620007a96000396000818161107c015261170a015260008181611006015261173401526000818161103b01526116e00152600061168801526000612ac501526152666000f3fe6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063cd923b841161006f578063cd923b84146107f9578063e20b4b5914610815578063e985e9c514610852578063eb8d24441461088f578063f2fde38b146108ba57610225565b8063a22cb46514610716578063b88d4fde1461073f578063c4e3709514610768578063c4fe875814610791578063c87b56dd146107bc57610225565b8063833b9499116100f2578063833b949914610662578063853828b61461068d5780638da5cb5b146106a457806395d89b41146106cf578063a0712d68146106fa57610225565b80636352211e146105a657806365f13097146105e357806370a082311461060e578063715018a61461064b57610225565b80632f745c59116101b15780633d5699f5116101755780633d5699f5146104c557806342842e0e146104ee5780634f6ccce714610517578063522f77ca1461055457806355f804b31461057d57610225565b80632f745c59146103e05780632fbba1151461041d57806330f72cd41461044657806332cb6b0c146104715780633ca6fb8c1461049c57610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631c92ba4b1461034e57806323b872dd146103795780632a55205a146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630928fc22146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061368d565b6108e3565b60405161025e91906136d5565b60405180910390f35b34801561027357600080fd5b5061027c6108f5565b6040516102899190613789565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906137e1565b610987565b6040516102c6919061384f565b60405180910390f35b3480156102db57600080fd5b506102e4610a0c565b6040516102f19190613789565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190613896565b610a9a565b005b34801561032f57600080fd5b50610338610bb2565b60405161034591906138e5565b60405180910390f35b34801561035a57600080fd5b50610363610bbf565b60405161037091906138e5565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613900565b610bc5565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613953565b610c25565b6040516103d7929190613993565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613896565b610e10565b60405161041491906138e5565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906137e1565b610eb5565b005b34801561045257600080fd5b5061045b6110e0565b60405161046891906136d5565b60405180910390f35b34801561047d57600080fd5b506104866110f3565b60405161049391906138e5565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be91906139e8565b6110f9565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906137e1565b611192565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613900565b611218565b005b34801561052357600080fd5b5061053e600480360381019061053991906137e1565b611238565b60405161054b91906138e5565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613953565b6112a9565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613b4a565b611337565b005b3480156105b257600080fd5b506105cd60048036038101906105c891906137e1565b6113cd565b6040516105da919061384f565b60405180910390f35b3480156105ef57600080fd5b506105f861147f565b60405161060591906138e5565b60405180910390f35b34801561061a57600080fd5b5061063560048036038101906106309190613b93565b611484565b60405161064291906138e5565b60405180910390f35b34801561065757600080fd5b5061066061153c565b005b34801561066e57600080fd5b506106776115c4565b60405161068491906138e5565b60405180910390f35b34801561069957600080fd5b506106a26115ca565b005b3480156106b057600080fd5b506106b961175e565b6040516106c6919061384f565b60405180910390f35b3480156106db57600080fd5b506106e4611788565b6040516106f19190613789565b60405180910390f35b610714600480360381019061070f91906137e1565b61181a565b005b34801561072257600080fd5b5061073d60048036038101906107389190613bc0565b611991565b005b34801561074b57600080fd5b5061076660048036038101906107619190613ca1565b6119a7565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139e8565b611a09565b005b34801561079d57600080fd5b506107a6611aa2565b6040516107b391906138e5565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906137e1565b611aa8565b6040516107f09190613789565b60405180910390f35b610813600480360381019061080e9190613dfc565b611b4f565b005b34801561082157600080fd5b5061083c60048036038101906108379190613b93565b611e2b565b60405161084991906138e5565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190613e3c565b611e49565b60405161088691906136d5565b60405180910390f35b34801561089b57600080fd5b506108a4611edd565b6040516108b191906136d5565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613b93565b611ef0565b005b60006108ee82611fe8565b9050919050565b60606002805461090490613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613eab565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050905090565b600061099282611ffa565b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890613f4f565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610a1990613eab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590613eab565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b505050505081565b6000610aa5826113cd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d90613fe1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b35612066565b73ffffffffffffffffffffffffffffffffffffffff161480610b645750610b6381610b5e612066565b611e49565b5b610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614073565b60405180910390fd5b610bad838361206e565b505050565b6000600a80549050905090565b60105481565b610bd6610bd0612066565b82612127565b610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90614105565b60405180910390fd5b610c20838383612205565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610dbb5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610dc561246c565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610df19190614154565b610dfb91906141dd565b90508160000151819350935050509250929050565b6000610e1b83611484565b8210610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390614280565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ebd612066565b73ffffffffffffffffffffffffffffffffffffffff16610edb61175e565b73ffffffffffffffffffffffffffffffffffffffff1614610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f28906142ec565b60405180910390fd5b6000610f3b610bb2565b905060036014610f4b9190614154565b600383610f589190614154565b1115610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614358565b60405180910390fd5b612710600383610fa99190614154565b82610fb49190614378565b1115610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061441a565b60405180910390fd5b6000805b838110156110da576110367f000000000000000000000000000000000000000000000000000000000000000083856110319190614378565b612476565b6110777f0000000000000000000000000000000000000000000000000000000000000000600184866110689190614378565b6110729190614378565b612476565b6110b87f0000000000000000000000000000000000000000000000000000000000000000600284866110a99190614378565b6110b39190614378565b612476565b6003826110c59190614378565b915080806110d29061443a565b915050610ff9565b50505050565b600c60159054906101000a900460ff1681565b61271081565b611101612066565b73ffffffffffffffffffffffffffffffffffffffff1661111f61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c906142ec565b60405180910390fd5b80600c60156101000a81548160ff02191690831515021790555050565b61119a612066565b73ffffffffffffffffffffffffffffffffffffffff166111b861175e565b73ffffffffffffffffffffffffffffffffffffffff161461120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906142ec565b60405180910390fd5b80600e8190555050565b611233838383604051806020016040528060008152506119a7565b505050565b6000611242610bb2565b8210611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a906144f5565b60405180910390fd5b600a828154811061129757611296614515565b5b90600052602060002001549050919050565b6112b1612066565b73ffffffffffffffffffffffffffffffffffffffff166112cf61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906142ec565b60405180910390fd5b81600f81905550806010819055505050565b61133f612066565b73ffffffffffffffffffffffffffffffffffffffff1661135d61175e565b73ffffffffffffffffffffffffffffffffffffffff16146113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa906142ec565b60405180910390fd5b80600d90805190602001906113c992919061357e565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906145b6565b60405180910390fd5b80915050919050565b601481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614648565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611544612066565b73ffffffffffffffffffffffffffffffffffffffff1661156261175e565b73ffffffffffffffffffffffffffffffffffffffff16146115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af906142ec565b60405180910390fd5b6115c26000612494565b565b600e5481565b6115d2612066565b73ffffffffffffffffffffffffffffffffffffffff166115f061175e565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d906142ec565b60405180910390fd5b60004790506000811161165857600080fd5b60006116816064611673600a8561255a90919063ffffffff16565b61257090919063ffffffff16565b90506116ad7f000000000000000000000000000000000000000000000000000000000000000082612586565b47915060006116d960646116cb601e8661255a90919063ffffffff16565b61257090919063ffffffff16565b90506117057f000000000000000000000000000000000000000000000000000000000000000082612586565b61172f7f000000000000000000000000000000000000000000000000000000000000000082612586565b6117597f000000000000000000000000000000000000000000000000000000000000000047612586565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461179790613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546117c390613eab565b80156118105780601f106117e557610100808354040283529160200191611810565b820191906000526020600020905b8154815290600101906020018083116117f357829003601f168201915b5050505050905090565b6000611824610bb2565b9050600c60149054906101000a900460ff16611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906146da565b60405180910390fd5b60148211156118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090614358565b60405180910390fd5b61271082826118c89190614378565b1115611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119009061441a565b60405180910390fd5b3482600e546119189190614154565b1115611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090614746565b60405180910390fd5b60005b8281101561198c576119793382846119749190614378565b612476565b80806119849061443a565b91505061195c565b505050565b6119a361199c612066565b8383612637565b5050565b6119b86119b2612066565b83612127565b6119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90614105565b60405180910390fd5b611a03848484846127a4565b50505050565b611a11612066565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c906142ec565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600f5481565b6060611ab382611ffa565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae9906147d8565b60405180910390fd5b6000611afc612800565b90506000815111611b1c5760405180602001604052806000815250611b47565b80611b2684612892565b604051602001611b37929190614834565b6040516020818303038152906040525b915050919050565b6000611b59610bb2565b9050600c60159054906101000a900460ff16611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba1906148ca565b60405180910390fd5b601054831115611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be69061495c565b60405180910390fd5b6127108382611bfe9190614378565b1115611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c369061441a565b60405180910390fd5b3483600f54611c4e9190614154565b1115611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614746565b60405180910390fd5b6000600133604051602001611ca59291906149f3565b604051602081830303815290604052805190602001209050611cc781846129f3565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614a68565b60405180910390fd5b601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015485611d579190614378565b1115611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614afa565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611dea9190614378565b9250508190555060005b84811015611e2457611e11338285611e0c9190614378565b612476565b8080611e1c9061443a565b915050611df4565b5050505050565b60116020528060005260406000206000915090508060000154905081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60149054906101000a900460ff1681565b611ef8612066565b73ffffffffffffffffffffffffffffffffffffffff16611f1661175e565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f63906142ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614b8c565b60405180910390fd5b611fe581612494565b50565b6000611ff382612b1b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e1836113cd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061213282611ffa565b612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216890614c1e565b60405180910390fd5b600061217c836113cd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121eb57508373ffffffffffffffffffffffffffffffffffffffff166121d384610987565b73ffffffffffffffffffffffffffffffffffffffff16145b806121fc57506121fb8185611e49565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612225826113cd565b73ffffffffffffffffffffffffffffffffffffffff161461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614d42565b60405180910390fd5b6122f6838383612b95565b61230160008261206e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123519190614d62565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a89190614378565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612467838383612ba5565b505050565b6000612710905090565b612490828260405180602001604052806000815250612baa565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836125689190614154565b905092915050565b6000818361257e91906141dd565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125ac90614dc7565b60006040518083038185875af1925050503d80600081146125e9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ee565b606091505b5050905080612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614e28565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614e94565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161279791906136d5565b60405180910390a3505050565b6127af848484612205565b6127bb84848484612c05565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614f26565b60405180910390fd5b50505050565b6060600d805461280f90613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461283b90613eab565b80156128885780601f1061285d57610100808354040283529160200191612888565b820191906000526020600020905b81548152906001019060200180831161286b57829003601f168201915b5050505050905090565b606060008214156128da576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129ee565b600082905060005b6000821461290c5780806128f59061443a565b915050600a8261290591906141dd565b91506128e2565b60008167ffffffffffffffff81111561292857612927613a1f565b5b6040519080825280601f01601f19166020018201604052801561295a5781602001600182028036833780820191505090505b5090505b600085146129e7576001826129739190614d62565b9150600a856129829190614f46565b603061298e9190614378565b60f81b8183815181106129a4576129a3614515565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129e091906141dd565b945061295e565b8093505050505b919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612a259493929190614f95565b6020604051602081039080840390855afa158015612a47573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90615026565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b8e5750612b8d82612d9c565b5b9050919050565b612ba0838383612e7e565b505050565b505050565b612bb48383612f92565b612bc16000848484612c05565b612c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf790614f26565b60405180910390fd5b505050565b6000612c268473ffffffffffffffffffffffffffffffffffffffff1661316c565b15612d8f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c4f612066565b8786866040518563ffffffff1660e01b8152600401612c71949392919061509b565b602060405180830381600087803b158015612c8b57600080fd5b505af1925050508015612cbc57506040513d601f19601f82011682018060405250810190612cb991906150fc565b60015b612d3f573d8060008114612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b50600081511415612d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2e90614f26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d94565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e6757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e775750612e768261318f565b5b9050919050565b612e89838383613209565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ecc57612ec78161320e565b612f0b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0a57612f098382613257565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4e57612f49816133c4565b612f8d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8c57612f8b8282613495565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff990615175565b60405180910390fd5b61300b81611ffa565b1561304b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613042906151e1565b60405180910390fd5b61305760008383612b95565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a79190614378565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461316860008383612ba5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613202575061320182613514565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161326484611484565b61326e9190614d62565b9050600060096000848152602001908152602001600020549050818114613353576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506133d89190614d62565b90506000600b60008481526020019081526020016000205490506000600a838154811061340857613407614515565b5b9060005260206000200154905080600a838154811061342a57613429614515565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061347957613478615201565b5b6001900381819060005260206000200160009055905550505050565b60006134a083611484565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461358a90613eab565b90600052602060002090601f0160209004810192826135ac57600085556135f3565b82601f106135c557805160ff19168380011785556135f3565b828001600101855582156135f3579182015b828111156135f25782518255916020019190600101906135d7565b5b5090506136009190613604565b5090565b5b8082111561361d576000816000905550600101613605565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61366a81613635565b811461367557600080fd5b50565b60008135905061368781613661565b92915050565b6000602082840312156136a3576136a261362b565b5b60006136b184828501613678565b91505092915050565b60008115159050919050565b6136cf816136ba565b82525050565b60006020820190506136ea60008301846136c6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372a57808201518184015260208101905061370f565b83811115613739576000848401525b50505050565b6000601f19601f8301169050919050565b600061375b826136f0565b61376581856136fb565b935061377581856020860161370c565b61377e8161373f565b840191505092915050565b600060208201905081810360008301526137a38184613750565b905092915050565b6000819050919050565b6137be816137ab565b81146137c957600080fd5b50565b6000813590506137db816137b5565b92915050565b6000602082840312156137f7576137f661362b565b5b6000613805848285016137cc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138398261380e565b9050919050565b6138498161382e565b82525050565b60006020820190506138646000830184613840565b92915050565b6138738161382e565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac61362b565b5b60006138bb85828601613881565b92505060206138cc858286016137cc565b9150509250929050565b6138df816137ab565b82525050565b60006020820190506138fa60008301846138d6565b92915050565b6000806000606084860312156139195761391861362b565b5b600061392786828701613881565b935050602061393886828701613881565b9250506040613949868287016137cc565b9150509250925092565b6000806040838503121561396a5761396961362b565b5b6000613978858286016137cc565b9250506020613989858286016137cc565b9150509250929050565b60006040820190506139a86000830185613840565b6139b560208301846138d6565b9392505050565b6139c5816136ba565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd61362b565b5b6000613a0c848285016139d3565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a578261373f565b810181811067ffffffffffffffff82111715613a7657613a75613a1f565b5b80604052505050565b6000613a89613621565b9050613a958282613a4e565b919050565b600067ffffffffffffffff821115613ab557613ab4613a1f565b5b613abe8261373f565b9050602081019050919050565b82818337600083830152505050565b6000613aed613ae884613a9a565b613a7f565b905082815260208101848484011115613b0957613b08613a1a565b5b613b14848285613acb565b509392505050565b600082601f830112613b3157613b30613a15565b5b8135613b41848260208601613ada565b91505092915050565b600060208284031215613b6057613b5f61362b565b5b600082013567ffffffffffffffff811115613b7e57613b7d613630565b5b613b8a84828501613b1c565b91505092915050565b600060208284031215613ba957613ba861362b565b5b6000613bb784828501613881565b91505092915050565b60008060408385031215613bd757613bd661362b565b5b6000613be585828601613881565b9250506020613bf6858286016139d3565b9150509250929050565b600067ffffffffffffffff821115613c1b57613c1a613a1f565b5b613c248261373f565b9050602081019050919050565b6000613c44613c3f84613c00565b613a7f565b905082815260208101848484011115613c6057613c5f613a1a565b5b613c6b848285613acb565b509392505050565b600082601f830112613c8857613c87613a15565b5b8135613c98848260208601613c31565b91505092915050565b60008060008060808587031215613cbb57613cba61362b565b5b6000613cc987828801613881565b9450506020613cda87828801613881565b9350506040613ceb878288016137cc565b925050606085013567ffffffffffffffff811115613d0c57613d0b613630565b5b613d1887828801613c73565b91505092959194509250565b600080fd5b6000819050919050565b613d3c81613d29565b8114613d4757600080fd5b50565b600081359050613d5981613d33565b92915050565b600060ff82169050919050565b613d7581613d5f565b8114613d8057600080fd5b50565b600081359050613d9281613d6c565b92915050565b600060608284031215613dae57613dad613d24565b5b613db86060613a7f565b90506000613dc884828501613d4a565b6000830152506020613ddc84828501613d4a565b6020830152506040613df084828501613d83565b60408301525092915050565b60008060808385031215613e1357613e1261362b565b5b6000613e21858286016137cc565b9250506020613e3285828601613d98565b9150509250929050565b60008060408385031215613e5357613e5261362b565b5b6000613e6185828601613881565b9250506020613e7285828601613881565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec357607f821691505b60208210811415613ed757613ed6613e7c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f39602c836136fb565b9150613f4482613edd565b604082019050919050565b60006020820190508181036000830152613f6881613f2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fcb6021836136fb565b9150613fd682613f6f565b604082019050919050565b60006020820190508181036000830152613ffa81613fbe565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061405d6038836136fb565b915061406882614001565b604082019050919050565b6000602082019050818103600083015261408c81614050565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140ef6031836136fb565b91506140fa82614093565b604082019050919050565b6000602082019050818103600083015261411e816140e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061415f826137ab565b915061416a836137ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141a3576141a2614125565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141e8826137ab565b91506141f3836137ab565b925082614203576142026141ae565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061426a602b836136fb565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142d66020836136fb565b91506142e1826142a0565b602082019050919050565b60006020820190508181036000830152614305816142c9565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614342601b836136fb565b915061434d8261430c565b602082019050919050565b6000602082019050818103600083015261437181614335565b9050919050565b6000614383826137ab565b915061438e836137ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c3576143c2614125565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006144046020836136fb565b915061440f826143ce565b602082019050919050565b60006020820190508181036000830152614433816143f7565b9050919050565b6000614445826137ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561447857614477614125565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006144df602c836136fb565b91506144ea82614483565b604082019050919050565b6000602082019050818103600083015261450e816144d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145a06029836136fb565b91506145ab82614544565b604082019050919050565b600060208201905081810360008301526145cf81614593565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614632602a836136fb565b915061463d826145d6565b604082019050919050565b6000602082019050818103600083015261466181614625565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b60006146c46022836136fb565b91506146cf82614668565b604082019050919050565b600060208201905081810360008301526146f3816146b7565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614730601f836136fb565b915061473b826146fa565b602082019050919050565b6000602082019050818103600083015261475f81614723565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006147c2602f836136fb565b91506147cd82614766565b604082019050919050565b600060208201905081810360008301526147f1816147b5565b9050919050565b600081905092915050565b600061480e826136f0565b61481881856147f8565b935061482881856020860161370c565b80840191505092915050565b60006148408285614803565b915061484c8284614803565b91508190509392505050565b7f50726573616c65206d7573742062652061637469766520746f206d696e74207460008201527f6f6b656e73000000000000000000000000000000000000000000000000000000602082015250565b60006148b46025836136fb565b91506148bf82614858565b604082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f50726573616c6500000000000000000000000000000000000000000000000000602082015250565b60006149466027836136fb565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106149bc576149bb61497c565b5b50565b60008190506149cd826149ab565b919050565b60006149dd826149bf565b9050919050565b6149ed816149d2565b82525050565b6000604082019050614a0860008301856149e4565b614a156020830184613840565b9392505050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b6000614a52600f836136fb565b9150614a5d82614a1c565b602082019050919050565b60006020820190508181036000830152614a8181614a45565b9050919050565b7f45786365656473206e756d626572206f66204d4f4e556d656e74616c7320796f60008201527f752063616e206d696e7420696e2050524553414c450000000000000000000000602082015250565b6000614ae46035836136fb565b9150614aef82614a88565b604082019050919050565b60006020820190508181036000830152614b1381614ad7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b766026836136fb565b9150614b8182614b1a565b604082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c08602c836136fb565b9150614c1382614bac565b604082019050919050565b60006020820190508181036000830152614c3781614bfb565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c9a6025836136fb565b9150614ca582614c3e565b604082019050919050565b60006020820190508181036000830152614cc981614c8d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d2c6024836136fb565b9150614d3782614cd0565b604082019050919050565b60006020820190508181036000830152614d5b81614d1f565b9050919050565b6000614d6d826137ab565b9150614d78836137ab565b925082821015614d8b57614d8a614125565b5b828203905092915050565b600081905092915050565b50565b6000614db1600083614d96565b9150614dbc82614da1565b600082019050919050565b6000614dd282614da4565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614e126010836136fb565b9150614e1d82614ddc565b602082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e7e6019836136fb565b9150614e8982614e48565b602082019050919050565b60006020820190508181036000830152614ead81614e71565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614f106032836136fb565b9150614f1b82614eb4565b604082019050919050565b60006020820190508181036000830152614f3f81614f03565b9050919050565b6000614f51826137ab565b9150614f5c836137ab565b925082614f6c57614f6b6141ae565b5b828206905092915050565b614f8081613d29565b82525050565b614f8f81613d5f565b82525050565b6000608082019050614faa6000830187614f77565b614fb76020830186614f86565b614fc46040830185614f77565b614fd16060830184614f77565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006150106018836136fb565b915061501b82614fda565b602082019050919050565b6000602082019050818103600083015261503f81615003565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061506d82615046565b6150778185615051565b935061508781856020860161370c565b6150908161373f565b840191505092915050565b60006080820190506150b06000830187613840565b6150bd6020830186613840565b6150ca60408301856138d6565b81810360608301526150dc8184615062565b905095945050505050565b6000815190506150f681613661565b92915050565b6000602082840312156151125761511161362b565b5b6000615120848285016150e7565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061515f6020836136fb565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006151cb601c836136fb565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202d7879c4b21b0c4d8c75ea99cf72355407bc29d0d9e947c1cd86dc132083d63d64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063cd923b841161006f578063cd923b84146107f9578063e20b4b5914610815578063e985e9c514610852578063eb8d24441461088f578063f2fde38b146108ba57610225565b8063a22cb46514610716578063b88d4fde1461073f578063c4e3709514610768578063c4fe875814610791578063c87b56dd146107bc57610225565b8063833b9499116100f2578063833b949914610662578063853828b61461068d5780638da5cb5b146106a457806395d89b41146106cf578063a0712d68146106fa57610225565b80636352211e146105a657806365f13097146105e357806370a082311461060e578063715018a61461064b57610225565b80632f745c59116101b15780633d5699f5116101755780633d5699f5146104c557806342842e0e146104ee5780634f6ccce714610517578063522f77ca1461055457806355f804b31461057d57610225565b80632f745c59146103e05780632fbba1151461041d57806330f72cd41461044657806332cb6b0c146104715780633ca6fb8c1461049c57610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631c92ba4b1461034e57806323b872dd146103795780632a55205a146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630928fc22146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061368d565b6108e3565b60405161025e91906136d5565b60405180910390f35b34801561027357600080fd5b5061027c6108f5565b6040516102899190613789565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906137e1565b610987565b6040516102c6919061384f565b60405180910390f35b3480156102db57600080fd5b506102e4610a0c565b6040516102f19190613789565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190613896565b610a9a565b005b34801561032f57600080fd5b50610338610bb2565b60405161034591906138e5565b60405180910390f35b34801561035a57600080fd5b50610363610bbf565b60405161037091906138e5565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613900565b610bc5565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613953565b610c25565b6040516103d7929190613993565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613896565b610e10565b60405161041491906138e5565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906137e1565b610eb5565b005b34801561045257600080fd5b5061045b6110e0565b60405161046891906136d5565b60405180910390f35b34801561047d57600080fd5b506104866110f3565b60405161049391906138e5565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be91906139e8565b6110f9565b005b3480156104d157600080fd5b506104ec60048036038101906104e791906137e1565b611192565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613900565b611218565b005b34801561052357600080fd5b5061053e600480360381019061053991906137e1565b611238565b60405161054b91906138e5565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613953565b6112a9565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613b4a565b611337565b005b3480156105b257600080fd5b506105cd60048036038101906105c891906137e1565b6113cd565b6040516105da919061384f565b60405180910390f35b3480156105ef57600080fd5b506105f861147f565b60405161060591906138e5565b60405180910390f35b34801561061a57600080fd5b5061063560048036038101906106309190613b93565b611484565b60405161064291906138e5565b60405180910390f35b34801561065757600080fd5b5061066061153c565b005b34801561066e57600080fd5b506106776115c4565b60405161068491906138e5565b60405180910390f35b34801561069957600080fd5b506106a26115ca565b005b3480156106b057600080fd5b506106b961175e565b6040516106c6919061384f565b60405180910390f35b3480156106db57600080fd5b506106e4611788565b6040516106f19190613789565b60405180910390f35b610714600480360381019061070f91906137e1565b61181a565b005b34801561072257600080fd5b5061073d60048036038101906107389190613bc0565b611991565b005b34801561074b57600080fd5b5061076660048036038101906107619190613ca1565b6119a7565b005b34801561077457600080fd5b5061078f600480360381019061078a91906139e8565b611a09565b005b34801561079d57600080fd5b506107a6611aa2565b6040516107b391906138e5565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906137e1565b611aa8565b6040516107f09190613789565b60405180910390f35b610813600480360381019061080e9190613dfc565b611b4f565b005b34801561082157600080fd5b5061083c60048036038101906108379190613b93565b611e2b565b60405161084991906138e5565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190613e3c565b611e49565b60405161088691906136d5565b60405180910390f35b34801561089b57600080fd5b506108a4611edd565b6040516108b191906136d5565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613b93565b611ef0565b005b60006108ee82611fe8565b9050919050565b60606002805461090490613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613eab565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050905090565b600061099282611ffa565b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890613f4f565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610a1990613eab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590613eab565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b505050505081565b6000610aa5826113cd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d90613fe1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b35612066565b73ffffffffffffffffffffffffffffffffffffffff161480610b645750610b6381610b5e612066565b611e49565b5b610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614073565b60405180910390fd5b610bad838361206e565b505050565b6000600a80549050905090565b60105481565b610bd6610bd0612066565b82612127565b610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90614105565b60405180910390fd5b610c20838383612205565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610dbb5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610dc561246c565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610df19190614154565b610dfb91906141dd565b90508160000151819350935050509250929050565b6000610e1b83611484565b8210610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390614280565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ebd612066565b73ffffffffffffffffffffffffffffffffffffffff16610edb61175e565b73ffffffffffffffffffffffffffffffffffffffff1614610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f28906142ec565b60405180910390fd5b6000610f3b610bb2565b905060036014610f4b9190614154565b600383610f589190614154565b1115610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614358565b60405180910390fd5b612710600383610fa99190614154565b82610fb49190614378565b1115610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061441a565b60405180910390fd5b6000805b838110156110da576110367f00000000000000000000000033d14aece255faee718fba7cb3bdd3c59b82f1a483856110319190614378565b612476565b6110777f000000000000000000000000f761957ee9c182b9648d92ee5775abb627525fb1600184866110689190614378565b6110729190614378565b612476565b6110b87f0000000000000000000000005ae7e7dc71481821b758938832a775e514707fd9600284866110a99190614378565b6110b39190614378565b612476565b6003826110c59190614378565b915080806110d29061443a565b915050610ff9565b50505050565b600c60159054906101000a900460ff1681565b61271081565b611101612066565b73ffffffffffffffffffffffffffffffffffffffff1661111f61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c906142ec565b60405180910390fd5b80600c60156101000a81548160ff02191690831515021790555050565b61119a612066565b73ffffffffffffffffffffffffffffffffffffffff166111b861175e565b73ffffffffffffffffffffffffffffffffffffffff161461120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906142ec565b60405180910390fd5b80600e8190555050565b611233838383604051806020016040528060008152506119a7565b505050565b6000611242610bb2565b8210611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a906144f5565b60405180910390fd5b600a828154811061129757611296614515565b5b90600052602060002001549050919050565b6112b1612066565b73ffffffffffffffffffffffffffffffffffffffff166112cf61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906142ec565b60405180910390fd5b81600f81905550806010819055505050565b61133f612066565b73ffffffffffffffffffffffffffffffffffffffff1661135d61175e565b73ffffffffffffffffffffffffffffffffffffffff16146113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa906142ec565b60405180910390fd5b80600d90805190602001906113c992919061357e565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906145b6565b60405180910390fd5b80915050919050565b601481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614648565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611544612066565b73ffffffffffffffffffffffffffffffffffffffff1661156261175e565b73ffffffffffffffffffffffffffffffffffffffff16146115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af906142ec565b60405180910390fd5b6115c26000612494565b565b600e5481565b6115d2612066565b73ffffffffffffffffffffffffffffffffffffffff166115f061175e565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d906142ec565b60405180910390fd5b60004790506000811161165857600080fd5b60006116816064611673600a8561255a90919063ffffffff16565b61257090919063ffffffff16565b90506116ad7f000000000000000000000000440e36815d3b632a8905cf13c889e07b8436e57c82612586565b47915060006116d960646116cb601e8661255a90919063ffffffff16565b61257090919063ffffffff16565b90506117057f000000000000000000000000f761957ee9c182b9648d92ee5775abb627525fb182612586565b61172f7f0000000000000000000000005ae7e7dc71481821b758938832a775e514707fd982612586565b6117597f00000000000000000000000033d14aece255faee718fba7cb3bdd3c59b82f1a447612586565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461179790613eab565b80601f01602080910402602001604051908101604052809291908181526020018280546117c390613eab565b80156118105780601f106117e557610100808354040283529160200191611810565b820191906000526020600020905b8154815290600101906020018083116117f357829003601f168201915b5050505050905090565b6000611824610bb2565b9050600c60149054906101000a900460ff16611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906146da565b60405180910390fd5b60148211156118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090614358565b60405180910390fd5b61271082826118c89190614378565b1115611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119009061441a565b60405180910390fd5b3482600e546119189190614154565b1115611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090614746565b60405180910390fd5b60005b8281101561198c576119793382846119749190614378565b612476565b80806119849061443a565b91505061195c565b505050565b6119a361199c612066565b8383612637565b5050565b6119b86119b2612066565b83612127565b6119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90614105565b60405180910390fd5b611a03848484846127a4565b50505050565b611a11612066565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61175e565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c906142ec565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600f5481565b6060611ab382611ffa565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae9906147d8565b60405180910390fd5b6000611afc612800565b90506000815111611b1c5760405180602001604052806000815250611b47565b80611b2684612892565b604051602001611b37929190614834565b6040516020818303038152906040525b915050919050565b6000611b59610bb2565b9050600c60159054906101000a900460ff16611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba1906148ca565b60405180910390fd5b601054831115611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be69061495c565b60405180910390fd5b6127108382611bfe9190614378565b1115611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c369061441a565b60405180910390fd5b3483600f54611c4e9190614154565b1115611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614746565b60405180910390fd5b6000600133604051602001611ca59291906149f3565b604051602081830303815290604052805190602001209050611cc781846129f3565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614a68565b60405180910390fd5b601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015485611d579190614378565b1115611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614afa565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611dea9190614378565b9250508190555060005b84811015611e2457611e11338285611e0c9190614378565b612476565b8080611e1c9061443a565b915050611df4565b5050505050565b60116020528060005260406000206000915090508060000154905081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60149054906101000a900460ff1681565b611ef8612066565b73ffffffffffffffffffffffffffffffffffffffff16611f1661175e565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f63906142ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614b8c565b60405180910390fd5b611fe581612494565b50565b6000611ff382612b1b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e1836113cd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061213282611ffa565b612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216890614c1e565b60405180910390fd5b600061217c836113cd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121eb57508373ffffffffffffffffffffffffffffffffffffffff166121d384610987565b73ffffffffffffffffffffffffffffffffffffffff16145b806121fc57506121fb8185611e49565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612225826113cd565b73ffffffffffffffffffffffffffffffffffffffff161461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614d42565b60405180910390fd5b6122f6838383612b95565b61230160008261206e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123519190614d62565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a89190614378565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612467838383612ba5565b505050565b6000612710905090565b612490828260405180602001604052806000815250612baa565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836125689190614154565b905092915050565b6000818361257e91906141dd565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125ac90614dc7565b60006040518083038185875af1925050503d80600081146125e9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ee565b606091505b5050905080612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614e28565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614e94565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161279791906136d5565b60405180910390a3505050565b6127af848484612205565b6127bb84848484612c05565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614f26565b60405180910390fd5b50505050565b6060600d805461280f90613eab565b80601f016020809104026020016040519081016040528092919081815260200182805461283b90613eab565b80156128885780601f1061285d57610100808354040283529160200191612888565b820191906000526020600020905b81548152906001019060200180831161286b57829003601f168201915b5050505050905090565b606060008214156128da576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129ee565b600082905060005b6000821461290c5780806128f59061443a565b915050600a8261290591906141dd565b91506128e2565b60008167ffffffffffffffff81111561292857612927613a1f565b5b6040519080825280601f01601f19166020018201604052801561295a5781602001600182028036833780820191505090505b5090505b600085146129e7576001826129739190614d62565b9150600a856129829190614f46565b603061298e9190614378565b60f81b8183815181106129a4576129a3614515565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129e091906141dd565b945061295e565b8093505050505b919050565b60008060018484604001518560000151866020015160405160008152602001604052604051612a259493929190614f95565b6020604051602081039080840390855afa158015612a47573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90615026565b60405180910390fd5b7f00000000000000000000000064df27b9156fbe53c6bb5335ef3a676c28aa0b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b8e5750612b8d82612d9c565b5b9050919050565b612ba0838383612e7e565b505050565b505050565b612bb48383612f92565b612bc16000848484612c05565b612c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf790614f26565b60405180910390fd5b505050565b6000612c268473ffffffffffffffffffffffffffffffffffffffff1661316c565b15612d8f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c4f612066565b8786866040518563ffffffff1660e01b8152600401612c71949392919061509b565b602060405180830381600087803b158015612c8b57600080fd5b505af1925050508015612cbc57506040513d601f19601f82011682018060405250810190612cb991906150fc565b60015b612d3f573d8060008114612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b50600081511415612d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2e90614f26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d94565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e6757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e775750612e768261318f565b5b9050919050565b612e89838383613209565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ecc57612ec78161320e565b612f0b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0a57612f098382613257565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4e57612f49816133c4565b612f8d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8c57612f8b8282613495565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff990615175565b60405180910390fd5b61300b81611ffa565b1561304b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613042906151e1565b60405180910390fd5b61305760008383612b95565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a79190614378565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461316860008383612ba5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613202575061320182613514565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161326484611484565b61326e9190614d62565b9050600060096000848152602001908152602001600020549050818114613353576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506133d89190614d62565b90506000600b60008481526020019081526020016000205490506000600a838154811061340857613407614515565b5b9060005260206000200154905080600a838154811061342a57613429614515565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061347957613478615201565b5b6001900381819060005260206000200160009055905550505050565b60006134a083611484565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461358a90613eab565b90600052602060002090601f0160209004810192826135ac57600085556135f3565b82601f106135c557805160ff19168380011785556135f3565b828001600101855582156135f3579182015b828111156135f25782518255916020019190600101906135d7565b5b5090506136009190613604565b5090565b5b8082111561361d576000816000905550600101613605565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61366a81613635565b811461367557600080fd5b50565b60008135905061368781613661565b92915050565b6000602082840312156136a3576136a261362b565b5b60006136b184828501613678565b91505092915050565b60008115159050919050565b6136cf816136ba565b82525050565b60006020820190506136ea60008301846136c6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372a57808201518184015260208101905061370f565b83811115613739576000848401525b50505050565b6000601f19601f8301169050919050565b600061375b826136f0565b61376581856136fb565b935061377581856020860161370c565b61377e8161373f565b840191505092915050565b600060208201905081810360008301526137a38184613750565b905092915050565b6000819050919050565b6137be816137ab565b81146137c957600080fd5b50565b6000813590506137db816137b5565b92915050565b6000602082840312156137f7576137f661362b565b5b6000613805848285016137cc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138398261380e565b9050919050565b6138498161382e565b82525050565b60006020820190506138646000830184613840565b92915050565b6138738161382e565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac61362b565b5b60006138bb85828601613881565b92505060206138cc858286016137cc565b9150509250929050565b6138df816137ab565b82525050565b60006020820190506138fa60008301846138d6565b92915050565b6000806000606084860312156139195761391861362b565b5b600061392786828701613881565b935050602061393886828701613881565b9250506040613949868287016137cc565b9150509250925092565b6000806040838503121561396a5761396961362b565b5b6000613978858286016137cc565b9250506020613989858286016137cc565b9150509250929050565b60006040820190506139a86000830185613840565b6139b560208301846138d6565b9392505050565b6139c5816136ba565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd61362b565b5b6000613a0c848285016139d3565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a578261373f565b810181811067ffffffffffffffff82111715613a7657613a75613a1f565b5b80604052505050565b6000613a89613621565b9050613a958282613a4e565b919050565b600067ffffffffffffffff821115613ab557613ab4613a1f565b5b613abe8261373f565b9050602081019050919050565b82818337600083830152505050565b6000613aed613ae884613a9a565b613a7f565b905082815260208101848484011115613b0957613b08613a1a565b5b613b14848285613acb565b509392505050565b600082601f830112613b3157613b30613a15565b5b8135613b41848260208601613ada565b91505092915050565b600060208284031215613b6057613b5f61362b565b5b600082013567ffffffffffffffff811115613b7e57613b7d613630565b5b613b8a84828501613b1c565b91505092915050565b600060208284031215613ba957613ba861362b565b5b6000613bb784828501613881565b91505092915050565b60008060408385031215613bd757613bd661362b565b5b6000613be585828601613881565b9250506020613bf6858286016139d3565b9150509250929050565b600067ffffffffffffffff821115613c1b57613c1a613a1f565b5b613c248261373f565b9050602081019050919050565b6000613c44613c3f84613c00565b613a7f565b905082815260208101848484011115613c6057613c5f613a1a565b5b613c6b848285613acb565b509392505050565b600082601f830112613c8857613c87613a15565b5b8135613c98848260208601613c31565b91505092915050565b60008060008060808587031215613cbb57613cba61362b565b5b6000613cc987828801613881565b9450506020613cda87828801613881565b9350506040613ceb878288016137cc565b925050606085013567ffffffffffffffff811115613d0c57613d0b613630565b5b613d1887828801613c73565b91505092959194509250565b600080fd5b6000819050919050565b613d3c81613d29565b8114613d4757600080fd5b50565b600081359050613d5981613d33565b92915050565b600060ff82169050919050565b613d7581613d5f565b8114613d8057600080fd5b50565b600081359050613d9281613d6c565b92915050565b600060608284031215613dae57613dad613d24565b5b613db86060613a7f565b90506000613dc884828501613d4a565b6000830152506020613ddc84828501613d4a565b6020830152506040613df084828501613d83565b60408301525092915050565b60008060808385031215613e1357613e1261362b565b5b6000613e21858286016137cc565b9250506020613e3285828601613d98565b9150509250929050565b60008060408385031215613e5357613e5261362b565b5b6000613e6185828601613881565b9250506020613e7285828601613881565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec357607f821691505b60208210811415613ed757613ed6613e7c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f39602c836136fb565b9150613f4482613edd565b604082019050919050565b60006020820190508181036000830152613f6881613f2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fcb6021836136fb565b9150613fd682613f6f565b604082019050919050565b60006020820190508181036000830152613ffa81613fbe565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061405d6038836136fb565b915061406882614001565b604082019050919050565b6000602082019050818103600083015261408c81614050565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140ef6031836136fb565b91506140fa82614093565b604082019050919050565b6000602082019050818103600083015261411e816140e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061415f826137ab565b915061416a836137ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141a3576141a2614125565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141e8826137ab565b91506141f3836137ab565b925082614203576142026141ae565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061426a602b836136fb565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142d66020836136fb565b91506142e1826142a0565b602082019050919050565b60006020820190508181036000830152614305816142c9565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614342601b836136fb565b915061434d8261430c565b602082019050919050565b6000602082019050818103600083015261437181614335565b9050919050565b6000614383826137ab565b915061438e836137ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c3576143c2614125565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006144046020836136fb565b915061440f826143ce565b602082019050919050565b60006020820190508181036000830152614433816143f7565b9050919050565b6000614445826137ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561447857614477614125565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006144df602c836136fb565b91506144ea82614483565b604082019050919050565b6000602082019050818103600083015261450e816144d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145a06029836136fb565b91506145ab82614544565b604082019050919050565b600060208201905081810360008301526145cf81614593565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614632602a836136fb565b915061463d826145d6565b604082019050919050565b6000602082019050818103600083015261466181614625565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b60006146c46022836136fb565b91506146cf82614668565b604082019050919050565b600060208201905081810360008301526146f3816146b7565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614730601f836136fb565b915061473b826146fa565b602082019050919050565b6000602082019050818103600083015261475f81614723565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006147c2602f836136fb565b91506147cd82614766565b604082019050919050565b600060208201905081810360008301526147f1816147b5565b9050919050565b600081905092915050565b600061480e826136f0565b61481881856147f8565b935061482881856020860161370c565b80840191505092915050565b60006148408285614803565b915061484c8284614803565b91508190509392505050565b7f50726573616c65206d7573742062652061637469766520746f206d696e74207460008201527f6f6b656e73000000000000000000000000000000000000000000000000000000602082015250565b60006148b46025836136fb565b91506148bf82614858565b604082019050919050565b600060208201905081810360008301526148e3816148a7565b9050919050565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f50726573616c6500000000000000000000000000000000000000000000000000602082015250565b60006149466027836136fb565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106149bc576149bb61497c565b5b50565b60008190506149cd826149ab565b919050565b60006149dd826149bf565b9050919050565b6149ed816149d2565b82525050565b6000604082019050614a0860008301856149e4565b614a156020830184613840565b9392505050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b6000614a52600f836136fb565b9150614a5d82614a1c565b602082019050919050565b60006020820190508181036000830152614a8181614a45565b9050919050565b7f45786365656473206e756d626572206f66204d4f4e556d656e74616c7320796f60008201527f752063616e206d696e7420696e2050524553414c450000000000000000000000602082015250565b6000614ae46035836136fb565b9150614aef82614a88565b604082019050919050565b60006020820190508181036000830152614b1381614ad7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b766026836136fb565b9150614b8182614b1a565b604082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c08602c836136fb565b9150614c1382614bac565b604082019050919050565b60006020820190508181036000830152614c3781614bfb565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c9a6025836136fb565b9150614ca582614c3e565b604082019050919050565b60006020820190508181036000830152614cc981614c8d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d2c6024836136fb565b9150614d3782614cd0565b604082019050919050565b60006020820190508181036000830152614d5b81614d1f565b9050919050565b6000614d6d826137ab565b9150614d78836137ab565b925082821015614d8b57614d8a614125565b5b828203905092915050565b600081905092915050565b50565b6000614db1600083614d96565b9150614dbc82614da1565b600082019050919050565b6000614dd282614da4565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614e126010836136fb565b9150614e1d82614ddc565b602082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e7e6019836136fb565b9150614e8982614e48565b602082019050919050565b60006020820190508181036000830152614ead81614e71565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614f106032836136fb565b9150614f1b82614eb4565b604082019050919050565b60006020820190508181036000830152614f3f81614f03565b9050919050565b6000614f51826137ab565b9150614f5c836137ab565b925082614f6c57614f6b6141ae565b5b828206905092915050565b614f8081613d29565b82525050565b614f8f81613d5f565b82525050565b6000608082019050614faa6000830187614f77565b614fb76020830186614f86565b614fc46040830185614f77565b614fd16060830184614f77565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006150106018836136fb565b915061501b82614fda565b602082019050919050565b6000602082019050818103600083015261503f81615003565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061506d82615046565b6150778185615051565b935061508781856020860161370c565b6150908161373f565b840191505092915050565b60006080820190506150b06000830187613840565b6150bd6020830186613840565b6150ca60408301856138d6565b81810360608301526150dc8184615062565b905095945050505050565b6000815190506150f681613661565b92915050565b6000602082840312156151125761511161362b565b5b6000615120848285016150e7565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061515f6020836136fb565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006151cb601c836136fb565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202d7879c4b21b0c4d8c75ea99cf72355407bc29d0d9e947c1cd86dc132083d63d64736f6c63430008090033

Deployed Bytecode Sourcemap

59795:6107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61056:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38592:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40151:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59991:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39674:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53947:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60244:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40901:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26896:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;53615:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62175:651;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59949:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60034:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61772:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62065;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41311:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54137:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61882:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61424:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38286:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60083:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38016:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11801:103;;;;;;;;;;;;;:::i;:::-;;60136:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62834:648;;;;;;;;;;;;;:::i;:::-;;11150:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38761:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65015:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40444:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41567:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61668:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60186:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38936:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63957:1018;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63865:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40670:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59910:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12059:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61056:194;61182:4;61206:36;61230:11;61206:23;:36::i;:::-;61199:43;;61056:194;;;:::o;38592:100::-;38646:13;38679:5;38672:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38592:100;:::o;40151:221::-;40227:7;40255:16;40263:7;40255;:16::i;:::-;40247:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40340:15;:24;40356:7;40340:24;;;;;;;;;;;;;;;;;;;;;40333:31;;40151:221;;;:::o;59991:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39674:411::-;39755:13;39771:23;39786:7;39771:14;:23::i;:::-;39755:39;;39819:5;39813:11;;:2;:11;;;;39805:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;39913:5;39897:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;39922:37;39939:5;39946:12;:10;:12::i;:::-;39922:16;:37::i;:::-;39897:62;39875:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;40056:21;40065:2;40069:7;40056:8;:21::i;:::-;39744:341;39674:411;;:::o;53947:113::-;54008:7;54035:10;:17;;;;54028:24;;53947:113;:::o;60244:42::-;;;;:::o;40901:339::-;41096:41;41115:12;:10;:12::i;:::-;41129:7;41096:18;:41::i;:::-;41088:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41204:28;41214:4;41220:2;41224:7;41204:9;:28::i;:::-;40901:339;;;:::o;26896:436::-;26987:7;26996;27016:26;27045:17;:27;27063:8;27045:27;;;;;;;;;;;27016:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27117:1;27089:30;;:7;:16;;;:30;;;27085:92;;;27146:19;27136:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27085:92;27189:21;27254:17;:15;:17::i;:::-;27213:58;;27227:7;:23;;;27214:36;;:10;:36;;;;:::i;:::-;27213:58;;;;:::i;:::-;27189:82;;27292:7;:16;;;27310:13;27284:40;;;;;;26896:436;;;;;:::o;53615:256::-;53712:7;53748:23;53765:5;53748:16;:23::i;:::-;53740:5;:31;53732:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53837:12;:19;53850:5;53837:19;;;;;;;;;;;;;;;:26;53857:5;53837:26;;;;;;;;;;;;53830:33;;53615:256;;;;:::o;62175:651::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62257:10:::1;62270:13;:11;:13::i;:::-;62257:26;;62350:1;60125:2;62332:19;;;;:::i;:::-;62325:1;62303:19;:23;;;;:::i;:::-;62302:50;;62294:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;60071:5;62431:1;62409:19;:23;;;;:::i;:::-;62403:2;:30;;;;:::i;:::-;:44;;62395:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;62497:23;62540:9:::0;62535:287:::1;62559:19;62555:1;:23;62535:287;;;62600:47;62610:14;62631:15;62626:2;:20;;;;:::i;:::-;62600:9;:47::i;:::-;62662:45;62672:10;62705:1;62689:15;62684:2;:20;;;;:::i;:::-;:22;;;;:::i;:::-;62662:9;:45::i;:::-;62722:51;62732:16;62771:1;62755:15;62750:2;:20;;;;:::i;:::-;:22;;;;:::i;:::-;62722:9;:51::i;:::-;62809:1;62790:20;;;;;:::i;:::-;;;62580:3;;;;;:::i;:::-;;;;62535:287;;;;62246:580;;62175:651:::0;:::o;59949:35::-;;;;;;;;;;;;;:::o;60034:42::-;60071:5;60034:42;:::o;61772:102::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61858:8:::1;61840:15;;:26;;;;;;;;;;;;;;;;;;61772:102:::0;:::o;62065:::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62154:5:::1;62136:15;:23;;;;62065:102:::0;:::o;41311:185::-;41449:39;41466:4;41472:2;41476:7;41449:39;;;;;;;;;;;;:16;:39::i;:::-;41311:185;;;:::o;54137:233::-;54212:7;54248:30;:28;:30::i;:::-;54240:5;:38;54232:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54345:10;54356:5;54345:17;;;;;;;;:::i;:::-;;;;;;;;;;54338:24;;54137:233;;;:::o;61882:175::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62000:5:::1;61974:23;:31;;;;62041:8;62016:22;:33;;;;61882:175:::0;;:::o;61424:111::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61519:8:::1;61500:16;:27;;;;;;;;;;;;:::i;:::-;;61424:111:::0;:::o;38286:239::-;38358:7;38378:13;38394:7;:16;38402:7;38394:16;;;;;;;;;;;;;;;;;;;;;38378:32;;38446:1;38429:19;;:5;:19;;;;38421:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38512:5;38505:12;;;38286:239;;;:::o;60083:44::-;60125:2;60083:44;:::o;38016:208::-;38088:7;38133:1;38116:19;;:5;:19;;;;38108:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38200:9;:16;38210:5;38200:16;;;;;;;;;;;;;;;;38193:23;;38016:208;;;:::o;11801:103::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11866:30:::1;11893:1;11866:18;:30::i;:::-;11801:103::o:0;60136:43::-;;;;:::o;62834:648::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62885:15:::1;62903:21;62885:39;;62953:1;62943:7;:11;62935:20;;;::::0;::::1;;62976:32;63011:24;63031:3;63011:15;63023:2;63011:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;62976:59;;63093:52;63104:14;63120:24;63093:10;:52::i;:::-;63166:21;63156:31;;63198:22;63223:24;63243:3;63223:15;63235:2;63223:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;63198:49;;63296:38;63307:10;63319:14;63296:10;:38::i;:::-;63345:44;63356:16;63374:14;63345:10;:44::i;:::-;63400:49;63411:14;63427:21;63400:10;:49::i;:::-;62874:608;;;62834:648::o:0;11150:87::-;11196:7;11223:6;;;;;;;;;;;11216:13;;11150:87;:::o;38761:104::-;38817:13;38850:7;38843:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38761:104;:::o;65015:576::-;65081:10;65094:13;:11;:13::i;:::-;65081:26;;65126:12;;;;;;;;;;;65118:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60125:2;65196:19;:38;;65188:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60071:5;65290:19;65285:2;:24;;;;:::i;:::-;:38;;65277:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65420:9;65397:19;65379:15;;:37;;;;:::i;:::-;:50;;65371:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;65483:9;65478:106;65502:19;65498:1;:23;65478:106;;;65543:29;65553:10;65570:1;65565:2;:6;;;;:::i;:::-;65543:9;:29::i;:::-;65523:3;;;;;:::i;:::-;;;;65478:106;;;;65070:521;65015:576;:::o;40444:155::-;40539:52;40558:12;:10;:12::i;:::-;40572:8;40582;40539:18;:52::i;:::-;40444:155;;:::o;41567:328::-;41742:41;41761:12;:10;:12::i;:::-;41775:7;41742:18;:41::i;:::-;41734:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41848:39;41862:4;41868:2;41872:7;41881:5;41848:13;:39::i;:::-;41567:328;;;;:::o;61668:96::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61748:8:::1;61733:12;;:23;;;;;;;;;;;;;;;;;;61668:96:::0;:::o;60186:51::-;;;;:::o;38936:334::-;39009:13;39043:16;39051:7;39043;:16::i;:::-;39035:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39124:21;39148:10;:8;:10::i;:::-;39124:34;;39200:1;39182:7;39176:21;:25;:86;;;;;;;;;;;;;;;;;39228:7;39237:18;:7;:16;:18::i;:::-;39211:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39176:86;39169:93;;;38936:334;;;:::o;63957:1018::-;64067:10;64080:13;:11;:13::i;:::-;64067:26;;64106:15;;;;;;;;;;;64098:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64205:22;;64182:19;:45;;64174:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;60071:5;64295:19;64290:2;:24;;;;:::i;:::-;:38;;64282:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;64433:9;64410:19;64384:23;;:45;;;;:::i;:::-;:58;;64376:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64485:14;64528:19;64549:10;64517:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64502:63;;;;;;64485:80;;64578:26;64588:6;64596:7;64578:9;:26::i;:::-;64570:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;64702:22;;64659:13;:25;64673:10;64659:25;;;;;;;;;;;;;;;:39;;;64637:19;:61;;;;:::i;:::-;:87;;64629:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;64841:19;64798:13;:25;64812:10;64798:25;;;;;;;;;;;;;;;:39;;;:62;;;;;;;:::i;:::-;;;;;;;;64870:9;64865:106;64889:19;64885:1;:23;64865:106;;;64930:29;64940:10;64957:1;64952:2;:6;;;;:::i;:::-;64930:9;:29::i;:::-;64910:3;;;;;:::i;:::-;;;;64865:106;;;;64056:919;;63957:1018;;:::o;63865:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;40670:164::-;40767:4;40791:18;:25;40810:5;40791:25;;;;;;;;;;;;;;;:35;40817:8;40791:35;;;;;;;;;;;;;;;;;;;;;;;;;40784:42;;40670:164;;;;:::o;59910:32::-;;;;;;;;;;;;;:::o;12059:201::-;11381:12;:10;:12::i;:::-;11370:23;;:7;:5;:7::i;:::-;:23;;;11362:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12168:1:::1;12148:22;;:8;:22;;;;12140:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12224:28;12243:8;12224:18;:28::i;:::-;12059:201:::0;:::o;51841:170::-;51943:4;51967:36;51991:11;51967:23;:36::i;:::-;51960:43;;51841:170;;;:::o;43405:127::-;43470:4;43522:1;43494:30;;:7;:16;43502:7;43494:16;;;;;;;;;;;;;;;;;;;;;:30;;;;43487:37;;43405:127;;;:::o;9863:98::-;9916:7;9943:10;9936:17;;9863:98;:::o;47551:174::-;47653:2;47626:15;:24;47642:7;47626:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47709:7;47705:2;47671:46;;47680:23;47695:7;47680:14;:23::i;:::-;47671:46;;;;;;;;;;;;47551:174;;:::o;43699:348::-;43792:4;43817:16;43825:7;43817;:16::i;:::-;43809:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43893:13;43909:23;43924:7;43909:14;:23::i;:::-;43893:39;;43962:5;43951:16;;:7;:16;;;:51;;;;43995:7;43971:31;;:20;43983:7;43971:11;:20::i;:::-;:31;;;43951:51;:87;;;;44006:32;44023:5;44030:7;44006:16;:32::i;:::-;43951:87;43943:96;;;43699:348;;;;:::o;46808:625::-;46967:4;46940:31;;:23;46955:7;46940:14;:23::i;:::-;:31;;;46932:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47046:1;47032:16;;:2;:16;;;;47024:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47102:39;47123:4;47129:2;47133:7;47102:20;:39::i;:::-;47206:29;47223:1;47227:7;47206:8;:29::i;:::-;47267:1;47248:9;:15;47258:4;47248:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;47296:1;47279:9;:13;47289:2;47279:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47327:2;47308:7;:16;47316:7;47308:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47366:7;47362:2;47347:27;;47356:4;47347:27;;;;;;;;;;;;47387:38;47407:4;47413:2;47417:7;47387:19;:38::i;:::-;46808:625;;;:::o;27614:97::-;27672:6;27698:5;27691:12;;27614:97;:::o;44389:110::-;44465:26;44475:2;44479:7;44465:26;;;;;;;;;;;;:9;:26::i;:::-;44389:110;;:::o;12420:191::-;12494:16;12513:6;;;;;;;;;;;12494:25;;12539:8;12530:6;;:17;;;;;;;;;;;;;;;;;;12594:8;12563:40;;12584:8;12563:40;;;;;;;;;;;;12483:128;12420:191;:::o;3611:98::-;3669:7;3700:1;3696;:5;;;;:::i;:::-;3689:12;;3611:98;;;;:::o;4010:::-;4068:7;4099:1;4095;:5;;;;:::i;:::-;4088:12;;4010:98;;;;:::o;63490:181::-;63565:12;63583:8;:13;;63604:7;63583:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63564:52;;;63635:7;63627:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;63553:118;63490:181;;:::o;47867:315::-;48022:8;48013:17;;:5;:17;;;;48005:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48109:8;48071:18;:25;48090:5;48071:25;;;;;;;;;;;;;;;:35;48097:8;48071:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48155:8;48133:41;;48148:5;48133:41;;;48165:8;48133:41;;;;;;:::i;:::-;;;;;;;;47867:315;;;:::o;42777:::-;42934:28;42944:4;42950:2;42954:7;42934:9;:28::i;:::-;42981:48;43004:4;43010:2;43014:7;43023:5;42981:22;:48::i;:::-;42973:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42777:315;;;;:::o;61543:117::-;61603:13;61636:16;61629:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61543:117;:::o;7414:723::-;7470:13;7700:1;7691:5;:10;7687:53;;;7718:10;;;;;;;;;;;;;;;;;;;;;7687:53;7750:12;7765:5;7750:20;;7781:14;7806:78;7821:1;7813:4;:9;7806:78;;7839:8;;;;;:::i;:::-;;;;7870:2;7862:10;;;;;:::i;:::-;;;7806:78;;;7894:19;7926:6;7916:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7894:39;;7944:154;7960:1;7951:5;:10;7944:154;;7988:1;7978:11;;;;;:::i;:::-;;;8055:2;8047:5;:10;;;;:::i;:::-;8034:2;:24;;;;:::i;:::-;8021:39;;8004:6;8011;8004:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8084:2;8075:11;;;;;:::i;:::-;;;7944:154;;;8122:6;8108:21;;;;;7414:723;;;;:::o;65628:271::-;65719:4;65732:14;65749:50;65759:6;65767:7;:9;;;65778:7;:9;;;65789:7;:9;;;65749:50;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65732:67;;65830:1;65812:20;;:6;:20;;;;65804:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65883:11;65873:21;;:6;:21;;;65866:28;;;65628:271;;;;:::o;53307:224::-;53409:4;53448:35;53433:50;;;:11;:50;;;;:90;;;;53487:36;53511:11;53487:23;:36::i;:::-;53433:90;53426:97;;53307:224;;;:::o;60867:181::-;60995:45;61022:4;61028:2;61032:7;60995:26;:45::i;:::-;60867:181;;;:::o;50629:125::-;;;;:::o;44726:321::-;44856:18;44862:2;44866:7;44856:5;:18::i;:::-;44907:54;44938:1;44942:2;44946:7;44955:5;44907:22;:54::i;:::-;44885:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;44726:321;;;:::o;48747:799::-;48902:4;48923:15;:2;:13;;;:15::i;:::-;48919:620;;;48975:2;48959:36;;;48996:12;:10;:12::i;:::-;49010:4;49016:7;49025:5;48959:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48955:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49218:1;49201:6;:13;:18;49197:272;;;49244:60;;;;;;;;;;:::i;:::-;;;;;;;;49197:272;49419:6;49413:13;49404:6;49400:2;49396:15;49389:38;48955:529;49092:41;;;49082:51;;;:6;:51;;;;49075:58;;;;;48919:620;49523:4;49516:11;;48747:799;;;;;;;:::o;37647:305::-;37749:4;37801:25;37786:40;;;:11;:40;;;;:105;;;;37858:33;37843:48;;;:11;:48;;;;37786:105;:158;;;;37908:36;37932:11;37908:23;:36::i;:::-;37786:158;37766:178;;37647:305;;;:::o;54983:589::-;55127:45;55154:4;55160:2;55164:7;55127:26;:45::i;:::-;55205:1;55189:18;;:4;:18;;;55185:187;;;55224:40;55256:7;55224:31;:40::i;:::-;55185:187;;;55294:2;55286:10;;:4;:10;;;55282:90;;55313:47;55346:4;55352:7;55313:32;:47::i;:::-;55282:90;55185:187;55400:1;55386:16;;:2;:16;;;55382:183;;;55419:45;55456:7;55419:36;:45::i;:::-;55382:183;;;55492:4;55486:10;;:2;:10;;;55482:83;;55513:40;55541:2;55545:7;55513:27;:40::i;:::-;55482:83;55382:183;54983:589;;;:::o;45383:439::-;45477:1;45463:16;;:2;:16;;;;45455:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45536:16;45544:7;45536;:16::i;:::-;45535:17;45527:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45598:45;45627:1;45631:2;45635:7;45598:20;:45::i;:::-;45673:1;45656:9;:13;45666:2;45656:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45704:2;45685:7;:16;45693:7;45685:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45749:7;45745:2;45724:33;;45741:1;45724:33;;;;;;;;;;;;45770:44;45798:1;45802:2;45806:7;45770:19;:44::i;:::-;45383:439;;:::o;13867:326::-;13927:4;14184:1;14162:7;:19;;;:23;14155:30;;13867:326;;;:::o;26626:215::-;26728:4;26767:26;26752:41;;;:11;:41;;;;:81;;;;26797:36;26821:11;26797:23;:36::i;:::-;26752:81;26745:88;;26626:215;;;:::o;50118:126::-;;;;:::o;56295:164::-;56399:10;:17;;;;56372:15;:24;56388:7;56372:24;;;;;;;;;;;:44;;;;56427:10;56443:7;56427:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56295:164;:::o;57086:988::-;57352:22;57402:1;57377:22;57394:4;57377:16;:22::i;:::-;:26;;;;:::i;:::-;57352:51;;57414:18;57435:17;:26;57453:7;57435:26;;;;;;;;;;;;57414:47;;57582:14;57568:10;:28;57564:328;;57613:19;57635:12;:18;57648:4;57635:18;;;;;;;;;;;;;;;:34;57654:14;57635:34;;;;;;;;;;;;57613:56;;57719:11;57686:12;:18;57699:4;57686:18;;;;;;;;;;;;;;;:30;57705:10;57686:30;;;;;;;;;;;:44;;;;57836:10;57803:17;:30;57821:11;57803:30;;;;;;;;;;;:43;;;;57598:294;57564:328;57988:17;:26;58006:7;57988:26;;;;;;;;;;;57981:33;;;58032:12;:18;58045:4;58032:18;;;;;;;;;;;;;;;:34;58051:14;58032:34;;;;;;;;;;;58025:41;;;57167:907;;57086:988;;:::o;58369:1079::-;58622:22;58667:1;58647:10;:17;;;;:21;;;;:::i;:::-;58622:46;;58679:18;58700:15;:24;58716:7;58700:24;;;;;;;;;;;;58679:45;;59051:19;59073:10;59084:14;59073:26;;;;;;;;:::i;:::-;;;;;;;;;;59051:48;;59137:11;59112:10;59123;59112:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59248:10;59217:15;:28;59233:11;59217:28;;;;;;;;;;;:41;;;;59389:15;:24;59405:7;59389:24;;;;;;;;;;;59382:31;;;59424:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58440:1008;;;58369:1079;:::o;55873:221::-;55958:14;55975:20;55992:2;55975:16;:20::i;:::-;55958:37;;56033:7;56006:12;:16;56019:2;56006:16;;;;;;;;;;;;;;;:24;56023:6;56006:24;;;;;;;;;;;:34;;;;56080:6;56051:17;:26;56069:7;56051:26;;;;;;;;;;;:35;;;;55947:147;55873:221;;:::o;25060:157::-;25145:4;25184:25;25169:40;;;:11;:40;;;;25162:47;;25060:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:332::-;6516:4;6554:2;6543:9;6539:18;6531:26;;6567:71;6635:1;6624:9;6620:17;6611:6;6567:71;:::i;:::-;6648:72;6716:2;6705:9;6701:18;6692:6;6648:72;:::i;:::-;6395:332;;;;;:::o;6733:116::-;6803:21;6818:5;6803:21;:::i;:::-;6796:5;6793:32;6783:60;;6839:1;6836;6829:12;6783:60;6733:116;:::o;6855:133::-;6898:5;6936:6;6923:20;6914:29;;6952:30;6976:5;6952:30;:::i;:::-;6855:133;;;;:::o;6994:323::-;7050:6;7099:2;7087:9;7078:7;7074:23;7070:32;7067:119;;;7105:79;;:::i;:::-;7067:119;7225:1;7250:50;7292:7;7283:6;7272:9;7268:22;7250:50;:::i;:::-;7240:60;;7196:114;6994:323;;;;:::o;7323:117::-;7432:1;7429;7422:12;7446:117;7555:1;7552;7545:12;7569:180;7617:77;7614:1;7607:88;7714:4;7711:1;7704:15;7738:4;7735:1;7728:15;7755:281;7838:27;7860:4;7838:27;:::i;:::-;7830:6;7826:40;7968:6;7956:10;7953:22;7932:18;7920:10;7917:34;7914:62;7911:88;;;7979:18;;:::i;:::-;7911:88;8019:10;8015:2;8008:22;7798:238;7755:281;;:::o;8042:129::-;8076:6;8103:20;;:::i;:::-;8093:30;;8132:33;8160:4;8152:6;8132:33;:::i;:::-;8042:129;;;:::o;8177:308::-;8239:4;8329:18;8321:6;8318:30;8315:56;;;8351:18;;:::i;:::-;8315:56;8389:29;8411:6;8389:29;:::i;:::-;8381:37;;8473:4;8467;8463:15;8455:23;;8177:308;;;:::o;8491:154::-;8575:6;8570:3;8565;8552:30;8637:1;8628:6;8623:3;8619:16;8612:27;8491:154;;;:::o;8651:412::-;8729:5;8754:66;8770:49;8812:6;8770:49;:::i;:::-;8754:66;:::i;:::-;8745:75;;8843:6;8836:5;8829:21;8881:4;8874:5;8870:16;8919:3;8910:6;8905:3;8901:16;8898:25;8895:112;;;8926:79;;:::i;:::-;8895:112;9016:41;9050:6;9045:3;9040;9016:41;:::i;:::-;8735:328;8651:412;;;;;:::o;9083:340::-;9139:5;9188:3;9181:4;9173:6;9169:17;9165:27;9155:122;;9196:79;;:::i;:::-;9155:122;9313:6;9300:20;9338:79;9413:3;9405:6;9398:4;9390:6;9386:17;9338:79;:::i;:::-;9329:88;;9145:278;9083:340;;;;:::o;9429:509::-;9498:6;9547:2;9535:9;9526:7;9522:23;9518:32;9515:119;;;9553:79;;:::i;:::-;9515:119;9701:1;9690:9;9686:17;9673:31;9731:18;9723:6;9720:30;9717:117;;;9753:79;;:::i;:::-;9717:117;9858:63;9913:7;9904:6;9893:9;9889:22;9858:63;:::i;:::-;9848:73;;9644:287;9429:509;;;;:::o;9944:329::-;10003:6;10052:2;10040:9;10031:7;10027:23;10023:32;10020:119;;;10058:79;;:::i;:::-;10020:119;10178:1;10203:53;10248:7;10239:6;10228:9;10224:22;10203:53;:::i;:::-;10193:63;;10149:117;9944:329;;;;:::o;10279:468::-;10344:6;10352;10401:2;10389:9;10380:7;10376:23;10372:32;10369:119;;;10407:79;;:::i;:::-;10369:119;10527:1;10552:53;10597:7;10588:6;10577:9;10573:22;10552:53;:::i;:::-;10542:63;;10498:117;10654:2;10680:50;10722:7;10713:6;10702:9;10698:22;10680:50;:::i;:::-;10670:60;;10625:115;10279:468;;;;;:::o;10753:307::-;10814:4;10904:18;10896:6;10893:30;10890:56;;;10926:18;;:::i;:::-;10890:56;10964:29;10986:6;10964:29;:::i;:::-;10956:37;;11048:4;11042;11038:15;11030:23;;10753:307;;;:::o;11066:410::-;11143:5;11168:65;11184:48;11225:6;11184:48;:::i;:::-;11168:65;:::i;:::-;11159:74;;11256:6;11249:5;11242:21;11294:4;11287:5;11283:16;11332:3;11323:6;11318:3;11314:16;11311:25;11308:112;;;11339:79;;:::i;:::-;11308:112;11429:41;11463:6;11458:3;11453;11429:41;:::i;:::-;11149:327;11066:410;;;;;:::o;11495:338::-;11550:5;11599:3;11592:4;11584:6;11580:17;11576:27;11566:122;;11607:79;;:::i;:::-;11566:122;11724:6;11711:20;11749:78;11823:3;11815:6;11808:4;11800:6;11796:17;11749:78;:::i;:::-;11740:87;;11556:277;11495:338;;;;:::o;11839:943::-;11934:6;11942;11950;11958;12007:3;11995:9;11986:7;11982:23;11978:33;11975:120;;;12014:79;;:::i;:::-;11975:120;12134:1;12159:53;12204:7;12195:6;12184:9;12180:22;12159:53;:::i;:::-;12149:63;;12105:117;12261:2;12287:53;12332:7;12323:6;12312:9;12308:22;12287:53;:::i;:::-;12277:63;;12232:118;12389:2;12415:53;12460:7;12451:6;12440:9;12436:22;12415:53;:::i;:::-;12405:63;;12360:118;12545:2;12534:9;12530:18;12517:32;12576:18;12568:6;12565:30;12562:117;;;12598:79;;:::i;:::-;12562:117;12703:62;12757:7;12748:6;12737:9;12733:22;12703:62;:::i;:::-;12693:72;;12488:287;11839:943;;;;;;;:::o;12788:117::-;12897:1;12894;12887:12;13034:77;13071:7;13100:5;13089:16;;13034:77;;;:::o;13117:122::-;13190:24;13208:5;13190:24;:::i;:::-;13183:5;13180:35;13170:63;;13229:1;13226;13219:12;13170:63;13117:122;:::o;13245:139::-;13291:5;13329:6;13316:20;13307:29;;13345:33;13372:5;13345:33;:::i;:::-;13245:139;;;;:::o;13390:86::-;13425:7;13465:4;13458:5;13454:16;13443:27;;13390:86;;;:::o;13482:118::-;13553:22;13569:5;13553:22;:::i;:::-;13546:5;13543:33;13533:61;;13590:1;13587;13580:12;13533:61;13482:118;:::o;13606:135::-;13650:5;13688:6;13675:20;13666:29;;13704:31;13729:5;13704:31;:::i;:::-;13606:135;;;;:::o;13781:724::-;13855:5;13899:4;13887:9;13882:3;13878:19;13874:30;13871:117;;;13907:79;;:::i;:::-;13871:117;14006:21;14022:4;14006:21;:::i;:::-;13997:30;;14083:1;14123:49;14168:3;14159:6;14148:9;14144:22;14123:49;:::i;:::-;14116:4;14109:5;14105:16;14098:75;14037:147;14240:2;14281:49;14326:3;14317:6;14306:9;14302:22;14281:49;:::i;:::-;14274:4;14267:5;14263:16;14256:75;14194:148;14398:2;14439:47;14482:3;14473:6;14462:9;14458:22;14439:47;:::i;:::-;14432:4;14425:5;14421:16;14414:73;14352:146;13781:724;;;;:::o;14511:525::-;14604:6;14612;14661:3;14649:9;14640:7;14636:23;14632:33;14629:120;;;14668:79;;:::i;:::-;14629:120;14788:1;14813:53;14858:7;14849:6;14838:9;14834:22;14813:53;:::i;:::-;14803:63;;14759:117;14915:2;14941:78;15011:7;15002:6;14991:9;14987:22;14941:78;:::i;:::-;14931:88;;14886:143;14511:525;;;;;:::o;15042:474::-;15110:6;15118;15167:2;15155:9;15146:7;15142:23;15138:32;15135:119;;;15173:79;;:::i;:::-;15135:119;15293:1;15318:53;15363:7;15354:6;15343:9;15339:22;15318:53;:::i;:::-;15308:63;;15264:117;15420:2;15446:53;15491:7;15482:6;15471:9;15467:22;15446:53;:::i;:::-;15436:63;;15391:118;15042:474;;;;;:::o;15522:180::-;15570:77;15567:1;15560:88;15667:4;15664:1;15657:15;15691:4;15688:1;15681:15;15708:320;15752:6;15789:1;15783:4;15779:12;15769:22;;15836:1;15830:4;15826:12;15857:18;15847:81;;15913:4;15905:6;15901:17;15891:27;;15847:81;15975:2;15967:6;15964:14;15944:18;15941:38;15938:84;;;15994:18;;:::i;:::-;15938:84;15759:269;15708:320;;;:::o;16034:231::-;16174:34;16170:1;16162:6;16158:14;16151:58;16243:14;16238:2;16230:6;16226:15;16219:39;16034:231;:::o;16271:366::-;16413:3;16434:67;16498:2;16493:3;16434:67;:::i;:::-;16427:74;;16510:93;16599:3;16510:93;:::i;:::-;16628:2;16623:3;16619:12;16612:19;;16271:366;;;:::o;16643:419::-;16809:4;16847:2;16836:9;16832:18;16824:26;;16896:9;16890:4;16886:20;16882:1;16871:9;16867:17;16860:47;16924:131;17050:4;16924:131;:::i;:::-;16916:139;;16643:419;;;:::o;17068:220::-;17208:34;17204:1;17196:6;17192:14;17185:58;17277:3;17272:2;17264:6;17260:15;17253:28;17068:220;:::o;17294:366::-;17436:3;17457:67;17521:2;17516:3;17457:67;:::i;:::-;17450:74;;17533:93;17622:3;17533:93;:::i;:::-;17651:2;17646:3;17642:12;17635:19;;17294:366;;;:::o;17666:419::-;17832:4;17870:2;17859:9;17855:18;17847:26;;17919:9;17913:4;17909:20;17905:1;17894:9;17890:17;17883:47;17947:131;18073:4;17947:131;:::i;:::-;17939:139;;17666:419;;;:::o;18091:243::-;18231:34;18227:1;18219:6;18215:14;18208:58;18300:26;18295:2;18287:6;18283:15;18276:51;18091:243;:::o;18340:366::-;18482:3;18503:67;18567:2;18562:3;18503:67;:::i;:::-;18496:74;;18579:93;18668:3;18579:93;:::i;:::-;18697:2;18692:3;18688:12;18681:19;;18340:366;;;:::o;18712:419::-;18878:4;18916:2;18905:9;18901:18;18893:26;;18965:9;18959:4;18955:20;18951:1;18940:9;18936:17;18929:47;18993:131;19119:4;18993:131;:::i;:::-;18985:139;;18712:419;;;:::o;19137:236::-;19277:34;19273:1;19265:6;19261:14;19254:58;19346:19;19341:2;19333:6;19329:15;19322:44;19137:236;:::o;19379:366::-;19521:3;19542:67;19606:2;19601:3;19542:67;:::i;:::-;19535:74;;19618:93;19707:3;19618:93;:::i;:::-;19736:2;19731:3;19727:12;19720:19;;19379:366;;;:::o;19751:419::-;19917:4;19955:2;19944:9;19940:18;19932:26;;20004:9;19998:4;19994:20;19990:1;19979:9;19975:17;19968:47;20032:131;20158:4;20032:131;:::i;:::-;20024:139;;19751:419;;;:::o;20176:180::-;20224:77;20221:1;20214:88;20321:4;20318:1;20311:15;20345:4;20342:1;20335:15;20362:348;20402:7;20425:20;20443:1;20425:20;:::i;:::-;20420:25;;20459:20;20477:1;20459:20;:::i;:::-;20454:25;;20647:1;20579:66;20575:74;20572:1;20569:81;20564:1;20557:9;20550:17;20546:105;20543:131;;;20654:18;;:::i;:::-;20543:131;20702:1;20699;20695:9;20684:20;;20362:348;;;;:::o;20716:180::-;20764:77;20761:1;20754:88;20861:4;20858:1;20851:15;20885:4;20882:1;20875:15;20902:185;20942:1;20959:20;20977:1;20959:20;:::i;:::-;20954:25;;20993:20;21011:1;20993:20;:::i;:::-;20988:25;;21032:1;21022:35;;21037:18;;:::i;:::-;21022:35;21079:1;21076;21072:9;21067:14;;20902:185;;;;:::o;21093:230::-;21233:34;21229:1;21221:6;21217:14;21210:58;21302:13;21297:2;21289:6;21285:15;21278:38;21093:230;:::o;21329:366::-;21471:3;21492:67;21556:2;21551:3;21492:67;:::i;:::-;21485:74;;21568:93;21657:3;21568:93;:::i;:::-;21686:2;21681:3;21677:12;21670:19;;21329:366;;;:::o;21701:419::-;21867:4;21905:2;21894:9;21890:18;21882:26;;21954:9;21948:4;21944:20;21940:1;21929:9;21925:17;21918:47;21982:131;22108:4;21982:131;:::i;:::-;21974:139;;21701:419;;;:::o;22126:182::-;22266:34;22262:1;22254:6;22250:14;22243:58;22126:182;:::o;22314:366::-;22456:3;22477:67;22541:2;22536:3;22477:67;:::i;:::-;22470:74;;22553:93;22642:3;22553:93;:::i;:::-;22671:2;22666:3;22662:12;22655:19;;22314:366;;;:::o;22686:419::-;22852:4;22890:2;22879:9;22875:18;22867:26;;22939:9;22933:4;22929:20;22925:1;22914:9;22910:17;22903:47;22967:131;23093:4;22967:131;:::i;:::-;22959:139;;22686:419;;;:::o;23111:177::-;23251:29;23247:1;23239:6;23235:14;23228:53;23111:177;:::o;23294:366::-;23436:3;23457:67;23521:2;23516:3;23457:67;:::i;:::-;23450:74;;23533:93;23622:3;23533:93;:::i;:::-;23651:2;23646:3;23642:12;23635:19;;23294:366;;;:::o;23666:419::-;23832:4;23870:2;23859:9;23855:18;23847:26;;23919:9;23913:4;23909:20;23905:1;23894:9;23890:17;23883:47;23947:131;24073:4;23947:131;:::i;:::-;23939:139;;23666:419;;;:::o;24091:305::-;24131:3;24150:20;24168:1;24150:20;:::i;:::-;24145:25;;24184:20;24202:1;24184:20;:::i;:::-;24179:25;;24338:1;24270:66;24266:74;24263:1;24260:81;24257:107;;;24344:18;;:::i;:::-;24257:107;24388:1;24385;24381:9;24374:16;;24091:305;;;;:::o;24402:182::-;24542:34;24538:1;24530:6;24526:14;24519:58;24402:182;:::o;24590:366::-;24732:3;24753:67;24817:2;24812:3;24753:67;:::i;:::-;24746:74;;24829:93;24918:3;24829:93;:::i;:::-;24947:2;24942:3;24938:12;24931:19;;24590:366;;;:::o;24962:419::-;25128:4;25166:2;25155:9;25151:18;25143:26;;25215:9;25209:4;25205:20;25201:1;25190:9;25186:17;25179:47;25243:131;25369:4;25243:131;:::i;:::-;25235:139;;24962:419;;;:::o;25387:233::-;25426:3;25449:24;25467:5;25449:24;:::i;:::-;25440:33;;25495:66;25488:5;25485:77;25482:103;;;25565:18;;:::i;:::-;25482:103;25612:1;25605:5;25601:13;25594:20;;25387:233;;;:::o;25626:231::-;25766:34;25762:1;25754:6;25750:14;25743:58;25835:14;25830:2;25822:6;25818:15;25811:39;25626:231;:::o;25863:366::-;26005:3;26026:67;26090:2;26085:3;26026:67;:::i;:::-;26019:74;;26102:93;26191:3;26102:93;:::i;:::-;26220:2;26215:3;26211:12;26204:19;;25863:366;;;:::o;26235:419::-;26401:4;26439:2;26428:9;26424:18;26416:26;;26488:9;26482:4;26478:20;26474:1;26463:9;26459:17;26452:47;26516:131;26642:4;26516:131;:::i;:::-;26508:139;;26235:419;;;:::o;26660:180::-;26708:77;26705:1;26698:88;26805:4;26802:1;26795:15;26829:4;26826:1;26819:15;26846:228;26986:34;26982:1;26974:6;26970:14;26963:58;27055:11;27050:2;27042:6;27038:15;27031:36;26846:228;:::o;27080:366::-;27222:3;27243:67;27307:2;27302:3;27243:67;:::i;:::-;27236:74;;27319:93;27408:3;27319:93;:::i;:::-;27437:2;27432:3;27428:12;27421:19;;27080:366;;;:::o;27452:419::-;27618:4;27656:2;27645:9;27641:18;27633:26;;27705:9;27699:4;27695:20;27691:1;27680:9;27676:17;27669:47;27733:131;27859:4;27733:131;:::i;:::-;27725:139;;27452:419;;;:::o;27877:229::-;28017:34;28013:1;28005:6;28001:14;27994:58;28086:12;28081:2;28073:6;28069:15;28062:37;27877:229;:::o;28112:366::-;28254:3;28275:67;28339:2;28334:3;28275:67;:::i;:::-;28268:74;;28351:93;28440:3;28351:93;:::i;:::-;28469:2;28464:3;28460:12;28453:19;;28112:366;;;:::o;28484:419::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:221::-;29049:34;29045:1;29037:6;29033:14;29026:58;29118:4;29113:2;29105:6;29101:15;29094:29;28909:221;:::o;29136:366::-;29278:3;29299:67;29363:2;29358:3;29299:67;:::i;:::-;29292:74;;29375:93;29464:3;29375:93;:::i;:::-;29493:2;29488:3;29484:12;29477:19;;29136:366;;;:::o;29508:419::-;29674:4;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29508:419;;;:::o;29933:181::-;30073:33;30069:1;30061:6;30057:14;30050:57;29933:181;:::o;30120:366::-;30262:3;30283:67;30347:2;30342:3;30283:67;:::i;:::-;30276:74;;30359:93;30448:3;30359:93;:::i;:::-;30477:2;30472:3;30468:12;30461:19;;30120:366;;;:::o;30492:419::-;30658:4;30696:2;30685:9;30681:18;30673:26;;30745:9;30739:4;30735:20;30731:1;30720:9;30716:17;30709:47;30773:131;30899:4;30773:131;:::i;:::-;30765:139;;30492:419;;;:::o;30917:234::-;31057:34;31053:1;31045:6;31041:14;31034:58;31126:17;31121:2;31113:6;31109:15;31102:42;30917:234;:::o;31157:366::-;31299:3;31320:67;31384:2;31379:3;31320:67;:::i;:::-;31313:74;;31396:93;31485:3;31396:93;:::i;:::-;31514:2;31509:3;31505:12;31498:19;;31157:366;;;:::o;31529:419::-;31695:4;31733:2;31722:9;31718:18;31710:26;;31782:9;31776:4;31772:20;31768:1;31757:9;31753:17;31746:47;31810:131;31936:4;31810:131;:::i;:::-;31802:139;;31529:419;;;:::o;31954:148::-;32056:11;32093:3;32078:18;;31954:148;;;;:::o;32108:377::-;32214:3;32242:39;32275:5;32242:39;:::i;:::-;32297:89;32379:6;32374:3;32297:89;:::i;:::-;32290:96;;32395:52;32440:6;32435:3;32428:4;32421:5;32417:16;32395:52;:::i;:::-;32472:6;32467:3;32463:16;32456:23;;32218:267;32108:377;;;;:::o;32491:435::-;32671:3;32693:95;32784:3;32775:6;32693:95;:::i;:::-;32686:102;;32805:95;32896:3;32887:6;32805:95;:::i;:::-;32798:102;;32917:3;32910:10;;32491:435;;;;;:::o;32932:224::-;33072:34;33068:1;33060:6;33056:14;33049:58;33141:7;33136:2;33128:6;33124:15;33117:32;32932:224;:::o;33162:366::-;33304:3;33325:67;33389:2;33384:3;33325:67;:::i;:::-;33318:74;;33401:93;33490:3;33401:93;:::i;:::-;33519:2;33514:3;33510:12;33503:19;;33162:366;;;:::o;33534:419::-;33700:4;33738:2;33727:9;33723:18;33715:26;;33787:9;33781:4;33777:20;33773:1;33762:9;33758:17;33751:47;33815:131;33941:4;33815:131;:::i;:::-;33807:139;;33534:419;;;:::o;33959:226::-;34099:34;34095:1;34087:6;34083:14;34076:58;34168:9;34163:2;34155:6;34151:15;34144:34;33959:226;:::o;34191:366::-;34333:3;34354:67;34418:2;34413:3;34354:67;:::i;:::-;34347:74;;34430:93;34519:3;34430:93;:::i;:::-;34548:2;34543:3;34539:12;34532:19;;34191:366;;;:::o;34563:419::-;34729:4;34767:2;34756:9;34752:18;34744:26;;34816:9;34810:4;34806:20;34802:1;34791:9;34787:17;34780:47;34844:131;34970:4;34844:131;:::i;:::-;34836:139;;34563:419;;;:::o;34988:180::-;35036:77;35033:1;35026:88;35133:4;35130:1;35123:15;35157:4;35154:1;35147:15;35174:121;35263:1;35256:5;35253:12;35243:46;;35269:18;;:::i;:::-;35243:46;35174:121;:::o;35301:143::-;35354:7;35383:5;35372:16;;35389:49;35432:5;35389:49;:::i;:::-;35301:143;;;:::o;35450:::-;35514:9;35547:40;35581:5;35547:40;:::i;:::-;35534:53;;35450:143;;;:::o;35599:159::-;35700:51;35745:5;35700:51;:::i;:::-;35695:3;35688:64;35599:159;;:::o;35764:360::-;35899:4;35937:2;35926:9;35922:18;35914:26;;35950:85;36032:1;36021:9;36017:17;36008:6;35950:85;:::i;:::-;36045:72;36113:2;36102:9;36098:18;36089:6;36045:72;:::i;:::-;35764:360;;;;;:::o;36130:165::-;36270:17;36266:1;36258:6;36254:14;36247:41;36130:165;:::o;36301:366::-;36443:3;36464:67;36528:2;36523:3;36464:67;:::i;:::-;36457:74;;36540:93;36629:3;36540:93;:::i;:::-;36658:2;36653:3;36649:12;36642:19;;36301:366;;;:::o;36673:419::-;36839:4;36877:2;36866:9;36862:18;36854:26;;36926:9;36920:4;36916:20;36912:1;36901:9;36897:17;36890:47;36954:131;37080:4;36954:131;:::i;:::-;36946:139;;36673:419;;;:::o;37098:240::-;37238:34;37234:1;37226:6;37222:14;37215:58;37307:23;37302:2;37294:6;37290:15;37283:48;37098:240;:::o;37344:366::-;37486:3;37507:67;37571:2;37566:3;37507:67;:::i;:::-;37500:74;;37583:93;37672:3;37583:93;:::i;:::-;37701:2;37696:3;37692:12;37685:19;;37344:366;;;:::o;37716:419::-;37882:4;37920:2;37909:9;37905:18;37897:26;;37969:9;37963:4;37959:20;37955:1;37944:9;37940:17;37933:47;37997:131;38123:4;37997:131;:::i;:::-;37989:139;;37716:419;;;:::o;38141:225::-;38281:34;38277:1;38269:6;38265:14;38258:58;38350:8;38345:2;38337:6;38333:15;38326:33;38141:225;:::o;38372:366::-;38514:3;38535:67;38599:2;38594:3;38535:67;:::i;:::-;38528:74;;38611:93;38700:3;38611:93;:::i;:::-;38729:2;38724:3;38720:12;38713:19;;38372:366;;;:::o;38744:419::-;38910:4;38948:2;38937:9;38933:18;38925:26;;38997:9;38991:4;38987:20;38983:1;38972:9;38968:17;38961:47;39025:131;39151:4;39025:131;:::i;:::-;39017:139;;38744:419;;;:::o;39169:231::-;39309:34;39305:1;39297:6;39293:14;39286:58;39378:14;39373:2;39365:6;39361:15;39354:39;39169:231;:::o;39406:366::-;39548:3;39569:67;39633:2;39628:3;39569:67;:::i;:::-;39562:74;;39645:93;39734:3;39645:93;:::i;:::-;39763:2;39758:3;39754:12;39747:19;;39406:366;;;:::o;39778:419::-;39944:4;39982:2;39971:9;39967:18;39959:26;;40031:9;40025:4;40021:20;40017:1;40006:9;40002:17;39995:47;40059:131;40185:4;40059:131;:::i;:::-;40051:139;;39778:419;;;:::o;40203:224::-;40343:34;40339:1;40331:6;40327:14;40320:58;40412:7;40407:2;40399:6;40395:15;40388:32;40203:224;:::o;40433:366::-;40575:3;40596:67;40660:2;40655:3;40596:67;:::i;:::-;40589:74;;40672:93;40761:3;40672:93;:::i;:::-;40790:2;40785:3;40781:12;40774:19;;40433:366;;;:::o;40805:419::-;40971:4;41009:2;40998:9;40994:18;40986:26;;41058:9;41052:4;41048:20;41044:1;41033:9;41029:17;41022:47;41086:131;41212:4;41086:131;:::i;:::-;41078:139;;40805:419;;;:::o;41230:223::-;41370:34;41366:1;41358:6;41354:14;41347:58;41439:6;41434:2;41426:6;41422:15;41415:31;41230:223;:::o;41459:366::-;41601:3;41622:67;41686:2;41681:3;41622:67;:::i;:::-;41615:74;;41698:93;41787:3;41698:93;:::i;:::-;41816:2;41811:3;41807:12;41800:19;;41459:366;;;:::o;41831:419::-;41997:4;42035:2;42024:9;42020:18;42012:26;;42084:9;42078:4;42074:20;42070:1;42059:9;42055:17;42048:47;42112:131;42238:4;42112:131;:::i;:::-;42104:139;;41831:419;;;:::o;42256:191::-;42296:4;42316:20;42334:1;42316:20;:::i;:::-;42311:25;;42350:20;42368:1;42350:20;:::i;:::-;42345:25;;42389:1;42386;42383:8;42380:34;;;42394:18;;:::i;:::-;42380:34;42439:1;42436;42432:9;42424:17;;42256:191;;;;:::o;42453:147::-;42554:11;42591:3;42576:18;;42453:147;;;;:::o;42606:114::-;;:::o;42726:398::-;42885:3;42906:83;42987:1;42982:3;42906:83;:::i;:::-;42899:90;;42998:93;43087:3;42998:93;:::i;:::-;43116:1;43111:3;43107:11;43100:18;;42726:398;;;:::o;43130:379::-;43314:3;43336:147;43479:3;43336:147;:::i;:::-;43329:154;;43500:3;43493:10;;43130:379;;;:::o;43515:166::-;43655:18;43651:1;43643:6;43639:14;43632:42;43515:166;:::o;43687:366::-;43829:3;43850:67;43914:2;43909:3;43850:67;:::i;:::-;43843:74;;43926:93;44015:3;43926:93;:::i;:::-;44044:2;44039:3;44035:12;44028:19;;43687:366;;;:::o;44059:419::-;44225:4;44263:2;44252:9;44248:18;44240:26;;44312:9;44306:4;44302:20;44298:1;44287:9;44283:17;44276:47;44340:131;44466:4;44340:131;:::i;:::-;44332:139;;44059:419;;;:::o;44484:175::-;44624:27;44620:1;44612:6;44608:14;44601:51;44484:175;:::o;44665:366::-;44807:3;44828:67;44892:2;44887:3;44828:67;:::i;:::-;44821:74;;44904:93;44993:3;44904:93;:::i;:::-;45022:2;45017:3;45013:12;45006:19;;44665:366;;;:::o;45037:419::-;45203:4;45241:2;45230:9;45226:18;45218:26;;45290:9;45284:4;45280:20;45276:1;45265:9;45261:17;45254:47;45318:131;45444:4;45318:131;:::i;:::-;45310:139;;45037:419;;;:::o;45462:237::-;45602:34;45598:1;45590:6;45586:14;45579:58;45671:20;45666:2;45658:6;45654:15;45647:45;45462:237;:::o;45705:366::-;45847:3;45868:67;45932:2;45927:3;45868:67;:::i;:::-;45861:74;;45944:93;46033:3;45944:93;:::i;:::-;46062:2;46057:3;46053:12;46046:19;;45705:366;;;:::o;46077:419::-;46243:4;46281:2;46270:9;46266:18;46258:26;;46330:9;46324:4;46320:20;46316:1;46305:9;46301:17;46294:47;46358:131;46484:4;46358:131;:::i;:::-;46350:139;;46077:419;;;:::o;46502:176::-;46534:1;46551:20;46569:1;46551:20;:::i;:::-;46546:25;;46585:20;46603:1;46585:20;:::i;:::-;46580:25;;46624:1;46614:35;;46629:18;;:::i;:::-;46614:35;46670:1;46667;46663:9;46658:14;;46502:176;;;;:::o;46684:118::-;46771:24;46789:5;46771:24;:::i;:::-;46766:3;46759:37;46684:118;;:::o;46808:112::-;46891:22;46907:5;46891:22;:::i;:::-;46886:3;46879:35;46808:112;;:::o;46926:545::-;47099:4;47137:3;47126:9;47122:19;47114:27;;47151:71;47219:1;47208:9;47204:17;47195:6;47151:71;:::i;:::-;47232:68;47296:2;47285:9;47281:18;47272:6;47232:68;:::i;:::-;47310:72;47378:2;47367:9;47363:18;47354:6;47310:72;:::i;:::-;47392;47460:2;47449:9;47445:18;47436:6;47392:72;:::i;:::-;46926:545;;;;;;;:::o;47477:174::-;47617:26;47613:1;47605:6;47601:14;47594:50;47477:174;:::o;47657:366::-;47799:3;47820:67;47884:2;47879:3;47820:67;:::i;:::-;47813:74;;47896:93;47985:3;47896:93;:::i;:::-;48014:2;48009:3;48005:12;47998:19;;47657:366;;;:::o;48029:419::-;48195:4;48233:2;48222:9;48218:18;48210:26;;48282:9;48276:4;48272:20;48268:1;48257:9;48253:17;48246:47;48310:131;48436:4;48310:131;:::i;:::-;48302:139;;48029:419;;;:::o;48454:98::-;48505:6;48539:5;48533:12;48523:22;;48454:98;;;:::o;48558:168::-;48641:11;48675:6;48670:3;48663:19;48715:4;48710:3;48706:14;48691:29;;48558:168;;;;:::o;48732:360::-;48818:3;48846:38;48878:5;48846:38;:::i;:::-;48900:70;48963:6;48958:3;48900:70;:::i;:::-;48893:77;;48979:52;49024:6;49019:3;49012:4;49005:5;49001:16;48979:52;:::i;:::-;49056:29;49078:6;49056:29;:::i;:::-;49051:3;49047:39;49040:46;;48822:270;48732:360;;;;:::o;49098:640::-;49293:4;49331:3;49320:9;49316:19;49308:27;;49345:71;49413:1;49402:9;49398:17;49389:6;49345:71;:::i;:::-;49426:72;49494:2;49483:9;49479:18;49470:6;49426:72;:::i;:::-;49508;49576:2;49565:9;49561:18;49552:6;49508:72;:::i;:::-;49627:9;49621:4;49617:20;49612:2;49601:9;49597:18;49590:48;49655:76;49726:4;49717:6;49655:76;:::i;:::-;49647:84;;49098:640;;;;;;;:::o;49744:141::-;49800:5;49831:6;49825:13;49816:22;;49847:32;49873:5;49847:32;:::i;:::-;49744:141;;;;:::o;49891:349::-;49960:6;50009:2;49997:9;49988:7;49984:23;49980:32;49977:119;;;50015:79;;:::i;:::-;49977:119;50135:1;50160:63;50215:7;50206:6;50195:9;50191:22;50160:63;:::i;:::-;50150:73;;50106:127;49891:349;;;;:::o;50246:182::-;50386:34;50382:1;50374:6;50370:14;50363:58;50246:182;:::o;50434:366::-;50576:3;50597:67;50661:2;50656:3;50597:67;:::i;:::-;50590:74;;50673:93;50762:3;50673:93;:::i;:::-;50791:2;50786:3;50782:12;50775:19;;50434:366;;;:::o;50806:419::-;50972:4;51010:2;50999:9;50995:18;50987:26;;51059:9;51053:4;51049:20;51045:1;51034:9;51030:17;51023:47;51087:131;51213:4;51087:131;:::i;:::-;51079:139;;50806:419;;;:::o;51231:178::-;51371:30;51367:1;51359:6;51355:14;51348:54;51231:178;:::o;51415:366::-;51557:3;51578:67;51642:2;51637:3;51578:67;:::i;:::-;51571:74;;51654:93;51743:3;51654:93;:::i;:::-;51772:2;51767:3;51763:12;51756:19;;51415:366;;;:::o;51787:419::-;51953:4;51991:2;51980:9;51976:18;51968:26;;52040:9;52034:4;52030:20;52026:1;52015:9;52011:17;52004:47;52068:131;52194:4;52068:131;:::i;:::-;52060:139;;51787:419;;;:::o;52212:180::-;52260:77;52257:1;52250:88;52357:4;52354:1;52347:15;52381:4;52378:1;52371:15

Swarm Source

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