ETH Price: $2,616.36 (+1.10%)

Token

SmolFrens (Frens)
 

Overview

Max Total Supply

0 Frens

Holders

47

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Frens
0x3E0811f23022B130701676cdBFBe6199e2123586
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

An Omnichain NFT Project with 8,888 collectibles. Allowing Smol Frens to teleport across chains!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SmolFrens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol



pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

// File: contracts/interfaces/ILayerZeroEndpoint.sol



pragma solidity >=0.5.0;


interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

// File: contracts/interfaces/ILayerZeroReceiver.sol



pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

// File: contracts/NonblockingReceiver.sol


pragma solidity ^0.8.6;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), 
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

// File: contracts/SmolFrens.sol

/*

░██████╗███╗░░░███╗░█████╗░██╗░░░░░███████╗██████╗░███████╗███╗░░██╗░██████╗███╗░░██╗███████╗████████╗░░░░█████╗░░█████╗░███╗░░░███╗
██╔════╝████╗░████║██╔══██╗██║░░░░░██╔════╝██╔══██╗██╔════╝████╗░██║██╔════╝████╗░██║██╔════╝╚══██╔══╝░░░██╔══██╗██╔══██╗████╗░████║
╚█████╗░██╔████╔██║██║░░██║██║░░░░░█████╗░░██████╔╝█████╗░░██╔██╗██║╚█████╗░██╔██╗██║█████╗░░░░░██║░░░░░░██║░░╚═╝██║░░██║██╔████╔██║
░╚═══██╗██║╚██╔╝██║██║░░██║██║░░░░░██╔══╝░░██╔══██╗██╔══╝░░██║╚████║░╚═══██╗██║╚████║██╔══╝░░░░░██║░░░░░░██║░░██╗██║░░██║██║╚██╔╝██║
██████╔╝██║░╚═╝░██║╚█████╔╝███████╗██║░░░░░██║░░██║███████╗██║░╚███║██████╔╝██║░╚███║██║░░░░░░░░██║░░░██╗╚█████╔╝╚█████╔╝██║░╚═╝░██║
╚═════╝░╚═╝░░░░░╚═╝░╚════╝░╚══════╝╚═╝░░░░░╚═╝░░╚═╝╚══════╝╚═╝░░╚══╝╚═════╝░╚═╝░░╚══╝╚═╝░░░░░░░░╚═╝░░░╚═╝░╚════╝░░╚════╝░╚═╝░░░░░╚═╝
 */

pragma solidity ^0.8.7;



