ETH Price: $2,605.19 (+0.44%)
Gas: 2 Gwei

Token

EL COCO CANDYSHOP (COCANDY)
 

Overview

Max Total Supply

830 COCANDY

Holders

94

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 COCANDY
0x672755E5d2A96707BE8ad58d124BbbEBA99fcFf4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ElCococCandyshopContract

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

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

//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@@@@(@@@@@@@@@@@@@((@@@@@@@@@@@@((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@@@@@@((((@@@@@@@@((((@@@@@@@@@@((((@@@@@@@@@(((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@((((@@@@@@@@@(((((((@@@@@(((((((@@@@@@((((((((@@@@@@(((((((((@@@@@@@@@@@%((((#@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@#((((((@@@@@@(((((((((((((((((((((&@@((((((((((@@(((((((((((((@@@(((((((((((((@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@((((((((((((((((((((((((((((((((((((((((((((((((((&@@@@@@@#((((((((((((((((((@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@((((((((((((((((((((%@@@@@@@@@@@@@@@@@@@@@@@@@@@@*...................*@@@@((((((((((@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@(((((((((((@@@@..................................@@@@@@..@@@@@@......@(%@@((((((#@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@((((((@@*...@@@@@...@@@@.....@@@@@@@*.@@@@@@..@@@@@@..@@@@@@@...@@.@@...@@((((@@@@@@@@((((@@@@@     
//  @@@@@@@@@@@@@@@@#(((((@@..%@@@@@@@@@.@@@@@@..@@@@@@@@..@@@@@@@@@@@@@......@@@@..@@/..@@@@@@@@@((((((((((((@@@@@@@     
//  @@@@@@@@@@@#((((((((@@...@@@@@@@@@@@.@@@@@@.@@@@@,.....@@@@@@@@.@@@@@@@@........*..@@  @@@//@@@(((((((((@@@@@@@@@     
//  @@@@@@@((((((((((((@@..@@@@@@@......@@@@@@..@@@@@......@@@@@@@...@@@@@@&..@@@@@@@.@      @///@@(((((((@@@@@@@@@@@     
//  @@@@@@@@@@@#((((((@@../@@@@@@@@@@&..@@@@@...@@@@@@@@@....@@@............@@@@#####@@     @@////@&((((((((((((((@@@     
//  @@@@@@@@@@@@@@((((@@..@@@@@@@@@@@@@.@@@@@....@@@@@@@@@@.......@@@@@@@.@@    @@####@@@@@@//////@@(((((((((((#@@@@@     
//  @@@@@@@@@@@@((((((@@..@@@@@@@@#*...@@@@@@@@@@@...@@@........@@@@%%%%%@@@    @@#####@@////////@@((((((((#@@@@@@@@@     
//  @@@@@@@@@@((((((((@@..@@@@@@@......(@@@@@@@@@@...@@@@ @@@.@@    @&%%%%@@@@@@@#######@///////@@(((((((@@@@@@@@@@@@     
//  @@@@@@@((((((((((((@..@@@@@@@@@@,..............#@    @@  @@@   @@%%%%%@@############@@////@@@((((((((((((((((@@@@     
//  @@@@@(((((@@@@@((((#@/.@@@@@@@@@@@@@@@@@@......@@    @@  @@*@@@%%%%%%%@@#############@/@@@((((((&@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@(((((((@@@./@@@@@@@@@@@@@@@.......@@@@@     @@@%%%%%%%%%%@@#######@@@@@@((((((((((((@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@(((((((((((@@@@@..,@@@@@..........@@         @@%%%%%%%@@@@@@@@@%(((((((((((((((((((((((((@@@@@@@@@@@     
//  @@@@@@@@@@@(((((((((@@((((((((((#@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((((((((@@@@@@@@@@(((@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@((((((((@@@@((((((((((#(((((((((@@@@@(((((((@@@@@(((((((((((@@@@((((((((@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@((((@@@@@@@@@(((((((@@@@@(((((((@@@@@@@#((((@@@@@@@@((((((((@@@@@@@@@@#(((@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@@@@@#((((%@@@@@@@@(((((@@@@@@@@@@((@@@@@@@@@@@@(((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@((@@@@@@@@@@@@((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     
//  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `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/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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



pragma solidity ^0.8.0;