contract SmolFrens is Ownable, ERC721, NonblockingReceiver {
    bytes32 public merkleRoot;
    address public _owner;
    uint256 public price;
    uint public status;
    string private baseURI;

    uint256 nextTokenId = 0;
    uint256 ETH_MINT = 2222;

    uint gasForDestinationLzReceive = 350000;

    constructor(address _layerZeroEndpoint) ERC721("SmolFrens", "Frens") { 
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
    }

    function Whitelist(bytes32[] calldata _merkleProof, uint256 _amount) external payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(status == 1, 'Whitelist Mint Not Live');
        require(_amount < 5, 'You can only mint 4 or less!');
        require(nextTokenId + _amount <= ETH_MINT, "Supply is capped!");
        require(tx.origin == msg.sender, 'Contract Denied');
        require(msg.value >= price * _amount, 'Ether Amount Insufficient');
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Proof Invalid');

        if (_amount == 1) {
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 2) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 3) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 4) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }

    }

    function mint(uint256 _amount) external payable {

        require(status == 2, 'Mint Not Live');
        require(_amount < 5, 'You can only mint 4 or less!'); 
        require(nextTokenId + _amount <= ETH_MINT, "Supply is capped!");
        require(tx.origin == msg.sender, 'Contract Denied');
        require(msg.value >= price * _amount, 'Ether Amount Insufficient');

        if (_amount == 1) {
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 2) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 3) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }
        if (_amount == 4) {
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function TeleportChain(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You must own the token to travel");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is unavailable");

        _burn(tokenId);
        bytes memory payload = abi.encode(msg.sender, tokenId);
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);

        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);
        
        require(msg.value >= messageFee, "Not enough gas to meet transaction demand");

        endpoint.send{value: msg.value}(
            _chainId,                           // destination chainId
            trustedRemoteLookup[_chainId],      // destination address of nft contract
            payload,                            // abi.encoded()'ed bytes
            payable(msg.sender),                // refund address
            address(0x0),                       // 'zroPaymentAddress' unused for this
            adapterParams                       // txParameters 
        );
    }  

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

    function setStatus(uint _status) external onlyOwner {
        status = _status;
    }

    function withdraw() external payable onlyOwner {
        uint256 p1 = address(this).balance * 40 / 100;
        uint256 p2 = address(this).balance * 40 / 100;
        uint256 p3 = address(this).balance * 10 / 100;
        uint256 p4 = address(this).balance * 10 / 100;

        require(payable(0x8FA9FAA437446eCbC9C2f7436B9328603E03817d).send(p1));
        require(payable(0xCd3DCDefDb63FFF60F93130aeE4d727F109Aa020).send(p2));
        require(payable(0xA038A64eD671b257b0b12F4812B3cC0C9591Ebcb).send(p3));
        require(payable(0xfB9bE452316754a94f46aD36F6bd279699FB3840).send(p4));
    }

    function setGasForDestinationLzReceive(uint newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal {
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));
        _safeMint(toAddr, tokenId);
    }  

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","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":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TeleportChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Whitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600f556108ae601055620557306011553480156200002357600080fd5b5060405162005e3938038062005e39833981810160405281019062000049919062000325565b6040518060400160405280600981526020017f536d6f6c4672656e7300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4672656e73000000000000000000000000000000000000000000000000000000815250620000d5620000c96200019260201b60201c565b6200019a60201b60201c565b8160019080519060200190620000ed9291906200025e565b508060029080519060200190620001069291906200025e565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200040f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026c906200038b565b90600052602060002090601f016020900481019282620002905760008555620002dc565b82601f10620002ab57805160ff1916838001178555620002dc565b82800160010185558215620002dc579182015b82811115620002db578251825591602001919060010190620002be565b5b509050620002eb9190620002ef565b5090565b5b808211156200030a576000816000905550600101620002f0565b5090565b6000815190506200031f81620003f5565b92915050565b6000602082840312156200033e576200033d620003f0565b5b60006200034e848285016200030e565b91505092915050565b600062000364826200036b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003a457607f821691505b60208210811415620003bb57620003ba620003c1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620004008162000357565b81146200040c57600080fd5b50565b615a1a806200041f6000396000f3fe6080604052600436106102035760003560e01c80637533d78811610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610705578063d1deba1f14610742578063e985e9c51461075e578063eb8d72b71461079b578063f2fde38b146107c457610203565b8063a22cb4651461066c578063b2bdfa7b14610695578063b88d4fde146106c0578063b96677c2146106e957610203565b806391b7f5ed116100e757806391b7f5ed146105a8578063943fb872146105d157806395d89b41146105fa578063a035b1fe14610625578063a0712d681461065057610203565b80637533d788146104d95780637cb64759146105165780638da5cb5b1461053f5780638ee749121461056a57610203565b80632eb4a7ab1161019b57806355f804b31161016a57806355f804b3146103f65780636352211e1461041f57806369ba1a751461045c57806370a0823114610485578063715018a6146104c257610203565b80632eb4a7ab1461037c5780633ccfd60b146103a75780633f487727146103b157806342842e0e146103cd57610203565b8063095ea7b3116101d7578063095ea7b3146102d65780631c37a822146102ff578063200d2ed21461032857806323b872dd1461035357610203565b80621d35671461020857806301ffc9a71461023157806306fdde031461026e578063081812fc14610299575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a9190613d42565b6107ed565b005b34801561023d57600080fd5b5061025860048036038101906102539190613aff565b610a2f565b60405161026591906146bd565b60405180910390f35b34801561027a57600080fd5b50610283610b11565b6040516102909190614715565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190613e21565b610ba3565b6040516102cd919061462d565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190613a32565b610c28565b005b34801561030b57600080fd5b5061032660048036038101906103219190613d42565b610d40565b005b34801561033457600080fd5b5061033d610dc0565b60405161034a9190614c76565b60405180910390f35b34801561035f57600080fd5b5061037a6004803603810190610375919061391c565b610dc6565b005b34801561038857600080fd5b50610391610e26565b60405161039e91906146d8565b60405180910390f35b6103af610e2c565b005b6103cb60048036038101906103c69190613de1565b61106a565b005b3480156103d957600080fd5b506103f460048036038101906103ef919061391c565b61135d565b005b34801561040257600080fd5b5061041d60048036038101906104189190613b59565b61137d565b005b34801561042b57600080fd5b5061044660048036038101906104419190613e21565b611413565b604051610453919061462d565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613e21565b6114c5565b005b34801561049157600080fd5b506104ac60048036038101906104a7919061386f565b61154b565b6040516104b99190614c76565b60405180910390f35b3480156104ce57600080fd5b506104d7611603565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613ba2565b61168b565b60405161050d91906146f3565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613ad2565b61172b565b005b34801561054b57600080fd5b506105546117b1565b604051610561919061462d565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613c2f565b6117da565b60405161059f929190614c91565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613e21565b61182e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613e21565b6118b4565b005b34801561060657600080fd5b5061060f61193a565b60405161061c9190614715565b60405180910390f35b34801561063157600080fd5b5061063a6119cc565b6040516106479190614c76565b60405180910390f35b61066a60048036038101906106659190613e21565b6119d2565b005b34801561067857600080fd5b50610693600480360381019061068e91906139f2565b611cc1565b005b3480156106a157600080fd5b506106aa611cd7565b6040516106b7919061462d565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e2919061396f565b611cfd565b005b61070360048036038101906106fe9190613a72565b611d5f565b005b34801561071157600080fd5b5061072c60048036038101906107279190613e21565b612109565b6040516107399190614715565b60405180910390f35b61075c60048036038101906107579190613c9e565b6121b0565b005b34801561076a57600080fd5b50610785600480360381019061078091906138dc565b612350565b60405161079291906146bd565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613bcf565b6123e4565b005b3480156107d057600080fd5b506107eb60048036038101906107e6919061386f565b612490565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461084757600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461086d90614fad565b905083511480156108b35750600960008561ffff1661ffff1681526020019081526020016000206040516108a191906145c6565b60405180910390208380519060200120145b6108f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e9906149f7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016109319493929190614bad565b600060405180830381600087803b15801561094b57600080fd5b505af192505050801561095c575060015b610a28576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516109a691906145af565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051610a1b9493929190614bad565b60405180910390a1610a29565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0a5750610b0982612588565b5b9050919050565b606060018054610b2090614fad565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4c90614fad565b8015610b995780601f10610b6e57610100808354040283529160200191610b99565b820191906000526020600020905b815481529060010190602001808311610b7c57829003601f168201915b5050505050905090565b6000610bae826125f2565b610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be4906149b7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3382611413565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614a37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc361265e565b73ffffffffffffffffffffffffffffffffffffffff161480610cf25750610cf181610cec61265e565b612350565b5b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28906148d7565b60405180910390fd5b610d3b8383612666565b505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614957565b60405180910390fd5b610dba8484848461271f565b50505050565b600d5481565b610dd7610dd161265e565b8261274c565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614a97565b60405180910390fd5b610e2183838361282a565b505050565b600a5481565b610e3461265e565b73ffffffffffffffffffffffffffffffffffffffff16610e526117b1565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906149d7565b60405180910390fd5b60006064602847610eb99190614e2b565b610ec39190614dfa565b905060006064602847610ed69190614e2b565b610ee09190614dfa565b905060006064600a47610ef39190614e2b565b610efd9190614dfa565b905060006064600a47610f109190614e2b565b610f1a9190614dfa565b9050738fa9faa437446ecbc9c2f7436b9328603e03817d73ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050610f6e57600080fd5b73cd3dcdefdb63fff60f93130aee4d727f109aa02073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050610fc057600080fd5b73a038a64ed671b257b0b12f4812b3cc0c9591ebcb73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061101257600080fd5b73fb9be452316754a94f46ad36f6bd279699fb384073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061106457600080fd5b50505050565b61107381611413565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790614757565b60405180910390fd5b6000600960008461ffff1661ffff168152602001908152602001600020805461110890614fad565b90501161114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114190614ab7565b60405180910390fd5b61115381612a91565b60003382604051602001611168929190614694565b6040516020818303038152906040529050600060019050600081601154604051602001611196929190614601565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b815260040161120d959493929190614af7565b604080518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190613e4e565b509050803410156112a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611299906148f7565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b815260040161132396959493929190614c00565b6000604051808303818588803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b5050505050505050505050565b61137883838360405180602001604052806000815250611cfd565b505050565b61138561265e565b73ffffffffffffffffffffffffffffffffffffffff166113a36117b1565b73ffffffffffffffffffffffffffffffffffffffff16146113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f0906149d7565b60405180910390fd5b80600e908051906020019061140f9291906134e8565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390614937565b60405180910390fd5b80915050919050565b6114cd61265e565b73ffffffffffffffffffffffffffffffffffffffff166114eb6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906149d7565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614917565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61160b61265e565b73ffffffffffffffffffffffffffffffffffffffff166116296117b1565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906149d7565b60405180910390fd5b6116896000612bae565b565b600960205280600052604060002060009150905080546116aa90614fad565b80601f01602080910402602001604051908101604052809291908181526020018280546116d690614fad565b80156117235780601f106116f857610100808354040283529160200191611723565b820191906000526020600020905b81548152906001019060200180831161170657829003601f168201915b505050505081565b61173361265e565b73ffffffffffffffffffffffffffffffffffffffff166117516117b1565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e906149d7565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b61183661265e565b73ffffffffffffffffffffffffffffffffffffffff166118546117b1565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a1906149d7565b60405180910390fd5b80600c8190555050565b6118bc61265e565b73ffffffffffffffffffffffffffffffffffffffff166118da6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611927906149d7565b60405180910390fd5b8060118190555050565b60606002805461194990614fad565b80601f016020809104026020016040519081016040528092919081815260200182805461197590614fad565b80156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b5050505050905090565b600c5481565b6002600d5414611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614797565b60405180910390fd5b60058110611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190614737565b60405180910390fd5b60105481600f54611a6b9190614da4565b1115611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390614a77565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614817565b60405180910390fd5b80600c54611b289190614e2b565b341015611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190614837565b60405180910390fd5b6001811415611b9257611b9133600f60008154611b8690615010565b919050819055612c72565b5b6002811415611bd857611bb933600f60008154611bae90615010565b919050819055612c72565b611bd733600f60008154611bcc90615010565b919050819055612c72565b5b6003811415611c3c57611bff33600f60008154611bf490615010565b919050819055612c72565b611c1d33600f60008154611c1290615010565b919050819055612c72565b611c3b33600f60008154611c3090615010565b919050819055612c72565b5b6004811415611cbe57611c6333600f60008154611c5890615010565b919050819055612c72565b611c8133600f60008154611c7690615010565b919050819055612c72565b611c9f33600f60008154611c9490615010565b919050819055612c72565b611cbd33600f60008154611cb290615010565b919050819055612c72565b5b50565b611cd3611ccc61265e565b8383612c90565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0e611d0861265e565b8361274c565b611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614a97565b60405180910390fd5b611d5984848484612dfd565b50505050565b600033604051602001611d72919061457b565b6040516020818303038152906040528051906020012090506001600d5414611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614a57565b60405180910390fd5b60058210611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614737565b60405180910390fd5b60105482600f54611e239190614da4565b1115611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614a77565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990614817565b60405180910390fd5b81600c54611ee09190614e2b565b341015611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614837565b60405180910390fd5b611f70848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612e59565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614977565b60405180910390fd5b6001821415611fd757611fd633600f60008154611fcb90615010565b919050819055612c72565b5b600282141561201d57611ffe33600f60008154611ff390615010565b919050819055612c72565b61201c33600f6000815461201190615010565b919050819055612c72565b5b60038214156120815761204433600f6000815461203990615010565b919050819055612c72565b61206233600f6000815461205790615010565b919050819055612c72565b61208033600f6000815461207590615010565b919050819055612c72565b5b6004821415612103576120a833600f6000815461209d90615010565b919050819055612c72565b6120c633600f600081546120bb90615010565b919050819055612c72565b6120e433600f600081546120d990615010565b919050819055612c72565b61210233600f600081546120f790615010565b919050819055612c72565b5b50505050565b6060612114826125f2565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90614a17565b60405180910390fd5b600061215d612e70565b9050600081511161217d57604051806020016040528060008152506121a8565b8061218784612f02565b6040516020016121989291906145dd565b6040516020818303038152906040525b915050919050565b6000600860008761ffff1661ffff168152602001908152602001600020856040516121db91906145af565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790614ad7565b60405180910390fd5b806000015483839050148015612280575080600101548383604051612276929190614596565b6040518091039020145b6122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b690614897565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401612316959493929190614b58565b600060405180830381600087803b15801561233057600080fd5b505af1158015612344573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123ec61265e565b73ffffffffffffffffffffffffffffffffffffffff1661240a6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614612460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612457906149d7565b60405180910390fd5b8181600960008661ffff1661ffff168152602001908152602001600020919061248a92919061356e565b50505050565b61249861265e565b73ffffffffffffffffffffffffffffffffffffffff166124b66117b1565b73ffffffffffffffffffffffffffffffffffffffff161461250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906149d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612573906147b7565b60405180910390fd5b61258581612bae565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126d983611413565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190612736919061389c565b915091506127448282612c72565b505050505050565b6000612757826125f2565b612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d906148b7565b60405180910390fd5b60006127a183611413565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281057508373ffffffffffffffffffffffffffffffffffffffff166127f884610ba3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282157506128208185612350565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284a82611413565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897906147d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790614857565b60405180910390fd5b61291b838383613063565b612926600082612666565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129769190614e85565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129cd9190614da4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a8c838383613068565b505050565b6000612a9c82611413565b9050612aaa81600084613063565b612ab5600083612666565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b059190614e85565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612baa81600084613068565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c8c82826040518060200160405280600081525061306d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf690614877565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612df091906146bd565b60405180910390a3505050565b612e0884848461282a565b612e14848484846130c8565b612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614777565b60405180910390fd5b50505050565b600082612e66858461325f565b1490509392505050565b6060600e8054612e7f90614fad565b80601f0160208091040260200160405190810160405280929190818152602001828054612eab90614fad565b8015612ef85780601f10612ecd57610100808354040283529160200191612ef8565b820191906000526020600020905b815481529060010190602001808311612edb57829003601f168201915b5050505050905090565b60606000821415612f4a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061305e565b600082905060005b60008214612f7c578080612f6590615010565b915050600a82612f759190614dfa565b9150612f52565b60008167ffffffffffffffff811115612f9857612f97615186565b5b6040519080825280601f01601f191660200182016040528015612fca5781602001600182028036833780820191505090505b5090505b6000851461305757600182612fe39190614e85565b9150600a85612ff29190615099565b6030612ffe9190614da4565b60f81b81838151811061301457613013615157565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130509190614dfa565b9450612fce565b8093505050505b919050565b505050565b505050565b61307783836132d4565b61308460008484846130c8565b6130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba90614777565b60405180910390fd5b505050565b60006130e98473ffffffffffffffffffffffffffffffffffffffff166134ae565b15613252578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311261265e565b8786866040518563ffffffff1660e01b81526004016131349493929190614648565b602060405180830381600087803b15801561314e57600080fd5b505af192505050801561317f57506040513d601f19601f8201168201806040525081019061317c9190613b2c565b60015b613202573d80600081146131af576040519150601f19603f3d011682016040523d82523d6000602084013e6131b4565b606091505b506000815114156131fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f190614777565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613257565b600190505b949350505050565b60008082905060005b84518110156132c957600085828151811061328657613285615157565b5b602002602001015190508083116132a8576132a183826134d1565b92506132b5565b6132b281846134d1565b92505b5080806132c190615010565b915050613268565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90614997565b60405180910390fd5b61334d816125f2565b1561338d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613384906147f7565b60405180910390fd5b61339960008383613063565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133e99190614da4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134aa60008383613068565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546134f490614fad565b90600052602060002090601f016020900481019282613516576000855561355d565b82601f1061352f57805160ff191683800117855561355d565b8280016001018555821561355d579182015b8281111561355c578251825591602001919060010190613541565b5b50905061356a91906135f4565b5090565b82805461357a90614fad565b90600052602060002090601f01602090048101928261359c57600085556135e3565b82601f106135b557803560ff19168380011785556135e3565b828001600101855582156135e3579182015b828111156135e25782358255916020019190600101906135c7565b5b5090506135f091906135f4565b5090565b5b8082111561360d5760008160009055506001016135f5565b5090565b600061362461361f84614cdf565b614cba565b9050828152602081018484840111156136405761363f6151c4565b5b61364b848285614f6b565b509392505050565b600061366661366184614d10565b614cba565b905082815260208101848484011115613682576136816151c4565b5b61368d848285614f6b565b509392505050565b6000813590506136a48161592c565b92915050565b6000815190506136b981615943565b92915050565b60008083601f8401126136d5576136d46151ba565b5b8235905067ffffffffffffffff8111156136f2576136f16151b5565b5b60208301915083602082028301111561370e5761370d6151bf565b5b9250929050565b6000813590506137248161595a565b92915050565b60008135905061373981615971565b92915050565b60008135905061374e81615988565b92915050565b60008151905061376381615988565b92915050565b60008083601f84011261377f5761377e6151ba565b5b8235905067ffffffffffffffff81111561379c5761379b6151b5565b5b6020830191508360018202830111156137b8576137b76151bf565b5b9250929050565b600082601f8301126137d4576137d36151ba565b5b81356137e4848260208601613611565b91505092915050565b600082601f830112613802576138016151ba565b5b8135613812848260208601613653565b91505092915050565b60008135905061382a8161599f565b92915050565b60008135905061383f816159b6565b92915050565b600081519050613854816159b6565b92915050565b600081359050613869816159cd565b92915050565b600060208284031215613885576138846151ce565b5b600061389384828501613695565b91505092915050565b600080604083850312156138b3576138b26151ce565b5b60006138c1858286016136aa565b92505060206138d285828601613845565b9150509250929050565b600080604083850312156138f3576138f26151ce565b5b600061390185828601613695565b925050602061391285828601613695565b9150509250929050565b600080600060608486031215613935576139346151ce565b5b600061394386828701613695565b935050602061395486828701613695565b925050604061396586828701613830565b9150509250925092565b60008060008060808587031215613989576139886151ce565b5b600061399787828801613695565b94505060206139a887828801613695565b93505060406139b987828801613830565b925050606085013567ffffffffffffffff8111156139da576139d96151c9565b5b6139e6878288016137bf565b91505092959194509250565b60008060408385031215613a0957613a086151ce565b5b6000613a1785828601613695565b9250506020613a2885828601613715565b9150509250929050565b60008060408385031215613a4957613a486151ce565b5b6000613a5785828601613695565b9250506020613a6885828601613830565b9150509250929050565b600080600060408486031215613a8b57613a8a6151ce565b5b600084013567ffffffffffffffff811115613aa957613aa86151c9565b5b613ab5868287016136bf565b93509350506020613ac886828701613830565b9150509250925092565b600060208284031215613ae857613ae76151ce565b5b6000613af68482850161372a565b91505092915050565b600060208284031215613b1557613b146151ce565b5b6000613b238482850161373f565b91505092915050565b600060208284031215613b4257613b416151ce565b5b6000613b5084828501613754565b91505092915050565b600060208284031215613b6f57613b6e6151ce565b5b600082013567ffffffffffffffff811115613b8d57613b8c6151c9565b5b613b99848285016137ed565b91505092915050565b600060208284031215613bb857613bb76151ce565b5b6000613bc68482850161381b565b91505092915050565b600080600060408486031215613be857613be76151ce565b5b6000613bf68682870161381b565b935050602084013567ffffffffffffffff811115613c1757613c166151c9565b5b613c2386828701613769565b92509250509250925092565b600080600060608486031215613c4857613c476151ce565b5b6000613c568682870161381b565b935050602084013567ffffffffffffffff811115613c7757613c766151c9565b5b613c83868287016137bf565b9250506040613c9486828701613830565b9150509250925092565b600080600080600060808688031215613cba57613cb96151ce565b5b6000613cc88882890161381b565b955050602086013567ffffffffffffffff811115613ce957613ce86151c9565b5b613cf5888289016137bf565b9450506040613d068882890161385a565b935050606086013567ffffffffffffffff811115613d2757613d266151c9565b5b613d3388828901613769565b92509250509295509295909350565b60008060008060808587031215613d5c57613d5b6151ce565b5b6000613d6a8782880161381b565b945050602085013567ffffffffffffffff811115613d8b57613d8a6151c9565b5b613d97878288016137bf565b9350506040613da88782880161385a565b925050606085013567ffffffffffffffff811115613dc957613dc86151c9565b5b613dd5878288016137bf565b91505092959194509250565b60008060408385031215613df857613df76151ce565b5b6000613e068582860161381b565b9250506020613e1785828601613830565b9150509250929050565b600060208284031215613e3757613e366151ce565b5b6000613e4584828501613830565b91505092915050565b60008060408385031215613e6557613e646151ce565b5b6000613e7385828601613845565b9250506020613e8485828601613845565b9150509250929050565b613e9781614ecb565b82525050565b613ea681614eb9565b82525050565b613ebd613eb882614eb9565b615059565b82525050565b613ecc81614edd565b82525050565b613edb81614ee9565b82525050565b6000613eed8385614d6c565b9350613efa838584614f6b565b613f03836151d3565b840190509392505050565b6000613f1a8385614d7d565b9350613f27838584614f6b565b82840190509392505050565b6000613f3e82614d56565b613f488185614d6c565b9350613f58818560208601614f7a565b613f61816151d3565b840191505092915050565b6000613f7782614d56565b613f818185614d7d565b9350613f91818560208601614f7a565b80840191505092915050565b60008154613faa81614fad565b613fb48186614d6c565b94506001821660008114613fcf5760018114613fe157614014565b60ff1983168652602086019350614014565b613fea85614d41565b60005b8381101561400c57815481890152600182019150602081019050613fed565b808801955050505b50505092915050565b6000815461402a81614fad565b6140348186614d7d565b9450600182166000811461404f576001811461406057614093565b60ff19831686528186019350614093565b61406985614d41565b60005b8381101561408b5781548189015260018201915060208101905061406c565b838801955050505b50505092915050565b60006140a782614d61565b6140b18185614d88565b93506140c1818560208601614f7a565b6140ca816151d3565b840191505092915050565b60006140e082614d61565b6140ea8185614d99565b93506140fa818560208601614f7a565b80840191505092915050565b6000614113601c83614d88565b915061411e826151fe565b602082019050919050565b6000614136602083614d88565b915061414182615227565b602082019050919050565b6000614159603283614d88565b915061416482615250565b604082019050919050565b600061417c600d83614d88565b91506141878261529f565b602082019050919050565b600061419f602683614d88565b91506141aa826152c8565b604082019050919050565b60006141c2602583614d88565b91506141cd82615317565b604082019050919050565b60006141e5601c83614d88565b91506141f082615366565b602082019050919050565b6000614208600f83614d88565b91506142138261538f565b602082019050919050565b600061422b601983614d88565b9150614236826153b8565b602082019050919050565b600061424e602483614d88565b9150614259826153e1565b604082019050919050565b6000614271601983614d88565b915061427c82615430565b602082019050919050565b6000614294601a83614d88565b915061429f82615459565b602082019050919050565b60006142b7602c83614d88565b91506142c282615482565b604082019050919050565b60006142da603883614d88565b91506142e5826154d1565b604082019050919050565b60006142fd602983614d88565b915061430882615520565b604082019050919050565b6000614320602a83614d88565b915061432b8261556f565b604082019050919050565b6000614343602983614d88565b915061434e826155be565b604082019050919050565b6000614366602b83614d88565b91506143718261560d565b604082019050919050565b6000614389600d83614d88565b91506143948261565c565b602082019050919050565b60006143ac602083614d88565b91506143b782615685565b602082019050919050565b60006143cf602c83614d88565b91506143da826156ae565b604082019050919050565b60006143f2602083614d88565b91506143fd826156fd565b602082019050919050565b6000614415603483614d88565b915061442082615726565b604082019050919050565b6000614438602f83614d88565b915061444382615775565b604082019050919050565b600061445b602183614d88565b9150614466826157c4565b604082019050919050565b600061447e601783614d88565b915061448982615813565b602082019050919050565b60006144a1601183614d88565b91506144ac8261583c565b602082019050919050565b60006144c4603183614d88565b91506144cf82615865565b604082019050919050565b60006144e7601983614d88565b91506144f2826158b4565b602082019050919050565b600061450a602683614d88565b9150614515826158dd565b604082019050919050565b61452981614f1f565b82525050565b61454061453b82614f1f565b61506b565b82525050565b61454f81614f4d565b82525050565b61456661456182614f4d565b61508f565b82525050565b61457581614f57565b82525050565b60006145878284613eac565b60148201915081905092915050565b60006145a3828486613f0e565b91508190509392505050565b60006145bb8284613f6c565b915081905092915050565b60006145d2828461401d565b915081905092915050565b60006145e982856140d5565b91506145f582846140d5565b91508190509392505050565b600061460d828561452f565b60028201915061461d8284614555565b6020820191508190509392505050565b60006020820190506146426000830184613e9d565b92915050565b600060808201905061465d6000830187613e9d565b61466a6020830186613e9d565b6146776040830185614546565b81810360608301526146898184613f33565b905095945050505050565b60006040820190506146a96000830185613e9d565b6146b66020830184614546565b9392505050565b60006020820190506146d26000830184613ec3565b92915050565b60006020820190506146ed6000830184613ed2565b92915050565b6000602082019050818103600083015261470d8184613f33565b905092915050565b6000602082019050818103600083015261472f818461409c565b905092915050565b6000602082019050818103600083015261475081614106565b9050919050565b6000602082019050818103600083015261477081614129565b9050919050565b600060208201905081810360008301526147908161414c565b9050919050565b600060208201905081810360008301526147b08161416f565b9050919050565b600060208201905081810360008301526147d081614192565b9050919050565b600060208201905081810360008301526147f0816141b5565b9050919050565b60006020820190508181036000830152614810816141d8565b9050919050565b60006020820190508181036000830152614830816141fb565b9050919050565b600060208201905081810360008301526148508161421e565b9050919050565b6000602082019050818103600083015261487081614241565b9050919050565b6000602082019050818103600083015261489081614264565b9050919050565b600060208201905081810360008301526148b081614287565b9050919050565b600060208201905081810360008301526148d0816142aa565b9050919050565b600060208201905081810360008301526148f0816142cd565b9050919050565b60006020820190508181036000830152614910816142f0565b9050919050565b6000602082019050818103600083015261493081614313565b9050919050565b6000602082019050818103600083015261495081614336565b9050919050565b6000602082019050818103600083015261497081614359565b9050919050565b600060208201905081810360008301526149908161437c565b9050919050565b600060208201905081810360008301526149b08161439f565b9050919050565b600060208201905081810360008301526149d0816143c2565b9050919050565b600060208201905081810360008301526149f0816143e5565b9050919050565b60006020820190508181036000830152614a1081614408565b9050919050565b60006020820190508181036000830152614a308161442b565b9050919050565b60006020820190508181036000830152614a508161444e565b9050919050565b60006020820190508181036000830152614a7081614471565b9050919050565b60006020820190508181036000830152614a9081614494565b9050919050565b60006020820190508181036000830152614ab0816144b7565b9050919050565b60006020820190508181036000830152614ad0816144da565b9050919050565b60006020820190508181036000830152614af0816144fd565b9050919050565b600060a082019050614b0c6000830188614520565b614b196020830187613e9d565b8181036040830152614b2b8186613f33565b9050614b3a6060830185613ec3565b8181036080830152614b4c8184613f33565b90509695505050505050565b6000608082019050614b6d6000830188614520565b8181036020830152614b7f8187613f33565b9050614b8e604083018661456c565b8181036060830152614ba1818486613ee1565b90509695505050505050565b6000608082019050614bc26000830187614520565b8181036020830152614bd48186613f33565b9050614be3604083018561456c565b8181036060830152614bf58184613f33565b905095945050505050565b600060c082019050614c156000830189614520565b8181036020830152614c278188613f9d565b90508181036040830152614c3b8187613f33565b9050614c4a6060830186613e8e565b614c576080830185613e9d565b81810360a0830152614c698184613f33565b9050979650505050505050565b6000602082019050614c8b6000830184614546565b92915050565b6000604082019050614ca66000830185614546565b614cb36020830184613ed2565b9392505050565b6000614cc4614cd5565b9050614cd08282614fdf565b919050565b6000604051905090565b600067ffffffffffffffff821115614cfa57614cf9615186565b5b614d03826151d3565b9050602081019050919050565b600067ffffffffffffffff821115614d2b57614d2a615186565b5b614d34826151d3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614daf82614f4d565b9150614dba83614f4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614def57614dee6150ca565b5b828201905092915050565b6000614e0582614f4d565b9150614e1083614f4d565b925082614e2057614e1f6150f9565b5b828204905092915050565b6000614e3682614f4d565b9150614e4183614f4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e7a57614e796150ca565b5b828202905092915050565b6000614e9082614f4d565b9150614e9b83614f4d565b925082821015614eae57614ead6150ca565b5b828203905092915050565b6000614ec482614f2d565b9050919050565b6000614ed682614f2d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614f98578082015181840152602081019050614f7d565b83811115614fa7576000848401525b50505050565b60006002820490506001821680614fc557607f821691505b60208210811415614fd957614fd8615128565b5b50919050565b614fe8826151d3565b810181811067ffffffffffffffff8211171561500757615006615186565b5b80604052505050565b600061501b82614f4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504e5761504d6150ca565b5b600182019050919050565b60006150648261507d565b9050919050565b6000615076826151e4565b9050919050565b6000615088826151f1565b9050919050565b6000819050919050565b60006150a482614f4d565b91506150af83614f4d565b9250826150bf576150be6150f9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b7f596f752063616e206f6e6c79206d696e742034206f72206c6573732100000000600082015250565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176656c600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74204e6f74204c69766500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b7f457468657220416d6f756e7420496e73756666696369656e7400000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f7420656e6f7567682067617320746f206d656574207472616e736163746960008201527f6f6e2064656d616e640000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f50726f6f6620496e76616c696400000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374204d696e74204e6f74204c697665000000000000000000600082015250565b7f537570706c792069732063617070656421000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5468697320636861696e20697320756e617661696c61626c6500000000000000600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b61593581614eb9565b811461594057600080fd5b50565b61594c81614ecb565b811461595757600080fd5b50565b61596381614edd565b811461596e57600080fd5b50565b61597a81614ee9565b811461598557600080fd5b50565b61599181614ef3565b811461599c57600080fd5b50565b6159a881614f1f565b81146159b357600080fd5b50565b6159bf81614f4d565b81146159ca57600080fd5b50565b6159d681614f57565b81146159e157600080fd5b5056fea26469706673582212205d775a8316b5ad6c45f10a286c5b758b9bc0ddf6e57efbd6e8a79983f8d3dde664736f6c6343000807003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675