contract ElCococCandyshopContract is ERC2981, ERC721Enumerable, Ownable {
    using Strings for uint256;

    string public baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 0 ether;
    uint256 public maxSupply = 1000;
    uint256 public maxMintAmount = 20;
    uint256 public nftPerAddressLimit = 20;
    bool public paused = false;
    bool public revealed = false;
    string public notRevealedUri;
    address[] public whitelistedAddresses;
    bool public onlyWhitelisted = true;
    mapping(address => uint256) public addressMintedBalance;
    uint96 royaltyFeesInBips;
    address royaltyAddress;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        uint96 _royaltyFeesInBips,
        string memory _initNotRevealedUri
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setRoyaltyInfo(msg.sender, _royaltyFeesInBips);
        setNotRevealedURI(_initNotRevealedUri);
        mint(msg.sender, 5);
    }

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

    // public
    function mint(address _to, uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused);
        require(_mintAmount > 0);
        if (msg.sender != owner()) {
            require(_mintAmount <= maxMintAmount);
        }
        require(supply + _mintAmount <= maxSupply);

        if (msg.sender != owner()) {
            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "user is not whitelisted");
                uint256 ownerMintedCount = addressMintedBalance[msg.sender];
                if (msg.sender != owner()) {
                    require(
                        ownerMintedCount + _mintAmount <= nftPerAddressLimit,
                        "max NFT per address exceeded"
                    );
                }
            }
            require(msg.value >= cost * _mintAmount, "insufficient funds");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(_to, supply + i);
        }
    }

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips)
        public
        onlyOwner
    {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

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

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function unReveal() public onlyOwner {
        revealed = false;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Enumerable, ERC2981)
        returns (bool)
    {
        return
            interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200005192919062001440565b506000600f556103e8601055601460115560146012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506001601660006101000a81548160ff021916908315150217905550348015620000c557600080fd5b5060405162007670380380620076708339818101604052810190620000eb9190620015ce565b848481600290805190602001906200010592919062001440565b5080600390805190602001906200011e92919062001440565b50505062000141620001356200019360201b60201c565b6200019b60201b60201c565b62000152836200026160201b60201c565b6200016433836200030c60201b60201c565b6200017581620003b160201b60201c565b620001883360056200045c60201b60201c565b5050505050620020aa565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002716200019360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002976200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e790620019b9565b60405180910390fd5b80600d90805190602001906200030892919062001440565b5050565b6200031c6200019360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003426200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039290620019b9565b60405180910390fd5b620003ad8282620007bd60201b60201c565b5050565b620003c16200019360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e76200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000440576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043790620019b9565b60405180910390fd5b80601490805190602001906200045892919062001440565b5050565b60006200046e6200096060201b60201c565b9050601360009054906101000a900460ff16156200048b57600080fd5b600082116200049957600080fd5b620004a96200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620004ed57601154821115620004ec57600080fd5b5b6010548282620004fe919062001aef565b11156200050a57600080fd5b6200051a6200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620006f25760011515601660009054906101000a900460ff16151514156200069c576200057b336200096d60201b60201c565b620005bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b49062001a1f565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050620006116200079360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200069a57601254838262000655919062001aef565b111562000699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006909062001953565b60405180910390fd5b5b505b81600f54620006ac919062001b4c565b341015620006f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e890620019db565b60405180910390fd5b5b6000600190505b8281116200078d57601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190620007539062001d0c565b9190505550620007778482846200076b919062001aef565b62000a2560201b60201c565b8080620007849062001d0c565b915050620006f9565b50505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007cd62000a4b60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200082e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200082590620019fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008989062001a41565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a80549050905090565b600080600090505b60158054905081101562000a1a578273ffffffffffffffffffffffffffffffffffffffff1660158281548110620009b157620009b062001de7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000a0457600191505062000a20565b808062000a119062001d0c565b91505062000975565b50600090505b919050565b62000a4782826040518060200160405280600081525062000a5560201b60201c565b5050565b6000612710905090565b62000a67838362000ac360201b60201c565b62000a7c600084848462000cbd60201b60201c565b62000abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ab5906200190f565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b2d9062001997565b60405180910390fd5b62000b478162000e7760201b60201c565b1562000b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b819062001931565b60405180910390fd5b62000b9e6000838362000ee360201b60201c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000bf0919062001aef565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a462000cb9600083836200102a60201b60201c565b5050565b600062000ceb8473ffffffffffffffffffffffffffffffffffffffff166200102f60201b620025461760201c565b1562000e6a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000d1d6200019360201b60201c565b8786866040518563ffffffff1660e01b815260040162000d419493929190620018bb565b602060405180830381600087803b15801562000d5c57600080fd5b505af192505050801562000d9057506040513d601f19601f8201168201806040525081019062000d8d91906200159c565b60015b62000e19573d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b5060008151141562000e11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e08906200190f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000e6f565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000efb8383836200105260201b620025691760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000f485762000f42816200105760201b60201c565b62000f90565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000f8f5762000f8e8382620010a060201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000fdd5762000fd7816200121d60201b60201c565b62001025565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200102457620010238282620012f960201b60201c565b5b5b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620010ba846200138560201b62001b901760201c565b620010c6919062001bad565b9050600060096000848152602001908152602001600020549050818114620011ac576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a8054905062001233919062001bad565b90506000600b60008481526020019081526020016000205490506000600a838154811062001266576200126562001de7565b5b9060005260206000200154905080600a83815481106200128b576200128a62001de7565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480620012dd57620012dc62001db8565b5b6001900381819060005260206000200160009055905550505050565b600062001311836200138560201b62001b901760201c565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620013f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013f09062001975565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8280546200144e9062001ca0565b90600052602060002090601f016020900481019282620014725760008555620014be565b82601f106200148d57805160ff1916838001178555620014be565b82800160010185558215620014be579182015b82811115620014bd578251825591602001919060010190620014a0565b5b509050620014cd9190620014d1565b5090565b5b80821115620014ec576000816000905550600101620014d2565b5090565b600062001507620015018462001a8c565b62001a63565b90508281526020810184848401111562001526576200152562001e4a565b5b6200153384828562001c6a565b509392505050565b6000815190506200154c8162002076565b92915050565b600082601f8301126200156a576200156962001e45565b5b81516200157c848260208601620014f0565b91505092915050565b600081519050620015968162002090565b92915050565b600060208284031215620015b557620015b462001e54565b5b6000620015c5848285016200153b565b91505092915050565b600080600080600060a08688031215620015ed57620015ec62001e54565b5b600086015167ffffffffffffffff8111156200160e576200160d62001e4f565b5b6200161c8882890162001552565b955050602086015167ffffffffffffffff81111562001640576200163f62001e4f565b5b6200164e8882890162001552565b945050604086015167ffffffffffffffff81111562001672576200167162001e4f565b5b620016808882890162001552565b9350506060620016938882890162001585565b925050608086015167ffffffffffffffff811115620016b757620016b662001e4f565b5b620016c58882890162001552565b9150509295509295909350565b620016dd8162001be8565b82525050565b6000620016f08262001ac2565b620016fc818562001acd565b93506200170e81856020860162001c6a565b620017198162001e59565b840191505092915050565b60006200173360328362001ade565b9150620017408262001e6a565b604082019050919050565b60006200175a601c8362001ade565b9150620017678262001eb9565b602082019050919050565b600062001781601c8362001ade565b91506200178e8262001ee2565b602082019050919050565b6000620017a8602a8362001ade565b9150620017b58262001f0b565b604082019050919050565b6000620017cf60208362001ade565b9150620017dc8262001f5a565b602082019050919050565b6000620017f660208362001ade565b9150620018038262001f83565b602082019050919050565b60006200181d60128362001ade565b91506200182a8262001fac565b602082019050919050565b600062001844602a8362001ade565b9150620018518262001fd5565b604082019050919050565b60006200186b60178362001ade565b9150620018788262002024565b602082019050919050565b60006200189260198362001ade565b91506200189f826200204d565b602082019050919050565b620018b58162001c48565b82525050565b6000608082019050620018d26000830187620016d2565b620018e16020830186620016d2565b620018f06040830185620018aa565b8181036060830152620019048184620016e3565b905095945050505050565b600060208201905081810360008301526200192a8162001724565b9050919050565b600060208201905081810360008301526200194c816200174b565b9050919050565b600060208201905081810360008301526200196e8162001772565b9050919050565b60006020820190508181036000830152620019908162001799565b9050919050565b60006020820190508181036000830152620019b281620017c0565b9050919050565b60006020820190508181036000830152620019d481620017e7565b9050919050565b60006020820190508181036000830152620019f6816200180e565b9050919050565b6000602082019050818103600083015262001a188162001835565b9050919050565b6000602082019050818103600083015262001a3a816200185c565b9050919050565b6000602082019050818103600083015262001a5c8162001883565b9050919050565b600062001a6f62001a82565b905062001a7d828262001cd6565b919050565b6000604051905090565b600067ffffffffffffffff82111562001aaa5762001aa962001e16565b5b62001ab58262001e59565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062001afc8262001c48565b915062001b098362001c48565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001b415762001b4062001d5a565b5b828201905092915050565b600062001b598262001c48565b915062001b668362001c48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001ba25762001ba162001d5a565b5b828202905092915050565b600062001bba8262001c48565b915062001bc78362001c48565b92508282101562001bdd5762001bdc62001d5a565b5b828203905092915050565b600062001bf58262001c28565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b8381101562001c8a57808201518184015260208101905062001c6d565b8381111562001c9a576000848401525b50505050565b6000600282049050600182168062001cb957607f821691505b6020821081141562001cd05762001ccf62001d89565b5b50919050565b62001ce18262001e59565b810181811067ffffffffffffffff8211171562001d035762001d0262001e16565b5b80604052505050565b600062001d198262001c48565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001d4f5762001d4e62001d5a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b620020818162001bfc565b81146200208d57600080fd5b50565b6200209b8162001c52565b8114620020a757600080fd5b50565b6155b680620020ba6000396000f3fe6080604052600436106102935760003560e01c806355f804b31161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb01146109fb578063da3ef23f14610a26578063e985e9c514610a4f578063edec5f2714610a8c578063f2c4ce1e14610ab5578063f2fde38b14610ade57610293565b8063b88d4fde146108d9578063ba4e5c4914610902578063ba7d2c761461093f578063c66828621461096a578063c87b56dd14610995578063d0eb26b0146109d257610293565b80637f00c7a6116101135780637f00c7a6146107ef5780638da5cb5b1461081857806395d89b41146108435780639c70b5121461086e578063a22cb46514610899578063a475b5dd146108c257610293565b806355f804b3146106df5780635c975abb146107085780636352211e146107335780636c0360eb1461077057806370a082311461079b578063715018a6146107d857610293565b806323b872dd116101fe57806340c10f19116101b757806340c10f19146105cc57806342842e0e146105e8578063438b63001461061157806344a0d68a1461064e5780634f6ccce71461067757806351830227146106b457610293565b806323b872dd146104b85780632a55205a146104e15780632f745c591461051f5780633af32abf1461055c5780633c952764146105995780633ccfd60b146105c257610293565b8063095ea7b311610250578063095ea7b3146103ba57806313faede6146103e357806315edf5f31461040e57806318160ddd1461042557806318cae26914610450578063239c70ae1461048d57610293565b806301ffc9a71461029857806302329a29146102d557806302fa7c47146102fe57806306fdde0314610327578063081812fc14610352578063081c8c441461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613fdf565b610b07565b6040516102cc91906146cb565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613fb2565b610b49565b005b34801561030a57600080fd5b5061032560048036038101906103209190613f25565b610be2565b005b34801561033357600080fd5b5061033c610c6c565b60405161034991906146e6565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190614082565b610cfe565b6040516103869190614619565b60405180910390f35b34801561039b57600080fd5b506103a4610d83565b6040516103b191906146e6565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613ee5565b610e11565b005b3480156103ef57600080fd5b506103f8610f29565b60405161040591906149e8565b60405180910390f35b34801561041a57600080fd5b50610423610f2f565b005b34801561043157600080fd5b5061043a610fc8565b60405161044791906149e8565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613d62565b610fd5565b60405161048491906149e8565b60405180910390f35b34801561049957600080fd5b506104a2610fed565b6040516104af91906149e8565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190613dcf565b610ff3565b005b3480156104ed57600080fd5b50610508600480360381019061050391906140af565b611053565b604051610516929190614680565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613ee5565b61123e565b60405161055391906149e8565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613d62565b6112e3565b60405161059091906146cb565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190613fb2565b611392565b005b6105ca61142b565b005b6105e660048036038101906105e19190613ee5565b6114e7565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613dcf565b6117cf565b005b34801561061d57600080fd5b5061063860048036038101906106339190613d62565b6117ef565b60405161064591906146a9565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190614082565b61189d565b005b34801561068357600080fd5b5061069e60048036038101906106999190614082565b611923565b6040516106ab91906149e8565b60405180910390f35b3480156106c057600080fd5b506106c9611994565b6040516106d691906146cb565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190614039565b6119a7565b005b34801561071457600080fd5b5061071d611a3d565b60405161072a91906146cb565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190614082565b611a50565b6040516107679190614619565b60405180910390f35b34801561077c57600080fd5b50610785611b02565b60405161079291906146e6565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613d62565b611b90565b6040516107cf91906149e8565b60405180910390f35b3480156107e457600080fd5b506107ed611c48565b005b3480156107fb57600080fd5b5061081660048036038101906108119190614082565b611cd0565b005b34801561082457600080fd5b5061082d611d56565b60405161083a9190614619565b60405180910390f35b34801561084f57600080fd5b50610858611d80565b60405161086591906146e6565b60405180910390f35b34801561087a57600080fd5b50610883611e12565b60405161089091906146cb565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613ea5565b611e25565b005b3480156108ce57600080fd5b506108d7611e3b565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613e22565b611ed4565b005b34801561090e57600080fd5b5061092960048036038101906109249190614082565b611f36565b6040516109369190614619565b60405180910390f35b34801561094b57600080fd5b50610954611f75565b60405161096191906149e8565b60405180910390f35b34801561097657600080fd5b5061097f611f7b565b60405161098c91906146e6565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b79190614082565b612009565b6040516109c991906146e6565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614082565b612162565b005b348015610a0757600080fd5b50610a106121e8565b604051610a1d91906149e8565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190614039565b6121ee565b005b348015610a5b57600080fd5b50610a766004803603810190610a719190613d8f565b612284565b604051610a8391906146cb565b60405180910390f35b348015610a9857600080fd5b50610ab36004803603810190610aae9190613f65565b612318565b005b348015610ac157600080fd5b50610adc6004803603810190610ad79190614039565b6123b8565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613d62565b61244e565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b425750610b418261256e565b5b9050919050565b610b516125e8565b73ffffffffffffffffffffffffffffffffffffffff16610b6f611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc906148c8565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b610bea6125e8565b73ffffffffffffffffffffffffffffffffffffffff16610c08611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906148c8565b60405180910390fd5b610c6882826125f0565b5050565b606060028054610c7b90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca790614cfe565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0982612785565b610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906148a8565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610d9090614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbc90614cfe565b8015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b505050505081565b6000610e1c82611a50565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614908565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eac6125e8565b73ffffffffffffffffffffffffffffffffffffffff161480610edb5750610eda81610ed56125e8565b612284565b5b610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190614828565b60405180910390fd5b610f2483836127f1565b505050565b600f5481565b610f376125e8565b73ffffffffffffffffffffffffffffffffffffffff16610f55611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906148c8565b60405180910390fd5b6000601360016101000a81548160ff021916908315150217905550565b6000600a80549050905090565b60176020528060005260406000206000915090505481565b60115481565b611004610ffe6125e8565b826128aa565b611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a90614948565b60405180910390fd5b61104e838383612988565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111e95760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006111f3612bef565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661121f9190614ba2565b6112299190614b71565b90508160000151819350935050509250929050565b600061124983611b90565b821061128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190614708565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b601580549050811015611387578273ffffffffffffffffffffffffffffffffffffffff166015828154811061132357611322614e97565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561137457600191505061138d565b808061137f90614d61565b9150506112eb565b50600090505b919050565b61139a6125e8565b73ffffffffffffffffffffffffffffffffffffffff166113b8611d56565b73ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906148c8565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b6114336125e8565b73ffffffffffffffffffffffffffffffffffffffff16611451611d56565b73ffffffffffffffffffffffffffffffffffffffff16146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e906148c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506114e557600080fd5b565b60006114f1610fc8565b9050601360009054906101000a900460ff161561150d57600080fd5b6000821161151a57600080fd5b611522611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115645760115482111561156357600080fd5b5b60105482826115739190614b1b565b111561157e57600080fd5b611586611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461173e5760011515601660009054906101000a900460ff16151514156116ed576115dd336112e3565b61161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906149a8565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611668611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116eb5760125483826116a99190614b1b565b11156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e1906147a8565b60405180910390fd5b5b505b81600f546116fb9190614ba2565b34101561173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490614928565b60405180910390fd5b5b6000600190505b8281116117c957601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061179c90614d61565b91905055506117b68482846117b19190614b1b565b612bf9565b80806117c190614d61565b915050611745565b50505050565b6117ea83838360405180602001604052806000815250611ed4565b505050565b606060006117fc83611b90565b905060008167ffffffffffffffff81111561181a57611819614ec6565b5b6040519080825280602002602001820160405280156118485781602001602082028036833780820191505090505b50905060005b8281101561189257611860858261123e565b82828151811061187357611872614e97565b5b602002602001018181525050808061188a90614d61565b91505061184e565b508092505050919050565b6118a56125e8565b73ffffffffffffffffffffffffffffffffffffffff166118c3611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611919576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611910906148c8565b60405180910390fd5b80600f8190555050565b600061192d610fc8565b821061196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614968565b60405180910390fd5b600a828154811061198257611981614e97565b5b90600052602060002001549050919050565b601360019054906101000a900460ff1681565b6119af6125e8565b73ffffffffffffffffffffffffffffffffffffffff166119cd611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a906148c8565b60405180910390fd5b80600d9080519060200190611a39929190613a4a565b5050565b601360009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614868565b60405180910390fd5b80915050919050565b600d8054611b0f90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b90614cfe565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614848565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c506125e8565b73ffffffffffffffffffffffffffffffffffffffff16611c6e611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906148c8565b60405180910390fd5b611cce6000612c17565b565b611cd86125e8565b73ffffffffffffffffffffffffffffffffffffffff16611cf6611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d43906148c8565b60405180910390fd5b8060118190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d8f90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90614cfe565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b5050505050905090565b601660009054906101000a900460ff1681565b611e37611e306125e8565b8383612cdd565b5050565b611e436125e8565b73ffffffffffffffffffffffffffffffffffffffff16611e61611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae906148c8565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b611ee5611edf6125e8565b836128aa565b611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b90614948565b60405180910390fd5b611f3084848484612e4a565b50505050565b60158181548110611f4657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b600e8054611f8890614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb490614cfe565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b505050505081565b606061201482612785565b612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906148e8565b60405180910390fd5b60001515601360019054906101000a900460ff1615151415612101576014805461207c90614cfe565b80601f01602080910402602001604051908101604052809291908181526020018280546120a890614cfe565b80156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b5050505050905061215d565b600061210b612ea6565b9050600081511161212b5760405180602001604052806000815250612159565b8061213584612f38565b600e604051602001612149939291906145e8565b6040516020818303038152906040525b9150505b919050565b61216a6125e8565b73ffffffffffffffffffffffffffffffffffffffff16612188611d56565b73ffffffffffffffffffffffffffffffffffffffff16146121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906148c8565b60405180910390fd5b8060128190555050565b60105481565b6121f66125e8565b73ffffffffffffffffffffffffffffffffffffffff16612214611d56565b73ffffffffffffffffffffffffffffffffffffffff161461226a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612261906148c8565b60405180910390fd5b80600e9080519060200190612280929190613a4a565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123206125e8565b73ffffffffffffffffffffffffffffffffffffffff1661233e611d56565b73ffffffffffffffffffffffffffffffffffffffff1614612394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238b906148c8565b60405180910390fd5b601560006123a29190613ad0565b8181601591906123b3929190613af1565b505050565b6123c06125e8565b73ffffffffffffffffffffffffffffffffffffffff166123de611d56565b73ffffffffffffffffffffffffffffffffffffffff1614612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b906148c8565b60405180910390fd5b806014908051906020019061244a929190613a4a565b5050565b6124566125e8565b73ffffffffffffffffffffffffffffffffffffffff16612474611d56565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906148c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614748565b60405180910390fd5b61254381612c17565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125e157506125e082613099565b5b9050919050565b600033905090565b6125f8612bef565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd906149c8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661286483611a50565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128b582612785565b6128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614808565b60405180910390fd5b60006128ff83611a50565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061294157506129408185612284565b5b8061297f57508373ffffffffffffffffffffffffffffffffffffffff1661296784610cfe565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129a882611a50565b73ffffffffffffffffffffffffffffffffffffffff16146129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f590614768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a65906147c8565b60405180910390fd5b612a7983838361317b565b612a846000826127f1565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad49190614bfc565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2b9190614b1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bea83838361328f565b505050565b6000612710905090565b612c13828260405180602001604052806000815250613294565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d43906147e8565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e3d91906146cb565b60405180910390a3505050565b612e55848484612988565b612e61848484846132ef565b612ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9790614728565b60405180910390fd5b50505050565b6060600d8054612eb590614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee190614cfe565b8015612f2e5780601f10612f0357610100808354040283529160200191612f2e565b820191906000526020600020905b815481529060010190602001808311612f1157829003601f168201915b5050505050905090565b60606000821415612f80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613094565b600082905060005b60008214612fb2578080612f9b90614d61565b915050600a82612fab9190614b71565b9150612f88565b60008167ffffffffffffffff811115612fce57612fcd614ec6565b5b6040519080825280601f01601f1916602001820160405280156130005781602001600182028036833780820191505090505b5090505b6000851461308d576001826130199190614bfc565b9150600a856130289190614daa565b60306130349190614b1b565b60f81b81838151811061304a57613049614e97565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130869190614b71565b9450613004565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061316457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613174575061317382613486565b5b9050919050565b613186838383612569565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131c9576131c481613500565b613208565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613207576132068382613549565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561324b57613246816136b6565b61328a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613289576132888282613787565b5b5b505050565b505050565b61329e8383613806565b6132ab60008484846132ef565b6132ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e190614728565b60405180910390fd5b505050565b60006133108473ffffffffffffffffffffffffffffffffffffffff16612546565b15613479578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133396125e8565b8786866040518563ffffffff1660e01b815260040161335b9493929190614634565b602060405180830381600087803b15801561337557600080fd5b505af19250505080156133a657506040513d601f19601f820116820180604052508101906133a3919061400c565b60015b613429573d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b606091505b50600081511415613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890614728565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347e565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134f957506134f8826139e0565b5b9050919050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161355684611b90565b6135609190614bfc565b9050600060096000848152602001908152602001600020549050818114613645576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506136ca9190614bfc565b90506000600b60008481526020019081526020016000205490506000600a83815481106136fa576136f9614e97565b5b9060005260206000200154905080600a838154811061371c5761371b614e97565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061376b5761376a614e68565b5b6001900381819060005260206000200160009055905550505050565b600061379283611b90565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386d90614888565b60405180910390fd5b61387f81612785565b156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614788565b60405180910390fd5b6138cb6000838361317b565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461391b9190614b1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139dc6000838361328f565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613a5690614cfe565b90600052602060002090601f016020900481019282613a785760008555613abf565b82601f10613a9157805160ff1916838001178555613abf565b82800160010185558215613abf579182015b82811115613abe578251825591602001919060010190613aa3565b5b509050613acc9190613b91565b5090565b5080546000825590600052602060002090810190613aee9190613b91565b50565b828054828255906000526020600020908101928215613b80579160200282015b82811115613b7f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b11565b5b509050613b8d9190613b91565b5090565b5b80821115613baa576000816000905550600101613b92565b5090565b6000613bc1613bbc84614a28565b614a03565b905082815260208101848484011115613bdd57613bdc614f04565b5b613be8848285614cbc565b509392505050565b6000613c03613bfe84614a59565b614a03565b905082815260208101848484011115613c1f57613c1e614f04565b5b613c2a848285614cbc565b509392505050565b600081359050613c418161550d565b92915050565b60008083601f840112613c5d57613c5c614efa565b5b8235905067ffffffffffffffff811115613c7a57613c79614ef5565b5b602083019150836020820283011115613c9657613c95614eff565b5b9250929050565b600081359050613cac81615524565b92915050565b600081359050613cc18161553b565b92915050565b600081519050613cd68161553b565b92915050565b600082601f830112613cf157613cf0614efa565b5b8135613d01848260208601613bae565b91505092915050565b600082601f830112613d1f57613d1e614efa565b5b8135613d2f848260208601613bf0565b91505092915050565b600081359050613d4781615552565b92915050565b600081359050613d5c81615569565b92915050565b600060208284031215613d7857613d77614f0e565b5b6000613d8684828501613c32565b91505092915050565b60008060408385031215613da657613da5614f0e565b5b6000613db485828601613c32565b9250506020613dc585828601613c32565b9150509250929050565b600080600060608486031215613de857613de7614f0e565b5b6000613df686828701613c32565b9350506020613e0786828701613c32565b9250506040613e1886828701613d38565b9150509250925092565b60008060008060808587031215613e3c57613e3b614f0e565b5b6000613e4a87828801613c32565b9450506020613e5b87828801613c32565b9350506040613e6c87828801613d38565b925050606085013567ffffffffffffffff811115613e8d57613e8c614f09565b5b613e9987828801613cdc565b91505092959194509250565b60008060408385031215613ebc57613ebb614f0e565b5b6000613eca85828601613c32565b9250506020613edb85828601613c9d565b9150509250929050565b60008060408385031215613efc57613efb614f0e565b5b6000613f0a85828601613c32565b9250506020613f1b85828601613d38565b9150509250929050565b60008060408385031215613f3c57613f3b614f0e565b5b6000613f4a85828601613c32565b9250506020613f5b85828601613d4d565b9150509250929050565b60008060208385031215613f7c57613f7b614f0e565b5b600083013567ffffffffffffffff811115613f9a57613f99614f09565b5b613fa685828601613c47565b92509250509250929050565b600060208284031215613fc857613fc7614f0e565b5b6000613fd684828501613c9d565b91505092915050565b600060208284031215613ff557613ff4614f0e565b5b600061400384828501613cb2565b91505092915050565b60006020828403121561402257614021614f0e565b5b600061403084828501613cc7565b91505092915050565b60006020828403121561404f5761404e614f0e565b5b600082013567ffffffffffffffff81111561406d5761406c614f09565b5b61407984828501613d0a565b91505092915050565b60006020828403121561409857614097614f0e565b5b60006140a684828501613d38565b91505092915050565b600080604083850312156140c6576140c5614f0e565b5b60006140d485828601613d38565b92505060206140e585828601613d38565b9150509250929050565b60006140fb83836145ca565b60208301905092915050565b61411081614c30565b82525050565b600061412182614aaf565b61412b8185614add565b935061413683614a8a565b8060005b8381101561416757815161414e88826140ef565b975061415983614ad0565b92505060018101905061413a565b5085935050505092915050565b61417d81614c42565b82525050565b600061418e82614aba565b6141988185614aee565b93506141a8818560208601614ccb565b6141b181614f13565b840191505092915050565b60006141c782614ac5565b6141d18185614aff565b93506141e1818560208601614ccb565b6141ea81614f13565b840191505092915050565b600061420082614ac5565b61420a8185614b10565b935061421a818560208601614ccb565b80840191505092915050565b6000815461423381614cfe565b61423d8186614b10565b9450600182166000811461425857600181146142695761429c565b60ff1983168652818601935061429c565b61427285614a9a565b60005b8381101561429457815481890152600182019150602081019050614275565b838801955050505b50505092915050565b60006142b2602b83614aff565b91506142bd82614f24565b604082019050919050565b60006142d5603283614aff565b91506142e082614f73565b604082019050919050565b60006142f8602683614aff565b915061430382614fc2565b604082019050919050565b600061431b602583614aff565b915061432682615011565b604082019050919050565b600061433e601c83614aff565b915061434982615060565b602082019050919050565b6000614361601c83614aff565b915061436c82615089565b602082019050919050565b6000614384602483614aff565b915061438f826150b2565b604082019050919050565b60006143a7601983614aff565b91506143b282615101565b602082019050919050565b60006143ca602c83614aff565b91506143d58261512a565b604082019050919050565b60006143ed603883614aff565b91506143f882615179565b604082019050919050565b6000614410602a83614aff565b915061441b826151c8565b604082019050919050565b6000614433602983614aff565b915061443e82615217565b604082019050919050565b6000614456602083614aff565b915061446182615266565b602082019050919050565b6000614479602c83614aff565b91506144848261528f565b604082019050919050565b600061449c602083614aff565b91506144a7826152de565b602082019050919050565b60006144bf602f83614aff565b91506144ca82615307565b604082019050919050565b60006144e2602183614aff565b91506144ed82615356565b604082019050919050565b6000614505601283614aff565b9150614510826153a5565b602082019050919050565b6000614528603183614aff565b9150614533826153ce565b604082019050919050565b600061454b602c83614aff565b91506145568261541d565b604082019050919050565b600061456e602a83614aff565b91506145798261546c565b604082019050919050565b6000614591601783614aff565b915061459c826154bb565b602082019050919050565b60006145b4601983614aff565b91506145bf826154e4565b602082019050919050565b6145d381614c9a565b82525050565b6145e281614c9a565b82525050565b60006145f482866141f5565b915061460082856141f5565b915061460c8284614226565b9150819050949350505050565b600060208201905061462e6000830184614107565b92915050565b60006080820190506146496000830187614107565b6146566020830186614107565b61466360408301856145d9565b81810360608301526146758184614183565b905095945050505050565b60006040820190506146956000830185614107565b6146a260208301846145d9565b9392505050565b600060208201905081810360008301526146c38184614116565b905092915050565b60006020820190506146e06000830184614174565b92915050565b6000602082019050818103600083015261470081846141bc565b905092915050565b60006020820190508181036000830152614721816142a5565b9050919050565b60006020820190508181036000830152614741816142c8565b9050919050565b60006020820190508181036000830152614761816142eb565b9050919050565b600060208201905081810360008301526147818161430e565b9050919050565b600060208201905081810360008301526147a181614331565b9050919050565b600060208201905081810360008301526147c181614354565b9050919050565b600060208201905081810360008301526147e181614377565b9050919050565b600060208201905081810360008301526148018161439a565b9050919050565b60006020820190508181036000830152614821816143bd565b9050919050565b60006020820190508181036000830152614841816143e0565b9050919050565b6000602082019050818103600083015261486181614403565b9050919050565b6000602082019050818103600083015261488181614426565b9050919050565b600060208201905081810360008301526148a181614449565b9050919050565b600060208201905081810360008301526148c18161446c565b9050919050565b600060208201905081810360008301526148e18161448f565b9050919050565b60006020820190508181036000830152614901816144b2565b9050919050565b60006020820190508181036000830152614921816144d5565b9050919050565b60006020820190508181036000830152614941816144f8565b9050919050565b600060208201905081810360008301526149618161451b565b9050919050565b600060208201905081810360008301526149818161453e565b9050919050565b600060208201905081810360008301526149a181614561565b9050919050565b600060208201905081810360008301526149c181614584565b9050919050565b600060208201905081810360008301526149e1816145a7565b9050919050565b60006020820190506149fd60008301846145d9565b92915050565b6000614a0d614a1e565b9050614a198282614d30565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4357614a42614ec6565b5b614a4c82614f13565b9050602081019050919050565b600067ffffffffffffffff821115614a7457614a73614ec6565b5b614a7d82614f13565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b2682614c9a565b9150614b3183614c9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6657614b65614ddb565b5b828201905092915050565b6000614b7c82614c9a565b9150614b8783614c9a565b925082614b9757614b96614e0a565b5b828204905092915050565b6000614bad82614c9a565b9150614bb883614c9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bf157614bf0614ddb565b5b828202905092915050565b6000614c0782614c9a565b9150614c1283614c9a565b925082821015614c2557614c24614ddb565b5b828203905092915050565b6000614c3b82614c7a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614ce9578082015181840152602081019050614cce565b83811115614cf8576000848401525b50505050565b60006002820490506001821680614d1657607f821691505b60208210811415614d2a57614d29614e39565b5b50919050565b614d3982614f13565b810181811067ffffffffffffffff82111715614d5857614d57614ec6565b5b80604052505050565b6000614d6c82614c9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9f57614d9e614ddb565b5b600182019050919050565b6000614db582614c9a565b9150614dc083614c9a565b925082614dd057614dcf614e0a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61551681614c30565b811461552157600080fd5b50565b61552d81614c42565b811461553857600080fd5b50565b61554481614c4e565b811461554f57600080fd5b50565b61555b81614c9a565b811461556657600080fd5b50565b61557281614ca4565b811461557d57600080fd5b5056fea26469706673582212208e55172b74be2a36808838561f42b4524843e8b08aa0638053886859c442946664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000029a00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000011454c20434f434f2043414e445953484f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007434f43414e4459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d504d736e7350437472666936504e3578476d557a457452385a4b70705a7255463255374136594136775032532f00000000000000000000000000000000000000000000000000000000000000000000000000000000005a68747470733a2f2f697066732e696f2f697066732f516d4e78656341466456666255443256694c366f694a48716873576e75414c5055344e44546756705847565a39682f67656e657269635f63616e647973686f702e6a736f6e000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c806355f804b31161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb01146109fb578063da3ef23f14610a26578063e985e9c514610a4f578063edec5f2714610a8c578063f2c4ce1e14610ab5578063f2fde38b14610ade57610293565b8063b88d4fde146108d9578063ba4e5c4914610902578063ba7d2c761461093f578063c66828621461096a578063c87b56dd14610995578063d0eb26b0146109d257610293565b80637f00c7a6116101135780637f00c7a6146107ef5780638da5cb5b1461081857806395d89b41146108435780639c70b5121461086e578063a22cb46514610899578063a475b5dd146108c257610293565b806355f804b3146106df5780635c975abb146107085780636352211e146107335780636c0360eb1461077057806370a082311461079b578063715018a6146107d857610293565b806323b872dd116101fe57806340c10f19116101b757806340c10f19146105cc57806342842e0e146105e8578063438b63001461061157806344a0d68a1461064e5780634f6ccce71461067757806351830227146106b457610293565b806323b872dd146104b85780632a55205a146104e15780632f745c591461051f5780633af32abf1461055c5780633c952764146105995780633ccfd60b146105c257610293565b8063095ea7b311610250578063095ea7b3146103ba57806313faede6146103e357806315edf5f31461040e57806318160ddd1461042557806318cae26914610450578063239c70ae1461048d57610293565b806301ffc9a71461029857806302329a29146102d557806302fa7c47146102fe57806306fdde0314610327578063081812fc14610352578063081c8c441461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613fdf565b610b07565b6040516102cc91906146cb565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613fb2565b610b49565b005b34801561030a57600080fd5b5061032560048036038101906103209190613f25565b610be2565b005b34801561033357600080fd5b5061033c610c6c565b60405161034991906146e6565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190614082565b610cfe565b6040516103869190614619565b60405180910390f35b34801561039b57600080fd5b506103a4610d83565b6040516103b191906146e6565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613ee5565b610e11565b005b3480156103ef57600080fd5b506103f8610f29565b60405161040591906149e8565b60405180910390f35b34801561041a57600080fd5b50610423610f2f565b005b34801561043157600080fd5b5061043a610fc8565b60405161044791906149e8565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613d62565b610fd5565b60405161048491906149e8565b60405180910390f35b34801561049957600080fd5b506104a2610fed565b6040516104af91906149e8565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190613dcf565b610ff3565b005b3480156104ed57600080fd5b50610508600480360381019061050391906140af565b611053565b604051610516929190614680565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613ee5565b61123e565b60405161055391906149e8565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613d62565b6112e3565b60405161059091906146cb565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190613fb2565b611392565b005b6105ca61142b565b005b6105e660048036038101906105e19190613ee5565b6114e7565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613dcf565b6117cf565b005b34801561061d57600080fd5b5061063860048036038101906106339190613d62565b6117ef565b60405161064591906146a9565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190614082565b61189d565b005b34801561068357600080fd5b5061069e60048036038101906106999190614082565b611923565b6040516106ab91906149e8565b60405180910390f35b3480156106c057600080fd5b506106c9611994565b6040516106d691906146cb565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190614039565b6119a7565b005b34801561071457600080fd5b5061071d611a3d565b60405161072a91906146cb565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190614082565b611a50565b6040516107679190614619565b60405180910390f35b34801561077c57600080fd5b50610785611b02565b60405161079291906146e6565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613d62565b611b90565b6040516107cf91906149e8565b60405180910390f35b3480156107e457600080fd5b506107ed611c48565b005b3480156107fb57600080fd5b5061081660048036038101906108119190614082565b611cd0565b005b34801561082457600080fd5b5061082d611d56565b60405161083a9190614619565b60405180910390f35b34801561084f57600080fd5b50610858611d80565b60405161086591906146e6565b60405180910390f35b34801561087a57600080fd5b50610883611e12565b60405161089091906146cb565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613ea5565b611e25565b005b3480156108ce57600080fd5b506108d7611e3b565b005b3480156108e557600080fd5b5061090060048036038101906108fb9190613e22565b611ed4565b005b34801561090e57600080fd5b5061092960048036038101906109249190614082565b611f36565b6040516109369190614619565b60405180910390f35b34801561094b57600080fd5b50610954611f75565b60405161096191906149e8565b60405180910390f35b34801561097657600080fd5b5061097f611f7b565b60405161098c91906146e6565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b79190614082565b612009565b6040516109c991906146e6565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614082565b612162565b005b348015610a0757600080fd5b50610a106121e8565b604051610a1d91906149e8565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190614039565b6121ee565b005b348015610a5b57600080fd5b50610a766004803603810190610a719190613d8f565b612284565b604051610a8391906146cb565b60405180910390f35b348015610a9857600080fd5b50610ab36004803603810190610aae9190613f65565b612318565b005b348015610ac157600080fd5b50610adc6004803603810190610ad79190614039565b6123b8565b005b348015610aea57600080fd5b50610b056004803603810190610b009190613d62565b61244e565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b425750610b418261256e565b5b9050919050565b610b516125e8565b73ffffffffffffffffffffffffffffffffffffffff16610b6f611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc906148c8565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b610bea6125e8565b73ffffffffffffffffffffffffffffffffffffffff16610c08611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906148c8565b60405180910390fd5b610c6882826125f0565b5050565b606060028054610c7b90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca790614cfe565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0982612785565b610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906148a8565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610d9090614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbc90614cfe565b8015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b505050505081565b6000610e1c82611a50565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614908565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eac6125e8565b73ffffffffffffffffffffffffffffffffffffffff161480610edb5750610eda81610ed56125e8565b612284565b5b610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190614828565b60405180910390fd5b610f2483836127f1565b505050565b600f5481565b610f376125e8565b73ffffffffffffffffffffffffffffffffffffffff16610f55611d56565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906148c8565b60405180910390fd5b6000601360016101000a81548160ff021916908315150217905550565b6000600a80549050905090565b60176020528060005260406000206000915090505481565b60115481565b611004610ffe6125e8565b826128aa565b611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a90614948565b60405180910390fd5b61104e838383612988565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111e95760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006111f3612bef565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661121f9190614ba2565b6112299190614b71565b90508160000151819350935050509250929050565b600061124983611b90565b821061128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190614708565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b601580549050811015611387578273ffffffffffffffffffffffffffffffffffffffff166015828154811061132357611322614e97565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561137457600191505061138d565b808061137f90614d61565b9150506112eb565b50600090505b919050565b61139a6125e8565b73ffffffffffffffffffffffffffffffffffffffff166113b8611d56565b73ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906148c8565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b6114336125e8565b73ffffffffffffffffffffffffffffffffffffffff16611451611d56565b73ffffffffffffffffffffffffffffffffffffffff16146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e906148c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506114e557600080fd5b565b60006114f1610fc8565b9050601360009054906101000a900460ff161561150d57600080fd5b6000821161151a57600080fd5b611522611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115645760115482111561156357600080fd5b5b60105482826115739190614b1b565b111561157e57600080fd5b611586611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461173e5760011515601660009054906101000a900460ff16151514156116ed576115dd336112e3565b61161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906149a8565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611668611d56565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116eb5760125483826116a99190614b1b565b11156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e1906147a8565b60405180910390fd5b5b505b81600f546116fb9190614ba2565b34101561173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490614928565b60405180910390fd5b5b6000600190505b8281116117c957601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061179c90614d61565b91905055506117b68482846117b19190614b1b565b612bf9565b80806117c190614d61565b915050611745565b50505050565b6117ea83838360405180602001604052806000815250611ed4565b505050565b606060006117fc83611b90565b905060008167ffffffffffffffff81111561181a57611819614ec6565b5b6040519080825280602002602001820160405280156118485781602001602082028036833780820191505090505b50905060005b8281101561189257611860858261123e565b82828151811061187357611872614e97565b5b602002602001018181525050808061188a90614d61565b91505061184e565b508092505050919050565b6118a56125e8565b73ffffffffffffffffffffffffffffffffffffffff166118c3611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611919576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611910906148c8565b60405180910390fd5b80600f8190555050565b600061192d610fc8565b821061196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614968565b60405180910390fd5b600a828154811061198257611981614e97565b5b90600052602060002001549050919050565b601360019054906101000a900460ff1681565b6119af6125e8565b73ffffffffffffffffffffffffffffffffffffffff166119cd611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a906148c8565b60405180910390fd5b80600d9080519060200190611a39929190613a4a565b5050565b601360009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614868565b60405180910390fd5b80915050919050565b600d8054611b0f90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b90614cfe565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614848565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c506125e8565b73ffffffffffffffffffffffffffffffffffffffff16611c6e611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906148c8565b60405180910390fd5b611cce6000612c17565b565b611cd86125e8565b73ffffffffffffffffffffffffffffffffffffffff16611cf6611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d43906148c8565b60405180910390fd5b8060118190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d8f90614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90614cfe565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b5050505050905090565b601660009054906101000a900460ff1681565b611e37611e306125e8565b8383612cdd565b5050565b611e436125e8565b73ffffffffffffffffffffffffffffffffffffffff16611e61611d56565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae906148c8565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b611ee5611edf6125e8565b836128aa565b611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b90614948565b60405180910390fd5b611f3084848484612e4a565b50505050565b60158181548110611f4657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b600e8054611f8890614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb490614cfe565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b505050505081565b606061201482612785565b612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906148e8565b60405180910390fd5b60001515601360019054906101000a900460ff1615151415612101576014805461207c90614cfe565b80601f01602080910402602001604051908101604052809291908181526020018280546120a890614cfe565b80156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b5050505050905061215d565b600061210b612ea6565b9050600081511161212b5760405180602001604052806000815250612159565b8061213584612f38565b600e604051602001612149939291906145e8565b6040516020818303038152906040525b9150505b919050565b61216a6125e8565b73ffffffffffffffffffffffffffffffffffffffff16612188611d56565b73ffffffffffffffffffffffffffffffffffffffff16146121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906148c8565b60405180910390fd5b8060128190555050565b60105481565b6121f66125e8565b73ffffffffffffffffffffffffffffffffffffffff16612214611d56565b73ffffffffffffffffffffffffffffffffffffffff161461226a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612261906148c8565b60405180910390fd5b80600e9080519060200190612280929190613a4a565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123206125e8565b73ffffffffffffffffffffffffffffffffffffffff1661233e611d56565b73ffffffffffffffffffffffffffffffffffffffff1614612394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238b906148c8565b60405180910390fd5b601560006123a29190613ad0565b8181601591906123b3929190613af1565b505050565b6123c06125e8565b73ffffffffffffffffffffffffffffffffffffffff166123de611d56565b73ffffffffffffffffffffffffffffffffffffffff1614612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b906148c8565b60405180910390fd5b806014908051906020019061244a929190613a4a565b5050565b6124566125e8565b73ffffffffffffffffffffffffffffffffffffffff16612474611d56565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906148c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614748565b60405180910390fd5b61254381612c17565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125e157506125e082613099565b5b9050919050565b600033905090565b6125f8612bef565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd906149c8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661286483611a50565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128b582612785565b6128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614808565b60405180910390fd5b60006128ff83611a50565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061294157506129408185612284565b5b8061297f57508373ffffffffffffffffffffffffffffffffffffffff1661296784610cfe565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129a882611a50565b73ffffffffffffffffffffffffffffffffffffffff16146129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f590614768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a65906147c8565b60405180910390fd5b612a7983838361317b565b612a846000826127f1565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad49190614bfc565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2b9190614b1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bea83838361328f565b505050565b6000612710905090565b612c13828260405180602001604052806000815250613294565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d43906147e8565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e3d91906146cb565b60405180910390a3505050565b612e55848484612988565b612e61848484846132ef565b612ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9790614728565b60405180910390fd5b50505050565b6060600d8054612eb590614cfe565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee190614cfe565b8015612f2e5780601f10612f0357610100808354040283529160200191612f2e565b820191906000526020600020905b815481529060010190602001808311612f1157829003601f168201915b5050505050905090565b60606000821415612f80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613094565b600082905060005b60008214612fb2578080612f9b90614d61565b915050600a82612fab9190614b71565b9150612f88565b60008167ffffffffffffffff811115612fce57612fcd614ec6565b5b6040519080825280601f01601f1916602001820160405280156130005781602001600182028036833780820191505090505b5090505b6000851461308d576001826130199190614bfc565b9150600a856130289190614daa565b60306130349190614b1b565b60f81b81838151811061304a57613049614e97565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130869190614b71565b9450613004565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061316457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613174575061317382613486565b5b9050919050565b613186838383612569565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131c9576131c481613500565b613208565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613207576132068382613549565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561324b57613246816136b6565b61328a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613289576132888282613787565b5b5b505050565b505050565b61329e8383613806565b6132ab60008484846132ef565b6132ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e190614728565b60405180910390fd5b505050565b60006133108473ffffffffffffffffffffffffffffffffffffffff16612546565b15613479578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133396125e8565b8786866040518563ffffffff1660e01b815260040161335b9493929190614634565b602060405180830381600087803b15801561337557600080fd5b505af19250505080156133a657506040513d601f19601f820116820180604052508101906133a3919061400c565b60015b613429573d80600081146133d6576040519150601f19603f3d011682016040523d82523d6000602084013e6133db565b606091505b50600081511415613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890614728565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347e565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134f957506134f8826139e0565b5b9050919050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161355684611b90565b6135609190614bfc565b9050600060096000848152602001908152602001600020549050818114613645576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506136ca9190614bfc565b90506000600b60008481526020019081526020016000205490506000600a83815481106136fa576136f9614e97565b5b9060005260206000200154905080600a838154811061371c5761371b614e97565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061376b5761376a614e68565b5b6001900381819060005260206000200160009055905550505050565b600061379283611b90565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386d90614888565b60405180910390fd5b61387f81612785565b156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614788565b60405180910390fd5b6138cb6000838361317b565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461391b9190614b1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139dc6000838361328f565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613a5690614cfe565b90600052602060002090601f016020900481019282613a785760008555613abf565b82601f10613a9157805160ff1916838001178555613abf565b82800160010185558215613abf579182015b82811115613abe578251825591602001919060010190613aa3565b5b509050613acc9190613b91565b5090565b5080546000825590600052602060002090810190613aee9190613b91565b50565b828054828255906000526020600020908101928215613b80579160200282015b82811115613b7f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b11565b5b509050613b8d9190613b91565b5090565b5b80821115613baa576000816000905550600101613b92565b5090565b6000613bc1613bbc84614a28565b614a03565b905082815260208101848484011115613bdd57613bdc614f04565b5b613be8848285614cbc565b509392505050565b6000613c03613bfe84614a59565b614a03565b905082815260208101848484011115613c1f57613c1e614f04565b5b613c2a848285614cbc565b509392505050565b600081359050613c418161550d565b92915050565b60008083601f840112613c5d57613c5c614efa565b5b8235905067ffffffffffffffff811115613c7a57613c79614ef5565b5b602083019150836020820283011115613c9657613c95614eff565b5b9250929050565b600081359050613cac81615524565b92915050565b600081359050613cc18161553b565b92915050565b600081519050613cd68161553b565b92915050565b600082601f830112613cf157613cf0614efa565b5b8135613d01848260208601613bae565b91505092915050565b600082601f830112613d1f57613d1e614efa565b5b8135613d2f848260208601613bf0565b91505092915050565b600081359050613d4781615552565b92915050565b600081359050613d5c81615569565b92915050565b600060208284031215613d7857613d77614f0e565b5b6000613d8684828501613c32565b91505092915050565b60008060408385031215613da657613da5614f0e565b5b6000613db485828601613c32565b9250506020613dc585828601613c32565b9150509250929050565b600080600060608486031215613de857613de7614f0e565b5b6000613df686828701613c32565b9350506020613e0786828701613c32565b9250506040613e1886828701613d38565b9150509250925092565b60008060008060808587031215613e3c57613e3b614f0e565b5b6000613e4a87828801613c32565b9450506020613e5b87828801613c32565b9350506040613e6c87828801613d38565b925050606085013567ffffffffffffffff811115613e8d57613e8c614f09565b5b613e9987828801613cdc565b91505092959194509250565b60008060408385031215613ebc57613ebb614f0e565b5b6000613eca85828601613c32565b9250506020613edb85828601613c9d565b9150509250929050565b60008060408385031215613efc57613efb614f0e565b5b6000613f0a85828601613c32565b9250506020613f1b85828601613d38565b9150509250929050565b60008060408385031215613f3c57613f3b614f0e565b5b6000613f4a85828601613c32565b9250506020613f5b85828601613d4d565b9150509250929050565b60008060208385031215613f7c57613f7b614f0e565b5b600083013567ffffffffffffffff811115613f9a57613f99614f09565b5b613fa685828601613c47565b92509250509250929050565b600060208284031215613fc857613fc7614f0e565b5b6000613fd684828501613c9d565b91505092915050565b600060208284031215613ff557613ff4614f0e565b5b600061400384828501613cb2565b91505092915050565b60006020828403121561402257614021614f0e565b5b600061403084828501613cc7565b91505092915050565b60006020828403121561404f5761404e614f0e565b5b600082013567ffffffffffffffff81111561406d5761406c614f09565b5b61407984828501613d0a565b91505092915050565b60006020828403121561409857614097614f0e565b5b60006140a684828501613d38565b91505092915050565b600080604083850312156140c6576140c5614f0e565b5b60006140d485828601613d38565b92505060206140e585828601613d38565b9150509250929050565b60006140fb83836145ca565b60208301905092915050565b61411081614c30565b82525050565b600061412182614aaf565b61412b8185614add565b935061413683614a8a565b8060005b8381101561416757815161414e88826140ef565b975061415983614ad0565b92505060018101905061413a565b5085935050505092915050565b61417d81614c42565b82525050565b600061418e82614aba565b6141988185614aee565b93506141a8818560208601614ccb565b6141b181614f13565b840191505092915050565b60006141c782614ac5565b6141d18185614aff565b93506141e1818560208601614ccb565b6141ea81614f13565b840191505092915050565b600061420082614ac5565b61420a8185614b10565b935061421a818560208601614ccb565b80840191505092915050565b6000815461423381614cfe565b61423d8186614b10565b9450600182166000811461425857600181146142695761429c565b60ff1983168652818601935061429c565b61427285614a9a565b60005b8381101561429457815481890152600182019150602081019050614275565b838801955050505b50505092915050565b60006142b2602b83614aff565b91506142bd82614f24565b604082019050919050565b60006142d5603283614aff565b91506142e082614f73565b604082019050919050565b60006142f8602683614aff565b915061430382614fc2565b604082019050919050565b600061431b602583614aff565b915061432682615011565b604082019050919050565b600061433e601c83614aff565b915061434982615060565b602082019050919050565b6000614361601c83614aff565b915061436c82615089565b602082019050919050565b6000614384602483614aff565b915061438f826150b2565b604082019050919050565b60006143a7601983614aff565b91506143b282615101565b602082019050919050565b60006143ca602c83614aff565b91506143d58261512a565b604082019050919050565b60006143ed603883614aff565b91506143f882615179565b604082019050919050565b6000614410602a83614aff565b915061441b826151c8565b604082019050919050565b6000614433602983614aff565b915061443e82615217565b604082019050919050565b6000614456602083614aff565b915061446182615266565b602082019050919050565b6000614479602c83614aff565b91506144848261528f565b604082019050919050565b600061449c602083614aff565b91506144a7826152de565b602082019050919050565b60006144bf602f83614aff565b91506144ca82615307565b604082019050919050565b60006144e2602183614aff565b91506144ed82615356565b604082019050919050565b6000614505601283614aff565b9150614510826153a5565b602082019050919050565b6000614528603183614aff565b9150614533826153ce565b604082019050919050565b600061454b602c83614aff565b91506145568261541d565b604082019050919050565b600061456e602a83614aff565b91506145798261546c565b604082019050919050565b6000614591601783614aff565b915061459c826154bb565b602082019050919050565b60006145b4601983614aff565b91506145bf826154e4565b602082019050919050565b6145d381614c9a565b82525050565b6145e281614c9a565b82525050565b60006145f482866141f5565b915061460082856141f5565b915061460c8284614226565b9150819050949350505050565b600060208201905061462e6000830184614107565b92915050565b60006080820190506146496000830187614107565b6146566020830186614107565b61466360408301856145d9565b81810360608301526146758184614183565b905095945050505050565b60006040820190506146956000830185614107565b6146a260208301846145d9565b9392505050565b600060208201905081810360008301526146c38184614116565b905092915050565b60006020820190506146e06000830184614174565b92915050565b6000602082019050818103600083015261470081846141bc565b905092915050565b60006020820190508181036000830152614721816142a5565b9050919050565b60006020820190508181036000830152614741816142c8565b9050919050565b60006020820190508181036000830152614761816142eb565b9050919050565b600060208201905081810360008301526147818161430e565b9050919050565b600060208201905081810360008301526147a181614331565b9050919050565b600060208201905081810360008301526147c181614354565b9050919050565b600060208201905081810360008301526147e181614377565b9050919050565b600060208201905081810360008301526148018161439a565b9050919050565b60006020820190508181036000830152614821816143bd565b9050919050565b60006020820190508181036000830152614841816143e0565b9050919050565b6000602082019050818103600083015261486181614403565b9050919050565b6000602082019050818103600083015261488181614426565b9050919050565b600060208201905081810360008301526148a181614449565b9050919050565b600060208201905081810360008301526148c18161446c565b9050919050565b600060208201905081810360008301526148e18161448f565b9050919050565b60006020820190508181036000830152614901816144b2565b9050919050565b60006020820190508181036000830152614921816144d5565b9050919050565b60006020820190508181036000830152614941816144f8565b9050919050565b600060208201905081810360008301526149618161451b565b9050919050565b600060208201905081810360008301526149818161453e565b9050919050565b600060208201905081810360008301526149a181614561565b9050919050565b600060208201905081810360008301526149c181614584565b9050919050565b600060208201905081810360008301526149e1816145a7565b9050919050565b60006020820190506149fd60008301846145d9565b92915050565b6000614a0d614a1e565b9050614a198282614d30565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4357614a42614ec6565b5b614a4c82614f13565b9050602081019050919050565b600067ffffffffffffffff821115614a7457614a73614ec6565b5b614a7d82614f13565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b2682614c9a565b9150614b3183614c9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6657614b65614ddb565b5b828201905092915050565b6000614b7c82614c9a565b9150614b8783614c9a565b925082614b9757614b96614e0a565b5b828204905092915050565b6000614bad82614c9a565b9150614bb883614c9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bf157614bf0614ddb565b5b828202905092915050565b6000614c0782614c9a565b9150614c1283614c9a565b925082821015614c2557614c24614ddb565b5b828203905092915050565b6000614c3b82614c7a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614ce9578082015181840152602081019050614cce565b83811115614cf8576000848401525b50505050565b60006002820490506001821680614d1657607f821691505b60208210811415614d2a57614d29614e39565b5b50919050565b614d3982614f13565b810181811067ffffffffffffffff82111715614d5857614d57614ec6565b5b80604052505050565b6000614d6c82614c9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9f57614d9e614ddb565b5b600182019050919050565b6000614db582614c9a565b9150614dc083614c9a565b925082614dd057614dcf614e0a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61551681614c30565b811461552157600080fd5b50565b61552d81614c42565b811461553857600080fd5b50565b61554481614c4e565b811461554f57600080fd5b50565b61555b81614c9a565b811461556657600080fd5b50565b61557281614ca4565b811461557d57600080fd5b5056fea26469706673582212208e55172b74be2a36808838561f42b4524843e8b08aa0638053886859c442946664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000029a00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000011454c20434f434f2043414e445953484f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007434f43414e4459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d504d736e7350437472666936504e3578476d557a457452385a4b70705a7255463255374136594136775032532f00000000000000000000000000000000000000000000000000000000000000000000000000000000005a68747470733a2f2f697066732e696f2f697066732f516d4e78656341466456666255443256694c366f694a48716873576e75414c5055344e44546756705847565a39682f67656e657269635f63616e647973686f702e6a736f6e000000000000

-----Decoded View---------------
Arg [0] : _name (string): EL COCO CANDYSHOP
Arg [1] : _symbol (string): COCANDY
Arg [2] : _initBaseURI (string): ipfs://QmPMsnsPCtrfi6PN5xGmUzEtR8ZKppZrUF2U7A6YA6wP2S/
Arg [3] : _royaltyFeesInBips (uint96): 666
Arg [4] : _initNotRevealedUri (string): https://ipfs.io/ipfs/QmNxecAFdVfbUD2ViL6oiJHqhsWnuALPU4NDTgVpXGVZ9h/generic_candyshop.json

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000000000000000000000000000000000000000029a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [6] : 454c20434f434f2043414e445953484f50000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 434f43414e445900000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d504d736e7350437472666936504e3578476d557a457452
Arg [11] : 385a4b70705a7255463255374136594136775032532f00000000000000000000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [13] : 68747470733a2f2f697066732e696f2f697066732f516d4e7865634146645666
Arg [14] : 6255443256694c366f694a48716873576e75414c5055344e4454675670584756
Arg [15] : 5a39682f67656e657269635f63616e647973686f702e6a736f6e000000000000


Deployed Bytecode Sourcemap

54012:5551:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58905:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58528:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56316:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34610:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36170:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54424:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35693:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54197:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57953:72;;;;;;;;;;;;;:::i;:::-;;48431:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54544:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54271:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36920:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22947:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48099:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59168:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57633:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58777:120;;;:::i;:::-;;55224:1084;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37330:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56502:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58033:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48621:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54389:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58257:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54356:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34304:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54125:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34034:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8073:103;;;;;;;;;;;;;:::i;:::-;;58127:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7422:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34779:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54503:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36463:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57876:69;;;;;;;;;;;;;:::i;:::-;;37586:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54459:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54311:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54153:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56900:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59450:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54233:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58369:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36689:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58615:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57742:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8331:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58905:255;59045:4;59102:10;59087:25;;:11;:25;;;;:65;;;;59116:36;59140:11;59116:23;:36::i;:::-;59087:65;59067:85;;58905:255;;;:::o;58528:79::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58593:6:::1;58584;;:15;;;;;;;;;;;;;;;;;;58528:79:::0;:::o;56316:178::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56437:49:::1;56456:9;56467:18;56437;:49::i;:::-;56316:178:::0;;:::o;34610:100::-;34664:13;34697:5;34690:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34610:100;:::o;36170:221::-;36246:7;36274:16;36282:7;36274;:16::i;:::-;36266:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36359:15;:24;36375:7;36359:24;;;;;;;;;;;;;;;;;;;;;36352:31;;36170:221;;;:::o;54424:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35693:411::-;35774:13;35790:23;35805:7;35790:14;:23::i;:::-;35774:39;;35838:5;35832:11;;:2;:11;;;;35824:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35932:5;35916:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35941:37;35958:5;35965:12;:10;:12::i;:::-;35941:16;:37::i;:::-;35916:62;35894:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36075:21;36084:2;36088:7;36075:8;:21::i;:::-;35763:341;35693:411;;:::o;54197:29::-;;;;:::o;57953:72::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58012:5:::1;58001:8;;:16;;;;;;;;;;;;;;;;;;57953:72::o:0;48431:113::-;48492:7;48519:10;:17;;;;48512:24;;48431:113;:::o;54544:55::-;;;;;;;;;;;;;;;;;:::o;54271:33::-;;;;:::o;36920:339::-;37115:41;37134:12;:10;:12::i;:::-;37148:7;37115:18;:41::i;:::-;37107:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37223:28;37233:4;37239:2;37243:7;37223:9;:28::i;:::-;36920:339;;;:::o;22947:442::-;23044:7;23053;23073:26;23102:17;:27;23120:8;23102:27;;;;;;;;;;;23073:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23174:1;23146:30;;:7;:16;;;:30;;;23142:92;;;23203:19;23193:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23142:92;23246:21;23311:17;:15;:17::i;:::-;23270:58;;23284:7;:23;;;23271:36;;:10;:36;;;;:::i;:::-;23270:58;;;;:::i;:::-;23246:82;;23349:7;:16;;;23367:13;23341:40;;;;;;22947:442;;;;;:::o;48099:256::-;48196:7;48232:23;48249:5;48232:16;:23::i;:::-;48224:5;:31;48216:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48321:12;:19;48334:5;48321:19;;;;;;;;;;;;;;;:26;48341:5;48321:26;;;;;;;;;;;;48314:33;;48099:256;;;;:::o;59168:274::-;59227:4;59249:9;59261:1;59249:13;;59244:168;59268:20;:27;;;;59264:1;:31;59244:168;;;59348:5;59321:32;;:20;59342:1;59321:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;59317:84;;;59381:4;59374:11;;;;;59317:84;59297:3;;;;;:::i;:::-;;;;59244:168;;;;59429:5;59422:12;;59168:274;;;;:::o;57633:101::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57720:6:::1;57702:15;;:24;;;;;;;;;;;;;;;;;;57633:101:::0;:::o;58777:120::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58849:10:::1;58841:24;;:47;58866:21;58841:47;;;;;;;;;;;;;;;;;;;;;;;58833:56;;;::::0;::::1;;58777:120::o:0;55224:1084::-;55298:14;55315:13;:11;:13::i;:::-;55298:30;;55348:6;;;;;;;;;;;55347:7;55339:16;;;;;;55388:1;55374:11;:15;55366:24;;;;;;55419:7;:5;:7::i;:::-;55405:21;;:10;:21;;;55401:91;;55466:13;;55451:11;:28;;55443:37;;;;;;55401:91;55534:9;;55519:11;55510:6;:20;;;;:::i;:::-;:33;;55502:42;;;;;;55575:7;:5;:7::i;:::-;55561:21;;:10;:21;;;55557:587;;55622:4;55603:23;;:15;;;;;;;;;;;:23;;;55599:457;;;55655:25;55669:10;55655:13;:25::i;:::-;55647:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55727:24;55754:20;:32;55775:10;55754:32;;;;;;;;;;;;;;;;55727:59;;55823:7;:5;:7::i;:::-;55809:21;;:10;:21;;;55805:236;;55923:18;;55908:11;55889:16;:30;;;;:::i;:::-;:52;;55855:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;55805:236;55628:428;55599:457;56098:11;56091:4;;:18;;;;:::i;:::-;56078:9;:31;;56070:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55557:587;56161:9;56173:1;56161:13;;56156:145;56181:11;56176:1;:16;56156:145;;56214:20;:32;56235:10;56214:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;56263:26;56273:3;56287:1;56278:6;:10;;;;:::i;:::-;56263:9;:26::i;:::-;56194:3;;;;;:::i;:::-;;;;56156:145;;;;55287:1021;55224:1084;;:::o;37330:185::-;37468:39;37485:4;37491:2;37495:7;37468:39;;;;;;;;;;;;:16;:39::i;:::-;37330:185;;;:::o;56502:390::-;56589:16;56623:23;56649:17;56659:6;56649:9;:17::i;:::-;56623:43;;56677:25;56719:15;56705:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56677:58;;56751:9;56746:113;56766:15;56762:1;:19;56746:113;;;56817:30;56837:6;56845:1;56817:19;:30::i;:::-;56803:8;56812:1;56803:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;56783:3;;;;;:::i;:::-;;;;56746:113;;;;56876:8;56869:15;;;;56502:390;;;:::o;58033:86::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58103:8:::1;58096:4;:15;;;;58033:86:::0;:::o;48621:233::-;48696:7;48732:30;:28;:30::i;:::-;48724:5;:38;48716:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48829:10;48840:5;48829:17;;;;;;;;:::i;:::-;;;;;;;;;;48822:24;;48621:233;;;:::o;54389:28::-;;;;;;;;;;;;;:::o;58257:104::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58342:11:::1;58332:7;:21;;;;;;;;;;;;:::i;:::-;;58257:104:::0;:::o;54356:26::-;;;;;;;;;;;;;:::o;34304:239::-;34376:7;34396:13;34412:7;:16;34420:7;34412:16;;;;;;;;;;;;;;;;;;;;;34396:32;;34464:1;34447:19;;:5;:19;;;;34439:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34530:5;34523:12;;;34304:239;;;:::o;54125:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34034:208::-;34106:7;34151:1;34134:19;;:5;:19;;;;34126:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34218:9;:16;34228:5;34218:16;;;;;;;;;;;;;;;;34211:23;;34034:208;;;:::o;8073:103::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8138:30:::1;8165:1;8138:18;:30::i;:::-;8073:103::o:0;58127:122::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58224:17:::1;58208:13;:33;;;;58127:122:::0;:::o;7422:87::-;7468:7;7495:6;;;;;;;;;;;7488:13;;7422:87;:::o;34779:104::-;34835:13;34868:7;34861:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34779:104;:::o;54503:34::-;;;;;;;;;;;;;:::o;36463:155::-;36558:52;36577:12;:10;:12::i;:::-;36591:8;36601;36558:18;:52::i;:::-;36463:155;;:::o;57876:69::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57933:4:::1;57922:8;;:15;;;;;;;;;;;;;;;;;;57876:69::o:0;37586:328::-;37761:41;37780:12;:10;:12::i;:::-;37794:7;37761:18;:41::i;:::-;37753:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37867:39;37881:4;37887:2;37891:7;37900:5;37867:13;:39::i;:::-;37586:328;;;;:::o;54459:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54311:38::-;;;;:::o;54153:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56900:725::-;57018:13;57071:16;57079:7;57071;:16::i;:::-;57049:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;57191:5;57179:17;;:8;;;;;;;;;;;:17;;;57175:71;;;57220:14;57213:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57175:71;57258:28;57289:10;:8;:10::i;:::-;57258:41;;57361:1;57336:14;57330:28;:32;:287;;;;;;;;;;;;;;;;;57454:14;57495:18;:7;:16;:18::i;:::-;57540:13;57411:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57330:287;57310:307;;;56900:725;;;;:::o;59450:110::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59546:6:::1;59525:18;:27;;;;59450:110:::0;:::o;54233:31::-;;;;:::o;58369:151::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58495:17:::1;58479:13;:33;;;;;;;;;;;;:::i;:::-;;58369:151:::0;:::o;36689:164::-;36786:4;36810:18;:25;36829:5;36810:25;;;;;;;;;;;;;;;:35;36836:8;36810:35;;;;;;;;;;;;;;;;;;;;;;;;;36803:42;;36689:164;;;;:::o;58615:154::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58701:20:::1;;58694:27;;;;:::i;:::-;58755:6;;58732:20;:29;;;;;;;:::i;:::-;;58615:154:::0;;:::o;57742:126::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57845:15:::1;57828:14;:32;;;;;;;;;;;;:::i;:::-;;57742:126:::0;:::o;8331:201::-;7653:12;:10;:12::i;:::-;7642:23;;:7;:5;:7::i;:::-;:23;;;7634:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8440:1:::1;8420:22;;:8;:22;;;;8412:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8496:28;8515:8;8496:18;:28::i;:::-;8331:201:::0;:::o;10123:326::-;10183:4;10440:1;10418:7;:19;;;:23;10411:30;;10123:326;;;:::o;46137:126::-;;;;:::o;47791:224::-;47893:4;47932:35;47917:50;;;:11;:50;;;;:90;;;;47971:36;47995:11;47971:23;:36::i;:::-;47917:90;47910:97;;47791:224;;;:::o;6146:98::-;6199:7;6226:10;6219:17;;6146:98;:::o;24039:332::-;24158:17;:15;:17::i;:::-;24142:33;;:12;:33;;;;24134:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24261:1;24241:22;;:8;:22;;;;24233:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24328:35;;;;;;;;24340:8;24328:35;;;;;;24350:12;24328:35;;;;;24306:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24039:332;;:::o;39424:127::-;39489:4;39541:1;39513:30;;:7;:16;39521:7;39513:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39506:37;;39424:127;;;:::o;43570:174::-;43672:2;43645:15;:24;43661:7;43645:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43728:7;43724:2;43690:46;;43699:23;43714:7;43699:14;:23::i;:::-;43690:46;;;;;;;;;;;;43570:174;;:::o;39718:348::-;39811:4;39836:16;39844:7;39836;:16::i;:::-;39828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39912:13;39928:23;39943:7;39928:14;:23::i;:::-;39912:39;;39981:5;39970:16;;:7;:16;;;:52;;;;39990:32;40007:5;40014:7;39990:16;:32::i;:::-;39970:52;:87;;;;40050:7;40026:31;;:20;40038:7;40026:11;:20::i;:::-;:31;;;39970:87;39962:96;;;39718:348;;;;:::o;42827:625::-;42986:4;42959:31;;:23;42974:7;42959:14;:23::i;:::-;:31;;;42951:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43065:1;43051:16;;:2;:16;;;;43043:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43121:39;43142:4;43148:2;43152:7;43121:20;:39::i;:::-;43225:29;43242:1;43246:7;43225:8;:29::i;:::-;43286:1;43267:9;:15;43277:4;43267:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43315:1;43298:9;:13;43308:2;43298:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43346:2;43327:7;:16;43335:7;43327:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43385:7;43381:2;43366:27;;43375:4;43366:27;;;;;;;;;;;;43406:38;43426:4;43432:2;43436:7;43406:19;:38::i;:::-;42827:625;;;:::o;23671:97::-;23729:6;23755:5;23748:12;;23671:97;:::o;40408:110::-;40484:26;40494:2;40498:7;40484:26;;;;;;;;;;;;:9;:26::i;:::-;40408:110;;:::o;8692:191::-;8766:16;8785:6;;;;;;;;;;;8766:25;;8811:8;8802:6;;:17;;;;;;;;;;;;;;;;;;8866:8;8835:40;;8856:8;8835:40;;;;;;;;;;;;8755:128;8692:191;:::o;43886:315::-;44041:8;44032:17;;:5;:17;;;;44024:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44128:8;44090:18;:25;44109:5;44090:25;;;;;;;;;;;;;;;:35;44116:8;44090:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44174:8;44152:41;;44167:5;44152:41;;;44184:8;44152:41;;;;;;:::i;:::-;;;;;;;;43886:315;;;:::o;38796:::-;38953:28;38963:4;38969:2;38973:7;38953:9;:28::i;:::-;39000:48;39023:4;39029:2;39033:7;39042:5;39000:22;:48::i;:::-;38992:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38796:315;;;;:::o;55093:108::-;55153:13;55186:7;55179:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55093:108;:::o;3708:723::-;3764:13;3994:1;3985:5;:10;3981:53;;;4012:10;;;;;;;;;;;;;;;;;;;;;3981:53;4044:12;4059:5;4044:20;;4075:14;4100:78;4115:1;4107:4;:9;4100:78;;4133:8;;;;;:::i;:::-;;;;4164:2;4156:10;;;;;:::i;:::-;;;4100:78;;;4188:19;4220:6;4210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4188:39;;4238:154;4254:1;4245:5;:10;4238:154;;4282:1;4272:11;;;;;:::i;:::-;;;4349:2;4341:5;:10;;;;:::i;:::-;4328:2;:24;;;;:::i;:::-;4315:39;;4298:6;4305;4298:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4378:2;4369:11;;;;;:::i;:::-;;;4238:154;;;4416:6;4402:21;;;;;3708:723;;;;:::o;33665:305::-;33767:4;33819:25;33804:40;;;:11;:40;;;;:105;;;;33876:33;33861:48;;;:11;:48;;;;33804:105;:158;;;;33926:36;33950:11;33926:23;:36::i;:::-;33804:158;33784:178;;33665:305;;;:::o;49467:589::-;49611:45;49638:4;49644:2;49648:7;49611:26;:45::i;:::-;49689:1;49673:18;;:4;:18;;;49669:187;;;49708:40;49740:7;49708:31;:40::i;:::-;49669:187;;;49778:2;49770:10;;:4;:10;;;49766:90;;49797:47;49830:4;49836:7;49797:32;:47::i;:::-;49766:90;49669:187;49884:1;49870:16;;:2;:16;;;49866:183;;;49903:45;49940:7;49903:36;:45::i;:::-;49866:183;;;49976:4;49970:10;;:2;:10;;;49966:83;;49997:40;50025:2;50029:7;49997:27;:40::i;:::-;49966:83;49866:183;49467:589;;;:::o;46648:125::-;;;;:::o;40745:321::-;40875:18;40881:2;40885:7;40875:5;:18::i;:::-;40926:54;40957:1;40961:2;40965:7;40974:5;40926:22;:54::i;:::-;40904:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40745:321;;;:::o;44766:799::-;44921:4;44942:15;:2;:13;;;:15::i;:::-;44938:620;;;44994:2;44978:36;;;45015:12;:10;:12::i;:::-;45029:4;45035:7;45044:5;44978:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44974:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45237:1;45220:6;:13;:18;45216:272;;;45263:60;;;;;;;;;;:::i;:::-;;;;;;;;45216:272;45438:6;45432:13;45423:6;45419:2;45415:15;45408:38;44974:529;45111:41;;;45101:51;;;:6;:51;;;;45094:58;;;;;44938:620;45542:4;45535:11;;44766:799;;;;;;;:::o;22677:215::-;22779:4;22818:26;22803:41;;;:11;:41;;;;:81;;;;22848:36;22872:11;22848:23;:36::i;:::-;22803:81;22796:88;;22677:215;;;:::o;50779:164::-;50883:10;:17;;;;50856:15;:24;50872:7;50856:24;;;;;;;;;;;:44;;;;50911:10;50927:7;50911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50779:164;:::o;51570:988::-;51836:22;51886:1;51861:22;51878:4;51861:16;:22::i;:::-;:26;;;;:::i;:::-;51836:51;;51898:18;51919:17;:26;51937:7;51919:26;;;;;;;;;;;;51898:47;;52066:14;52052:10;:28;52048:328;;52097:19;52119:12;:18;52132:4;52119:18;;;;;;;;;;;;;;;:34;52138:14;52119:34;;;;;;;;;;;;52097:56;;52203:11;52170:12;:18;52183:4;52170:18;;;;;;;;;;;;;;;:30;52189:10;52170:30;;;;;;;;;;;:44;;;;52320:10;52287:17;:30;52305:11;52287:30;;;;;;;;;;;:43;;;;52082:294;52048:328;52472:17;:26;52490:7;52472:26;;;;;;;;;;;52465:33;;;52516:12;:18;52529:4;52516:18;;;;;;;;;;;;;;;:34;52535:14;52516:34;;;;;;;;;;;52509:41;;;51651:907;;51570:988;;:::o;52853:1079::-;53106:22;53151:1;53131:10;:17;;;;:21;;;;:::i;:::-;53106:46;;53163:18;53184:15;:24;53200:7;53184:24;;;;;;;;;;;;53163:45;;53535:19;53557:10;53568:14;53557:26;;;;;;;;:::i;:::-;;;;;;;;;;53535:48;;53621:11;53596:10;53607;53596:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53732:10;53701:15;:28;53717:11;53701:28;;;;;;;;;;;:41;;;;53873:15;:24;53889:7;53873:24;;;;;;;;;;;53866:31;;;53908:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52924:1008;;;52853:1079;:::o;50357:221::-;50442:14;50459:20;50476:2;50459:16;:20::i;:::-;50442:37;;50517:7;50490:12;:16;50503:2;50490:16;;;;;;;;;;;;;;;:24;50507:6;50490:24;;;;;;;;;;;:34;;;;50564:6;50535:17;:26;50553:7;50535:26;;;;;;;;;;;:35;;;;50431:147;50357:221;;:::o;41402:439::-;41496:1;41482:16;;:2;:16;;;;41474:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41555:16;41563:7;41555;:16::i;:::-;41554:17;41546:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41617:45;41646:1;41650:2;41654:7;41617:20;:45::i;:::-;41692:1;41675:9;:13;41685:2;41675:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41723:2;41704:7;:16;41712:7;41704:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41768:7;41764:2;41743:33;;41760:1;41743:33;;;;;;;;;;;;41789:44;41817:1;41821:2;41825:7;41789:19;:44::i;:::-;41402:439;;:::o;21127:157::-;21212:4;21251:25;21236:40;;;:11;:40;;;;21229:47;;21127:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:137::-;2913:5;2951:6;2938:20;2929:29;;2967:32;2993:5;2967:32;:::i;:::-;2868:137;;;;:::o;3011:329::-;3070:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:119;;;3125:79;;:::i;:::-;3087:119;3245:1;3270:53;3315:7;3306:6;3295:9;3291:22;3270:53;:::i;:::-;3260:63;;3216:117;3011:329;;;;:::o;3346:474::-;3414:6;3422;3471:2;3459:9;3450:7;3446:23;3442:32;3439:119;;;3477:79;;:::i;:::-;3439:119;3597:1;3622:53;3667:7;3658:6;3647:9;3643:22;3622:53;:::i;:::-;3612:63;;3568:117;3724:2;3750:53;3795:7;3786:6;3775:9;3771:22;3750:53;:::i;:::-;3740:63;;3695:118;3346:474;;;;;:::o;3826:619::-;3903:6;3911;3919;3968:2;3956:9;3947:7;3943:23;3939:32;3936:119;;;3974:79;;:::i;:::-;3936:119;4094:1;4119:53;4164:7;4155:6;4144:9;4140:22;4119:53;:::i;:::-;4109:63;;4065:117;4221:2;4247:53;4292:7;4283:6;4272:9;4268:22;4247:53;:::i;:::-;4237:63;;4192:118;4349:2;4375:53;4420:7;4411:6;4400:9;4396:22;4375:53;:::i;:::-;4365:63;;4320:118;3826:619;;;;;:::o;4451:943::-;4546:6;4554;4562;4570;4619:3;4607:9;4598:7;4594:23;4590:33;4587:120;;;4626:79;;:::i;:::-;4587:120;4746:1;4771:53;4816:7;4807:6;4796:9;4792:22;4771:53;:::i;:::-;4761:63;;4717:117;4873:2;4899:53;4944:7;4935:6;4924:9;4920:22;4899:53;:::i;:::-;4889:63;;4844:118;5001:2;5027:53;5072:7;5063:6;5052:9;5048:22;5027:53;:::i;:::-;5017:63;;4972:118;5157:2;5146:9;5142:18;5129:32;5188:18;5180:6;5177:30;5174:117;;;5210:79;;:::i;:::-;5174:117;5315:62;5369:7;5360:6;5349:9;5345:22;5315:62;:::i;:::-;5305:72;;5100:287;4451:943;;;;;;;:::o;5400:468::-;5465:6;5473;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:53;5718:7;5709:6;5698:9;5694:22;5673:53;:::i;:::-;5663:63;;5619:117;5775:2;5801:50;5843:7;5834:6;5823:9;5819:22;5801:50;:::i;:::-;5791:60;;5746:115;5400:468;;;;;:::o;5874:474::-;5942:6;5950;5999:2;5987:9;5978:7;5974:23;5970:32;5967:119;;;6005:79;;:::i;:::-;5967:119;6125:1;6150:53;6195:7;6186:6;6175:9;6171:22;6150:53;:::i;:::-;6140:63;;6096:117;6252:2;6278:53;6323:7;6314:6;6303:9;6299:22;6278:53;:::i;:::-;6268:63;;6223:118;5874:474;;;;;:::o;6354:472::-;6421:6;6429;6478:2;6466:9;6457:7;6453:23;6449:32;6446:119;;;6484:79;;:::i;:::-;6446:119;6604:1;6629:53;6674:7;6665:6;6654:9;6650:22;6629:53;:::i;:::-;6619:63;;6575:117;6731:2;6757:52;6801:7;6792:6;6781:9;6777:22;6757:52;:::i;:::-;6747:62;;6702:117;6354:472;;;;;:::o;6832:559::-;6918:6;6926;6975:2;6963:9;6954:7;6950:23;6946:32;6943:119;;;6981:79;;:::i;:::-;6943:119;7129:1;7118:9;7114:17;7101:31;7159:18;7151:6;7148:30;7145:117;;;7181:79;;:::i;:::-;7145:117;7294:80;7366:7;7357:6;7346:9;7342:22;7294:80;:::i;:::-;7276:98;;;;7072:312;6832:559;;;;;:::o;7397:323::-;7453:6;7502:2;7490:9;7481:7;7477:23;7473:32;7470:119;;;7508:79;;:::i;:::-;7470:119;7628:1;7653:50;7695:7;7686:6;7675:9;7671:22;7653:50;:::i;:::-;7643:60;;7599:114;7397:323;;;;:::o;7726:327::-;7784:6;7833:2;7821:9;7812:7;7808:23;7804:32;7801:119;;;7839:79;;:::i;:::-;7801:119;7959:1;7984:52;8028:7;8019:6;8008:9;8004:22;7984:52;:::i;:::-;7974:62;;7930:116;7726:327;;;;:::o;8059:349::-;8128:6;8177:2;8165:9;8156:7;8152:23;8148:32;8145:119;;;8183:79;;:::i;:::-;8145:119;8303:1;8328:63;8383:7;8374:6;8363:9;8359:22;8328:63;:::i;:::-;8318:73;;8274:127;8059:349;;;;:::o;8414:509::-;8483:6;8532:2;8520:9;8511:7;8507:23;8503:32;8500:119;;;8538:79;;:::i;:::-;8500:119;8686:1;8675:9;8671:17;8658:31;8716:18;8708:6;8705:30;8702:117;;;8738:79;;:::i;:::-;8702:117;8843:63;8898:7;8889:6;8878:9;8874:22;8843:63;:::i;:::-;8833:73;;8629:287;8414:509;;;;:::o;8929:329::-;8988:6;9037:2;9025:9;9016:7;9012:23;9008:32;9005:119;;;9043:79;;:::i;:::-;9005:119;9163:1;9188:53;9233:7;9224:6;9213:9;9209:22;9188:53;:::i;:::-;9178:63;;9134:117;8929:329;;;;:::o;9264:474::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:53;9713:7;9704:6;9693:9;9689:22;9668:53;:::i;:::-;9658:63;;9613:118;9264:474;;;;;:::o;9744:179::-;9813:10;9834:46;9876:3;9868:6;9834:46;:::i;:::-;9912:4;9907:3;9903:14;9889:28;;9744:179;;;;:::o;9929:118::-;10016:24;10034:5;10016:24;:::i;:::-;10011:3;10004:37;9929:118;;:::o;10083:732::-;10202:3;10231:54;10279:5;10231:54;:::i;:::-;10301:86;10380:6;10375:3;10301:86;:::i;:::-;10294:93;;10411:56;10461:5;10411:56;:::i;:::-;10490:7;10521:1;10506:284;10531:6;10528:1;10525:13;10506:284;;;10607:6;10601:13;10634:63;10693:3;10678:13;10634:63;:::i;:::-;10627:70;;10720:60;10773:6;10720:60;:::i;:::-;10710:70;;10566:224;10553:1;10550;10546:9;10541:14;;10506:284;;;10510:14;10806:3;10799:10;;10207:608;;;10083:732;;;;:::o;10821:109::-;10902:21;10917:5;10902:21;:::i;:::-;10897:3;10890:34;10821:109;;:::o;10936:360::-;11022:3;11050:38;11082:5;11050:38;:::i;:::-;11104:70;11167:6;11162:3;11104:70;:::i;:::-;11097:77;;11183:52;11228:6;11223:3;11216:4;11209:5;11205:16;11183:52;:::i;:::-;11260:29;11282:6;11260:29;:::i;:::-;11255:3;11251:39;11244:46;;11026:270;10936:360;;;;:::o;11302:364::-;11390:3;11418:39;11451:5;11418:39;:::i;:::-;11473:71;11537:6;11532:3;11473:71;:::i;:::-;11466:78;;11553:52;11598:6;11593:3;11586:4;11579:5;11575:16;11553:52;:::i;:::-;11630:29;11652:6;11630:29;:::i;:::-;11625:3;11621:39;11614:46;;11394:272;11302:364;;;;:::o;11672:377::-;11778:3;11806:39;11839:5;11806:39;:::i;:::-;11861:89;11943:6;11938:3;11861:89;:::i;:::-;11854:96;;11959:52;12004:6;11999:3;11992:4;11985:5;11981:16;11959:52;:::i;:::-;12036:6;12031:3;12027:16;12020:23;;11782:267;11672:377;;;;:::o;12079:845::-;12182:3;12219:5;12213:12;12248:36;12274:9;12248:36;:::i;:::-;12300:89;12382:6;12377:3;12300:89;:::i;:::-;12293:96;;12420:1;12409:9;12405:17;12436:1;12431:137;;;;12582:1;12577:341;;;;12398:520;;12431:137;12515:4;12511:9;12500;12496:25;12491:3;12484:38;12551:6;12546:3;12542:16;12535:23;;12431:137;;12577:341;12644:38;12676:5;12644:38;:::i;:::-;12704:1;12718:154;12732:6;12729:1;12726:13;12718:154;;;12806:7;12800:14;12796:1;12791:3;12787:11;12780:35;12856:1;12847:7;12843:15;12832:26;;12754:4;12751:1;12747:12;12742:17;;12718:154;;;12901:6;12896:3;12892:16;12885:23;;12584:334;;12398:520;;12186:738;;12079:845;;;;:::o;12930:366::-;13072:3;13093:67;13157:2;13152:3;13093:67;:::i;:::-;13086:74;;13169:93;13258:3;13169:93;:::i;:::-;13287:2;13282:3;13278:12;13271:19;;12930:366;;;:::o;13302:::-;13444:3;13465:67;13529:2;13524:3;13465:67;:::i;:::-;13458:74;;13541:93;13630:3;13541:93;:::i;:::-;13659:2;13654:3;13650:12;13643:19;;13302:366;;;:::o;13674:::-;13816:3;13837:67;13901:2;13896:3;13837:67;:::i;:::-;13830:74;;13913:93;14002:3;13913:93;:::i;:::-;14031:2;14026:3;14022:12;14015:19;;13674:366;;;:::o;14046:::-;14188:3;14209:67;14273:2;14268:3;14209:67;:::i;:::-;14202:74;;14285:93;14374:3;14285:93;:::i;:::-;14403:2;14398:3;14394:12;14387:19;;14046:366;;;:::o;14418:::-;14560:3;14581:67;14645:2;14640:3;14581:67;:::i;:::-;14574:74;;14657:93;14746:3;14657:93;:::i;:::-;14775:2;14770:3;14766:12;14759:19;;14418:366;;;:::o;14790:::-;14932:3;14953:67;15017:2;15012:3;14953:67;:::i;:::-;14946:74;;15029:93;15118:3;15029:93;:::i;:::-;15147:2;15142:3;15138:12;15131:19;;14790:366;;;:::o;15162:::-;15304:3;15325:67;15389:2;15384:3;15325:67;:::i;:::-;15318:74;;15401:93;15490:3;15401:93;:::i;:::-;15519:2;15514:3;15510:12;15503:19;;15162:366;;;:::o;15534:::-;15676:3;15697:67;15761:2;15756:3;15697:67;:::i;:::-;15690:74;;15773:93;15862:3;15773:93;:::i;:::-;15891:2;15886:3;15882:12;15875:19;;15534:366;;;:::o;15906:::-;16048:3;16069:67;16133:2;16128:3;16069:67;:::i;:::-;16062:74;;16145:93;16234:3;16145:93;:::i;:::-;16263:2;16258:3;16254:12;16247:19;;15906:366;;;:::o;16278:::-;16420:3;16441:67;16505:2;16500:3;16441:67;:::i;:::-;16434:74;;16517:93;16606:3;16517:93;:::i;:::-;16635:2;16630:3;16626:12;16619:19;;16278:366;;;:::o;16650:::-;16792:3;16813:67;16877:2;16872:3;16813:67;:::i;:::-;16806:74;;16889:93;16978:3;16889:93;:::i;:::-;17007:2;17002:3;16998:12;16991:19;;16650:366;;;:::o;17022:::-;17164:3;17185:67;17249:2;17244:3;17185:67;:::i;:::-;17178:74;;17261:93;17350:3;17261:93;:::i;:::-;17379:2;17374:3;17370:12;17363:19;;17022:366;;;:::o;17394:::-;17536:3;17557:67;17621:2;17616:3;17557:67;:::i;:::-;17550:74;;17633:93;17722:3;17633:93;:::i;:::-;17751:2;17746:3;17742:12;17735:19;;17394:366;;;:::o;17766:::-;17908:3;17929:67;17993:2;17988:3;17929:67;:::i;:::-;17922:74;;18005:93;18094:3;18005:93;:::i;:::-;18123:2;18118:3;18114:12;18107:19;;17766:366;;;:::o;18138:::-;18280:3;18301:67;18365:2;18360:3;18301:67;:::i;:::-;18294:74;;18377:93;18466:3;18377:93;:::i;:::-;18495:2;18490:3;18486:12;18479:19;;18138:366;;;:::o;18510:::-;18652:3;18673:67;18737:2;18732:3;18673:67;:::i;:::-;18666:74;;18749:93;18838:3;18749:93;:::i;:::-;18867:2;18862:3;18858:12;18851:19;;18510:366;;;:::o;18882:::-;19024:3;19045:67;19109:2;19104:3;19045:67;:::i;:::-;19038:74;;19121:93;19210:3;19121:93;:::i;:::-;19239:2;19234:3;19230:12;19223:19;;18882:366;;;:::o;19254:::-;19396:3;19417:67;19481:2;19476:3;19417:67;:::i;:::-;19410:74;;19493:93;19582:3;19493:93;:::i;:::-;19611:2;19606:3;19602:12;19595:19;;19254:366;;;:::o;19626:::-;19768:3;19789:67;19853:2;19848:3;19789:67;:::i;:::-;19782:74;;19865:93;19954:3;19865:93;:::i;:::-;19983:2;19978:3;19974:12;19967:19;;19626:366;;;:::o;19998:::-;20140:3;20161:67;20225:2;20220:3;20161:67;:::i;:::-;20154:74;;20237:93;20326:3;20237:93;:::i;:::-;20355:2;20350:3;20346:12;20339:19;;19998:366;;;:::o;20370:::-;20512:3;20533:67;20597:2;20592:3;20533:67;:::i;:::-;20526:74;;20609:93;20698:3;20609:93;:::i;:::-;20727:2;20722:3;20718:12;20711:19;;20370:366;;;:::o;20742:::-;20884:3;20905:67;20969:2;20964:3;20905:67;:::i;:::-;20898:74;;20981:93;21070:3;20981:93;:::i;:::-;21099:2;21094:3;21090:12;21083:19;;20742:366;;;:::o;21114:::-;21256:3;21277:67;21341:2;21336:3;21277:67;:::i;:::-;21270:74;;21353:93;21442:3;21353:93;:::i;:::-;21471:2;21466:3;21462:12;21455:19;;21114:366;;;:::o;21486:108::-;21563:24;21581:5;21563:24;:::i;:::-;21558:3;21551:37;21486:108;;:::o;21600:118::-;21687:24;21705:5;21687:24;:::i;:::-;21682:3;21675:37;21600:118;;:::o;21724:589::-;21949:3;21971:95;22062:3;22053:6;21971:95;:::i;:::-;21964:102;;22083:95;22174:3;22165:6;22083:95;:::i;:::-;22076:102;;22195:92;22283:3;22274:6;22195:92;:::i;:::-;22188:99;;22304:3;22297:10;;21724:589;;;;;;:::o;22319:222::-;22412:4;22450:2;22439:9;22435:18;22427:26;;22463:71;22531:1;22520:9;22516:17;22507:6;22463:71;:::i;:::-;22319:222;;;;:::o;22547:640::-;22742:4;22780:3;22769:9;22765:19;22757:27;;22794:71;22862:1;22851:9;22847:17;22838:6;22794:71;:::i;:::-;22875:72;22943:2;22932:9;22928:18;22919:6;22875:72;:::i;:::-;22957;23025:2;23014:9;23010:18;23001:6;22957:72;:::i;:::-;23076:9;23070:4;23066:20;23061:2;23050:9;23046:18;23039:48;23104:76;23175:4;23166:6;23104:76;:::i;:::-;23096:84;;22547:640;;;;;;;:::o;23193:332::-;23314:4;23352:2;23341:9;23337:18;23329:26;;23365:71;23433:1;23422:9;23418:17;23409:6;23365:71;:::i;:::-;23446:72;23514:2;23503:9;23499:18;23490:6;23446:72;:::i;:::-;23193:332;;;;;:::o;23531:373::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:108;23892:4;23883:6;23789:108;:::i;:::-;23781:116;;23531:373;;;;:::o;23910:210::-;23997:4;24035:2;24024:9;24020:18;24012:26;;24048:65;24110:1;24099:9;24095:17;24086:6;24048:65;:::i;:::-;23910:210;;;;:::o;24126:313::-;24239:4;24277:2;24266:9;24262:18;24254:26;;24326:9;24320:4;24316:20;24312:1;24301:9;24297:17;24290:47;24354:78;24427:4;24418:6;24354:78;:::i;:::-;24346:86;;24126:313;;;;:::o;24445:419::-;24611:4;24649:2;24638:9;24634:18;24626:26;;24698:9;24692:4;24688:20;24684:1;24673:9;24669:17;24662:47;24726:131;24852:4;24726:131;:::i;:::-;24718:139;;24445:419;;;:::o;24870:::-;25036:4;25074:2;25063:9;25059:18;25051:26;;25123:9;25117:4;25113:20;25109:1;25098:9;25094:17;25087:47;25151:131;25277:4;25151:131;:::i;:::-;25143:139;;24870:419;;;:::o;25295:::-;25461:4;25499:2;25488:9;25484:18;25476:26;;25548:9;25542:4;25538:20;25534:1;25523:9;25519:17;25512:47;25576:131;25702:4;25576:131;:::i;:::-;25568:139;;25295:419;;;:::o;25720:::-;25886:4;25924:2;25913:9;25909:18;25901:26;;25973:9;25967:4;25963:20;25959:1;25948:9;25944:17;25937:47;26001:131;26127:4;26001:131;:::i;:::-;25993:139;;25720:419;;;:::o;26145:::-;26311:4;26349:2;26338:9;26334:18;26326:26;;26398:9;26392:4;26388:20;26384:1;26373:9;26369:17;26362:47;26426:131;26552:4;26426:131;:::i;:::-;26418:139;;26145:419;;;:::o;26570:::-;26736:4;26774:2;26763:9;26759:18;26751:26;;26823:9;26817:4;26813:20;26809:1;26798:9;26794:17;26787:47;26851:131;26977:4;26851:131;:::i;:::-;26843:139;;26570:419;;;:::o;26995:::-;27161:4;27199:2;27188:9;27184:18;27176:26;;27248:9;27242:4;27238:20;27234:1;27223:9;27219:17;27212:47;27276:131;27402:4;27276:131;:::i;:::-;27268:139;;26995:419;;;:::o;27420:::-;27586:4;27624:2;27613:9;27609:18;27601:26;;27673:9;27667:4;27663:20;27659:1;27648:9;27644:17;27637:47;27701:131;27827:4;27701:131;:::i;:::-;27693:139;;27420:419;;;:::o;27845:::-;28011:4;28049:2;28038:9;28034:18;28026:26;;28098:9;28092:4;28088:20;28084:1;28073:9;28069:17;28062:47;28126:131;28252:4;28126:131;:::i;:::-;28118:139;;27845:419;;;:::o;28270:::-;28436:4;28474:2;28463:9;28459:18;28451:26;;28523:9;28517:4;28513:20;28509:1;28498:9;28494:17;28487:47;28551:131;28677:4;28551:131;:::i;:::-;28543:139;;28270:419;;;:::o;28695:::-;28861:4;28899:2;28888:9;28884:18;28876:26;;28948:9;28942:4;28938:20;28934:1;28923:9;28919:17;28912:47;28976:131;29102:4;28976:131;:::i;:::-;28968:139;;28695:419;;;:::o;29120:::-;29286:4;29324:2;29313:9;29309:18;29301:26;;29373:9;29367:4;29363:20;29359:1;29348:9;29344:17;29337:47;29401:131;29527:4;29401:131;:::i;:::-;29393:139;;29120:419;;;:::o;29545:::-;29711:4;29749:2;29738:9;29734:18;29726:26;;29798:9;29792:4;29788:20;29784:1;29773:9;29769:17;29762:47;29826:131;29952:4;29826:131;:::i;:::-;29818:139;;29545:419;;;:::o;29970:::-;30136:4;30174:2;30163:9;30159:18;30151:26;;30223:9;30217:4;30213:20;30209:1;30198:9;30194:17;30187:47;30251:131;30377:4;30251:131;:::i;:::-;30243:139;;29970:419;;;:::o;30395:::-;30561:4;30599:2;30588:9;30584:18;30576:26;;30648:9;30642:4;30638:20;30634:1;30623:9;30619:17;30612:47;30676:131;30802:4;30676:131;:::i;:::-;30668:139;;30395:419;;;:::o;30820:::-;30986:4;31024:2;31013:9;31009:18;31001:26;;31073:9;31067:4;31063:20;31059:1;31048:9;31044:17;31037:47;31101:131;31227:4;31101:131;:::i;:::-;31093:139;;30820:419;;;:::o;31245:::-;31411:4;31449:2;31438:9;31434:18;31426:26;;31498:9;31492:4;31488:20;31484:1;31473:9;31469:17;31462:47;31526:131;31652:4;31526:131;:::i;:::-;31518:139;;31245:419;;;:::o;31670:::-;31836:4;31874:2;31863:9;31859:18;31851:26;;31923:9;31917:4;31913:20;31909:1;31898:9;31894:17;31887:47;31951:131;32077:4;31951:131;:::i;:::-;31943:139;;31670:419;;;:::o;32095:::-;32261:4;32299:2;32288:9;32284:18;32276:26;;32348:9;32342:4;32338:20;32334:1;32323:9;32319:17;32312:47;32376:131;32502:4;32376:131;:::i;:::-;32368:139;;32095:419;;;:::o;32520:::-;32686:4;32724:2;32713:9;32709:18;32701:26;;32773:9;32767:4;32763:20;32759:1;32748:9;32744:17;32737:47;32801:131;32927:4;32801:131;:::i;:::-;32793:139;;32520:419;;;:::o;32945:::-;33111:4;33149:2;33138:9;33134:18;33126:26;;33198:9;33192:4;33188:20;33184:1;33173:9;33169:17;33162:47;33226:131;33352:4;33226:131;:::i;:::-;33218:139;;32945:419;;;:::o;33370:::-;33536:4;33574:2;33563:9;33559:18;33551:26;;33623:9;33617:4;33613:20;33609:1;33598:9;33594:17;33587:47;33651:131;33777:4;33651:131;:::i;:::-;33643:139;;33370:419;;;:::o;33795:::-;33961:4;33999:2;33988:9;33984:18;33976:26;;34048:9;34042:4;34038:20;34034:1;34023:9;34019:17;34012:47;34076:131;34202:4;34076:131;:::i;:::-;34068:139;;33795:419;;;:::o;34220:222::-;34313:4;34351:2;34340:9;34336:18;34328:26;;34364:71;34432:1;34421:9;34417:17;34408:6;34364:71;:::i;:::-;34220:222;;;;:::o;34448:129::-;34482:6;34509:20;;:::i;:::-;34499:30;;34538:33;34566:4;34558:6;34538:33;:::i;:::-;34448:129;;;:::o;34583:75::-;34616:6;34649:2;34643:9;34633:19;;34583:75;:::o;34664:307::-;34725:4;34815:18;34807:6;34804:30;34801:56;;;34837:18;;:::i;:::-;34801:56;34875:29;34897:6;34875:29;:::i;:::-;34867:37;;34959:4;34953;34949:15;34941:23;;34664:307;;;:::o;34977:308::-;35039:4;35129:18;35121:6;35118:30;35115:56;;;35151:18;;:::i;:::-;35115:56;35189:29;35211:6;35189:29;:::i;:::-;35181:37;;35273:4;35267;35263:15;35255:23;;34977:308;;;:::o;35291:132::-;35358:4;35381:3;35373:11;;35411:4;35406:3;35402:14;35394:22;;35291:132;;;:::o;35429:141::-;35478:4;35501:3;35493:11;;35524:3;35521:1;35514:14;35558:4;35555:1;35545:18;35537:26;;35429:141;;;:::o;35576:114::-;35643:6;35677:5;35671:12;35661:22;;35576:114;;;:::o;35696:98::-;35747:6;35781:5;35775:12;35765:22;;35696:98;;;:::o;35800:99::-;35852:6;35886:5;35880:12;35870:22;;35800:99;;;:::o;35905:113::-;35975:4;36007;36002:3;35998:14;35990:22;;35905:113;;;:::o;36024:184::-;36123:11;36157:6;36152:3;36145:19;36197:4;36192:3;36188:14;36173:29;;36024:184;;;;:::o;36214:168::-;36297:11;36331:6;36326:3;36319:19;36371:4;36366:3;36362:14;36347:29;;36214:168;;;;:::o;36388:169::-;36472:11;36506:6;36501:3;36494:19;36546:4;36541:3;36537:14;36522:29;;36388:169;;;;:::o;36563:148::-;36665:11;36702:3;36687:18;;36563:148;;;;:::o;36717:305::-;36757:3;36776:20;36794:1;36776:20;:::i;:::-;36771:25;;36810:20;36828:1;36810:20;:::i;:::-;36805:25;;36964:1;36896:66;36892:74;36889:1;36886:81;36883:107;;;36970:18;;:::i;:::-;36883:107;37014:1;37011;37007:9;37000:16;;36717:305;;;;:::o;37028:185::-;37068:1;37085:20;37103:1;37085:20;:::i;:::-;37080:25;;37119:20;37137:1;37119:20;:::i;:::-;37114:25;;37158:1;37148:35;;37163:18;;:::i;:::-;37148:35;37205:1;37202;37198:9;37193:14;;37028:185;;;;:::o;37219:348::-;37259:7;37282:20;37300:1;37282:20;:::i;:::-;37277:25;;37316:20;37334:1;37316:20;:::i;:::-;37311:25;;37504:1;37436:66;37432:74;37429:1;37426:81;37421:1;37414:9;37407:17;37403:105;37400:131;;;37511:18;;:::i;:::-;37400:131;37559:1;37556;37552:9;37541:20;;37219:348;;;;:::o;37573:191::-;37613:4;37633:20;37651:1;37633:20;:::i;:::-;37628:25;;37667:20;37685:1;37667:20;:::i;:::-;37662:25;;37706:1;37703;37700:8;37697:34;;;37711:18;;:::i;:::-;37697:34;37756:1;37753;37749:9;37741:17;;37573:191;;;;:::o;37770:96::-;37807:7;37836:24;37854:5;37836:24;:::i;:::-;37825:35;;37770:96;;;:::o;37872:90::-;37906:7;37949:5;37942:13;37935:21;37924:32;;37872:90;;;:::o;37968:149::-;38004:7;38044:66;38037:5;38033:78;38022:89;;37968:149;;;:::o;38123:126::-;38160:7;38200:42;38193:5;38189:54;38178:65;;38123:126;;;:::o;38255:77::-;38292:7;38321:5;38310:16;;38255:77;;;:::o;38338:109::-;38374:7;38414:26;38407:5;38403:38;38392:49;;38338:109;;;:::o;38453:154::-;38537:6;38532:3;38527;38514:30;38599:1;38590:6;38585:3;38581:16;38574:27;38453:154;;;:::o;38613:307::-;38681:1;38691:113;38705:6;38702:1;38699:13;38691:113;;;38790:1;38785:3;38781:11;38775:18;38771:1;38766:3;38762:11;38755:39;38727:2;38724:1;38720:10;38715:15;;38691:113;;;38822:6;38819:1;38816:13;38813:101;;;38902:1;38893:6;38888:3;38884:16;38877:27;38813:101;38662:258;38613:307;;;:::o;38926:320::-;38970:6;39007:1;39001:4;38997:12;38987:22;;39054:1;39048:4;39044:12;39075:18;39065:81;;39131:4;39123:6;39119:17;39109:27;;39065:81;39193:2;39185:6;39182:14;39162:18;39159:38;39156:84;;;39212:18;;:::i;:::-;39156:84;38977:269;38926:320;;;:::o;39252:281::-;39335:27;39357:4;39335:27;:::i;:::-;39327:6;39323:40;39465:6;39453:10;39450:22;39429:18;39417:10;39414:34;39411:62;39408:88;;;39476:18;;:::i;:::-;39408:88;39516:10;39512:2;39505:22;39295:238;39252:281;;:::o;39539:233::-;39578:3;39601:24;39619:5;39601:24;:::i;:::-;39592:33;;39647:66;39640:5;39637:77;39634:103;;;39717:18;;:::i;:::-;39634:103;39764:1;39757:5;39753:13;39746:20;;39539:233;;;:::o;39778:176::-;39810:1;39827:20;39845:1;39827:20;:::i;:::-;39822:25;;39861:20;39879:1;39861:20;:::i;:::-;39856:25;;39900:1;39890:35;;39905:18;;:::i;:::-;39890:35;39946:1;39943;39939:9;39934:14;;39778:176;;;;:::o;39960:180::-;40008:77;40005:1;39998:88;40105:4;40102:1;40095:15;40129:4;40126:1;40119:15;40146:180;40194:77;40191:1;40184:88;40291:4;40288:1;40281:15;40315:4;40312:1;40305:15;40332:180;40380:77;40377:1;40370:88;40477:4;40474:1;40467:15;40501:4;40498:1;40491:15;40518:180;40566:77;40563:1;40556:88;40663:4;40660:1;40653:15;40687:4;40684:1;40677:15;40704:180;40752:77;40749:1;40742:88;40849:4;40846:1;40839:15;40873:4;40870:1;40863:15;40890:180;40938:77;40935:1;40928:88;41035:4;41032:1;41025:15;41059:4;41056:1;41049:15;41076:117;41185:1;41182;41175:12;41199:117;41308:1;41305;41298:12;41322:117;41431:1;41428;41421:12;41445:117;41554:1;41551;41544:12;41568:117;41677:1;41674;41667:12;41691:117;41800:1;41797;41790:12;41814:102;41855:6;41906:2;41902:7;41897:2;41890:5;41886:14;41882:28;41872:38;;41814:102;;;:::o;41922:230::-;42062:34;42058:1;42050:6;42046:14;42039:58;42131:13;42126:2;42118:6;42114:15;42107:38;41922:230;:::o;42158:237::-;42298:34;42294:1;42286:6;42282:14;42275:58;42367:20;42362:2;42354:6;42350:15;42343:45;42158:237;:::o;42401:225::-;42541:34;42537:1;42529:6;42525:14;42518:58;42610:8;42605:2;42597:6;42593:15;42586:33;42401:225;:::o;42632:224::-;42772:34;42768:1;42760:6;42756:14;42749:58;42841:7;42836:2;42828:6;42824:15;42817:32;42632:224;:::o;42862:178::-;43002:30;42998:1;42990:6;42986:14;42979:54;42862:178;:::o;43046:::-;43186:30;43182:1;43174:6;43170:14;43163:54;43046:178;:::o;43230:223::-;43370:34;43366:1;43358:6;43354:14;43347:58;43439:6;43434:2;43426:6;43422:15;43415:31;43230:223;:::o;43459:175::-;43599:27;43595:1;43587:6;43583:14;43576:51;43459:175;:::o;43640:231::-;43780:34;43776:1;43768:6;43764:14;43757:58;43849:14;43844:2;43836:6;43832:15;43825:39;43640:231;:::o;43877:243::-;44017:34;44013:1;44005:6;44001:14;43994:58;44086:26;44081:2;44073:6;44069:15;44062:51;43877:243;:::o;44126:229::-;44266:34;44262:1;44254:6;44250:14;44243:58;44335:12;44330:2;44322:6;44318:15;44311:37;44126:229;:::o;44361:228::-;44501:34;44497:1;44489:6;44485:14;44478:58;44570:11;44565:2;44557:6;44553:15;44546:36;44361:228;:::o;44595:182::-;44735:34;44731:1;44723:6;44719:14;44712:58;44595:182;:::o;44783:231::-;44923:34;44919:1;44911:6;44907:14;44900:58;44992:14;44987:2;44979:6;44975:15;44968:39;44783:231;:::o;45020:182::-;45160:34;45156:1;45148:6;45144:14;45137:58;45020:182;:::o;45208:234::-;45348:34;45344:1;45336:6;45332:14;45325:58;45417:17;45412:2;45404:6;45400:15;45393:42;45208:234;:::o;45448:220::-;45588:34;45584:1;45576:6;45572:14;45565:58;45657:3;45652:2;45644:6;45640:15;45633:28;45448:220;:::o;45674:168::-;45814:20;45810:1;45802:6;45798:14;45791:44;45674:168;:::o;45848:236::-;45988:34;45984:1;45976:6;45972:14;45965:58;46057:19;46052:2;46044:6;46040:15;46033:44;45848:236;:::o;46090:231::-;46230:34;46226:1;46218:6;46214:14;46207:58;46299:14;46294:2;46286:6;46282:15;46275:39;46090:231;:::o;46327:229::-;46467:34;46463:1;46455:6;46451:14;46444:58;46536:12;46531:2;46523:6;46519:15;46512:37;46327:229;:::o;46562:173::-;46702:25;46698:1;46690:6;46686:14;46679:49;46562:173;:::o;46741:175::-;46881:27;46877:1;46869:6;46865:14;46858:51;46741:175;:::o;46922:122::-;46995:24;47013:5;46995:24;:::i;:::-;46988:5;46985:35;46975:63;;47034:1;47031;47024:12;46975:63;46922:122;:::o;47050:116::-;47120:21;47135:5;47120:21;:::i;:::-;47113:5;47110:32;47100:60;;47156:1;47153;47146:12;47100:60;47050:116;:::o;47172:120::-;47244:23;47261:5;47244:23;:::i;:::-;47237:5;47234:34;47224:62;;47282:1;47279;47272:12;47224:62;47172:120;:::o;47298:122::-;47371:24;47389:5;47371:24;:::i;:::-;47364:5;47361:35;47351:63;;47410:1;47407;47400:12;47351:63;47298:122;:::o;47426:120::-;47498:23;47515:5;47498:23;:::i;:::-;47491:5;47488:34;47478:62;;47536:1;47533;47526:12;47478:62;47426:120;:::o

Swarm Source

ipfs://8e55172b74be2a36808838561f42b4524843e8b08aa0638053886859c4429466
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.