Deployed Bytecode

0x6080604052600436106102035760003560e01c80637533d78811610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610705578063d1deba1f14610742578063e985e9c51461075e578063eb8d72b71461079b578063f2fde38b146107c457610203565b8063a22cb4651461066c578063b2bdfa7b14610695578063b88d4fde146106c0578063b96677c2146106e957610203565b806391b7f5ed116100e757806391b7f5ed146105a8578063943fb872146105d157806395d89b41146105fa578063a035b1fe14610625578063a0712d681461065057610203565b80637533d788146104d95780637cb64759146105165780638da5cb5b1461053f5780638ee749121461056a57610203565b80632eb4a7ab1161019b57806355f804b31161016a57806355f804b3146103f65780636352211e1461041f57806369ba1a751461045c57806370a0823114610485578063715018a6146104c257610203565b80632eb4a7ab1461037c5780633ccfd60b146103a75780633f487727146103b157806342842e0e146103cd57610203565b8063095ea7b3116101d7578063095ea7b3146102d65780631c37a822146102ff578063200d2ed21461032857806323b872dd1461035357610203565b80621d35671461020857806301ffc9a71461023157806306fdde031461026e578063081812fc14610299575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a9190613d42565b6107ed565b005b34801561023d57600080fd5b5061025860048036038101906102539190613aff565b610a2f565b60405161026591906146bd565b60405180910390f35b34801561027a57600080fd5b50610283610b11565b6040516102909190614715565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190613e21565b610ba3565b6040516102cd919061462d565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190613a32565b610c28565b005b34801561030b57600080fd5b5061032660048036038101906103219190613d42565b610d40565b005b34801561033457600080fd5b5061033d610dc0565b60405161034a9190614c76565b60405180910390f35b34801561035f57600080fd5b5061037a6004803603810190610375919061391c565b610dc6565b005b34801561038857600080fd5b50610391610e26565b60405161039e91906146d8565b60405180910390f35b6103af610e2c565b005b6103cb60048036038101906103c69190613de1565b61106a565b005b3480156103d957600080fd5b506103f460048036038101906103ef919061391c565b61135d565b005b34801561040257600080fd5b5061041d60048036038101906104189190613b59565b61137d565b005b34801561042b57600080fd5b5061044660048036038101906104419190613e21565b611413565b604051610453919061462d565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613e21565b6114c5565b005b34801561049157600080fd5b506104ac60048036038101906104a7919061386f565b61154b565b6040516104b99190614c76565b60405180910390f35b3480156104ce57600080fd5b506104d7611603565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613ba2565b61168b565b60405161050d91906146f3565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613ad2565b61172b565b005b34801561054b57600080fd5b506105546117b1565b604051610561919061462d565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613c2f565b6117da565b60405161059f929190614c91565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613e21565b61182e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613e21565b6118b4565b005b34801561060657600080fd5b5061060f61193a565b60405161061c9190614715565b60405180910390f35b34801561063157600080fd5b5061063a6119cc565b6040516106479190614c76565b60405180910390f35b61066a60048036038101906106659190613e21565b6119d2565b005b34801561067857600080fd5b50610693600480360381019061068e91906139f2565b611cc1565b005b3480156106a157600080fd5b506106aa611cd7565b6040516106b7919061462d565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e2919061396f565b611cfd565b005b61070360048036038101906106fe9190613a72565b611d5f565b005b34801561071157600080fd5b5061072c60048036038101906107279190613e21565b612109565b6040516107399190614715565b60405180910390f35b61075c60048036038101906107579190613c9e565b6121b0565b005b34801561076a57600080fd5b50610785600480360381019061078091906138dc565b612350565b60405161079291906146bd565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613bcf565b6123e4565b005b3480156107d057600080fd5b506107eb60048036038101906107e6919061386f565b612490565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461084757600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461086d90614fad565b905083511480156108b35750600960008561ffff1661ffff1681526020019081526020016000206040516108a191906145c6565b60405180910390208380519060200120145b6108f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e9906149f7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016109319493929190614bad565b600060405180830381600087803b15801561094b57600080fd5b505af192505050801561095c575060015b610a28576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516109a691906145af565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051610a1b9493929190614bad565b60405180910390a1610a29565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0a5750610b0982612588565b5b9050919050565b606060018054610b2090614fad565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4c90614fad565b8015610b995780601f10610b6e57610100808354040283529160200191610b99565b820191906000526020600020905b815481529060010190602001808311610b7c57829003601f168201915b5050505050905090565b6000610bae826125f2565b610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be4906149b7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3382611413565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614a37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc361265e565b73ffffffffffffffffffffffffffffffffffffffff161480610cf25750610cf181610cec61265e565b612350565b5b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28906148d7565b60405180910390fd5b610d3b8383612666565b505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614957565b60405180910390fd5b610dba8484848461271f565b50505050565b600d5481565b610dd7610dd161265e565b8261274c565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614a97565b60405180910390fd5b610e2183838361282a565b505050565b600a5481565b610e3461265e565b73ffffffffffffffffffffffffffffffffffffffff16610e526117b1565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906149d7565b60405180910390fd5b60006064602847610eb99190614e2b565b610ec39190614dfa565b905060006064602847610ed69190614e2b565b610ee09190614dfa565b905060006064600a47610ef39190614e2b565b610efd9190614dfa565b905060006064600a47610f109190614e2b565b610f1a9190614dfa565b9050738fa9faa437446ecbc9c2f7436b9328603e03817d73ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050610f6e57600080fd5b73cd3dcdefdb63fff60f93130aee4d727f109aa02073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050610fc057600080fd5b73a038a64ed671b257b0b12f4812b3cc0c9591ebcb73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061101257600080fd5b73fb9be452316754a94f46ad36f6bd279699fb384073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061106457600080fd5b50505050565b61107381611413565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790614757565b60405180910390fd5b6000600960008461ffff1661ffff168152602001908152602001600020805461110890614fad565b90501161114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114190614ab7565b60405180910390fd5b61115381612a91565b60003382604051602001611168929190614694565b6040516020818303038152906040529050600060019050600081601154604051602001611196929190614601565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b815260040161120d959493929190614af7565b604080518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190613e4e565b509050803410156112a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611299906148f7565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b815260040161132396959493929190614c00565b6000604051808303818588803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b5050505050505050505050565b61137883838360405180602001604052806000815250611cfd565b505050565b61138561265e565b73ffffffffffffffffffffffffffffffffffffffff166113a36117b1565b73ffffffffffffffffffffffffffffffffffffffff16146113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f0906149d7565b60405180910390fd5b80600e908051906020019061140f9291906134e8565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390614937565b60405180910390fd5b80915050919050565b6114cd61265e565b73ffffffffffffffffffffffffffffffffffffffff166114eb6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906149d7565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614917565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61160b61265e565b73ffffffffffffffffffffffffffffffffffffffff166116296117b1565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906149d7565b60405180910390fd5b6116896000612bae565b565b600960205280600052604060002060009150905080546116aa90614fad565b80601f01602080910402602001604051908101604052809291908181526020018280546116d690614fad565b80156117235780601f106116f857610100808354040283529160200191611723565b820191906000526020600020905b81548152906001019060200180831161170657829003601f168201915b505050505081565b61173361265e565b73ffffffffffffffffffffffffffffffffffffffff166117516117b1565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e906149d7565b60405180910390fd5b80600a8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b61183661265e565b73ffffffffffffffffffffffffffffffffffffffff166118546117b1565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a1906149d7565b60405180910390fd5b80600c8190555050565b6118bc61265e565b73ffffffffffffffffffffffffffffffffffffffff166118da6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611927906149d7565b60405180910390fd5b8060118190555050565b60606002805461194990614fad565b80601f016020809104026020016040519081016040528092919081815260200182805461197590614fad565b80156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b5050505050905090565b600c5481565b6002600d5414611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614797565b60405180910390fd5b60058110611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190614737565b60405180910390fd5b60105481600f54611a6b9190614da4565b1115611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390614a77565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614817565b60405180910390fd5b80600c54611b289190614e2b565b341015611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190614837565b60405180910390fd5b6001811415611b9257611b9133600f60008154611b8690615010565b919050819055612c72565b5b6002811415611bd857611bb933600f60008154611bae90615010565b919050819055612c72565b611bd733600f60008154611bcc90615010565b919050819055612c72565b5b6003811415611c3c57611bff33600f60008154611bf490615010565b919050819055612c72565b611c1d33600f60008154611c1290615010565b919050819055612c72565b611c3b33600f60008154611c3090615010565b919050819055612c72565b5b6004811415611cbe57611c6333600f60008154611c5890615010565b919050819055612c72565b611c8133600f60008154611c7690615010565b919050819055612c72565b611c9f33600f60008154611c9490615010565b919050819055612c72565b611cbd33600f60008154611cb290615010565b919050819055612c72565b5b50565b611cd3611ccc61265e565b8383612c90565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0e611d0861265e565b8361274c565b611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614a97565b60405180910390fd5b611d5984848484612dfd565b50505050565b600033604051602001611d72919061457b565b6040516020818303038152906040528051906020012090506001600d5414611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614a57565b60405180910390fd5b60058210611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614737565b60405180910390fd5b60105482600f54611e239190614da4565b1115611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614a77565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990614817565b60405180910390fd5b81600c54611ee09190614e2b565b341015611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614837565b60405180910390fd5b611f70848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612e59565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614977565b60405180910390fd5b6001821415611fd757611fd633600f60008154611fcb90615010565b919050819055612c72565b5b600282141561201d57611ffe33600f60008154611ff390615010565b919050819055612c72565b61201c33600f6000815461201190615010565b919050819055612c72565b5b60038214156120815761204433600f6000815461203990615010565b919050819055612c72565b61206233600f6000815461205790615010565b919050819055612c72565b61208033600f6000815461207590615010565b919050819055612c72565b5b6004821415612103576120a833600f6000815461209d90615010565b919050819055612c72565b6120c633600f600081546120bb90615010565b919050819055612c72565b6120e433600f600081546120d990615010565b919050819055612c72565b61210233600f600081546120f790615010565b919050819055612c72565b5b50505050565b6060612114826125f2565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90614a17565b60405180910390fd5b600061215d612e70565b9050600081511161217d57604051806020016040528060008152506121a8565b8061218784612f02565b6040516020016121989291906145dd565b6040516020818303038152906040525b915050919050565b6000600860008761ffff1661ffff168152602001908152602001600020856040516121db91906145af565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790614ad7565b60405180910390fd5b806000015483839050148015612280575080600101548383604051612276929190614596565b6040518091039020145b6122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b690614897565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401612316959493929190614b58565b600060405180830381600087803b15801561233057600080fd5b505af1158015612344573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123ec61265e565b73ffffffffffffffffffffffffffffffffffffffff1661240a6117b1565b73ffffffffffffffffffffffffffffffffffffffff1614612460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612457906149d7565b60405180910390fd5b8181600960008661ffff1661ffff168152602001908152602001600020919061248a92919061356e565b50505050565b61249861265e565b73ffffffffffffffffffffffffffffffffffffffff166124b66117b1565b73ffffffffffffffffffffffffffffffffffffffff161461250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906149d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612573906147b7565b60405180910390fd5b61258581612bae565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126d983611413565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190612736919061389c565b915091506127448282612c72565b505050505050565b6000612757826125f2565b612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d906148b7565b60405180910390fd5b60006127a183611413565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281057508373ffffffffffffffffffffffffffffffffffffffff166127f884610ba3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282157506128208185612350565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284a82611413565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897906147d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790614857565b60405180910390fd5b61291b838383613063565b612926600082612666565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129769190614e85565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129cd9190614da4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a8c838383613068565b505050565b6000612a9c82611413565b9050612aaa81600084613063565b612ab5600083612666565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b059190614e85565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612baa81600084613068565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c8c82826040518060200160405280600081525061306d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf690614877565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612df091906146bd565b60405180910390a3505050565b612e0884848461282a565b612e14848484846130c8565b612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614777565b60405180910390fd5b50505050565b600082612e66858461325f565b1490509392505050565b6060600e8054612e7f90614fad565b80601f0160208091040260200160405190810160405280929190818152602001828054612eab90614fad565b8015612ef85780601f10612ecd57610100808354040283529160200191612ef8565b820191906000526020600020905b815481529060010190602001808311612edb57829003601f168201915b5050505050905090565b60606000821415612f4a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061305e565b600082905060005b60008214612f7c578080612f6590615010565b915050600a82612f759190614dfa565b9150612f52565b60008167ffffffffffffffff811115612f9857612f97615186565b5b6040519080825280601f01601f191660200182016040528015612fca5781602001600182028036833780820191505090505b5090505b6000851461305757600182612fe39190614e85565b9150600a85612ff29190615099565b6030612ffe9190614da4565b60f81b81838151811061301457613013615157565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130509190614dfa565b9450612fce565b8093505050505b919050565b505050565b505050565b61307783836132d4565b61308460008484846130c8565b6130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba90614777565b60405180910390fd5b505050565b60006130e98473ffffffffffffffffffffffffffffffffffffffff166134ae565b15613252578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311261265e565b8786866040518563ffffffff1660e01b81526004016131349493929190614648565b602060405180830381600087803b15801561314e57600080fd5b505af192505050801561317f57506040513d601f19601f8201168201806040525081019061317c9190613b2c565b60015b613202573d80600081146131af576040519150601f19603f3d011682016040523d82523d6000602084013e6131b4565b606091505b506000815114156131fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f190614777565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613257565b600190505b949350505050565b60008082905060005b84518110156132c957600085828151811061328657613285615157565b5b602002602001015190508083116132a8576132a183826134d1565b92506132b5565b6132b281846134d1565b92505b5080806132c190615010565b915050613268565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90614997565b60405180910390fd5b61334d816125f2565b1561338d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613384906147f7565b60405180910390fd5b61339960008383613063565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133e99190614da4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134aa60008383613068565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546134f490614fad565b90600052602060002090601f016020900481019282613516576000855561355d565b82601f1061352f57805160ff191683800117855561355d565b8280016001018555821561355d579182015b8281111561355c578251825591602001919060010190613541565b5b50905061356a91906135f4565b5090565b82805461357a90614fad565b90600052602060002090601f01602090048101928261359c57600085556135e3565b82601f106135b557803560ff19168380011785556135e3565b828001600101855582156135e3579182015b828111156135e25782358255916020019190600101906135c7565b5b5090506135f091906135f4565b5090565b5b8082111561360d5760008160009055506001016135f5565b5090565b600061362461361f84614cdf565b614cba565b9050828152602081018484840111156136405761363f6151c4565b5b61364b848285614f6b565b509392505050565b600061366661366184614d10565b614cba565b905082815260208101848484011115613682576136816151c4565b5b61368d848285614f6b565b509392505050565b6000813590506136a48161592c565b92915050565b6000815190506136b981615943565b92915050565b60008083601f8401126136d5576136d46151ba565b5b8235905067ffffffffffffffff8111156136f2576136f16151b5565b5b60208301915083602082028301111561370e5761370d6151bf565b5b9250929050565b6000813590506137248161595a565b92915050565b60008135905061373981615971565b92915050565b60008135905061374e81615988565b92915050565b60008151905061376381615988565b92915050565b60008083601f84011261377f5761377e6151ba565b5b8235905067ffffffffffffffff81111561379c5761379b6151b5565b5b6020830191508360018202830111156137b8576137b76151bf565b5b9250929050565b600082601f8301126137d4576137d36151ba565b5b81356137e4848260208601613611565b91505092915050565b600082601f830112613802576138016151ba565b5b8135613812848260208601613653565b91505092915050565b60008135905061382a8161599f565b92915050565b60008135905061383f816159b6565b92915050565b600081519050613854816159b6565b92915050565b600081359050613869816159cd565b92915050565b600060208284031215613885576138846151ce565b5b600061389384828501613695565b91505092915050565b600080604083850312156138b3576138b26151ce565b5b60006138c1858286016136aa565b92505060206138d285828601613845565b9150509250929050565b600080604083850312156138f3576138f26151ce565b5b600061390185828601613695565b925050602061391285828601613695565b9150509250929050565b600080600060608486031215613935576139346151ce565b5b600061394386828701613695565b935050602061395486828701613695565b925050604061396586828701613830565b9150509250925092565b60008060008060808587031215613989576139886151ce565b5b600061399787828801613695565b94505060206139a887828801613695565b93505060406139b987828801613830565b925050606085013567ffffffffffffffff8111156139da576139d96151c9565b5b6139e6878288016137bf565b91505092959194509250565b60008060408385031215613a0957613a086151ce565b5b6000613a1785828601613695565b9250506020613a2885828601613715565b9150509250929050565b60008060408385031215613a4957613a486151ce565b5b6000613a5785828601613695565b9250506020613a6885828601613830565b9150509250929050565b600080600060408486031215613a8b57613a8a6151ce565b5b600084013567ffffffffffffffff811115613aa957613aa86151c9565b5b613ab5868287016136bf565b93509350506020613ac886828701613830565b9150509250925092565b600060208284031215613ae857613ae76151ce565b5b6000613af68482850161372a565b91505092915050565b600060208284031215613b1557613b146151ce565b5b6000613b238482850161373f565b91505092915050565b600060208284031215613b4257613b416151ce565b5b6000613b5084828501613754565b91505092915050565b600060208284031215613b6f57613b6e6151ce565b5b600082013567ffffffffffffffff811115613b8d57613b8c6151c9565b5b613b99848285016137ed565b91505092915050565b600060208284031215613bb857613bb76151ce565b5b6000613bc68482850161381b565b91505092915050565b600080600060408486031215613be857613be76151ce565b5b6000613bf68682870161381b565b935050602084013567ffffffffffffffff811115613c1757613c166151c9565b5b613c2386828701613769565b92509250509250925092565b600080600060608486031215613c4857613c476151ce565b5b6000613c568682870161381b565b935050602084013567ffffffffffffffff811115613c7757613c766151c9565b5b613c83868287016137bf565b9250506040613c9486828701613830565b9150509250925092565b600080600080600060808688031215613cba57613cb96151ce565b5b6000613cc88882890161381b565b955050602086013567ffffffffffffffff811115613ce957613ce86151c9565b5b613cf5888289016137bf565b9450506040613d068882890161385a565b935050606086013567ffffffffffffffff811115613d2757613d266151c9565b5b613d3388828901613769565b92509250509295509295909350565b60008060008060808587031215613d5c57613d5b6151ce565b5b6000613d6a8782880161381b565b945050602085013567ffffffffffffffff811115613d8b57613d8a6151c9565b5b613d97878288016137bf565b9350506040613da88782880161385a565b925050606085013567ffffffffffffffff811115613dc957613dc86151c9565b5b613dd5878288016137bf565b91505092959194509250565b60008060408385031215613df857613df76151ce565b5b6000613e068582860161381b565b9250506020613e1785828601613830565b9150509250929050565b600060208284031215613e3757613e366151ce565b5b6000613e4584828501613830565b91505092915050565b60008060408385031215613e6557613e646151ce565b5b6000613e7385828601613845565b9250506020613e8485828601613845565b9150509250929050565b613e9781614ecb565b82525050565b613ea681614eb9565b82525050565b613ebd613eb882614eb9565b615059565b82525050565b613ecc81614edd565b82525050565b613edb81614ee9565b82525050565b6000613eed8385614d6c565b9350613efa838584614f6b565b613f03836151d3565b840190509392505050565b6000613f1a8385614d7d565b9350613f27838584614f6b565b82840190509392505050565b6000613f3e82614d56565b613f488185614d6c565b9350613f58818560208601614f7a565b613f61816151d3565b840191505092915050565b6000613f7782614d56565b613f818185614d7d565b9350613f91818560208601614f7a565b80840191505092915050565b60008154613faa81614fad565b613fb48186614d6c565b94506001821660008114613fcf5760018114613fe157614014565b60ff1983168652602086019350614014565b613fea85614d41565b60005b8381101561400c57815481890152600182019150602081019050613fed565b808801955050505b50505092915050565b6000815461402a81614fad565b6140348186614d7d565b9450600182166000811461404f576001811461406057614093565b60ff19831686528186019350614093565b61406985614d41565b60005b8381101561408b5781548189015260018201915060208101905061406c565b838801955050505b50505092915050565b60006140a782614d61565b6140b18185614d88565b93506140c1818560208601614f7a565b6140ca816151d3565b840191505092915050565b60006140e082614d61565b6140ea8185614d99565b93506140fa818560208601614f7a565b80840191505092915050565b6000614113601c83614d88565b915061411e826151fe565b602082019050919050565b6000614136602083614d88565b915061414182615227565b602082019050919050565b6000614159603283614d88565b915061416482615250565b604082019050919050565b600061417c600d83614d88565b91506141878261529f565b602082019050919050565b600061419f602683614d88565b91506141aa826152c8565b604082019050919050565b60006141c2602583614d88565b91506141cd82615317565b604082019050919050565b60006141e5601c83614d88565b91506141f082615366565b602082019050919050565b6000614208600f83614d88565b91506142138261538f565b602082019050919050565b600061422b601983614d88565b9150614236826153b8565b602082019050919050565b600061424e602483614d88565b9150614259826153e1565b604082019050919050565b6000614271601983614d88565b915061427c82615430565b602082019050919050565b6000614294601a83614d88565b915061429f82615459565b602082019050919050565b60006142b7602c83614d88565b91506142c282615482565b604082019050919050565b60006142da603883614d88565b91506142e5826154d1565b604082019050919050565b60006142fd602983614d88565b915061430882615520565b604082019050919050565b6000614320602a83614d88565b915061432b8261556f565b604082019050919050565b6000614343602983614d88565b915061434e826155be565b604082019050919050565b6000614366602b83614d88565b91506143718261560d565b604082019050919050565b6000614389600d83614d88565b91506143948261565c565b602082019050919050565b60006143ac602083614d88565b91506143b782615685565b602082019050919050565b60006143cf602c83614d88565b91506143da826156ae565b604082019050919050565b60006143f2602083614d88565b91506143fd826156fd565b602082019050919050565b6000614415603483614d88565b915061442082615726565b604082019050919050565b6000614438602f83614d88565b915061444382615775565b604082019050919050565b600061445b602183614d88565b9150614466826157c4565b604082019050919050565b600061447e601783614d88565b915061448982615813565b602082019050919050565b60006144a1601183614d88565b91506144ac8261583c565b602082019050919050565b60006144c4603183614d88565b91506144cf82615865565b604082019050919050565b60006144e7601983614d88565b91506144f2826158b4565b602082019050919050565b600061450a602683614d88565b9150614515826158dd565b604082019050919050565b61452981614f1f565b82525050565b61454061453b82614f1f565b61506b565b82525050565b61454f81614f4d565b82525050565b61456661456182614f4d565b61508f565b82525050565b61457581614f57565b82525050565b60006145878284613eac565b60148201915081905092915050565b60006145a3828486613f0e565b91508190509392505050565b60006145bb8284613f6c565b915081905092915050565b60006145d2828461401d565b915081905092915050565b60006145e982856140d5565b91506145f582846140d5565b91508190509392505050565b600061460d828561452f565b60028201915061461d8284614555565b6020820191508190509392505050565b60006020820190506146426000830184613e9d565b92915050565b600060808201905061465d6000830187613e9d565b61466a6020830186613e9d565b6146776040830185614546565b81810360608301526146898184613f33565b905095945050505050565b60006040820190506146a96000830185613e9d565b6146b66020830184614546565b9392505050565b60006020820190506146d26000830184613ec3565b92915050565b60006020820190506146ed6000830184613ed2565b92915050565b6000602082019050818103600083015261470d8184613f33565b905092915050565b6000602082019050818103600083015261472f818461409c565b905092915050565b6000602082019050818103600083015261475081614106565b9050919050565b6000602082019050818103600083015261477081614129565b9050919050565b600060208201905081810360008301526147908161414c565b9050919050565b600060208201905081810360008301526147b08161416f565b9050919050565b600060208201905081810360008301526147d081614192565b9050919050565b600060208201905081810360008301526147f0816141b5565b9050919050565b60006020820190508181036000830152614810816141d8565b9050919050565b60006020820190508181036000830152614830816141fb565b9050919050565b600060208201905081810360008301526148508161421e565b9050919050565b6000602082019050818103600083015261487081614241565b9050919050565b6000602082019050818103600083015261489081614264565b9050919050565b600060208201905081810360008301526148b081614287565b9050919050565b600060208201905081810360008301526148d0816142aa565b9050919050565b600060208201905081810360008301526148f0816142cd565b9050919050565b60006020820190508181036000830152614910816142f0565b9050919050565b6000602082019050818103600083015261493081614313565b9050919050565b6000602082019050818103600083015261495081614336565b9050919050565b6000602082019050818103600083015261497081614359565b9050919050565b600060208201905081810360008301526149908161437c565b9050919050565b600060208201905081810360008301526149b08161439f565b9050919050565b600060208201905081810360008301526149d0816143c2565b9050919050565b600060208201905081810360008301526149f0816143e5565b9050919050565b60006020820190508181036000830152614a1081614408565b9050919050565b60006020820190508181036000830152614a308161442b565b9050919050565b60006020820190508181036000830152614a508161444e565b9050919050565b60006020820190508181036000830152614a7081614471565b9050919050565b60006020820190508181036000830152614a9081614494565b9050919050565b60006020820190508181036000830152614ab0816144b7565b9050919050565b60006020820190508181036000830152614ad0816144da565b9050919050565b60006020820190508181036000830152614af0816144fd565b9050919050565b600060a082019050614b0c6000830188614520565b614b196020830187613e9d565b8181036040830152614b2b8186613f33565b9050614b3a6060830185613ec3565b8181036080830152614b4c8184613f33565b90509695505050505050565b6000608082019050614b6d6000830188614520565b8181036020830152614b7f8187613f33565b9050614b8e604083018661456c565b8181036060830152614ba1818486613ee1565b90509695505050505050565b6000608082019050614bc26000830187614520565b8181036020830152614bd48186613f33565b9050614be3604083018561456c565b8181036060830152614bf58184613f33565b905095945050505050565b600060c082019050614c156000830189614520565b8181036020830152614c278188613f9d565b90508181036040830152614c3b8187613f33565b9050614c4a6060830186613e8e565b614c576080830185613e9d565b81810360a0830152614c698184613f33565b9050979650505050505050565b6000602082019050614c8b6000830184614546565b92915050565b6000604082019050614ca66000830185614546565b614cb36020830184613ed2565b9392505050565b6000614cc4614cd5565b9050614cd08282614fdf565b919050565b6000604051905090565b600067ffffffffffffffff821115614cfa57614cf9615186565b5b614d03826151d3565b9050602081019050919050565b600067ffffffffffffffff821115614d2b57614d2a615186565b5b614d34826151d3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614daf82614f4d565b9150614dba83614f4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614def57614dee6150ca565b5b828201905092915050565b6000614e0582614f4d565b9150614e1083614f4d565b925082614e2057614e1f6150f9565b5b828204905092915050565b6000614e3682614f4d565b9150614e4183614f4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e7a57614e796150ca565b5b828202905092915050565b6000614e9082614f4d565b9150614e9b83614f4d565b925082821015614eae57614ead6150ca565b5b828203905092915050565b6000614ec482614f2d565b9050919050565b6000614ed682614f2d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614f98578082015181840152602081019050614f7d565b83811115614fa7576000848401525b50505050565b60006002820490506001821680614fc557607f821691505b60208210811415614fd957614fd8615128565b5b50919050565b614fe8826151d3565b810181811067ffffffffffffffff8211171561500757615006615186565b5b80604052505050565b600061501b82614f4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504e5761504d6150ca565b5b600182019050919050565b60006150648261507d565b9050919050565b6000615076826151e4565b9050919050565b6000615088826151f1565b9050919050565b6000819050919050565b60006150a482614f4d565b91506150af83614f4d565b9250826150bf576150be6150f9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b7f596f752063616e206f6e6c79206d696e742034206f72206c6573732100000000600082015250565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176656c600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74204e6f74204c69766500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b7f457468657220416d6f756e7420496e73756666696369656e7400000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f7420656e6f7567682067617320746f206d656574207472616e736163746960008201527f6f6e2064656d616e640000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f50726f6f6620496e76616c696400000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374204d696e74204e6f74204c697665000000000000000000600082015250565b7f537570706c792069732063617070656421000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5468697320636861696e20697320756e617661696c61626c6500000000000000600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b61593581614eb9565b811461594057600080fd5b50565b61594c81614ecb565b811461595757600080fd5b50565b61596381614edd565b811461596e57600080fd5b50565b61597a81614ee9565b811461598557600080fd5b50565b61599181614ef3565b811461599c57600080fd5b50565b6159a881614f1f565b81146159b357600080fd5b50565b6159bf81614f4d565b81146159ca57600080fd5b50565b6159d681614f57565b81146159e157600080fd5b5056fea26469706673582212205d775a8316b5ad6c45f10a286c5b758b9bc0ddf6e57efbd6e8a79983f8d3dde664736f6c63430008070033

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

00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675

-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675


Deployed Bytecode Sourcemap

61409:5535:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56221:949;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29407:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30352:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31911:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31434:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57178:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61562:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32661:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61475:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65841:601;;;:::i;:::-;;64440:1188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33071:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65638:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30046:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65746:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29776:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52465:103;;;;;;;;;;;;;:::i;:::-;;56063:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64326:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51814:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55966:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64232:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66450:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30521:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61535:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63169:1055;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32204:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61507:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33327:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61905:1256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30696:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58010:758;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32430:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58776:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52723:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56221:949;56383:8;;;;;;;;;;;56361:31;;:10;:31;;;56353:40;;;;;;56504:19;:32;56524:11;56504:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;56482:11;:18;:61;:134;;;;;56583:19;:32;56603:11;56583:32;;;;;;;;;;;;;;;56573:43;;;;;;:::i;:::-;;;;;;;;56557:11;56547:22;;;;;;:69;56482:134;56474:213;;;;;;;;;;;;:::i;:::-;;;;;;;;;56815:4;:16;;;56832:11;56845;56858:6;56866:8;56815:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56811:352;;57022:52;;;;;;;;57037:8;:15;57022:52;;;;57064:8;57054:19;;;;;;57022:52;;;56971:14;:27;56986:11;56971:27;;;;;;;;;;;;;;;56999:11;56971:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;57012:6;56971:48;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;;;;;57094:57;57108:11;57121;57134:6;57142:8;57094:57;;;;;;;;;:::i;:::-;;;;;;;;56811:352;;;;56221:949;;;;:::o;29407:305::-;29509:4;29561:25;29546:40;;;:11;:40;;;;:105;;;;29618:33;29603:48;;;:11;:48;;;;29546:105;:158;;;;29668:36;29692:11;29668:23;:36::i;:::-;29546:158;29526:178;;29407:305;;;:::o;30352:100::-;30406:13;30439:5;30432:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30352:100;:::o;31911:221::-;31987:7;32015:16;32023:7;32015;:16::i;:::-;32007:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32100:15;:24;32116:7;32100:24;;;;;;;;;;;;;;;;;;;;;32093:31;;31911:221;;;:::o;31434:411::-;31515:13;31531:23;31546:7;31531:14;:23::i;:::-;31515:39;;31579:5;31573:11;;:2;:11;;;;31565:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31673:5;31657:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31682:37;31699:5;31706:12;:10;:12::i;:::-;31682:16;:37::i;:::-;31657:62;31635:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31816:21;31825:2;31829:7;31816:8;:21::i;:::-;31504:341;31434:411;;:::o;57178:356::-;57369:4;57347:27;;:10;:27;;;57339:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57471:55;57483:11;57496;57509:6;57517:8;57471:10;:55::i;:::-;57178:356;;;;:::o;61562:18::-;;;;:::o;32661:339::-;32856:41;32875:12;:10;:12::i;:::-;32889:7;32856:18;:41::i;:::-;32848:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32964:28;32974:4;32980:2;32984:7;32964:9;:28::i;:::-;32661:339;;;:::o;61475:25::-;;;;:::o;65841:601::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65899:10:::1;65941:3;65936:2;65912:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;65899:45;;65955:10;65997:3;65992:2;65968:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;65955:45;;66011:10;66053:3;66048:2;66024:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;66011:45;;66067:10;66109:3;66104:2;66080:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;66067:45;;66141:42;66133:56;;:60;66190:2;66133:60;;;;;;;;;;;;;;;;;;;;;;;66125:69;;;::::0;::::1;;66221:42;66213:56;;:60;66270:2;66213:60;;;;;;;;;;;;;;;;;;;;;;;66205:69;;;::::0;::::1;;66301:42;66293:56;;:60;66350:2;66293:60;;;;;;;;;;;;;;;;;;;;;;;66285:69;;;::::0;::::1;;66381:42;66373:56;;:60;66430:2;66373:60;;;;;;;;;;;;;;;;;;;;;;;66365:69;;;::::0;::::1;;65888:554;;;;65841:601::o:0;64440:1188::-;64542:16;64550:7;64542;:16::i;:::-;64528:30;;:10;:30;;;64520:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64653:1;64614:19;:29;64634:8;64614:29;;;;;;;;;;;;;;;:36;;;;;:::i;:::-;;;:40;64606:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;64697:14;64703:7;64697:5;:14::i;:::-;64722:20;64756:10;64768:7;64745:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64722:54;;64787:14;64804:1;64787:18;;64816:26;64862:7;64871:26;;64845:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64816:82;;64912:15;64933:8;;;;;;;;;;;:21;;;64955:8;64973:4;64980:7;64989:5;64996:13;64933:77;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64911:99;;;65052:10;65039:9;:23;;65031:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;65121:8;;;;;;;;;;;:13;;;65142:9;65167:8;65239:19;:29;65259:8;65239:29;;;;;;;;;;;;;;;65327:7;65410:10;65477:3;65557:13;65121:499;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64509:1119;;;;64440:1188;;:::o;33071:185::-;33209:39;33226:4;33232:2;33236:7;33209:39;;;;;;;;;;;;:16;:39::i;:::-;33071:185;;;:::o;65638:100::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65722:8:::1;65712:7;:18;;;;;;;;;;;;:::i;:::-;;65638:100:::0;:::o;30046:239::-;30118:7;30138:13;30154:7;:16;30162:7;30154:16;;;;;;;;;;;;;;;;;;;;;30138:32;;30206:1;30189:19;;:5;:19;;;;30181:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30272:5;30265:12;;;30046:239;;;:::o;65746:87::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65818:7:::1;65809:6;:16;;;;65746:87:::0;:::o;29776:208::-;29848:7;29893:1;29876:19;;:5;:19;;;;29868:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29960:9;:16;29970:5;29960:16;;;;;;;;;;;;;;;;29953:23;;29776:208;;;:::o;52465:103::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52530:30:::1;52557:1;52530:18;:30::i;:::-;52465:103::o:0;56063:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64326:106::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64413:11:::1;64400:10;:24;;;;64326:106:::0;:::o;51814:87::-;51860:7;51887:6;;;;;;;;;;;51880:13;;51814:87;:::o;55966:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64232:86::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64304:6:::1;64296:5;:14;;;;64232:86:::0;:::o;66450:125::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66561:6:::1;66532:26;:35;;;;66450:125:::0;:::o;30521:104::-;30577:13;30610:7;30603:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30521:104;:::o;61535:20::-;;;;:::o;63169:1055::-;63248:1;63238:6;;:11;63230:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;63296:1;63286:7;:11;63278:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;63375:8;;63364:7;63350:11;;:21;;;;:::i;:::-;:33;;63342:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63437:10;63424:23;;:9;:23;;;63416:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;63507:7;63499:5;;:15;;;;:::i;:::-;63486:9;:28;;63478:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63572:1;63561:7;:12;63557:81;;;63590:36;63600:10;63614:11;;63612:13;;;;;:::i;:::-;;;;;;;63590:9;:36::i;:::-;63557:81;63663:1;63652:7;:12;63648:132;;;63681:36;63691:10;63705:11;;63703:13;;;;;:::i;:::-;;;;;;;63681:9;:36::i;:::-;63732;63742:10;63756:11;;63754:13;;;;;:::i;:::-;;;;;;;63732:9;:36::i;:::-;63648:132;63805:1;63794:7;:12;63790:183;;;63823:36;63833:10;63847:11;;63845:13;;;;;:::i;:::-;;;;;;;63823:9;:36::i;:::-;63874;63884:10;63898:11;;63896:13;;;;;:::i;:::-;;;;;;;63874:9;:36::i;:::-;63925;63935:10;63949:11;;63947:13;;;;;:::i;:::-;;;;;;;63925:9;:36::i;:::-;63790:183;63998:1;63987:7;:12;63983:234;;;64016:36;64026:10;64040:11;;64038:13;;;;;:::i;:::-;;;;;;;64016:9;:36::i;:::-;64067;64077:10;64091:11;;64089:13;;;;;:::i;:::-;;;;;;;64067:9;:36::i;:::-;64118;64128:10;64142:11;;64140:13;;;;;:::i;:::-;;;;;;;64118:9;:36::i;:::-;64169;64179:10;64193:11;;64191:13;;;;;:::i;:::-;;;;;;;64169:9;:36::i;:::-;63983:234;63169:1055;:::o;32204:155::-;32299:52;32318:12;:10;:12::i;:::-;32332:8;32342;32299:18;:52::i;:::-;32204:155;;:::o;61507:21::-;;;;;;;;;;;;;:::o;33327:328::-;33502:41;33521:12;:10;:12::i;:::-;33535:7;33502:18;:41::i;:::-;33494:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33608:39;33622:4;33628:2;33632:7;33641:5;33608:13;:39::i;:::-;33327:328;;;;:::o;61905:1256::-;62002:12;62044:10;62027:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62017:39;;;;;;62002:54;;62087:1;62077:6;;:11;62069:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62145:1;62135:7;:11;62127:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;62223:8;;62212:7;62198:11;;:21;;;;:::i;:::-;:33;;62190:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;62285:10;62272:23;;:9;:23;;;62264:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62355:7;62347:5;;:15;;;;:::i;:::-;62334:9;:28;;62326:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62411:50;62430:12;;62411:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62444:10;;62456:4;62411:18;:50::i;:::-;62403:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;62507:1;62496:7;:12;62492:81;;;62525:36;62535:10;62549:11;;62547:13;;;;;:::i;:::-;;;;;;;62525:9;:36::i;:::-;62492:81;62598:1;62587:7;:12;62583:132;;;62616:36;62626:10;62640:11;;62638:13;;;;;:::i;:::-;;;;;;;62616:9;:36::i;:::-;62667;62677:10;62691:11;;62689:13;;;;;:::i;:::-;;;;;;;62667:9;:36::i;:::-;62583:132;62740:1;62729:7;:12;62725:183;;;62758:36;62768:10;62782:11;;62780:13;;;;;:::i;:::-;;;;;;;62758:9;:36::i;:::-;62809;62819:10;62833:11;;62831:13;;;;;:::i;:::-;;;;;;;62809:9;:36::i;:::-;62860;62870:10;62884:11;;62882:13;;;;;:::i;:::-;;;;;;;62860:9;:36::i;:::-;62725:183;62933:1;62922:7;:12;62918:234;;;62951:36;62961:10;62975:11;;62973:13;;;;;:::i;:::-;;;;;;;62951:9;:36::i;:::-;63002;63012:10;63026:11;;63024:13;;;;;:::i;:::-;;;;;;;63002:9;:36::i;:::-;63053;63063:10;63077:11;;63075:13;;;;;:::i;:::-;;;;;;;63053:9;:36::i;:::-;63104;63114:10;63128:11;;63126:13;;;;;:::i;:::-;;;;;;;63104:9;:36::i;:::-;62918:234;61991:1170;61905:1256;;;:::o;30696:334::-;30769:13;30803:16;30811:7;30803;:16::i;:::-;30795:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30884:21;30908:10;:8;:10::i;:::-;30884:34;;30960:1;30942:7;30936:21;:25;:86;;;;;;;;;;;;;;;;;30988:7;30997:18;:7;:16;:18::i;:::-;30971:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30936:86;30929:93;;;30696:334;;;:::o;58010:758::-;58191:32;58226:14;:27;58241:11;58226:27;;;;;;;;;;;;;;;58254:11;58226:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;58267:6;58226:48;;;;;;;;;;;;;58191:83;;58326:1;58318:10;;58293:9;:21;;;:35;;58285:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58409:9;:23;;;58390:8;;:15;;:42;:90;;;;;58459:9;:21;;;58446:8;;58436:19;;;;;;;:::i;:::-;;;;;;;;:44;58390:90;58382:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;58585:1;58559:9;:23;;:27;;;;58629:1;58621:10;;58597:9;:21;;:34;;;;58700:4;:16;;;58717:11;58730;58743:6;58751:8;;58700:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58135:633;58010:758;;;;;:::o;32430:164::-;32527:4;32551:18;:25;32570:5;32551:25;;;;;;;;;;;;;;;:35;32577:8;32551:35;;;;;;;;;;;;;;;;;;;;;;;;;32544:42;;32430:164;;;;:::o;58776:158::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58912:14:::1;;58880:19;:29;58900:8;58880:29;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;58776:158:::0;;;:::o;52723:201::-;52045:12;:10;:12::i;:::-;52034:23;;:7;:5;:7::i;:::-;:23;;;52026:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52832:1:::1;52812:22;;:8;:22;;;;52804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52888:28;52907:8;52888:18;:28::i;:::-;52723:201:::0;:::o;27838:157::-;27923:4;27962:25;27947:40;;;:11;:40;;;;27940:47;;27838:157;;;:::o;35165:127::-;35230:4;35282:1;35254:30;;:7;:16;35262:7;35254:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35247:37;;35165:127;;;:::o;24637:98::-;24690:7;24717:10;24710:17;;24637:98;:::o;39311:174::-;39413:2;39386:15;:24;39402:7;39386:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39469:7;39465:2;39431:46;;39440:23;39455:7;39440:14;:23::i;:::-;39431:46;;;;;;;;;;;;39311:174;;:::o;66583:248::-;66717:14;66733:12;66760:8;66749:37;;;;;;;;;;;;:::i;:::-;66716:70;;;;66797:26;66807:6;66815:7;66797:9;:26::i;:::-;66705:126;;66583:248;;;;:::o;35459:348::-;35552:4;35577:16;35585:7;35577;:16::i;:::-;35569:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35653:13;35669:23;35684:7;35669:14;:23::i;:::-;35653:39;;35722:5;35711:16;;:7;:16;;;:51;;;;35755:7;35731:31;;:20;35743:7;35731:11;:20::i;:::-;:31;;;35711:51;:87;;;;35766:32;35783:5;35790:7;35766:16;:32::i;:::-;35711:87;35703:96;;;35459:348;;;;:::o;38568:625::-;38727:4;38700:31;;:23;38715:7;38700:14;:23::i;:::-;:31;;;38692:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38806:1;38792:16;;:2;:16;;;;38784:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38862:39;38883:4;38889:2;38893:7;38862:20;:39::i;:::-;38966:29;38983:1;38987:7;38966:8;:29::i;:::-;39027:1;39008:9;:15;39018:4;39008:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39056:1;39039:9;:13;39049:2;39039:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39087:2;39068:7;:16;39076:7;39068:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39126:7;39122:2;39107:27;;39116:4;39107:27;;;;;;;;;;;;39147:38;39167:4;39173:2;39177:7;39147:19;:38::i;:::-;38568:625;;;:::o;37811:420::-;37871:13;37887:23;37902:7;37887:14;:23::i;:::-;37871:39;;37923:48;37944:5;37959:1;37963:7;37923:20;:48::i;:::-;38012:29;38029:1;38033:7;38012:8;:29::i;:::-;38074:1;38054:9;:16;38064:5;38054:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38093:7;:16;38101:7;38093:16;;;;;;;;;;;;38086:23;;;;;;;;;;;38155:7;38151:1;38127:36;;38136:5;38127:36;;;;;;;;;;;;38176:47;38196:5;38211:1;38215:7;38176:19;:47::i;:::-;37860:371;37811:420;:::o;53084:191::-;53158:16;53177:6;;;;;;;;;;;53158:25;;53203:8;53194:6;;:17;;;;;;;;;;;;;;;;;;53258:8;53227:40;;53248:8;53227:40;;;;;;;;;;;;53147:128;53084:191;:::o;36149:110::-;36225:26;36235:2;36239:7;36225:26;;;;;;;;;;;;:9;:26::i;:::-;36149:110;;:::o;39627:315::-;39782:8;39773:17;;:5;:17;;;;39765:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39869:8;39831:18;:25;39850:5;39831:25;;;;;;;;;;;;;;;:35;39857:8;39831:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39915:8;39893:41;;39908:5;39893:41;;;39925:8;39893:41;;;;;;:::i;:::-;;;;;;;;39627:315;;;:::o;34537:::-;34694:28;34704:4;34710:2;34714:7;34694:9;:28::i;:::-;34741:48;34764:4;34770:2;34774:7;34783:5;34741:22;:48::i;:::-;34733:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34537:315;;;;:::o;54205:190::-;54330:4;54383;54354:25;54367:5;54374:4;54354:12;:25::i;:::-;:33;54347:40;;54205:190;;;;;:::o;66841:100::-;66893:13;66926:7;66919:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66841:100;:::o;25216:723::-;25272:13;25502:1;25493:5;:10;25489:53;;;25520:10;;;;;;;;;;;;;;;;;;;;;25489:53;25552:12;25567:5;25552:20;;25583:14;25608:78;25623:1;25615:4;:9;25608:78;;25641:8;;;;;:::i;:::-;;;;25672:2;25664:10;;;;;:::i;:::-;;;25608:78;;;25696:19;25728:6;25718:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25696:39;;25746:154;25762:1;25753:5;:10;25746:154;;25790:1;25780:11;;;;;:::i;:::-;;;25857:2;25849:5;:10;;;;:::i;:::-;25836:2;:24;;;;:::i;:::-;25823:39;;25806:6;25813;25806:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;25886:2;25877:11;;;;;:::i;:::-;;;25746:154;;;25924:6;25910:21;;;;;25216:723;;;;:::o;41878:126::-;;;;:::o;42389:125::-;;;;:::o;36486:321::-;36616:18;36622:2;36626:7;36616:5;:18::i;:::-;36667:54;36698:1;36702:2;36706:7;36715:5;36667:22;:54::i;:::-;36645:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36486:321;;;:::o;40507:799::-;40662:4;40683:15;:2;:13;;;:15::i;:::-;40679:620;;;40735:2;40719:36;;;40756:12;:10;:12::i;:::-;40770:4;40776:7;40785:5;40719:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40715:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40978:1;40961:6;:13;:18;40957:272;;;41004:60;;;;;;;;;;:::i;:::-;;;;;;;;40957:272;41179:6;41173:13;41164:6;41160:2;41156:15;41149:38;40715:529;40852:41;;;40842:51;;;:6;:51;;;;40835:58;;;;;40679:620;41283:4;41276:11;;40507:799;;;;;;;:::o;54757:675::-;54840:7;54860:20;54883:4;54860:27;;54903:9;54898:497;54922:5;:12;54918:1;:16;54898:497;;;54956:20;54979:5;54985:1;54979:8;;;;;;;;:::i;:::-;;;;;;;;54956:31;;55022:12;55006;:28;55002:382;;55149:42;55164:12;55178;55149:14;:42::i;:::-;55134:57;;55002:382;;;55326:42;55341:12;55355;55326:14;:42::i;:::-;55311:57;;55002:382;54941:454;54936:3;;;;;:::i;:::-;;;;54898:497;;;;55412:12;55405:19;;;54757:675;;;;:::o;37143:439::-;37237:1;37223:16;;:2;:16;;;;37215:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37296:16;37304:7;37296;:16::i;:::-;37295:17;37287:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37358:45;37387:1;37391:2;37395:7;37358:20;:45::i;:::-;37433:1;37416:9;:13;37426:2;37416:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37464:2;37445:7;:16;37453:7;37445:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37509:7;37505:2;37484:33;;37501:1;37484:33;;;;;;;;;;;;37530:44;37558:1;37562:2;37566:7;37530:19;:44::i;:::-;37143:439;;:::o;16688:326::-;16748:4;17005:1;16983:7;:19;;;:23;16976:30;;16688:326;;;:::o;55440:224::-;55508:13;55571:1;55565:4;55558:15;55600:1;55594:4;55587:15;55641:4;55635;55625:21;55616:30;;55440:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423: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;986:159::-;1051:5;1082:6;1076:13;1067:22;;1098:41;1133:5;1098:41;:::i;:::-;986:159;;;;:::o;1168:568::-;1241:8;1251:6;1301:3;1294:4;1286:6;1282:17;1278:27;1268:122;;1309:79;;:::i;:::-;1268:122;1422:6;1409:20;1399:30;;1452:18;1444:6;1441:30;1438:117;;;1474:79;;:::i;:::-;1438:117;1588:4;1580:6;1576:17;1564:29;;1642:3;1634:4;1626:6;1622:17;1612:8;1608:32;1605:41;1602:128;;;1649:79;;:::i;:::-;1602:128;1168:568;;;;;:::o;1742:133::-;1785:5;1823:6;1810:20;1801:29;;1839:30;1863:5;1839:30;:::i;:::-;1742:133;;;;:::o;1881:139::-;1927:5;1965:6;1952:20;1943:29;;1981:33;2008:5;1981:33;:::i;:::-;1881:139;;;;:::o;2026:137::-;2071:5;2109:6;2096:20;2087:29;;2125:32;2151:5;2125:32;:::i;:::-;2026:137;;;;:::o;2169:141::-;2225:5;2256:6;2250:13;2241:22;;2272:32;2298:5;2272:32;:::i;:::-;2169:141;;;;:::o;2329:552::-;2386:8;2396:6;2446:3;2439:4;2431:6;2427:17;2423:27;2413:122;;2454:79;;:::i;:::-;2413:122;2567:6;2554:20;2544:30;;2597:18;2589:6;2586:30;2583:117;;;2619:79;;:::i;:::-;2583:117;2733:4;2725:6;2721:17;2709:29;;2787:3;2779:4;2771:6;2767:17;2757:8;2753:32;2750:41;2747:128;;;2794:79;;:::i;:::-;2747:128;2329:552;;;;;:::o;2900:338::-;2955:5;3004:3;2997:4;2989:6;2985:17;2981:27;2971:122;;3012:79;;:::i;:::-;2971:122;3129:6;3116:20;3154:78;3228:3;3220:6;3213:4;3205:6;3201:17;3154:78;:::i;:::-;3145:87;;2961:277;2900:338;;;;:::o;3258:340::-;3314:5;3363:3;3356:4;3348:6;3344:17;3340:27;3330:122;;3371:79;;:::i;:::-;3330:122;3488:6;3475:20;3513:79;3588:3;3580:6;3573:4;3565:6;3561:17;3513:79;:::i;:::-;3504:88;;3320:278;3258:340;;;;:::o;3604:137::-;3649:5;3687:6;3674:20;3665:29;;3703:32;3729:5;3703:32;:::i;:::-;3604:137;;;;:::o;3747:139::-;3793:5;3831:6;3818:20;3809:29;;3847:33;3874:5;3847:33;:::i;:::-;3747:139;;;;:::o;3892:143::-;3949:5;3980:6;3974:13;3965:22;;3996:33;4023:5;3996:33;:::i;:::-;3892:143;;;;:::o;4041:137::-;4086:5;4124:6;4111:20;4102:29;;4140:32;4166:5;4140:32;:::i;:::-;4041:137;;;;:::o;4184:329::-;4243:6;4292:2;4280:9;4271:7;4267:23;4263:32;4260:119;;;4298:79;;:::i;:::-;4260:119;4418:1;4443:53;4488:7;4479:6;4468:9;4464:22;4443:53;:::i;:::-;4433:63;;4389:117;4184:329;;;;:::o;4519:523::-;4606:6;4614;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:72;4878:7;4869:6;4858:9;4854:22;4814:72;:::i;:::-;4804:82;;4760:136;4935:2;4961:64;5017:7;5008:6;4997:9;4993:22;4961:64;:::i;:::-;4951:74;;4906:129;4519:523;;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:619::-;5605:6;5613;5621;5670:2;5658:9;5649:7;5645:23;5641:32;5638:119;;;5676:79;;:::i;:::-;5638:119;5796:1;5821:53;5866:7;5857:6;5846:9;5842:22;5821:53;:::i;:::-;5811:63;;5767:117;5923:2;5949:53;5994:7;5985:6;5974:9;5970:22;5949:53;:::i;:::-;5939:63;;5894:118;6051:2;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6022:118;5528:619;;;;;:::o;6153:943::-;6248:6;6256;6264;6272;6321:3;6309:9;6300:7;6296:23;6292:33;6289:120;;;6328:79;;:::i;:::-;6289:120;6448:1;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;:::i;:::-;6463:63;;6419:117;6575:2;6601:53;6646:7;6637:6;6626:9;6622:22;6601:53;:::i;:::-;6591:63;;6546:118;6703:2;6729:53;6774:7;6765:6;6754:9;6750:22;6729:53;:::i;:::-;6719:63;;6674:118;6859:2;6848:9;6844:18;6831:32;6890:18;6882:6;6879:30;6876:117;;;6912:79;;:::i;:::-;6876:117;7017:62;7071:7;7062:6;7051:9;7047:22;7017:62;:::i;:::-;7007:72;;6802:287;6153:943;;;;;;;:::o;7102:468::-;7167:6;7175;7224:2;7212:9;7203:7;7199:23;7195:32;7192:119;;;7230:79;;:::i;:::-;7192:119;7350:1;7375:53;7420:7;7411:6;7400:9;7396:22;7375:53;:::i;:::-;7365:63;;7321:117;7477:2;7503:50;7545:7;7536:6;7525:9;7521:22;7503:50;:::i;:::-;7493:60;;7448:115;7102:468;;;;;:::o;7576:474::-;7644:6;7652;7701:2;7689:9;7680:7;7676:23;7672:32;7669:119;;;7707:79;;:::i;:::-;7669:119;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7954:2;7980:53;8025:7;8016:6;8005:9;8001:22;7980:53;:::i;:::-;7970:63;;7925:118;7576:474;;;;;:::o;8056:704::-;8151:6;8159;8167;8216:2;8204:9;8195:7;8191:23;8187:32;8184:119;;;8222:79;;:::i;:::-;8184:119;8370:1;8359:9;8355:17;8342:31;8400:18;8392:6;8389:30;8386:117;;;8422:79;;:::i;:::-;8386:117;8535:80;8607:7;8598:6;8587:9;8583:22;8535:80;:::i;:::-;8517:98;;;;8313:312;8664:2;8690:53;8735:7;8726:6;8715:9;8711:22;8690:53;:::i;:::-;8680:63;;8635:118;8056:704;;;;;:::o;8766:329::-;8825:6;8874:2;8862:9;8853:7;8849:23;8845:32;8842:119;;;8880:79;;:::i;:::-;8842:119;9000:1;9025:53;9070:7;9061:6;9050:9;9046:22;9025:53;:::i;:::-;9015:63;;8971:117;8766:329;;;;:::o;9101:327::-;9159:6;9208:2;9196:9;9187:7;9183:23;9179:32;9176:119;;;9214:79;;:::i;:::-;9176:119;9334:1;9359:52;9403:7;9394:6;9383:9;9379:22;9359:52;:::i;:::-;9349:62;;9305:116;9101:327;;;;:::o;9434:349::-;9503:6;9552:2;9540:9;9531:7;9527:23;9523:32;9520:119;;;9558:79;;:::i;:::-;9520:119;9678:1;9703:63;9758:7;9749:6;9738:9;9734:22;9703:63;:::i;:::-;9693:73;;9649:127;9434:349;;;;:::o;9789:509::-;9858:6;9907:2;9895:9;9886:7;9882:23;9878:32;9875:119;;;9913:79;;:::i;:::-;9875:119;10061:1;10050:9;10046:17;10033:31;10091:18;10083:6;10080:30;10077:117;;;10113:79;;:::i;:::-;10077:117;10218:63;10273:7;10264:6;10253:9;10249:22;10218:63;:::i;:::-;10208:73;;10004:287;9789:509;;;;:::o;10304:327::-;10362:6;10411:2;10399:9;10390:7;10386:23;10382:32;10379:119;;;10417:79;;:::i;:::-;10379:119;10537:1;10562:52;10606:7;10597:6;10586:9;10582:22;10562:52;:::i;:::-;10552:62;;10508:116;10304:327;;;;:::o;10637:670::-;10715:6;10723;10731;10780:2;10768:9;10759:7;10755:23;10751:32;10748:119;;;10786:79;;:::i;:::-;10748:119;10906:1;10931:52;10975:7;10966:6;10955:9;10951:22;10931:52;:::i;:::-;10921:62;;10877:116;11060:2;11049:9;11045:18;11032:32;11091:18;11083:6;11080:30;11077:117;;;11113:79;;:::i;:::-;11077:117;11226:64;11282:7;11273:6;11262:9;11258:22;11226:64;:::i;:::-;11208:82;;;;11003:297;10637:670;;;;;:::o;11313:795::-;11398:6;11406;11414;11463:2;11451:9;11442:7;11438:23;11434:32;11431:119;;;11469:79;;:::i;:::-;11431:119;11589:1;11614:52;11658:7;11649:6;11638:9;11634:22;11614:52;:::i;:::-;11604:62;;11560:116;11743:2;11732:9;11728:18;11715:32;11774:18;11766:6;11763:30;11760:117;;;11796:79;;:::i;:::-;11760:117;11901:62;11955:7;11946:6;11935:9;11931:22;11901:62;:::i;:::-;11891:72;;11686:287;12012:2;12038:53;12083:7;12074:6;12063:9;12059:22;12038:53;:::i;:::-;12028:63;;11983:118;11313:795;;;;;:::o;12114:1137::-;12218:6;12226;12234;12242;12250;12299:3;12287:9;12278:7;12274:23;12270:33;12267:120;;;12306:79;;:::i;:::-;12267:120;12426:1;12451:52;12495:7;12486:6;12475:9;12471:22;12451:52;:::i;:::-;12441:62;;12397:116;12580:2;12569:9;12565:18;12552:32;12611:18;12603:6;12600:30;12597:117;;;12633:79;;:::i;:::-;12597:117;12738:62;12792:7;12783:6;12772:9;12768:22;12738:62;:::i;:::-;12728:72;;12523:287;12849:2;12875:52;12919:7;12910:6;12899:9;12895:22;12875:52;:::i;:::-;12865:62;;12820:117;13004:2;12993:9;12989:18;12976:32;13035:18;13027:6;13024:30;13021:117;;;13057:79;;:::i;:::-;13021:117;13170:64;13226:7;13217:6;13206:9;13202:22;13170:64;:::i;:::-;13152:82;;;;12947:297;12114:1137;;;;;;;;:::o;13257:1117::-;13359:6;13367;13375;13383;13432:3;13420:9;13411:7;13407:23;13403:33;13400:120;;;13439:79;;:::i;:::-;13400:120;13559:1;13584:52;13628:7;13619:6;13608:9;13604:22;13584:52;:::i;:::-;13574:62;;13530:116;13713:2;13702:9;13698:18;13685:32;13744:18;13736:6;13733:30;13730:117;;;13766:79;;:::i;:::-;13730:117;13871:62;13925:7;13916:6;13905:9;13901:22;13871:62;:::i;:::-;13861:72;;13656:287;13982:2;14008:52;14052:7;14043:6;14032:9;14028:22;14008:52;:::i;:::-;13998:62;;13953:117;14137:2;14126:9;14122:18;14109:32;14168:18;14160:6;14157:30;14154:117;;;14190:79;;:::i;:::-;14154:117;14295:62;14349:7;14340:6;14329:9;14325:22;14295:62;:::i;:::-;14285:72;;14080:287;13257:1117;;;;;;;:::o;14380:472::-;14447:6;14455;14504:2;14492:9;14483:7;14479:23;14475:32;14472:119;;;14510:79;;:::i;:::-;14472:119;14630:1;14655:52;14699:7;14690:6;14679:9;14675:22;14655:52;:::i;:::-;14645:62;;14601:116;14756:2;14782:53;14827:7;14818:6;14807:9;14803:22;14782:53;:::i;:::-;14772:63;;14727:118;14380:472;;;;;:::o;14858:329::-;14917:6;14966:2;14954:9;14945:7;14941:23;14937:32;14934:119;;;14972:79;;:::i;:::-;14934:119;15092:1;15117:53;15162:7;15153:6;15142:9;15138:22;15117:53;:::i;:::-;15107:63;;15063:117;14858:329;;;;:::o;15193:507::-;15272:6;15280;15329:2;15317:9;15308:7;15304:23;15300:32;15297:119;;;15335:79;;:::i;:::-;15297:119;15455:1;15480:64;15536:7;15527:6;15516:9;15512:22;15480:64;:::i;:::-;15470:74;;15426:128;15593:2;15619:64;15675:7;15666:6;15655:9;15651:22;15619:64;:::i;:::-;15609:74;;15564:129;15193:507;;;;;:::o;15706:142::-;15809:32;15835:5;15809:32;:::i;:::-;15804:3;15797:45;15706:142;;:::o;15854:118::-;15941:24;15959:5;15941:24;:::i;:::-;15936:3;15929:37;15854:118;;:::o;15978:157::-;16083:45;16103:24;16121:5;16103:24;:::i;:::-;16083:45;:::i;:::-;16078:3;16071:58;15978:157;;:::o;16141:109::-;16222:21;16237:5;16222:21;:::i;:::-;16217:3;16210:34;16141:109;;:::o;16256:118::-;16343:24;16361:5;16343:24;:::i;:::-;16338:3;16331:37;16256:118;;:::o;16402:301::-;16498:3;16519:70;16582:6;16577:3;16519:70;:::i;:::-;16512:77;;16599:43;16635:6;16630:3;16623:5;16599:43;:::i;:::-;16667:29;16689:6;16667:29;:::i;:::-;16662:3;16658:39;16651:46;;16402:301;;;;;:::o;16731:314::-;16845:3;16866:88;16947:6;16942:3;16866:88;:::i;:::-;16859:95;;16964:43;17000:6;16995:3;16988:5;16964:43;:::i;:::-;17032:6;17027:3;17023:16;17016:23;;16731:314;;;;;:::o;17051:360::-;17137:3;17165:38;17197:5;17165:38;:::i;:::-;17219:70;17282:6;17277:3;17219:70;:::i;:::-;17212:77;;17298:52;17343:6;17338:3;17331:4;17324:5;17320:16;17298:52;:::i;:::-;17375:29;17397:6;17375:29;:::i;:::-;17370:3;17366:39;17359:46;;17141:270;17051:360;;;;:::o;17417:373::-;17521:3;17549:38;17581:5;17549:38;:::i;:::-;17603:88;17684:6;17679:3;17603:88;:::i;:::-;17596:95;;17700:52;17745:6;17740:3;17733:4;17726:5;17722:16;17700:52;:::i;:::-;17777:6;17772:3;17768:16;17761:23;;17525:265;17417:373;;;;:::o;17818:798::-;17901:3;17938:5;17932:12;17967:36;17993:9;17967:36;:::i;:::-;18019:70;18082:6;18077:3;18019:70;:::i;:::-;18012:77;;18120:1;18109:9;18105:17;18136:1;18131:135;;;;18280:1;18275:335;;;;18098:512;;18131:135;18215:4;18211:9;18200;18196:25;18191:3;18184:38;18251:4;18246:3;18242:14;18235:21;;18131:135;;18275:335;18342:37;18373:5;18342:37;:::i;:::-;18401:1;18415:154;18429:6;18426:1;18423:13;18415:154;;;18503:7;18497:14;18493:1;18488:3;18484:11;18477:35;18553:1;18544:7;18540:15;18529:26;;18451:4;18448:1;18444:12;18439:17;;18415:154;;;18598:1;18593:3;18589:11;18582:18;;18282:328;;18098:512;;17905:711;;17818:798;;;;:::o;18644:841::-;18745:3;18782:5;18776:12;18811:36;18837:9;18811:36;:::i;:::-;18863:88;18944:6;18939:3;18863:88;:::i;:::-;18856:95;;18982:1;18971:9;18967:17;18998:1;18993:137;;;;19144:1;19139:340;;;;18960:519;;18993:137;19077:4;19073:9;19062;19058:25;19053:3;19046:38;19113:6;19108:3;19104:16;19097:23;;18993:137;;19139:340;19206:37;19237:5;19206:37;:::i;:::-;19265:1;19279:154;19293:6;19290:1;19287:13;19279:154;;;19367:7;19361:14;19357:1;19352:3;19348:11;19341:35;19417:1;19408:7;19404:15;19393:26;;19315:4;19312:1;19308:12;19303:17;;19279:154;;;19462:6;19457:3;19453:16;19446:23;;19146:333;;18960:519;;18749:736;;18644:841;;;;:::o;19491:364::-;19579:3;19607:39;19640:5;19607:39;:::i;:::-;19662:71;19726:6;19721:3;19662:71;:::i;:::-;19655:78;;19742:52;19787:6;19782:3;19775:4;19768:5;19764:16;19742:52;:::i;:::-;19819:29;19841:6;19819:29;:::i;:::-;19814:3;19810:39;19803:46;;19583:272;19491:364;;;;:::o;19861:377::-;19967:3;19995:39;20028:5;19995:39;:::i;:::-;20050:89;20132:6;20127:3;20050:89;:::i;:::-;20043:96;;20148:52;20193:6;20188:3;20181:4;20174:5;20170:16;20148:52;:::i;:::-;20225:6;20220:3;20216:16;20209:23;;19971:267;19861:377;;;;:::o;20244:366::-;20386:3;20407:67;20471:2;20466:3;20407:67;:::i;:::-;20400:74;;20483:93;20572:3;20483:93;:::i;:::-;20601:2;20596:3;20592:12;20585:19;;20244:366;;;:::o;20616:::-;20758:3;20779:67;20843:2;20838:3;20779:67;:::i;:::-;20772:74;;20855:93;20944:3;20855:93;:::i;:::-;20973:2;20968:3;20964:12;20957:19;;20616:366;;;:::o;20988:::-;21130:3;21151:67;21215:2;21210:3;21151:67;:::i;:::-;21144:74;;21227:93;21316:3;21227:93;:::i;:::-;21345:2;21340:3;21336:12;21329:19;;20988:366;;;:::o;21360:::-;21502:3;21523:67;21587:2;21582:3;21523:67;:::i;:::-;21516:74;;21599:93;21688:3;21599:93;:::i;:::-;21717:2;21712:3;21708:12;21701:19;;21360:366;;;:::o;21732:::-;21874:3;21895:67;21959:2;21954:3;21895:67;:::i;:::-;21888:74;;21971:93;22060:3;21971:93;:::i;:::-;22089:2;22084:3;22080:12;22073:19;;21732:366;;;:::o;22104:::-;22246:3;22267:67;22331:2;22326:3;22267:67;:::i;:::-;22260:74;;22343:93;22432:3;22343:93;:::i;:::-;22461:2;22456:3;22452:12;22445:19;;22104:366;;;:::o;22476:::-;22618:3;22639:67;22703:2;22698:3;22639:67;:::i;:::-;22632:74;;22715:93;22804:3;22715:93;:::i;:::-;22833:2;22828:3;22824:12;22817:19;;22476:366;;;:::o;22848:::-;22990:3;23011:67;23075:2;23070:3;23011:67;:::i;:::-;23004:74;;23087:93;23176:3;23087:93;:::i;:::-;23205:2;23200:3;23196:12;23189:19;;22848:366;;;:::o;23220:::-;23362:3;23383:67;23447:2;23442:3;23383:67;:::i;:::-;23376:74;;23459:93;23548:3;23459:93;:::i;:::-;23577:2;23572:3;23568:12;23561:19;;23220:366;;;:::o;23592:::-;23734:3;23755:67;23819:2;23814:3;23755:67;:::i;:::-;23748:74;;23831:93;23920:3;23831:93;:::i;:::-;23949:2;23944:3;23940:12;23933:19;;23592:366;;;:::o;23964:::-;24106:3;24127:67;24191:2;24186:3;24127:67;:::i;:::-;24120:74;;24203:93;24292:3;24203:93;:::i;:::-;24321:2;24316:3;24312:12;24305:19;;23964:366;;;:::o;24336:::-;24478:3;24499:67;24563:2;24558:3;24499:67;:::i;:::-;24492:74;;24575:93;24664:3;24575:93;:::i;:::-;24693:2;24688:3;24684:12;24677:19;;24336:366;;;:::o;24708:::-;24850:3;24871:67;24935:2;24930:3;24871:67;:::i;:::-;24864:74;;24947:93;25036:3;24947:93;:::i;:::-;25065:2;25060:3;25056:12;25049:19;;24708:366;;;:::o;25080:::-;25222:3;25243:67;25307:2;25302:3;25243:67;:::i;:::-;25236:74;;25319:93;25408:3;25319:93;:::i;:::-;25437:2;25432:3;25428:12;25421:19;;25080:366;;;:::o;25452:::-;25594:3;25615:67;25679:2;25674:3;25615:67;:::i;:::-;25608:74;;25691:93;25780:3;25691:93;:::i;:::-;25809:2;25804:3;25800:12;25793:19;;25452:366;;;:::o;25824:::-;25966:3;25987:67;26051:2;26046:3;25987:67;:::i;:::-;25980:74;;26063:93;26152:3;26063:93;:::i;:::-;26181:2;26176:3;26172:12;26165:19;;25824:366;;;:::o;26196:::-;26338:3;26359:67;26423:2;26418:3;26359:67;:::i;:::-;26352:74;;26435:93;26524:3;26435:93;:::i;:::-;26553:2;26548:3;26544:12;26537:19;;26196:366;;;:::o;26568:::-;26710:3;26731:67;26795:2;26790:3;26731:67;:::i;:::-;26724:74;;26807:93;26896:3;26807:93;:::i;:::-;26925:2;26920:3;26916:12;26909:19;;26568:366;;;:::o;26940:::-;27082:3;27103:67;27167:2;27162:3;27103:67;:::i;:::-;27096:74;;27179:93;27268:3;27179:93;:::i;:::-;27297:2;27292:3;27288:12;27281:19;;26940:366;;;:::o;27312:::-;27454:3;27475:67;27539:2;27534:3;27475:67;:::i;:::-;27468:74;;27551:93;27640:3;27551:93;:::i;:::-;27669:2;27664:3;27660:12;27653:19;;27312:366;;;:::o;27684:::-;27826:3;27847:67;27911:2;27906:3;27847:67;:::i;:::-;27840:74;;27923:93;28012:3;27923:93;:::i;:::-;28041:2;28036:3;28032:12;28025:19;;27684:366;;;:::o;28056:::-;28198:3;28219:67;28283:2;28278:3;28219:67;:::i;:::-;28212:74;;28295:93;28384:3;28295:93;:::i;:::-;28413:2;28408:3;28404:12;28397:19;;28056:366;;;:::o;28428:::-;28570:3;28591:67;28655:2;28650:3;28591:67;:::i;:::-;28584:74;;28667:93;28756:3;28667:93;:::i;:::-;28785:2;28780:3;28776:12;28769:19;;28428:366;;;:::o;28800:::-;28942:3;28963:67;29027:2;29022:3;28963:67;:::i;:::-;28956:74;;29039:93;29128:3;29039:93;:::i;:::-;29157:2;29152:3;29148:12;29141:19;;28800:366;;;:::o;29172:::-;29314:3;29335:67;29399:2;29394:3;29335:67;:::i;:::-;29328:74;;29411:93;29500:3;29411:93;:::i;:::-;29529:2;29524:3;29520:12;29513:19;;29172:366;;;:::o;29544:::-;29686:3;29707:67;29771:2;29766:3;29707:67;:::i;:::-;29700:74;;29783:93;29872:3;29783:93;:::i;:::-;29901:2;29896:3;29892:12;29885:19;;29544:366;;;:::o;29916:::-;30058:3;30079:67;30143:2;30138:3;30079:67;:::i;:::-;30072:74;;30155:93;30244:3;30155:93;:::i;:::-;30273:2;30268:3;30264:12;30257:19;;29916:366;;;:::o;30288:::-;30430:3;30451:67;30515:2;30510:3;30451:67;:::i;:::-;30444:74;;30527:93;30616:3;30527:93;:::i;:::-;30645:2;30640:3;30636:12;30629:19;;30288:366;;;:::o;30660:::-;30802:3;30823:67;30887:2;30882:3;30823:67;:::i;:::-;30816:74;;30899:93;30988:3;30899:93;:::i;:::-;31017:2;31012:3;31008:12;31001:19;;30660:366;;;:::o;31032:::-;31174:3;31195:67;31259:2;31254:3;31195:67;:::i;:::-;31188:74;;31271:93;31360:3;31271:93;:::i;:::-;31389:2;31384:3;31380:12;31373:19;;31032:366;;;:::o;31404:115::-;31489:23;31506:5;31489:23;:::i;:::-;31484:3;31477:36;31404:115;;:::o;31525:153::-;31628:43;31647:23;31664:5;31647:23;:::i;:::-;31628:43;:::i;:::-;31623:3;31616:56;31525:153;;:::o;31684:118::-;31771:24;31789:5;31771:24;:::i;:::-;31766:3;31759:37;31684:118;;:::o;31808:157::-;31913:45;31933:24;31951:5;31933:24;:::i;:::-;31913:45;:::i;:::-;31908:3;31901:58;31808:157;;:::o;31971:115::-;32056:23;32073:5;32056:23;:::i;:::-;32051:3;32044:36;31971:115;;:::o;32092:256::-;32204:3;32219:75;32290:3;32281:6;32219:75;:::i;:::-;32319:2;32314:3;32310:12;32303:19;;32339:3;32332:10;;32092:256;;;;:::o;32354:291::-;32494:3;32516:103;32615:3;32606:6;32598;32516:103;:::i;:::-;32509:110;;32636:3;32629:10;;32354:291;;;;;:::o;32651:271::-;32781:3;32803:93;32892:3;32883:6;32803:93;:::i;:::-;32796:100;;32913:3;32906:10;;32651:271;;;;:::o;32928:265::-;33055:3;33077:90;33163:3;33154:6;33077:90;:::i;:::-;33070:97;;33184:3;33177:10;;32928:265;;;;:::o;33199:435::-;33379:3;33401:95;33492:3;33483:6;33401:95;:::i;:::-;33394:102;;33513:95;33604:3;33595:6;33513:95;:::i;:::-;33506:102;;33625:3;33618:10;;33199:435;;;;;:::o;33640:392::-;33778:3;33793:73;33862:3;33853:6;33793:73;:::i;:::-;33891:1;33886:3;33882:11;33875:18;;33903:75;33974:3;33965:6;33903:75;:::i;:::-;34003:2;33998:3;33994:12;33987:19;;34023:3;34016:10;;33640:392;;;;;:::o;34038:222::-;34131:4;34169:2;34158:9;34154:18;34146:26;;34182:71;34250:1;34239:9;34235:17;34226:6;34182:71;:::i;:::-;34038:222;;;;:::o;34266:640::-;34461:4;34499:3;34488:9;34484:19;34476:27;;34513:71;34581:1;34570:9;34566:17;34557:6;34513:71;:::i;:::-;34594:72;34662:2;34651:9;34647:18;34638:6;34594:72;:::i;:::-;34676;34744:2;34733:9;34729:18;34720:6;34676:72;:::i;:::-;34795:9;34789:4;34785:20;34780:2;34769:9;34765:18;34758:48;34823:76;34894:4;34885:6;34823:76;:::i;:::-;34815:84;;34266:640;;;;;;;:::o;34912:332::-;35033:4;35071:2;35060:9;35056:18;35048:26;;35084:71;35152:1;35141:9;35137:17;35128:6;35084:71;:::i;:::-;35165:72;35233:2;35222:9;35218:18;35209:6;35165:72;:::i;:::-;34912:332;;;;;:::o;35250:210::-;35337:4;35375:2;35364:9;35360:18;35352:26;;35388:65;35450:1;35439:9;35435:17;35426:6;35388:65;:::i;:::-;35250:210;;;;:::o;35466:222::-;35559:4;35597:2;35586:9;35582:18;35574:26;;35610:71;35678:1;35667:9;35663:17;35654:6;35610:71;:::i;:::-;35466:222;;;;:::o;35694:309::-;35805:4;35843:2;35832:9;35828:18;35820:26;;35892:9;35886:4;35882:20;35878:1;35867:9;35863:17;35856:47;35920:76;35991:4;35982:6;35920:76;:::i;:::-;35912:84;;35694:309;;;;:::o;36009:313::-;36122:4;36160:2;36149:9;36145:18;36137:26;;36209:9;36203:4;36199:20;36195:1;36184:9;36180:17;36173:47;36237:78;36310:4;36301:6;36237:78;:::i;:::-;36229:86;;36009:313;;;;:::o;36328:419::-;36494:4;36532:2;36521:9;36517:18;36509:26;;36581:9;36575:4;36571:20;36567:1;36556:9;36552:17;36545:47;36609:131;36735:4;36609:131;:::i;:::-;36601:139;;36328:419;;;:::o;36753:::-;36919:4;36957:2;36946:9;36942:18;36934:26;;37006:9;37000:4;36996:20;36992:1;36981:9;36977:17;36970:47;37034:131;37160:4;37034:131;:::i;:::-;37026:139;;36753:419;;;:::o;37178:::-;37344:4;37382:2;37371:9;37367:18;37359:26;;37431:9;37425:4;37421:20;37417:1;37406:9;37402:17;37395:47;37459:131;37585:4;37459:131;:::i;:::-;37451:139;;37178:419;;;:::o;37603:::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37603:419;;;:::o;38028:::-;38194:4;38232:2;38221:9;38217:18;38209:26;;38281:9;38275:4;38271:20;38267:1;38256:9;38252:17;38245:47;38309:131;38435:4;38309:131;:::i;:::-;38301:139;;38028:419;;;:::o;38453:::-;38619:4;38657:2;38646:9;38642:18;38634:26;;38706:9;38700:4;38696:20;38692:1;38681:9;38677:17;38670:47;38734:131;38860:4;38734:131;:::i;:::-;38726:139;;38453:419;;;:::o;38878:::-;39044:4;39082:2;39071:9;39067:18;39059:26;;39131:9;39125:4;39121:20;39117:1;39106:9;39102:17;39095:47;39159:131;39285:4;39159:131;:::i;:::-;39151:139;;38878:419;;;:::o;39303:::-;39469:4;39507:2;39496:9;39492:18;39484:26;;39556:9;39550:4;39546:20;39542:1;39531:9;39527:17;39520:47;39584:131;39710:4;39584:131;:::i;:::-;39576:139;;39303:419;;;:::o;39728:::-;39894:4;39932:2;39921:9;39917:18;39909:26;;39981:9;39975:4;39971:20;39967:1;39956:9;39952:17;39945:47;40009:131;40135:4;40009:131;:::i;:::-;40001:139;;39728:419;;;:::o;40153:::-;40319:4;40357:2;40346:9;40342:18;40334:26;;40406:9;40400:4;40396:20;40392:1;40381:9;40377:17;40370:47;40434:131;40560:4;40434:131;:::i;:::-;40426:139;;40153:419;;;:::o;40578:::-;40744:4;40782:2;40771:9;40767:18;40759:26;;40831:9;40825:4;40821:20;40817:1;40806:9;40802:17;40795:47;40859:131;40985:4;40859:131;:::i;:::-;40851:139;;40578:419;;;:::o;41003:::-;41169:4;41207:2;41196:9;41192:18;41184:26;;41256:9;41250:4;41246:20;41242:1;41231:9;41227:17;41220:47;41284:131;41410:4;41284:131;:::i;:::-;41276:139;;41003:419;;;:::o;41428:::-;41594:4;41632:2;41621:9;41617:18;41609:26;;41681:9;41675:4;41671:20;41667:1;41656:9;41652:17;41645:47;41709:131;41835:4;41709:131;:::i;:::-;41701:139;;41428:419;;;:::o;41853:::-;42019:4;42057:2;42046:9;42042:18;42034:26;;42106:9;42100:4;42096:20;42092:1;42081:9;42077:17;42070:47;42134:131;42260:4;42134:131;:::i;:::-;42126:139;;41853:419;;;:::o;42278:::-;42444:4;42482:2;42471:9;42467:18;42459:26;;42531:9;42525:4;42521:20;42517:1;42506:9;42502:17;42495:47;42559:131;42685:4;42559:131;:::i;:::-;42551:139;;42278:419;;;:::o;42703:::-;42869:4;42907:2;42896:9;42892:18;42884:26;;42956:9;42950:4;42946:20;42942:1;42931:9;42927:17;42920:47;42984:131;43110:4;42984:131;:::i;:::-;42976:139;;42703:419;;;:::o;43128:::-;43294:4;43332:2;43321:9;43317:18;43309:26;;43381:9;43375:4;43371:20;43367:1;43356:9;43352:17;43345:47;43409:131;43535:4;43409:131;:::i;:::-;43401:139;;43128:419;;;:::o;43553:::-;43719:4;43757:2;43746:9;43742:18;43734:26;;43806:9;43800:4;43796:20;43792:1;43781:9;43777:17;43770:47;43834:131;43960:4;43834:131;:::i;:::-;43826:139;;43553:419;;;:::o;43978:::-;44144:4;44182:2;44171:9;44167:18;44159:26;;44231:9;44225:4;44221:20;44217:1;44206:9;44202:17;44195:47;44259:131;44385:4;44259:131;:::i;:::-;44251:139;;43978:419;;;:::o;44403:::-;44569:4;44607:2;44596:9;44592:18;44584:26;;44656:9;44650:4;44646:20;44642:1;44631:9;44627:17;44620:47;44684:131;44810:4;44684:131;:::i;:::-;44676:139;;44403:419;;;:::o;44828:::-;44994:4;45032:2;45021:9;45017:18;45009:26;;45081:9;45075:4;45071:20;45067:1;45056:9;45052:17;45045:47;45109:131;45235:4;45109:131;:::i;:::-;45101:139;;44828:419;;;:::o;45253:::-;45419:4;45457:2;45446:9;45442:18;45434:26;;45506:9;45500:4;45496:20;45492:1;45481:9;45477:17;45470:47;45534:131;45660:4;45534:131;:::i;:::-;45526:139;;45253:419;;;:::o;45678:::-;45844:4;45882:2;45871:9;45867:18;45859:26;;45931:9;45925:4;45921:20;45917:1;45906:9;45902:17;45895:47;45959:131;46085:4;45959:131;:::i;:::-;45951:139;;45678:419;;;:::o;46103:::-;46269:4;46307:2;46296:9;46292:18;46284:26;;46356:9;46350:4;46346:20;46342:1;46331:9;46327:17;46320:47;46384:131;46510:4;46384:131;:::i;:::-;46376:139;;46103:419;;;:::o;46528:::-;46694:4;46732:2;46721:9;46717:18;46709:26;;46781:9;46775:4;46771:20;46767:1;46756:9;46752:17;46745:47;46809:131;46935:4;46809:131;:::i;:::-;46801:139;;46528:419;;;:::o;46953:::-;47119:4;47157:2;47146:9;47142:18;47134:26;;47206:9;47200:4;47196:20;47192:1;47181:9;47177:17;47170:47;47234:131;47360:4;47234:131;:::i;:::-;47226:139;;46953:419;;;:::o;47378:::-;47544:4;47582:2;47571:9;47567:18;47559:26;;47631:9;47625:4;47621:20;47617:1;47606:9;47602:17;47595:47;47659:131;47785:4;47659:131;:::i;:::-;47651:139;;47378:419;;;:::o;47803:::-;47969:4;48007:2;47996:9;47992:18;47984:26;;48056:9;48050:4;48046:20;48042:1;48031:9;48027:17;48020:47;48084:131;48210:4;48084:131;:::i;:::-;48076:139;;47803:419;;;:::o;48228:::-;48394:4;48432:2;48421:9;48417:18;48409:26;;48481:9;48475:4;48471:20;48467:1;48456:9;48452:17;48445:47;48509:131;48635:4;48509:131;:::i;:::-;48501:139;;48228:419;;;:::o;48653:::-;48819:4;48857:2;48846:9;48842:18;48834:26;;48906:9;48900:4;48896:20;48892:1;48881:9;48877:17;48870:47;48934:131;49060:4;48934:131;:::i;:::-;48926:139;;48653:419;;;:::o;49078:822::-;49311:4;49349:3;49338:9;49334:19;49326:27;;49363:69;49429:1;49418:9;49414:17;49405:6;49363:69;:::i;:::-;49442:72;49510:2;49499:9;49495:18;49486:6;49442:72;:::i;:::-;49561:9;49555:4;49551:20;49546:2;49535:9;49531:18;49524:48;49589:76;49660:4;49651:6;49589:76;:::i;:::-;49581:84;;49675:66;49737:2;49726:9;49722:18;49713:6;49675:66;:::i;:::-;49789:9;49783:4;49779:20;49773:3;49762:9;49758:19;49751:49;49817:76;49888:4;49879:6;49817:76;:::i;:::-;49809:84;;49078:822;;;;;;;;:::o;49906:739::-;50125:4;50163:3;50152:9;50148:19;50140:27;;50177:69;50243:1;50232:9;50228:17;50219:6;50177:69;:::i;:::-;50293:9;50287:4;50283:20;50278:2;50267:9;50263:18;50256:48;50321:76;50392:4;50383:6;50321:76;:::i;:::-;50313:84;;50407:70;50473:2;50462:9;50458:18;50449:6;50407:70;:::i;:::-;50524:9;50518:4;50514:20;50509:2;50498:9;50494:18;50487:48;50552:86;50633:4;50624:6;50616;50552:86;:::i;:::-;50544:94;;49906:739;;;;;;;;:::o;50651:719::-;50860:4;50898:3;50887:9;50883:19;50875:27;;50912:69;50978:1;50967:9;50963:17;50954:6;50912:69;:::i;:::-;51028:9;51022:4;51018:20;51013:2;51002:9;50998:18;50991:48;51056:76;51127:4;51118:6;51056:76;:::i;:::-;51048:84;;51142:70;51208:2;51197:9;51193:18;51184:6;51142:70;:::i;:::-;51259:9;51253:4;51249:20;51244:2;51233:9;51229:18;51222:48;51287:76;51358:4;51349:6;51287:76;:::i;:::-;51279:84;;50651:719;;;;;;;:::o;51376:1058::-;51674:4;51712:3;51701:9;51697:19;51689:27;;51726:69;51792:1;51781:9;51777:17;51768:6;51726:69;:::i;:::-;51842:9;51836:4;51832:20;51827:2;51816:9;51812:18;51805:48;51870:73;51938:4;51929:6;51870:73;:::i;:::-;51862:81;;51990:9;51984:4;51980:20;51975:2;51964:9;51960:18;51953:48;52018:76;52089:4;52080:6;52018:76;:::i;:::-;52010:84;;52104:88;52188:2;52177:9;52173:18;52164:6;52104:88;:::i;:::-;52202:73;52270:3;52259:9;52255:19;52246:6;52202:73;:::i;:::-;52323:9;52317:4;52313:20;52307:3;52296:9;52292:19;52285:49;52351:76;52422:4;52413:6;52351:76;:::i;:::-;52343:84;;51376:1058;;;;;;;;;:::o;52440:222::-;52533:4;52571:2;52560:9;52556:18;52548:26;;52584:71;52652:1;52641:9;52637:17;52628:6;52584:71;:::i;:::-;52440:222;;;;:::o;52668:332::-;52789:4;52827:2;52816:9;52812:18;52804:26;;52840:71;52908:1;52897:9;52893:17;52884:6;52840:71;:::i;:::-;52921:72;52989:2;52978:9;52974:18;52965:6;52921:72;:::i;:::-;52668:332;;;;;:::o;53006:129::-;53040:6;53067:20;;:::i;:::-;53057:30;;53096:33;53124:4;53116:6;53096:33;:::i;:::-;53006:129;;;:::o;53141:75::-;53174:6;53207:2;53201:9;53191:19;;53141:75;:::o;53222:307::-;53283:4;53373:18;53365:6;53362:30;53359:56;;;53395:18;;:::i;:::-;53359:56;53433:29;53455:6;53433:29;:::i;:::-;53425:37;;53517:4;53511;53507:15;53499:23;;53222:307;;;:::o;53535:308::-;53597:4;53687:18;53679:6;53676:30;53673:56;;;53709:18;;:::i;:::-;53673:56;53747:29;53769:6;53747:29;:::i;:::-;53739:37;;53831:4;53825;53821:15;53813:23;;53535:308;;;:::o;53849:140::-;53897:4;53920:3;53912:11;;53943:3;53940:1;53933:14;53977:4;53974:1;53964:18;53956:26;;53849:140;;;:::o;53995:98::-;54046:6;54080:5;54074:12;54064:22;;53995:98;;;:::o;54099:99::-;54151:6;54185:5;54179:12;54169:22;;54099:99;;;:::o;54204:168::-;54287:11;54321:6;54316:3;54309:19;54361:4;54356:3;54352:14;54337:29;;54204:168;;;;:::o;54378:147::-;54479:11;54516:3;54501:18;;54378:147;;;;:::o;54531:169::-;54615:11;54649:6;54644:3;54637:19;54689:4;54684:3;54680:14;54665:29;;54531:169;;;;:::o;54706:148::-;54808:11;54845:3;54830:18;;54706:148;;;;:::o;54860:305::-;54900:3;54919:20;54937:1;54919:20;:::i;:::-;54914:25;;54953:20;54971:1;54953:20;:::i;:::-;54948:25;;55107:1;55039:66;55035:74;55032:1;55029:81;55026:107;;;55113:18;;:::i;:::-;55026:107;55157:1;55154;55150:9;55143:16;;54860:305;;;;:::o;55171:185::-;55211:1;55228:20;55246:1;55228:20;:::i;:::-;55223:25;;55262:20;55280:1;55262:20;:::i;:::-;55257:25;;55301:1;55291:35;;55306:18;;:::i;:::-;55291:35;55348:1;55345;55341:9;55336:14;;55171:185;;;;:::o;55362:348::-;55402:7;55425:20;55443:1;55425:20;:::i;:::-;55420:25;;55459:20;55477:1;55459:20;:::i;:::-;55454:25;;55647:1;55579:66;55575:74;55572:1;55569:81;55564:1;55557:9;55550:17;55546:105;55543:131;;;55654:18;;:::i;:::-;55543:131;55702:1;55699;55695:9;55684:20;;55362:348;;;;:::o;55716:191::-;55756:4;55776:20;55794:1;55776:20;:::i;:::-;55771:25;;55810:20;55828:1;55810:20;:::i;:::-;55805:25;;55849:1;55846;55843:8;55840:34;;;55854:18;;:::i;:::-;55840:34;55899:1;55896;55892:9;55884:17;;55716:191;;;;:::o;55913:96::-;55950:7;55979:24;55997:5;55979:24;:::i;:::-;55968:35;;55913:96;;;:::o;56015:104::-;56060:7;56089:24;56107:5;56089:24;:::i;:::-;56078:35;;56015:104;;;:::o;56125:90::-;56159:7;56202:5;56195:13;56188:21;56177:32;;56125:90;;;:::o;56221:77::-;56258:7;56287:5;56276:16;;56221:77;;;:::o;56304:149::-;56340:7;56380:66;56373:5;56369:78;56358:89;;56304:149;;;:::o;56459:89::-;56495:7;56535:6;56528:5;56524:18;56513:29;;56459:89;;;:::o;56554:126::-;56591:7;56631:42;56624:5;56620:54;56609:65;;56554:126;;;:::o;56686:77::-;56723:7;56752:5;56741:16;;56686:77;;;:::o;56769:101::-;56805:7;56845:18;56838:5;56834:30;56823:41;;56769:101;;;:::o;56876:154::-;56960:6;56955:3;56950;56937:30;57022:1;57013:6;57008:3;57004:16;56997:27;56876:154;;;:::o;57036:307::-;57104:1;57114:113;57128:6;57125:1;57122:13;57114:113;;;57213:1;57208:3;57204:11;57198:18;57194:1;57189:3;57185:11;57178:39;57150:2;57147:1;57143:10;57138:15;;57114:113;;;57245:6;57242:1;57239:13;57236:101;;;57325:1;57316:6;57311:3;57307:16;57300:27;57236:101;57085:258;57036:307;;;:::o;57349:320::-;57393:6;57430:1;57424:4;57420:12;57410:22;;57477:1;57471:4;57467:12;57498:18;57488:81;;57554:4;57546:6;57542:17;57532:27;;57488:81;57616:2;57608:6;57605:14;57585:18;57582:38;57579:84;;;57635:18;;:::i;:::-;57579:84;57400:269;57349:320;;;:::o;57675:281::-;57758:27;57780:4;57758:27;:::i;:::-;57750:6;57746:40;57888:6;57876:10;57873:22;57852:18;57840:10;57837:34;57834:62;57831:88;;;57899:18;;:::i;:::-;57831:88;57939:10;57935:2;57928:22;57718:238;57675:281;;:::o;57962:233::-;58001:3;58024:24;58042:5;58024:24;:::i;:::-;58015:33;;58070:66;58063:5;58060:77;58057:103;;;58140:18;;:::i;:::-;58057:103;58187:1;58180:5;58176:13;58169:20;;57962:233;;;:::o;58201:100::-;58240:7;58269:26;58289:5;58269:26;:::i;:::-;58258:37;;58201:100;;;:::o;58307:94::-;58345:7;58374:21;58389:5;58374:21;:::i;:::-;58363:32;;58307:94;;;:::o;58407:::-;58446:7;58475:20;58489:5;58475:20;:::i;:::-;58464:31;;58407:94;;;:::o;58507:79::-;58546:7;58575:5;58564:16;;58507:79;;;:::o;58592:176::-;58624:1;58641:20;58659:1;58641:20;:::i;:::-;58636:25;;58675:20;58693:1;58675:20;:::i;:::-;58670:25;;58714:1;58704:35;;58719:18;;:::i;:::-;58704:35;58760:1;58757;58753:9;58748:14;;58592:176;;;;:::o;58774:180::-;58822:77;58819:1;58812:88;58919:4;58916:1;58909:15;58943:4;58940:1;58933:15;58960:180;59008:77;59005:1;58998:88;59105:4;59102:1;59095:15;59129:4;59126:1;59119:15;59146:180;59194:77;59191:1;59184:88;59291:4;59288:1;59281:15;59315:4;59312:1;59305:15;59332:180;59380:77;59377:1;59370:88;59477:4;59474:1;59467:15;59501:4;59498:1;59491:15;59518:180;59566:77;59563:1;59556:88;59663:4;59660:1;59653:15;59687:4;59684:1;59677:15;59704:117;59813:1;59810;59803:12;59827:117;59936:1;59933;59926:12;59950:117;60059:1;60056;60049:12;60073:117;60182:1;60179;60172:12;60196:117;60305:1;60302;60295:12;60319:117;60428:1;60425;60418:12;60442:102;60483:6;60534:2;60530:7;60525:2;60518:5;60514:14;60510:28;60500:38;;60442:102;;;:::o;60550:96::-;60584:8;60633:5;60628:3;60624:15;60603:36;;60550:96;;;:::o;60652:94::-;60685:8;60733:5;60729:2;60725:14;60704:35;;60652:94;;;:::o;60752:178::-;60892:30;60888:1;60880:6;60876:14;60869:54;60752:178;:::o;60936:182::-;61076:34;61072:1;61064:6;61060:14;61053:58;60936:182;:::o;61124:237::-;61264:34;61260:1;61252:6;61248:14;61241:58;61333:20;61328:2;61320:6;61316:15;61309:45;61124:237;:::o;61367:163::-;61507:15;61503:1;61495:6;61491:14;61484:39;61367:163;:::o;61536:225::-;61676:34;61672:1;61664:6;61660:14;61653:58;61745:8;61740:2;61732:6;61728:15;61721:33;61536:225;:::o;61767:224::-;61907:34;61903:1;61895:6;61891:14;61884:58;61976:7;61971:2;61963:6;61959:15;61952:32;61767:224;:::o;61997:178::-;62137:30;62133:1;62125:6;62121:14;62114:54;61997:178;:::o;62181:165::-;62321:17;62317:1;62309:6;62305:14;62298:41;62181:165;:::o;62352:175::-;62492:27;62488:1;62480:6;62476:14;62469:51;62352:175;:::o;62533:223::-;62673:34;62669:1;62661:6;62657:14;62650:58;62742:6;62737:2;62729:6;62725:15;62718:31;62533:223;:::o;62762:175::-;62902:27;62898:1;62890:6;62886:14;62879:51;62762:175;:::o;62943:176::-;63083:28;63079:1;63071:6;63067:14;63060:52;62943:176;:::o;63125:231::-;63265:34;63261:1;63253:6;63249:14;63242:58;63334:14;63329:2;63321:6;63317:15;63310:39;63125:231;:::o;63362:243::-;63502:34;63498:1;63490:6;63486:14;63479:58;63571:26;63566:2;63558:6;63554:15;63547:51;63362:243;:::o;63611:228::-;63751:34;63747:1;63739:6;63735:14;63728:58;63820:11;63815:2;63807:6;63803:15;63796:36;63611:228;:::o;63845:229::-;63985:34;63981:1;63973:6;63969:14;63962:58;64054:12;64049:2;64041:6;64037:15;64030:37;63845:229;:::o;64080:228::-;64220:34;64216:1;64208:6;64204:14;64197:58;64289:11;64284:2;64276:6;64272:15;64265:36;64080:228;:::o;64314:230::-;64454:34;64450:1;64442:6;64438:14;64431:58;64523:13;64518:2;64510:6;64506:15;64499:38;64314:230;:::o;64550:163::-;64690:15;64686:1;64678:6;64674:14;64667:39;64550:163;:::o;64719:182::-;64859:34;64855:1;64847:6;64843:14;64836:58;64719:182;:::o;64907:231::-;65047:34;65043:1;65035:6;65031:14;65024:58;65116:14;65111:2;65103:6;65099:15;65092:39;64907:231;:::o;65144:182::-;65284:34;65280:1;65272:6;65268:14;65261:58;65144:182;:::o;65332:239::-;65472:34;65468:1;65460:6;65456:14;65449:58;65541:22;65536:2;65528:6;65524:15;65517:47;65332:239;:::o;65577:234::-;65717:34;65713:1;65705:6;65701:14;65694:58;65786:17;65781:2;65773:6;65769:15;65762:42;65577:234;:::o;65817:220::-;65957:34;65953:1;65945:6;65941:14;65934:58;66026:3;66021:2;66013:6;66009:15;66002:28;65817:220;:::o;66043:173::-;66183:25;66179:1;66171:6;66167:14;66160:49;66043:173;:::o;66222:167::-;66362:19;66358:1;66350:6;66346:14;66339:43;66222:167;:::o;66395:236::-;66535:34;66531:1;66523:6;66519:14;66512:58;66604:19;66599:2;66591:6;66587:15;66580:44;66395:236;:::o;66637:175::-;66777:27;66773:1;66765:6;66761:14;66754:51;66637:175;:::o;66818:225::-;66958:34;66954:1;66946:6;66942:14;66935:58;67027:8;67022:2;67014:6;67010:15;67003:33;66818:225;:::o;67049:122::-;67122:24;67140:5;67122:24;:::i;:::-;67115:5;67112:35;67102:63;;67161:1;67158;67151:12;67102:63;67049:122;:::o;67177:138::-;67258:32;67284:5;67258:32;:::i;:::-;67251:5;67248:43;67238:71;;67305:1;67302;67295:12;67238:71;67177:138;:::o;67321:116::-;67391:21;67406:5;67391:21;:::i;:::-;67384:5;67381:32;67371:60;;67427:1;67424;67417:12;67371:60;67321:116;:::o;67443:122::-;67516:24;67534:5;67516:24;:::i;:::-;67509:5;67506:35;67496:63;;67555:1;67552;67545:12;67496:63;67443:122;:::o;67571:120::-;67643:23;67660:5;67643:23;:::i;:::-;67636:5;67633:34;67623:62;;67681:1;67678;67671:12;67623:62;67571:120;:::o;67697:::-;67769:23;67786:5;67769:23;:::i;:::-;67762:5;67759:34;67749:62;;67807:1;67804;67797:12;67749:62;67697:120;:::o;67823:122::-;67896:24;67914:5;67896:24;:::i;:::-;67889:5;67886:35;67876:63;;67935:1;67932;67925:12;67876:63;67823:122;:::o;67951:120::-;68023:23;68040:5;68023:23;:::i;:::-;68016:5;68013:34;68003:62;;68061:1;68058;68051:12;68003:62;67951:120;:::o

Swarm Source

ipfs://5d775a8316b5ad6c45f10a286c5b758b9bc0ddf6e57efbd6e8a79983f8d3dde6
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.