ETH Price: $4,000.77 (+2.35%)

Token

Chibi Galaxy (GALACTIC CHIBI)
 

Overview

Max Total Supply

3,500 GALACTIC CHIBI

Holders

1,757

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 GALACTIC CHIBI
0xe39e63d8a85d3ac4f4c27853315de3ab4c3de3fc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Chibi Galaxy is a collection of 3,500 interstellar characters with traits inspired by our galaxy’s most powerful features.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChibiGalaxy

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-10
*/

// Sources flattened with hardhat v2.6.8 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

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/[email protected]


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/[email protected]


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/[email protected]


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/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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/[email protected]


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/[email protected]


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/[email protected]


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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

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


// File @openzeppelin/contracts/security/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


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) {
        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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


// File contracts/ChibiGalaxy.sol

pragma solidity ^0.8.2;




contract Generation1s {
    function balanceOf(address owner) public view virtual returns (uint256) {}
}

contract Generation2s {
    function balanceOf(address owner) public view virtual returns (uint256) {}
}

contract ChibiGalaxy is ERC721, Ownable {

    using Address for address;
    using MerkleProof for bytes32[];

    string public baseTokenURI;

    uint public preMintPrice = 0.06 ether;
    uint public publicMintPrice = 0.08 ether;
    uint public collectionSize = 7000;
    uint public maxItemsPerTx = 5;
    uint public giveawayCount = 0;
    uint public giveawayMaxItems = 100;
    uint public rareTokenCount = 0;
    uint public maxRareTokens = 140;
    uint public nextRareTokenIdToClaim = 0;
    uint public totalSupply = 0;
    uint public maxItemsForSpecialMint = 2;

    bool public onlyWhitelistedCanMint = true;

    bool public preMintPaused = true;
    bool public publicMintPaused = true;

    bytes32 generation1HoldersMerkleRoot;
    bytes32 whitelistMerkleRoot;
    bytes32 specialEventWhitelistMerkleRoot;

    mapping(address => uint) public ownerRareTokens;
    mapping(address => uint) public specialMintTokens;

    event Mint(address indexed owner, uint256 tokenId);

    Generation1s gen1ContractInstance;
    Generation2s gen2ContractInstance;

    constructor() ERC721("Chibi Galaxy", "GALACTIC CHIBI") {
        gen1ContractInstance = Generation1s(0x4Ef0Fe82B42B6104BbcEB69E764AbD2050aCfdd4);
        gen2ContractInstance = Generation2s(0xC49a9AB342b6ea66792D4110e9cA0ab36e3a5674);
    }

    /*
    GIVEAWAY FUNCTIONS - START
    */
    function giveawayMint(address to, uint amount) external onlyOwner {
        require(giveawayCount + amount <= giveawayMaxItems, "giveawayMint: Surpasses cap");
        _mintWithoutValidation(to, amount);
        giveawayCount += amount;
    }
    /*
    GIVEAWAY FUNCTIONS - END
    */

    /*
    RARE MINT FUNCTIONS - START
    */
    function setGeneration1HoldersMerkleRoot(bytes32 _generation1HoldersMerkleRoot) public onlyOwner {
        generation1HoldersMerkleRoot = _generation1HoldersMerkleRoot;
    }

    function isAddressAGeneration1Holder(bytes32[] memory proof, address _address, uint balance) public view returns (bool) {
        return proof.verify(generation1HoldersMerkleRoot, keccak256(abi.encodePacked(_address, balance)));
    }

    function rareMintAmount() public view returns (uint) {
        uint numGen1sOwned = numGeneration1sOwned();
        uint numGen2sOwned = numGeneration2sOwned();
        return calculateRareMintAmount(numGen1sOwned, numGen2sOwned);
    }

    function rareMint(uint amount) external onlyOwner {
        require(rareTokenCount + amount <= maxRareTokens, "surpass cap");
        nextRareTokenIdToClaim = totalSupply + 1;
        _mintWithoutValidation(address(this), amount);
        ownerRareTokens[address(this)] += amount;
        rareTokenCount += amount;
    }

    function transferRareTokensToOwner() external onlyOwner {
        uint amount = ownerRareTokens[address(this)];
        for (uint i = 0; i < amount; i++){
            _transfer(address(this), msg.sender, nextRareTokenIdToClaim + i);
        }
        ownerRareTokens[msg.sender] += amount;
        ownerRareTokens[address(this)] -= amount;
    }

    function claimRareToken(bytes32[] memory proof) public {
        require(ownerRareTokens[address(this)] > 0, "all claimed");

        // wallet should be part of the gen1 snapshot
        uint numGen1sOwned = numGeneration1sOwned();

        require(isAddressAGeneration1Holder(proof, msg.sender, numGen1sOwned), "not part of snapshot");

        uint numGen2sOwned = numGeneration2sOwned();

        uint amount = calculateRareMintAmount(numGen1sOwned, numGen2sOwned);

        // not eligible to claim any rares
        require((amount > 0 && ownerRareTokens[msg.sender] < amount), "not eligible");

        // a wallet with a gen 1 and 2 can claim a token.
        for (uint i = 0; i < amount; i++) {
            _transfer(address(this), msg.sender, nextRareTokenIdToClaim + i);
        }

        ownerRareTokens[msg.sender] += amount;
        ownerRareTokens[address(this)] -= amount;
        nextRareTokenIdToClaim += amount;
    }
    /*
    RARE MINT FUNCTIONS - END
    */

    /*
    PRE MINT - START
    */
    function setPreMintPaused(bool _preMintPaused) public onlyOwner {
        preMintPaused = _preMintPaused;
    }

    function preMint() external payable {
        require(!preMintPaused, "mint paused");
        // verify that the client sent enough eth to pay for the mint
        uint remainder = msg.value % preMintPrice;
        require(remainder == 0, "send a divisible amount of eth");

        // calculate the amount of tokens we are minting based on the amount of eth sent
        uint amount = msg.value / preMintPrice;
        require(amount > 0, "amount to mint is 0");

        uint numGen1sOwned = numGeneration1sOwned();
        uint numGen2sOwned = numGeneration2sOwned();

        // only gen 1 or gen 2 owners can pre mint.
        require((numGen1sOwned > 0 || numGen2sOwned > 0), "not eligible");

        // calculate the max number of items to mint. (3 passes per gen 1, 1 pass per gen 2)
        uint maxItemsForPreMint = (numGen1sOwned * 3) + (numGen2sOwned * 1);

        uint numGeneration3sOwned = balanceOf(msg.sender);
        require((numGeneration3sOwned + amount) <= maxItemsForPreMint, "surpass pre mint cap");

        _mintWithoutValidation(msg.sender, amount);
    }
    /*
    PRE MINT - END
    */

    /*
     SPECIAL EVENT MINT FUNCTIONS - BEGIN
     */
    function setSpecialEventMintInfo(uint _maxItemsForSpecialMint, bytes32 _specialEventWhitelistMerkleRoot) public onlyOwner {
        specialEventWhitelistMerkleRoot = _specialEventWhitelistMerkleRoot;
        maxItemsForSpecialMint = _maxItemsForSpecialMint;
    }

    function isAddressWhitelistedForSpecialEvent(bytes32[] memory proof, address _address) public view returns (bool) {
        return isAddressInMerkleRoot(specialEventWhitelistMerkleRoot, proof, _address);
    }

    function specialEventMint(bytes32[] memory proof) external payable {
        require(!preMintPaused, "mint paused");
        require(isAddressWhitelistedForSpecialEvent(proof, msg.sender), "not eligible");

        // verify that the client sent enough eth to pay for the mint
        uint remainder = msg.value % publicMintPrice;
        require(remainder == 0, "send a divisible amount of eth");

        // calculate the amount of tokens we are minting based on the amount of eth sent
        uint amount = msg.value / publicMintPrice;
        require(amount > 0, "amount to mint is 0");

        require(specialMintTokens[msg.sender] < maxItemsForSpecialMint, "already minted max");
        require(specialMintTokens[msg.sender] + amount < maxItemsForSpecialMint, "will surpass special mint cap");

        _mintWithoutValidation(msg.sender, amount);
    }
    /*
    SPECIAL EVENT MINT FUNCTIONS - END
    */

    /*
    PUBLIC MINT FUNCTIONS - START
    */
    function setPublicMintInfo(bool _publicMintPaused, bool _onlyWhitelistedCanMint, bytes32 _whitelistMerkleRoot) public onlyOwner {
        publicMintPaused = _publicMintPaused;
        whitelistMerkleRoot = _whitelistMerkleRoot;
        onlyWhitelistedCanMint = _onlyWhitelistedCanMint;
    }

    function isAddressWhitelisted(bytes32[] memory proof, address _address) public view returns (bool) {
        return isAddressInMerkleRoot(whitelistMerkleRoot, proof, _address);
    }

    function publicMint(bytes32[] memory proof) external payable {
        // publicMintPaused is set by owner calling pausePublicMint and unpausePublicMint
        require(!publicMintPaused, "mint paused");
        // verify that the client sent enough eth to pay for the mint
        uint remainder = msg.value % publicMintPrice;
        require(remainder == 0, "send a divisible amount of eth");

        // calculate the amount of tokens we are minting based on the amount of eth sent
        uint amount = msg.value / publicMintPrice;

        require(amount <= maxItemsPerTx, "max 5 per tx");

        // onlyWhitelistedCanMint is set by calling setOnlyWhitelistedCanMint
        if (onlyWhitelistedCanMint){
            uint numGen1sOwned = numGeneration1sOwned();
            uint numGen2sOwned = numGeneration2sOwned();
            // perform the following only for wallets that don't have a gen 1 or gen 2
            if (numGen1sOwned == 0 && numGen2sOwned == 0) {
                // should not throw if user is whitelisted, the amount being minted is equal to their whitelisted value and they
                // have not minted already.
                require(isAddressWhitelisted(proof, msg.sender), "not eligible to mint");
            }
        }

        _mintWithoutValidation(msg.sender, amount);
    }
    /*
    PUBLIC MINT FUNCTIONS - END
    */

    /*
    HELPER FUNCTIONS - START
    */
    function _mintWithoutValidation(address to, uint amount) internal {
        require((totalSupply + amount) <= collectionSize, "sold out");
        for (uint i = 0; i < amount; i++) {
            totalSupply += 1;
            _mint(to, totalSupply);
            emit Mint(to, totalSupply);
        }
    }

    function calculateRareMintAmount(uint numGen1sOwned, uint numGen2sOwned) internal view returns (uint){
        if (numGen1sOwned > 0 && numGen2sOwned > 0){
            // the number of rares minted should be the lesser of gen 1s owned to gen 2s owned
            uint amount = numGen1sOwned;
            if (numGen1sOwned > numGen2sOwned) {
                amount = numGen2sOwned;
            }
            return amount - ownerRareTokens[msg.sender];
        }
        return 0;
    }

    function numGeneration1sOwned() public view returns (uint256) {
        return gen1ContractInstance.balanceOf(msg.sender);
    }

    function numGeneration2sOwned() public view returns (uint256) {
        return gen2ContractInstance.balanceOf(msg.sender);
    }

    function isAddressInMerkleRoot(bytes32 merkleRoot, bytes32[] memory proof, address _address) internal pure returns (bool) {
        // specialEventWhitelistMerkleRoot is set by calling setSpecialEventWhitelistMerkleRoot
        return proof.verify(merkleRoot, keccak256(abi.encodePacked(_address)));
    }
    /*
    HELPER FUNCTIONS - END
    */

    /*
    ADMIN FUNCTIONS - BEGIN
    */
    function setMintInfo(uint _preMintPrice, uint _publicMintPrice) public onlyOwner {
        preMintPrice = _preMintPrice;
        publicMintPrice = _publicMintPrice;
    }

    function setMaxItemsPerTrx(uint _maxItemsPerTrx) public onlyOwner {
        maxItemsPerTx = _maxItemsPerTrx;
    }

    function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function withdrawAll() external onlyOwner {
        uint amount1 = address(this).balance * 200 / 1000;
        uint amount2 = address(this).balance * 800 / 1000;
        uint amount3 = amount2 * 1/2;
        uint amount4 = amount2 * 1/4;
        uint amount5 = amount2 * 1/4;

        sendEth(0xAc0B0CD0268B5A9166De11A94E931E8e0cAD1DbB, amount1);
        sendEth(0x1D70A61565a309a25d6ddA87dCf649873ee36E39, amount3);
        sendEth(0xb5966228209779d3c0C826b775172De7E9a31538, amount4);
        sendEth(0xf415770F7aF765f823296BA7294c6d72217C8Af5, amount5);
    }

    function sendEth(address to, uint amount) internal {
        (bool success,) = to.call{value: amount}("");
        require(success, "Failed to send ether");
    }
    /*
    ADMIN FUNCTIONS - END
    */

    /*
    REQUIRED BY SOLIDITY - START
    */
    function _burn(uint256 tokenId) internal override(ERC721) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId)));
    }
    /*
    REQUIRED BY SOLIDITY - END
    */
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimRareToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayMaxItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giveawayMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"isAddressAGeneration1Holder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressWhitelistedForSpecialEvent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxItemsForSpecialMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxItemsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRareTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRareTokenIdToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numGeneration1sOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numGeneration2sOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelistedCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerRareTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rareMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rareMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_generation1HoldersMerkleRoot","type":"bytes32"}],"name":"setGeneration1HoldersMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxItemsPerTrx","type":"uint256"}],"name":"setMaxItemsPerTrx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preMintPrice","type":"uint256"},{"internalType":"uint256","name":"_publicMintPrice","type":"uint256"}],"name":"setMintInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preMintPaused","type":"bool"}],"name":"setPreMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicMintPaused","type":"bool"},{"internalType":"bool","name":"_onlyWhitelistedCanMint","type":"bool"},{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setPublicMintInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxItemsForSpecialMint","type":"uint256"},{"internalType":"bytes32","name":"_specialEventWhitelistMerkleRoot","type":"bytes32"}],"name":"setSpecialEventMintInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"specialEventMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"specialMintTokens","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferRareTokensToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266d529ae9e86000060085567011c37937e080000600955611b58600a556005600b556000600c556064600d556000600e55608c600f556000601055600060115560026012556001601360006101000a81548160ff0219169083151502179055506001601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff021916908315150217905550348015620000a757600080fd5b506040518060400160405280600c81526020017f43686962692047616c61787900000000000000000000000000000000000000008152506040518060400160405280600e81526020017f47414c414354494320434849424900000000000000000000000000000000000081525081600090805190602001906200012c929190620002e6565b50806001908051906020019062000145929190620002e6565b505050620001686200015c6200021860201b60201c565b6200022060201b60201c565b734ef0fe82b42b6104bbceb69e764abd2050acfdd4601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c49a9ab342b6ea66792d4110e9ca0ab36e3a5674601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003fb565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002f49062000396565b90600052602060002090601f01602090048101928262000318576000855562000364565b82601f106200033357805160ff191683800117855562000364565b8280016001018555821562000364579182015b828111156200036357825182559160200191906001019062000346565b5b50905062000373919062000377565b5090565b5b808211156200039257600081600090555060010162000378565b5090565b60006002820490506001821680620003af57607f821691505b60208210811415620003c657620003c5620003cc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615836806200040b6000396000f3fe6080604052600436106103355760003560e01c806371ce32e4116101ab578063cf978f67116100f7578063e340204511610095578063ea457d0f1161006f578063ea457d0f14610bde578063ef84ff0c14610c07578063f2fde38b14610c32578063ffe7b11614610c5b57610335565b8063e340204514610b4d578063e985e9c514610b76578063e9be0f3f14610bb357610335565b8063d547cfb7116100d1578063d547cfb714610aa1578063dbd3b2d414610acc578063dc49c6f214610af7578063dc53fd9214610b2257610335565b8063cf978f6714610a10578063d0a6e5cf14610a4d578063d5077b9014610a7657610335565b80638da5cb5b11610164578063a22cb4651161013e578063a22cb46514610958578063aa11c31714610981578063b88d4fde146109aa578063c87b56dd146109d357610335565b80638da5cb5b146108d757806395d89b4114610902578063a187c89b1461092d57610335565b806371ce32e4146107db57806373c78e36146108185780637af98b0c146108435780637f40107914610880578063853828b6146108975780638bc6f94b146108ae57610335565b80633cd29ac811610285578063655b903c116102235780636cdec202116101fd5780636cdec202146107405780636f77197d1461076b57806370a0823114610787578063715018a6146107c457610335565b8063655b903c146106c157806368abfea9146106ec5780636c0ef0c91461071757610335565b80633f351e4b1161025f5780633f351e4b146105f357806342842e0e1461063057806345c0f533146106595780636352211e1461068457610335565b80633cd29ac8146105975780633eaa3366146105a15780633ece1d7c146105ca57610335565b806318160ddd116102f257806330666a4d116102cc57806330666a4d146104eb57806333d9d5fd1461051657806335fe933914610541578063385eb74b1461056c57610335565b806318160ddd1461046e57806323b872dd1461049957806330176e13146104c257610335565b806301ffc9a71461033a578063048266241461037757806306fdde03146103a0578063081812fc146103cb578063095ea7b3146104085780630996896b14610431575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613fe7565b610c77565b60405161036e9190614828565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613e0e565b610d59565b005b3480156103ac57600080fd5b506103b5610e4e565b6040516103c29190614843565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed919061407a565b610ee0565b6040516103ff91906147c1565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613e0e565b610f65565b005b34801561043d57600080fd5b5061045860048036038101906104539190613e8b565b61107d565b6040516104659190614828565b60405180910390f35b34801561047a57600080fd5b50610483611094565b6040516104909190614c25565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613d08565b61109a565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190614039565b6110fa565b005b3480156104f757600080fd5b50610500611190565b60405161050d9190614c25565b60405180910390f35b34801561052257600080fd5b5061052b611196565b6040516105389190614828565b60405180910390f35b34801561054d57600080fd5b506105566111a9565b6040516105639190614c25565b60405180910390f35b34801561057857600080fd5b506105816111af565b60405161058e9190614c25565b60405180910390f35b61059f6111b5565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613f6f565b6113aa565b005b3480156105d657600080fd5b506105f160048036038101906105ec919061407a565b611466565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613edf565b6115c5565b6040516106279190614828565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613d08565b61160f565b005b34801561066557600080fd5b5061066e61162f565b60405161067b9190614c25565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a6919061407a565b611635565b6040516106b891906147c1565b60405180910390f35b3480156106cd57600080fd5b506106d66116e7565b6040516106e39190614c25565b60405180910390f35b3480156106f857600080fd5b50610701611711565b60405161070e9190614828565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190613fbe565b611724565b005b34801561074c57600080fd5b506107556117aa565b6040516107629190614c25565b60405180910390f35b61078560048036038101906107809190613e4a565b61185c565b005b34801561079357600080fd5b506107ae60048036038101906107a99190613ca3565b6119f6565b6040516107bb9190614c25565b60405180910390f35b3480156107d057600080fd5b506107d9611aae565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613ca3565b611b36565b60405161080f9190614c25565b60405180910390f35b34801561082457600080fd5b5061082d611b4e565b60405161083a9190614c25565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190613e8b565b611c00565b6040516108779190614828565b60405180910390f35b34801561088c57600080fd5b50610895611c17565b005b3480156108a357600080fd5b506108ac611dbd565b005b3480156108ba57600080fd5b506108d560048036038101906108d09190613e4a565b611f4c565b005b3480156108e357600080fd5b506108ec6121cd565b6040516108f991906147c1565b60405180910390f35b34801561090e57600080fd5b506109176121f7565b6040516109249190614843565b60405180910390f35b34801561093957600080fd5b50610942612289565b60405161094f9190614c25565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613dd2565b61228f565b005b34801561098d57600080fd5b506109a860048036038101906109a3919061407a565b612410565b005b3480156109b657600080fd5b506109d160048036038101906109cc9190613d57565b612496565b005b3480156109df57600080fd5b506109fa60048036038101906109f5919061407a565b6124f8565b604051610a079190614843565b60405180910390f35b348015610a1c57600080fd5b50610a376004803603810190610a329190613ca3565b61252c565b604051610a449190614c25565b60405180910390f35b348015610a5957600080fd5b50610a746004803603810190610a6f9190614108565b612544565b005b348015610a8257600080fd5b50610a8b6125d2565b604051610a989190614c25565b60405180910390f35b348015610aad57600080fd5b50610ab66125d8565b604051610ac39190614843565b60405180910390f35b348015610ad857600080fd5b50610ae1612666565b604051610aee9190614828565b60405180910390f35b348015610b0357600080fd5b50610b0c612679565b604051610b199190614c25565b60405180910390f35b348015610b2e57600080fd5b50610b3761267f565b604051610b449190614c25565b60405180910390f35b348015610b5957600080fd5b50610b746004803603810190610b6f91906140cc565b612685565b005b348015610b8257600080fd5b50610b9d6004803603810190610b989190613ccc565b612713565b604051610baa9190614828565b60405180910390f35b348015610bbf57600080fd5b50610bc86127a7565b604051610bd59190614c25565b60405180910390f35b348015610bea57600080fd5b50610c056004803603810190610c009190613f46565b6127ad565b005b348015610c1357600080fd5b50610c1c612846565b604051610c299190614c25565b60405180910390f35b348015610c3e57600080fd5b50610c596004803603810190610c549190613ca3565b61284c565b005b610c756004803603810190610c709190613e4a565b612944565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d525750610d5182612ba7565b5b9050919050565b610d61612c11565b73ffffffffffffffffffffffffffffffffffffffff16610d7f6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614ae5565b60405180910390fd5b600d5481600c54610de69190614d56565b1115610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90614945565b60405180910390fd5b610e318282612c19565b80600c6000828254610e439190614d56565b925050819055505050565b606060008054610e5d90614f2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8990614f2b565b8015610ed65780601f10610eab57610100808354040283529160200191610ed6565b820191906000526020600020905b815481529060010190602001808311610eb957829003601f168201915b5050505050905090565b6000610eeb82612d04565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190614ac5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7082611635565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614b65565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611000612c11565b73ffffffffffffffffffffffffffffffffffffffff16148061102f575061102e81611029612c11565b612713565b5b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614a05565b60405180910390fd5b6110788383612d70565b505050565b600061108c6015548484612e29565b905092915050565b60115481565b6110ab6110a5612c11565b82612e6f565b6110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e190614bc5565b60405180910390fd5b6110f5838383612f4d565b505050565b611102612c11565b73ffffffffffffffffffffffffffffffffffffffff166111206121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d90614ae5565b60405180910390fd5b806007908051906020019061118c929190613a07565b5050565b600b5481565b601360029054906101000a900460ff1681565b600f5481565b600e5481565b601360019054906101000a900460ff1615611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906149c5565b60405180910390fd5b600060085434611215919061500f565b90506000811461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190614be5565b60405180910390fd5b60006008543461126a9190614dac565b9050600081116112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690614aa5565b60405180910390fd5b60006112b96117aa565b905060006112c5611b4e565b905060008211806112d65750600081115b611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906148e5565b60405180910390fd5b60006001826113249190614ddd565b6003846113319190614ddd565b61133b9190614d56565b90506000611348336119f6565b90508185826113579190614d56565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906149e5565b60405180910390fd5b6113a23386612c19565b505050505050565b6113b2612c11565b73ffffffffffffffffffffffffffffffffffffffff166113d06121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90614ae5565b60405180910390fd5b82601360026101000a81548160ff0219169083151502179055508060158190555081601360006101000a81548160ff021916908315150217905550505050565b61146e612c11565b73ffffffffffffffffffffffffffffffffffffffff1661148c6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614ae5565b60405180910390fd5b600f5481600e546114f39190614d56565b1115611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614b45565b60405180910390fd5b60016011546115439190614d56565b6010819055506115533082612c19565b80601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115a29190614d56565b9250508190555080600e60008282546115bb9190614d56565b9250508190555050565b600061160660145484846040516020016115e0929190614730565b60405160208183030381529060405280519060200120866131a99092919063ffffffff16565b90509392505050565b61162a83838360405180602001604052806000815250612496565b505050565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614a45565b60405180910390fd5b80915050919050565b6000806116f26117aa565b905060006116fe611b4e565b905061170a8282613285565b9250505090565b601360019054906101000a900460ff1681565b61172c612c11565b73ffffffffffffffffffffffffffffffffffffffff1661174a6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790614ae5565b60405180910390fd5b8060148190555050565b6000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161180791906147c1565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185791906140a3565b905090565b601360029054906101000a900460ff16156118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906149c5565b60405180910390fd5b6000600954346118bc919061500f565b905060008114611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614be5565b60405180910390fd5b6000600954346119119190614dac565b9050600b54811115611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614b85565b60405180910390fd5b601360009054906101000a900460ff16156119e75760006119776117aa565b90506000611983611b4e565b90506000821480156119955750600081145b156119e4576119a4853361107d565b6119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614c05565b60405180910390fd5b5b50505b6119f13382612c19565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90614a25565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ab6612c11565b73ffffffffffffffffffffffffffffffffffffffff16611ad46121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190614ae5565b60405180910390fd5b611b34600061330a565b565b60176020528060005260406000206000915090505481565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611bab91906147c1565b60206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb91906140a3565b905090565b6000611c0f6016548484612e29565b905092915050565b611c1f612c11565b73ffffffffffffffffffffffffffffffffffffffff16611c3d6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614ae5565b60405180910390fd5b6000601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b81811015611d0d57611cfa303383601054611cf59190614d56565b612f4d565b8080611d0590614f8e565b915050611cda565b5080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d5d9190614d56565b9250508190555080601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db39190614e37565b9250508190555050565b611dc5612c11565b73ffffffffffffffffffffffffffffffffffffffff16611de36121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614ae5565b60405180910390fd5b60006103e860c847611e4b9190614ddd565b611e559190614dac565b905060006103e861032047611e6a9190614ddd565b611e749190614dac565b905060006002600183611e879190614ddd565b611e919190614dac565b905060006004600184611ea49190614ddd565b611eae9190614dac565b905060006004600185611ec19190614ddd565b611ecb9190614dac565b9050611eeb73ac0b0cd0268b5a9166de11a94e931e8e0cad1dbb866133d0565b611f09731d70a61565a309a25d6dda87dcf649873ee36e39846133d0565b611f2773b5966228209779d3c0c826b775172de7e9a31538836133d0565b611f4573f415770f7af765f823296ba7294c6d72217c8af5826133d0565b5050505050565b6000601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614a65565b60405180910390fd5b6000611fd86117aa565b9050611fe58233836115c5565b612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b906148c5565b60405180910390fd5b600061202e611b4e565b9050600061203c8383613285565b905060008111801561208c575080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b6120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c2906148e5565b60405180910390fd5b60005b81811015612101576120ee3033836010546120e99190614d56565b612f4d565b80806120f990614f8e565b9150506120ce565b5080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121519190614d56565b9250508190555080601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a79190614e37565b9250508190555080601060008282546121c09190614d56565b9250508190555050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461220690614f2b565b80601f016020809104026020016040519081016040528092919081815260200182805461223290614f2b565b801561227f5780601f106122545761010080835404028352916020019161227f565b820191906000526020600020905b81548152906001019060200180831161226257829003601f168201915b5050505050905090565b60085481565b612297612c11565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614925565b60405180910390fd5b8060056000612312612c11565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123bf612c11565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124049190614828565b60405180910390a35050565b612418612c11565b73ffffffffffffffffffffffffffffffffffffffff166124366121cd565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614ae5565b60405180910390fd5b80600b8190555050565b6124a76124a1612c11565b83612e6f565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614bc5565b60405180910390fd5b6124f284848484613481565b50505050565b60606007612505836134dd565b604051602001612516929190614788565b6040516020818303038152906040529050919050565b60186020528060005260406000206000915090505481565b61254c612c11565b73ffffffffffffffffffffffffffffffffffffffff1661256a6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b790614ae5565b60405180910390fd5b81600881905550806009819055505050565b600d5481565b600780546125e590614f2b565b80601f016020809104026020016040519081016040528092919081815260200182805461261190614f2b565b801561265e5780601f106126335761010080835404028352916020019161265e565b820191906000526020600020905b81548152906001019060200180831161264157829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b60105481565b60095481565b61268d612c11565b73ffffffffffffffffffffffffffffffffffffffff166126ab6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f890614ae5565b60405180910390fd5b80601681905550816012819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b6127b5612c11565b73ffffffffffffffffffffffffffffffffffffffff166127d36121cd565b73ffffffffffffffffffffffffffffffffffffffff1614612829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282090614ae5565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b60125481565b612854612c11565b73ffffffffffffffffffffffffffffffffffffffff166128726121cd565b73ffffffffffffffffffffffffffffffffffffffff16146128c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf90614ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f90614885565b60405180910390fd5b6129418161330a565b50565b601360019054906101000a900460ff1615612994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298b906149c5565b60405180910390fd5b61299e8133611c00565b6129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d4906148e5565b60405180910390fd5b6000600954346129ed919061500f565b905060008114612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2990614be5565b60405180910390fd5b600060095434612a429190614dac565b905060008111612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e90614aa5565b60405180910390fd5b601254601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0190614ba5565b60405180910390fd5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b589190614d56565b10612b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8f90614965565b60405180910390fd5b612ba23382612c19565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600a5481601154612c2a9190614d56565b1115612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906149a5565b60405180910390fd5b60005b81811015612cff57600160116000828254612c899190614d56565b92505081905550612c9c8360115461368a565b8273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885601154604051612ce49190614c25565b60405180910390a28080612cf790614f8e565b915050612c6e565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de383611635565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e668483604051602001612e409190614715565b60405160208183030381529060405280519060200120856131a99092919063ffffffff16565b90509392505050565b6000612e7a82612d04565b612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090614985565b60405180910390fd5b6000612ec483611635565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f3357508373ffffffffffffffffffffffffffffffffffffffff16612f1b84610ee0565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f445750612f438185612713565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f6d82611635565b73ffffffffffffffffffffffffffffffffffffffff1614612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614b25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302a90614905565b60405180910390fd5b61303e838383613858565b613049600082612d70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130999190614e37565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130f09190614d56565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b85518110156132775760008682815181106131f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161323757828160405160200161321a92919061475c565b604051602081830303815290604052805190602001209250613263565b808360405160200161324a92919061475c565b6040516020818303038152906040528051906020012092505b50808061326f90614f8e565b9150506131b2565b508381149150509392505050565b600080831180156132965750600082115b156132ff576000839050828411156132ac578290505b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816132f79190614e37565b915050613304565b600090505b92915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516133f6906147ac565b60006040518083038185875af1925050503d8060008114613433576040519150601f19603f3d011682016040523d82523d6000602084013e613438565b606091505b505090508061347c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347390614b05565b60405180910390fd5b505050565b61348c848484612f4d565b6134988484848461385d565b6134d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ce90614865565b60405180910390fd5b50505050565b60606000821415613525576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613685565b600082905060005b6000821461355757808061354090614f8e565b915050600a826135509190614dac565b915061352d565b60008167ffffffffffffffff811115613599577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135cb5781602001600182028036833780820191505090505b5090505b6000851461367e576001826135e49190614e37565b9150600a856135f3919061500f565b60306135ff9190614d56565b60f81b81838151811061363b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136779190614dac565b94506135cf565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f190614a85565b60405180910390fd5b61370381612d04565b15613743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373a906148a5565b60405180910390fd5b61374f60008383613858565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461379f9190614d56565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600061387e8473ffffffffffffffffffffffffffffffffffffffff166139f4565b156139e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138a7612c11565b8786866040518563ffffffff1660e01b81526004016138c994939291906147dc565b602060405180830381600087803b1580156138e357600080fd5b505af192505050801561391457506040513d601f19601f820116820180604052508101906139119190614010565b60015b613997573d8060008114613944576040519150601f19603f3d011682016040523d82523d6000602084013e613949565b606091505b5060008151141561398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690614865565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139ec565b600190505b949350505050565b600080823b905060008111915050919050565b828054613a1390614f2b565b90600052602060002090601f016020900481019282613a355760008555613a7c565b82601f10613a4e57805160ff1916838001178555613a7c565b82800160010185558215613a7c579182015b82811115613a7b578251825591602001919060010190613a60565b5b509050613a899190613a8d565b5090565b5b80821115613aa6576000816000905550600101613a8e565b5090565b6000613abd613ab884614c65565b614c40565b90508083825260208201905082856020860282011115613adc57600080fd5b60005b85811015613b0c5781613af28882613be6565b845260208401935060208301925050600181019050613adf565b5050509392505050565b6000613b29613b2484614c91565b614c40565b905082815260208101848484011115613b4157600080fd5b613b4c848285614ee9565b509392505050565b6000613b67613b6284614cc2565b614c40565b905082815260208101848484011115613b7f57600080fd5b613b8a848285614ee9565b509392505050565b600081359050613ba18161578d565b92915050565b600082601f830112613bb857600080fd5b8135613bc8848260208601613aaa565b91505092915050565b600081359050613be0816157a4565b92915050565b600081359050613bf5816157bb565b92915050565b600081359050613c0a816157d2565b92915050565b600081519050613c1f816157d2565b92915050565b600082601f830112613c3657600080fd5b8135613c46848260208601613b16565b91505092915050565b600082601f830112613c6057600080fd5b8135613c70848260208601613b54565b91505092915050565b600081359050613c88816157e9565b92915050565b600081519050613c9d816157e9565b92915050565b600060208284031215613cb557600080fd5b6000613cc384828501613b92565b91505092915050565b60008060408385031215613cdf57600080fd5b6000613ced85828601613b92565b9250506020613cfe85828601613b92565b9150509250929050565b600080600060608486031215613d1d57600080fd5b6000613d2b86828701613b92565b9350506020613d3c86828701613b92565b9250506040613d4d86828701613c79565b9150509250925092565b60008060008060808587031215613d6d57600080fd5b6000613d7b87828801613b92565b9450506020613d8c87828801613b92565b9350506040613d9d87828801613c79565b925050606085013567ffffffffffffffff811115613dba57600080fd5b613dc687828801613c25565b91505092959194509250565b60008060408385031215613de557600080fd5b6000613df385828601613b92565b9250506020613e0485828601613bd1565b9150509250929050565b60008060408385031215613e2157600080fd5b6000613e2f85828601613b92565b9250506020613e4085828601613c79565b9150509250929050565b600060208284031215613e5c57600080fd5b600082013567ffffffffffffffff811115613e7657600080fd5b613e8284828501613ba7565b91505092915050565b60008060408385031215613e9e57600080fd5b600083013567ffffffffffffffff811115613eb857600080fd5b613ec485828601613ba7565b9250506020613ed585828601613b92565b9150509250929050565b600080600060608486031215613ef457600080fd5b600084013567ffffffffffffffff811115613f0e57600080fd5b613f1a86828701613ba7565b9350506020613f2b86828701613b92565b9250506040613f3c86828701613c79565b9150509250925092565b600060208284031215613f5857600080fd5b6000613f6684828501613bd1565b91505092915050565b600080600060608486031215613f8457600080fd5b6000613f9286828701613bd1565b9350506020613fa386828701613bd1565b9250506040613fb486828701613be6565b9150509250925092565b600060208284031215613fd057600080fd5b6000613fde84828501613be6565b91505092915050565b600060208284031215613ff957600080fd5b600061400784828501613bfb565b91505092915050565b60006020828403121561402257600080fd5b600061403084828501613c10565b91505092915050565b60006020828403121561404b57600080fd5b600082013567ffffffffffffffff81111561406557600080fd5b61407184828501613c4f565b91505092915050565b60006020828403121561408c57600080fd5b600061409a84828501613c79565b91505092915050565b6000602082840312156140b557600080fd5b60006140c384828501613c8e565b91505092915050565b600080604083850312156140df57600080fd5b60006140ed85828601613c79565b92505060206140fe85828601613be6565b9150509250929050565b6000806040838503121561411b57600080fd5b600061412985828601613c79565b925050602061413a85828601613c79565b9150509250929050565b61414d81614e6b565b82525050565b61416461415f82614e6b565b614fd7565b82525050565b61417381614e7d565b82525050565b61418a61418582614e89565b614fe9565b82525050565b600061419b82614d08565b6141a58185614d1e565b93506141b5818560208601614ef8565b6141be816150fc565b840191505092915050565b60006141d482614d13565b6141de8185614d3a565b93506141ee818560208601614ef8565b6141f7816150fc565b840191505092915050565b600061420d82614d13565b6142178185614d4b565b9350614227818560208601614ef8565b80840191505092915050565b6000815461424081614f2b565b61424a8186614d4b565b945060018216600081146142655760018114614276576142a9565b60ff198316865281860193506142a9565b61427f85614cf3565b60005b838110156142a157815481890152600182019150602081019050614282565b838801955050505b50505092915050565b60006142bf603283614d3a565b91506142ca8261511a565b604082019050919050565b60006142e2602683614d3a565b91506142ed82615169565b604082019050919050565b6000614305601c83614d3a565b9150614310826151b8565b602082019050919050565b6000614328601483614d3a565b9150614333826151e1565b602082019050919050565b600061434b600c83614d3a565b91506143568261520a565b602082019050919050565b600061436e602483614d3a565b915061437982615233565b604082019050919050565b6000614391601983614d3a565b915061439c82615282565b602082019050919050565b60006143b4601b83614d3a565b91506143bf826152ab565b602082019050919050565b60006143d7601d83614d3a565b91506143e2826152d4565b602082019050919050565b60006143fa602c83614d3a565b9150614405826152fd565b604082019050919050565b600061441d600883614d3a565b91506144288261534c565b602082019050919050565b6000614440600b83614d3a565b915061444b82615375565b602082019050919050565b6000614463601483614d3a565b915061446e8261539e565b602082019050919050565b6000614486603883614d3a565b9150614491826153c7565b604082019050919050565b60006144a9602a83614d3a565b91506144b482615416565b604082019050919050565b60006144cc602983614d3a565b91506144d782615465565b604082019050919050565b60006144ef600b83614d3a565b91506144fa826154b4565b602082019050919050565b6000614512602083614d3a565b915061451d826154dd565b602082019050919050565b6000614535601383614d3a565b915061454082615506565b602082019050919050565b6000614558602c83614d3a565b91506145638261552f565b604082019050919050565b600061457b602083614d3a565b91506145868261557e565b602082019050919050565b600061459e601483614d3a565b91506145a9826155a7565b602082019050919050565b60006145c1602983614d3a565b91506145cc826155d0565b604082019050919050565b60006145e4600b83614d3a565b91506145ef8261561f565b602082019050919050565b6000614607602183614d3a565b915061461282615648565b604082019050919050565b600061462a600083614d2f565b915061463582615697565b600082019050919050565b600061464d600c83614d3a565b91506146588261569a565b602082019050919050565b6000614670601283614d3a565b915061467b826156c3565b602082019050919050565b6000614693603183614d3a565b915061469e826156ec565b604082019050919050565b60006146b6601e83614d3a565b91506146c18261573b565b602082019050919050565b60006146d9601483614d3a565b91506146e482615764565b602082019050919050565b6146f881614edf565b82525050565b61470f61470a82614edf565b615005565b82525050565b60006147218284614153565b60148201915081905092915050565b600061473c8285614153565b60148201915061474c82846146fe565b6020820191508190509392505050565b60006147688285614179565b6020820191506147788284614179565b6020820191508190509392505050565b60006147948285614233565b91506147a08284614202565b91508190509392505050565b60006147b78261461d565b9150819050919050565b60006020820190506147d66000830184614144565b92915050565b60006080820190506147f16000830187614144565b6147fe6020830186614144565b61480b60408301856146ef565b818103606083015261481d8184614190565b905095945050505050565b600060208201905061483d600083018461416a565b92915050565b6000602082019050818103600083015261485d81846141c9565b905092915050565b6000602082019050818103600083015261487e816142b2565b9050919050565b6000602082019050818103600083015261489e816142d5565b9050919050565b600060208201905081810360008301526148be816142f8565b9050919050565b600060208201905081810360008301526148de8161431b565b9050919050565b600060208201905081810360008301526148fe8161433e565b9050919050565b6000602082019050818103600083015261491e81614361565b9050919050565b6000602082019050818103600083015261493e81614384565b9050919050565b6000602082019050818103600083015261495e816143a7565b9050919050565b6000602082019050818103600083015261497e816143ca565b9050919050565b6000602082019050818103600083015261499e816143ed565b9050919050565b600060208201905081810360008301526149be81614410565b9050919050565b600060208201905081810360008301526149de81614433565b9050919050565b600060208201905081810360008301526149fe81614456565b9050919050565b60006020820190508181036000830152614a1e81614479565b9050919050565b60006020820190508181036000830152614a3e8161449c565b9050919050565b60006020820190508181036000830152614a5e816144bf565b9050919050565b60006020820190508181036000830152614a7e816144e2565b9050919050565b60006020820190508181036000830152614a9e81614505565b9050919050565b60006020820190508181036000830152614abe81614528565b9050919050565b60006020820190508181036000830152614ade8161454b565b9050919050565b60006020820190508181036000830152614afe8161456e565b9050919050565b60006020820190508181036000830152614b1e81614591565b9050919050565b60006020820190508181036000830152614b3e816145b4565b9050919050565b60006020820190508181036000830152614b5e816145d7565b9050919050565b60006020820190508181036000830152614b7e816145fa565b9050919050565b60006020820190508181036000830152614b9e81614640565b9050919050565b60006020820190508181036000830152614bbe81614663565b9050919050565b60006020820190508181036000830152614bde81614686565b9050919050565b60006020820190508181036000830152614bfe816146a9565b9050919050565b60006020820190508181036000830152614c1e816146cc565b9050919050565b6000602082019050614c3a60008301846146ef565b92915050565b6000614c4a614c5b565b9050614c568282614f5d565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8057614c7f6150cd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cac57614cab6150cd565b5b614cb5826150fc565b9050602081019050919050565b600067ffffffffffffffff821115614cdd57614cdc6150cd565b5b614ce6826150fc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d6182614edf565b9150614d6c83614edf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614da157614da0615040565b5b828201905092915050565b6000614db782614edf565b9150614dc283614edf565b925082614dd257614dd161506f565b5b828204905092915050565b6000614de882614edf565b9150614df383614edf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e2c57614e2b615040565b5b828202905092915050565b6000614e4282614edf565b9150614e4d83614edf565b925082821015614e6057614e5f615040565b5b828203905092915050565b6000614e7682614ebf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f16578082015181840152602081019050614efb565b83811115614f25576000848401525b50505050565b60006002820490506001821680614f4357607f821691505b60208210811415614f5757614f5661509e565b5b50919050565b614f66826150fc565b810181811067ffffffffffffffff82111715614f8557614f846150cd565b5b80604052505050565b6000614f9982614edf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fcc57614fcb615040565b5b600182019050919050565b6000614fe282614ff3565b9050919050565b6000819050919050565b6000614ffe8261510d565b9050919050565b6000819050919050565b600061501a82614edf565b915061502583614edf565b9250826150355761503461506f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6e6f742070617274206f6620736e617073686f74000000000000000000000000600082015250565b7f6e6f7420656c696769626c650000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f67697665617761794d696e743a20537572706173736573206361700000000000600082015250565b7f77696c6c2073757270617373207370656369616c206d696e7420636170000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f6d696e7420706175736564000000000000000000000000000000000000000000600082015250565b7f7375727061737320707265206d696e7420636170000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f616c6c20636c61696d6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f616d6f756e7420746f206d696e74206973203000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f7375727061737320636170000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f6d61782035207065722074780000000000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564206d61780000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f73656e64206120646976697369626c6520616d6f756e74206f66206574680000600082015250565b7f6e6f7420656c696769626c6520746f206d696e74000000000000000000000000600082015250565b61579681614e6b565b81146157a157600080fd5b50565b6157ad81614e7d565b81146157b857600080fd5b50565b6157c481614e89565b81146157cf57600080fd5b50565b6157db81614e93565b81146157e657600080fd5b50565b6157f281614edf565b81146157fd57600080fd5b5056fea26469706673582212208d038c40c7ccdf5fb6ce278dd0f82f9ca3265c97894bd9f8b0dd9f86edbe68fa64736f6c63430008020033

Deployed Bytecode

0x6080604052600436106103355760003560e01c806371ce32e4116101ab578063cf978f67116100f7578063e340204511610095578063ea457d0f1161006f578063ea457d0f14610bde578063ef84ff0c14610c07578063f2fde38b14610c32578063ffe7b11614610c5b57610335565b8063e340204514610b4d578063e985e9c514610b76578063e9be0f3f14610bb357610335565b8063d547cfb7116100d1578063d547cfb714610aa1578063dbd3b2d414610acc578063dc49c6f214610af7578063dc53fd9214610b2257610335565b8063cf978f6714610a10578063d0a6e5cf14610a4d578063d5077b9014610a7657610335565b80638da5cb5b11610164578063a22cb4651161013e578063a22cb46514610958578063aa11c31714610981578063b88d4fde146109aa578063c87b56dd146109d357610335565b80638da5cb5b146108d757806395d89b4114610902578063a187c89b1461092d57610335565b806371ce32e4146107db57806373c78e36146108185780637af98b0c146108435780637f40107914610880578063853828b6146108975780638bc6f94b146108ae57610335565b80633cd29ac811610285578063655b903c116102235780636cdec202116101fd5780636cdec202146107405780636f77197d1461076b57806370a0823114610787578063715018a6146107c457610335565b8063655b903c146106c157806368abfea9146106ec5780636c0ef0c91461071757610335565b80633f351e4b1161025f5780633f351e4b146105f357806342842e0e1461063057806345c0f533146106595780636352211e1461068457610335565b80633cd29ac8146105975780633eaa3366146105a15780633ece1d7c146105ca57610335565b806318160ddd116102f257806330666a4d116102cc57806330666a4d146104eb57806333d9d5fd1461051657806335fe933914610541578063385eb74b1461056c57610335565b806318160ddd1461046e57806323b872dd1461049957806330176e13146104c257610335565b806301ffc9a71461033a578063048266241461037757806306fdde03146103a0578063081812fc146103cb578063095ea7b3146104085780630996896b14610431575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613fe7565b610c77565b60405161036e9190614828565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613e0e565b610d59565b005b3480156103ac57600080fd5b506103b5610e4e565b6040516103c29190614843565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed919061407a565b610ee0565b6040516103ff91906147c1565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613e0e565b610f65565b005b34801561043d57600080fd5b5061045860048036038101906104539190613e8b565b61107d565b6040516104659190614828565b60405180910390f35b34801561047a57600080fd5b50610483611094565b6040516104909190614c25565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613d08565b61109a565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190614039565b6110fa565b005b3480156104f757600080fd5b50610500611190565b60405161050d9190614c25565b60405180910390f35b34801561052257600080fd5b5061052b611196565b6040516105389190614828565b60405180910390f35b34801561054d57600080fd5b506105566111a9565b6040516105639190614c25565b60405180910390f35b34801561057857600080fd5b506105816111af565b60405161058e9190614c25565b60405180910390f35b61059f6111b5565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613f6f565b6113aa565b005b3480156105d657600080fd5b506105f160048036038101906105ec919061407a565b611466565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613edf565b6115c5565b6040516106279190614828565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613d08565b61160f565b005b34801561066557600080fd5b5061066e61162f565b60405161067b9190614c25565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a6919061407a565b611635565b6040516106b891906147c1565b60405180910390f35b3480156106cd57600080fd5b506106d66116e7565b6040516106e39190614c25565b60405180910390f35b3480156106f857600080fd5b50610701611711565b60405161070e9190614828565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190613fbe565b611724565b005b34801561074c57600080fd5b506107556117aa565b6040516107629190614c25565b60405180910390f35b61078560048036038101906107809190613e4a565b61185c565b005b34801561079357600080fd5b506107ae60048036038101906107a99190613ca3565b6119f6565b6040516107bb9190614c25565b60405180910390f35b3480156107d057600080fd5b506107d9611aae565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613ca3565b611b36565b60405161080f9190614c25565b60405180910390f35b34801561082457600080fd5b5061082d611b4e565b60405161083a9190614c25565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190613e8b565b611c00565b6040516108779190614828565b60405180910390f35b34801561088c57600080fd5b50610895611c17565b005b3480156108a357600080fd5b506108ac611dbd565b005b3480156108ba57600080fd5b506108d560048036038101906108d09190613e4a565b611f4c565b005b3480156108e357600080fd5b506108ec6121cd565b6040516108f991906147c1565b60405180910390f35b34801561090e57600080fd5b506109176121f7565b6040516109249190614843565b60405180910390f35b34801561093957600080fd5b50610942612289565b60405161094f9190614c25565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613dd2565b61228f565b005b34801561098d57600080fd5b506109a860048036038101906109a3919061407a565b612410565b005b3480156109b657600080fd5b506109d160048036038101906109cc9190613d57565b612496565b005b3480156109df57600080fd5b506109fa60048036038101906109f5919061407a565b6124f8565b604051610a079190614843565b60405180910390f35b348015610a1c57600080fd5b50610a376004803603810190610a329190613ca3565b61252c565b604051610a449190614c25565b60405180910390f35b348015610a5957600080fd5b50610a746004803603810190610a6f9190614108565b612544565b005b348015610a8257600080fd5b50610a8b6125d2565b604051610a989190614c25565b60405180910390f35b348015610aad57600080fd5b50610ab66125d8565b604051610ac39190614843565b60405180910390f35b348015610ad857600080fd5b50610ae1612666565b604051610aee9190614828565b60405180910390f35b348015610b0357600080fd5b50610b0c612679565b604051610b199190614c25565b60405180910390f35b348015610b2e57600080fd5b50610b3761267f565b604051610b449190614c25565b60405180910390f35b348015610b5957600080fd5b50610b746004803603810190610b6f91906140cc565b612685565b005b348015610b8257600080fd5b50610b9d6004803603810190610b989190613ccc565b612713565b604051610baa9190614828565b60405180910390f35b348015610bbf57600080fd5b50610bc86127a7565b604051610bd59190614c25565b60405180910390f35b348015610bea57600080fd5b50610c056004803603810190610c009190613f46565b6127ad565b005b348015610c1357600080fd5b50610c1c612846565b604051610c299190614c25565b60405180910390f35b348015610c3e57600080fd5b50610c596004803603810190610c549190613ca3565b61284c565b005b610c756004803603810190610c709190613e4a565b612944565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d525750610d5182612ba7565b5b9050919050565b610d61612c11565b73ffffffffffffffffffffffffffffffffffffffff16610d7f6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614ae5565b60405180910390fd5b600d5481600c54610de69190614d56565b1115610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90614945565b60405180910390fd5b610e318282612c19565b80600c6000828254610e439190614d56565b925050819055505050565b606060008054610e5d90614f2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8990614f2b565b8015610ed65780601f10610eab57610100808354040283529160200191610ed6565b820191906000526020600020905b815481529060010190602001808311610eb957829003601f168201915b5050505050905090565b6000610eeb82612d04565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190614ac5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7082611635565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614b65565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611000612c11565b73ffffffffffffffffffffffffffffffffffffffff16148061102f575061102e81611029612c11565b612713565b5b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614a05565b60405180910390fd5b6110788383612d70565b505050565b600061108c6015548484612e29565b905092915050565b60115481565b6110ab6110a5612c11565b82612e6f565b6110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e190614bc5565b60405180910390fd5b6110f5838383612f4d565b505050565b611102612c11565b73ffffffffffffffffffffffffffffffffffffffff166111206121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d90614ae5565b60405180910390fd5b806007908051906020019061118c929190613a07565b5050565b600b5481565b601360029054906101000a900460ff1681565b600f5481565b600e5481565b601360019054906101000a900460ff1615611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906149c5565b60405180910390fd5b600060085434611215919061500f565b90506000811461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190614be5565b60405180910390fd5b60006008543461126a9190614dac565b9050600081116112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690614aa5565b60405180910390fd5b60006112b96117aa565b905060006112c5611b4e565b905060008211806112d65750600081115b611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906148e5565b60405180910390fd5b60006001826113249190614ddd565b6003846113319190614ddd565b61133b9190614d56565b90506000611348336119f6565b90508185826113579190614d56565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906149e5565b60405180910390fd5b6113a23386612c19565b505050505050565b6113b2612c11565b73ffffffffffffffffffffffffffffffffffffffff166113d06121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90614ae5565b60405180910390fd5b82601360026101000a81548160ff0219169083151502179055508060158190555081601360006101000a81548160ff021916908315150217905550505050565b61146e612c11565b73ffffffffffffffffffffffffffffffffffffffff1661148c6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614ae5565b60405180910390fd5b600f5481600e546114f39190614d56565b1115611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614b45565b60405180910390fd5b60016011546115439190614d56565b6010819055506115533082612c19565b80601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115a29190614d56565b9250508190555080600e60008282546115bb9190614d56565b9250508190555050565b600061160660145484846040516020016115e0929190614730565b60405160208183030381529060405280519060200120866131a99092919063ffffffff16565b90509392505050565b61162a83838360405180602001604052806000815250612496565b505050565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614a45565b60405180910390fd5b80915050919050565b6000806116f26117aa565b905060006116fe611b4e565b905061170a8282613285565b9250505090565b601360019054906101000a900460ff1681565b61172c612c11565b73ffffffffffffffffffffffffffffffffffffffff1661174a6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790614ae5565b60405180910390fd5b8060148190555050565b6000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161180791906147c1565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185791906140a3565b905090565b601360029054906101000a900460ff16156118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906149c5565b60405180910390fd5b6000600954346118bc919061500f565b905060008114611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614be5565b60405180910390fd5b6000600954346119119190614dac565b9050600b54811115611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614b85565b60405180910390fd5b601360009054906101000a900460ff16156119e75760006119776117aa565b90506000611983611b4e565b90506000821480156119955750600081145b156119e4576119a4853361107d565b6119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614c05565b60405180910390fd5b5b50505b6119f13382612c19565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90614a25565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ab6612c11565b73ffffffffffffffffffffffffffffffffffffffff16611ad46121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190614ae5565b60405180910390fd5b611b34600061330a565b565b60176020528060005260406000206000915090505481565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611bab91906147c1565b60206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb91906140a3565b905090565b6000611c0f6016548484612e29565b905092915050565b611c1f612c11565b73ffffffffffffffffffffffffffffffffffffffff16611c3d6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614ae5565b60405180910390fd5b6000601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b81811015611d0d57611cfa303383601054611cf59190614d56565b612f4d565b8080611d0590614f8e565b915050611cda565b5080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d5d9190614d56565b9250508190555080601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db39190614e37565b9250508190555050565b611dc5612c11565b73ffffffffffffffffffffffffffffffffffffffff16611de36121cd565b73ffffffffffffffffffffffffffffffffffffffff1614611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614ae5565b60405180910390fd5b60006103e860c847611e4b9190614ddd565b611e559190614dac565b905060006103e861032047611e6a9190614ddd565b611e749190614dac565b905060006002600183611e879190614ddd565b611e919190614dac565b905060006004600184611ea49190614ddd565b611eae9190614dac565b905060006004600185611ec19190614ddd565b611ecb9190614dac565b9050611eeb73ac0b0cd0268b5a9166de11a94e931e8e0cad1dbb866133d0565b611f09731d70a61565a309a25d6dda87dcf649873ee36e39846133d0565b611f2773b5966228209779d3c0c826b775172de7e9a31538836133d0565b611f4573f415770f7af765f823296ba7294c6d72217c8af5826133d0565b5050505050565b6000601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614a65565b60405180910390fd5b6000611fd86117aa565b9050611fe58233836115c5565b612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b906148c5565b60405180910390fd5b600061202e611b4e565b9050600061203c8383613285565b905060008111801561208c575080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b6120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c2906148e5565b60405180910390fd5b60005b81811015612101576120ee3033836010546120e99190614d56565b612f4d565b80806120f990614f8e565b9150506120ce565b5080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121519190614d56565b9250508190555080601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a79190614e37565b9250508190555080601060008282546121c09190614d56565b9250508190555050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461220690614f2b565b80601f016020809104026020016040519081016040528092919081815260200182805461223290614f2b565b801561227f5780601f106122545761010080835404028352916020019161227f565b820191906000526020600020905b81548152906001019060200180831161226257829003601f168201915b5050505050905090565b60085481565b612297612c11565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614925565b60405180910390fd5b8060056000612312612c11565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123bf612c11565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124049190614828565b60405180910390a35050565b612418612c11565b73ffffffffffffffffffffffffffffffffffffffff166124366121cd565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614ae5565b60405180910390fd5b80600b8190555050565b6124a76124a1612c11565b83612e6f565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614bc5565b60405180910390fd5b6124f284848484613481565b50505050565b60606007612505836134dd565b604051602001612516929190614788565b6040516020818303038152906040529050919050565b60186020528060005260406000206000915090505481565b61254c612c11565b73ffffffffffffffffffffffffffffffffffffffff1661256a6121cd565b73ffffffffffffffffffffffffffffffffffffffff16146125c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b790614ae5565b60405180910390fd5b81600881905550806009819055505050565b600d5481565b600780546125e590614f2b565b80601f016020809104026020016040519081016040528092919081815260200182805461261190614f2b565b801561265e5780601f106126335761010080835404028352916020019161265e565b820191906000526020600020905b81548152906001019060200180831161264157829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b60105481565b60095481565b61268d612c11565b73ffffffffffffffffffffffffffffffffffffffff166126ab6121cd565b73ffffffffffffffffffffffffffffffffffffffff1614612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f890614ae5565b60405180910390fd5b80601681905550816012819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b6127b5612c11565b73ffffffffffffffffffffffffffffffffffffffff166127d36121cd565b73ffffffffffffffffffffffffffffffffffffffff1614612829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282090614ae5565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b60125481565b612854612c11565b73ffffffffffffffffffffffffffffffffffffffff166128726121cd565b73ffffffffffffffffffffffffffffffffffffffff16146128c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf90614ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f90614885565b60405180910390fd5b6129418161330a565b50565b601360019054906101000a900460ff1615612994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298b906149c5565b60405180910390fd5b61299e8133611c00565b6129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d4906148e5565b60405180910390fd5b6000600954346129ed919061500f565b905060008114612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2990614be5565b60405180910390fd5b600060095434612a429190614dac565b905060008111612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e90614aa5565b60405180910390fd5b601254601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0190614ba5565b60405180910390fd5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b589190614d56565b10612b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8f90614965565b60405180910390fd5b612ba23382612c19565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600a5481601154612c2a9190614d56565b1115612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906149a5565b60405180910390fd5b60005b81811015612cff57600160116000828254612c899190614d56565b92505081905550612c9c8360115461368a565b8273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885601154604051612ce49190614c25565b60405180910390a28080612cf790614f8e565b915050612c6e565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de383611635565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e668483604051602001612e409190614715565b60405160208183030381529060405280519060200120856131a99092919063ffffffff16565b90509392505050565b6000612e7a82612d04565b612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090614985565b60405180910390fd5b6000612ec483611635565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f3357508373ffffffffffffffffffffffffffffffffffffffff16612f1b84610ee0565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f445750612f438185612713565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f6d82611635565b73ffffffffffffffffffffffffffffffffffffffff1614612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614b25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302a90614905565b60405180910390fd5b61303e838383613858565b613049600082612d70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130999190614e37565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130f09190614d56565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b85518110156132775760008682815181106131f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161323757828160405160200161321a92919061475c565b604051602081830303815290604052805190602001209250613263565b808360405160200161324a92919061475c565b6040516020818303038152906040528051906020012092505b50808061326f90614f8e565b9150506131b2565b508381149150509392505050565b600080831180156132965750600082115b156132ff576000839050828411156132ac578290505b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816132f79190614e37565b915050613304565b600090505b92915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516133f6906147ac565b60006040518083038185875af1925050503d8060008114613433576040519150601f19603f3d011682016040523d82523d6000602084013e613438565b606091505b505090508061347c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347390614b05565b60405180910390fd5b505050565b61348c848484612f4d565b6134988484848461385d565b6134d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ce90614865565b60405180910390fd5b50505050565b60606000821415613525576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613685565b600082905060005b6000821461355757808061354090614f8e565b915050600a826135509190614dac565b915061352d565b60008167ffffffffffffffff811115613599577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135cb5781602001600182028036833780820191505090505b5090505b6000851461367e576001826135e49190614e37565b9150600a856135f3919061500f565b60306135ff9190614d56565b60f81b81838151811061363b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136779190614dac565b94506135cf565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f190614a85565b60405180910390fd5b61370381612d04565b15613743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373a906148a5565b60405180910390fd5b61374f60008383613858565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461379f9190614d56565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600061387e8473ffffffffffffffffffffffffffffffffffffffff166139f4565b156139e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138a7612c11565b8786866040518563ffffffff1660e01b81526004016138c994939291906147dc565b602060405180830381600087803b1580156138e357600080fd5b505af192505050801561391457506040513d601f19601f820116820180604052508101906139119190614010565b60015b613997573d8060008114613944576040519150601f19603f3d011682016040523d82523d6000602084013e613949565b606091505b5060008151141561398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690614865565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139ec565b600190505b949350505050565b600080823b905060008111915050919050565b828054613a1390614f2b565b90600052602060002090601f016020900481019282613a355760008555613a7c565b82601f10613a4e57805160ff1916838001178555613a7c565b82800160010185558215613a7c579182015b82811115613a7b578251825591602001919060010190613a60565b5b509050613a899190613a8d565b5090565b5b80821115613aa6576000816000905550600101613a8e565b5090565b6000613abd613ab884614c65565b614c40565b90508083825260208201905082856020860282011115613adc57600080fd5b60005b85811015613b0c5781613af28882613be6565b845260208401935060208301925050600181019050613adf565b5050509392505050565b6000613b29613b2484614c91565b614c40565b905082815260208101848484011115613b4157600080fd5b613b4c848285614ee9565b509392505050565b6000613b67613b6284614cc2565b614c40565b905082815260208101848484011115613b7f57600080fd5b613b8a848285614ee9565b509392505050565b600081359050613ba18161578d565b92915050565b600082601f830112613bb857600080fd5b8135613bc8848260208601613aaa565b91505092915050565b600081359050613be0816157a4565b92915050565b600081359050613bf5816157bb565b92915050565b600081359050613c0a816157d2565b92915050565b600081519050613c1f816157d2565b92915050565b600082601f830112613c3657600080fd5b8135613c46848260208601613b16565b91505092915050565b600082601f830112613c6057600080fd5b8135613c70848260208601613b54565b91505092915050565b600081359050613c88816157e9565b92915050565b600081519050613c9d816157e9565b92915050565b600060208284031215613cb557600080fd5b6000613cc384828501613b92565b91505092915050565b60008060408385031215613cdf57600080fd5b6000613ced85828601613b92565b9250506020613cfe85828601613b92565b9150509250929050565b600080600060608486031215613d1d57600080fd5b6000613d2b86828701613b92565b9350506020613d3c86828701613b92565b9250506040613d4d86828701613c79565b9150509250925092565b60008060008060808587031215613d6d57600080fd5b6000613d7b87828801613b92565b9450506020613d8c87828801613b92565b9350506040613d9d87828801613c79565b925050606085013567ffffffffffffffff811115613dba57600080fd5b613dc687828801613c25565b91505092959194509250565b60008060408385031215613de557600080fd5b6000613df385828601613b92565b9250506020613e0485828601613bd1565b9150509250929050565b60008060408385031215613e2157600080fd5b6000613e2f85828601613b92565b9250506020613e4085828601613c79565b9150509250929050565b600060208284031215613e5c57600080fd5b600082013567ffffffffffffffff811115613e7657600080fd5b613e8284828501613ba7565b91505092915050565b60008060408385031215613e9e57600080fd5b600083013567ffffffffffffffff811115613eb857600080fd5b613ec485828601613ba7565b9250506020613ed585828601613b92565b9150509250929050565b600080600060608486031215613ef457600080fd5b600084013567ffffffffffffffff811115613f0e57600080fd5b613f1a86828701613ba7565b9350506020613f2b86828701613b92565b9250506040613f3c86828701613c79565b9150509250925092565b600060208284031215613f5857600080fd5b6000613f6684828501613bd1565b91505092915050565b600080600060608486031215613f8457600080fd5b6000613f9286828701613bd1565b9350506020613fa386828701613bd1565b9250506040613fb486828701613be6565b9150509250925092565b600060208284031215613fd057600080fd5b6000613fde84828501613be6565b91505092915050565b600060208284031215613ff957600080fd5b600061400784828501613bfb565b91505092915050565b60006020828403121561402257600080fd5b600061403084828501613c10565b91505092915050565b60006020828403121561404b57600080fd5b600082013567ffffffffffffffff81111561406557600080fd5b61407184828501613c4f565b91505092915050565b60006020828403121561408c57600080fd5b600061409a84828501613c79565b91505092915050565b6000602082840312156140b557600080fd5b60006140c384828501613c8e565b91505092915050565b600080604083850312156140df57600080fd5b60006140ed85828601613c79565b92505060206140fe85828601613be6565b9150509250929050565b6000806040838503121561411b57600080fd5b600061412985828601613c79565b925050602061413a85828601613c79565b9150509250929050565b61414d81614e6b565b82525050565b61416461415f82614e6b565b614fd7565b82525050565b61417381614e7d565b82525050565b61418a61418582614e89565b614fe9565b82525050565b600061419b82614d08565b6141a58185614d1e565b93506141b5818560208601614ef8565b6141be816150fc565b840191505092915050565b60006141d482614d13565b6141de8185614d3a565b93506141ee818560208601614ef8565b6141f7816150fc565b840191505092915050565b600061420d82614d13565b6142178185614d4b565b9350614227818560208601614ef8565b80840191505092915050565b6000815461424081614f2b565b61424a8186614d4b565b945060018216600081146142655760018114614276576142a9565b60ff198316865281860193506142a9565b61427f85614cf3565b60005b838110156142a157815481890152600182019150602081019050614282565b838801955050505b50505092915050565b60006142bf603283614d3a565b91506142ca8261511a565b604082019050919050565b60006142e2602683614d3a565b91506142ed82615169565b604082019050919050565b6000614305601c83614d3a565b9150614310826151b8565b602082019050919050565b6000614328601483614d3a565b9150614333826151e1565b602082019050919050565b600061434b600c83614d3a565b91506143568261520a565b602082019050919050565b600061436e602483614d3a565b915061437982615233565b604082019050919050565b6000614391601983614d3a565b915061439c82615282565b602082019050919050565b60006143b4601b83614d3a565b91506143bf826152ab565b602082019050919050565b60006143d7601d83614d3a565b91506143e2826152d4565b602082019050919050565b60006143fa602c83614d3a565b9150614405826152fd565b604082019050919050565b600061441d600883614d3a565b91506144288261534c565b602082019050919050565b6000614440600b83614d3a565b915061444b82615375565b602082019050919050565b6000614463601483614d3a565b915061446e8261539e565b602082019050919050565b6000614486603883614d3a565b9150614491826153c7565b604082019050919050565b60006144a9602a83614d3a565b91506144b482615416565b604082019050919050565b60006144cc602983614d3a565b91506144d782615465565b604082019050919050565b60006144ef600b83614d3a565b91506144fa826154b4565b602082019050919050565b6000614512602083614d3a565b915061451d826154dd565b602082019050919050565b6000614535601383614d3a565b915061454082615506565b602082019050919050565b6000614558602c83614d3a565b91506145638261552f565b604082019050919050565b600061457b602083614d3a565b91506145868261557e565b602082019050919050565b600061459e601483614d3a565b91506145a9826155a7565b602082019050919050565b60006145c1602983614d3a565b91506145cc826155d0565b604082019050919050565b60006145e4600b83614d3a565b91506145ef8261561f565b602082019050919050565b6000614607602183614d3a565b915061461282615648565b604082019050919050565b600061462a600083614d2f565b915061463582615697565b600082019050919050565b600061464d600c83614d3a565b91506146588261569a565b602082019050919050565b6000614670601283614d3a565b915061467b826156c3565b602082019050919050565b6000614693603183614d3a565b915061469e826156ec565b604082019050919050565b60006146b6601e83614d3a565b91506146c18261573b565b602082019050919050565b60006146d9601483614d3a565b91506146e482615764565b602082019050919050565b6146f881614edf565b82525050565b61470f61470a82614edf565b615005565b82525050565b60006147218284614153565b60148201915081905092915050565b600061473c8285614153565b60148201915061474c82846146fe565b6020820191508190509392505050565b60006147688285614179565b6020820191506147788284614179565b6020820191508190509392505050565b60006147948285614233565b91506147a08284614202565b91508190509392505050565b60006147b78261461d565b9150819050919050565b60006020820190506147d66000830184614144565b92915050565b60006080820190506147f16000830187614144565b6147fe6020830186614144565b61480b60408301856146ef565b818103606083015261481d8184614190565b905095945050505050565b600060208201905061483d600083018461416a565b92915050565b6000602082019050818103600083015261485d81846141c9565b905092915050565b6000602082019050818103600083015261487e816142b2565b9050919050565b6000602082019050818103600083015261489e816142d5565b9050919050565b600060208201905081810360008301526148be816142f8565b9050919050565b600060208201905081810360008301526148de8161431b565b9050919050565b600060208201905081810360008301526148fe8161433e565b9050919050565b6000602082019050818103600083015261491e81614361565b9050919050565b6000602082019050818103600083015261493e81614384565b9050919050565b6000602082019050818103600083015261495e816143a7565b9050919050565b6000602082019050818103600083015261497e816143ca565b9050919050565b6000602082019050818103600083015261499e816143ed565b9050919050565b600060208201905081810360008301526149be81614410565b9050919050565b600060208201905081810360008301526149de81614433565b9050919050565b600060208201905081810360008301526149fe81614456565b9050919050565b60006020820190508181036000830152614a1e81614479565b9050919050565b60006020820190508181036000830152614a3e8161449c565b9050919050565b60006020820190508181036000830152614a5e816144bf565b9050919050565b60006020820190508181036000830152614a7e816144e2565b9050919050565b60006020820190508181036000830152614a9e81614505565b9050919050565b60006020820190508181036000830152614abe81614528565b9050919050565b60006020820190508181036000830152614ade8161454b565b9050919050565b60006020820190508181036000830152614afe8161456e565b9050919050565b60006020820190508181036000830152614b1e81614591565b9050919050565b60006020820190508181036000830152614b3e816145b4565b9050919050565b60006020820190508181036000830152614b5e816145d7565b9050919050565b60006020820190508181036000830152614b7e816145fa565b9050919050565b60006020820190508181036000830152614b9e81614640565b9050919050565b60006020820190508181036000830152614bbe81614663565b9050919050565b60006020820190508181036000830152614bde81614686565b9050919050565b60006020820190508181036000830152614bfe816146a9565b9050919050565b60006020820190508181036000830152614c1e816146cc565b9050919050565b6000602082019050614c3a60008301846146ef565b92915050565b6000614c4a614c5b565b9050614c568282614f5d565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8057614c7f6150cd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cac57614cab6150cd565b5b614cb5826150fc565b9050602081019050919050565b600067ffffffffffffffff821115614cdd57614cdc6150cd565b5b614ce6826150fc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d6182614edf565b9150614d6c83614edf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614da157614da0615040565b5b828201905092915050565b6000614db782614edf565b9150614dc283614edf565b925082614dd257614dd161506f565b5b828204905092915050565b6000614de882614edf565b9150614df383614edf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e2c57614e2b615040565b5b828202905092915050565b6000614e4282614edf565b9150614e4d83614edf565b925082821015614e6057614e5f615040565b5b828203905092915050565b6000614e7682614ebf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f16578082015181840152602081019050614efb565b83811115614f25576000848401525b50505050565b60006002820490506001821680614f4357607f821691505b60208210811415614f5757614f5661509e565b5b50919050565b614f66826150fc565b810181811067ffffffffffffffff82111715614f8557614f846150cd565b5b80604052505050565b6000614f9982614edf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fcc57614fcb615040565b5b600182019050919050565b6000614fe282614ff3565b9050919050565b6000819050919050565b6000614ffe8261510d565b9050919050565b6000819050919050565b600061501a82614edf565b915061502583614edf565b9250826150355761503461506f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6e6f742070617274206f6620736e617073686f74000000000000000000000000600082015250565b7f6e6f7420656c696769626c650000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f67697665617761794d696e743a20537572706173736573206361700000000000600082015250565b7f77696c6c2073757270617373207370656369616c206d696e7420636170000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f6d696e7420706175736564000000000000000000000000000000000000000000600082015250565b7f7375727061737320707265206d696e7420636170000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f616c6c20636c61696d6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f616d6f756e7420746f206d696e74206973203000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f7375727061737320636170000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f6d61782035207065722074780000000000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564206d61780000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f73656e64206120646976697369626c6520616d6f756e74206f66206574680000600082015250565b7f6e6f7420656c696769626c6520746f206d696e74000000000000000000000000600082015250565b61579681614e6b565b81146157a157600080fd5b50565b6157ad81614e7d565b81146157b857600080fd5b50565b6157c481614e89565b81146157cf57600080fd5b50565b6157db81614e93565b81146157e657600080fd5b50565b6157f281614edf565b81146157fd57600080fd5b5056fea26469706673582212208d038c40c7ccdf5fb6ce278dd0f82f9ca3265c97894bd9f8b0dd9f86edbe68fa64736f6c63430008020033

Deployed Bytecode Sourcemap

39427:12057:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20786:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40838:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21731:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23290:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22813:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46729:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39947:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24180:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50174:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39714:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40117:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39864:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39827:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43731:1107;;;:::i;:::-;;46426:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41863:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41371:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24590:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39674:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21425:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41615:240;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40078:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41187:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49188:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46921:1342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21155:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36826:94;;;;;;;;;;;;;:::i;:::-;;40286:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49326:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45216:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42197:352;;;;;;;;;;;;;:::i;:::-;;50302:573;;;;;;;;;;;;;:::i;:::-;;42557:960;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36175:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21900:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39583:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23583:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50050:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24846:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51254:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40340:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49869:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39786:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39548:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40028:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39902:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39627:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44942:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23949:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39750:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43610:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39981:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37075:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45435:876;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20786:305;20888:4;20940:25;20925:40;;;:11;:40;;;;:105;;;;20997:33;20982:48;;;:11;:48;;;;20925:105;:158;;;;21047:36;21071:11;21047:23;:36::i;:::-;20925:158;20905:178;;20786:305;;;:::o;40838:246::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40949:16:::1;;40939:6;40923:13;;:22;;;;:::i;:::-;:42;;40915:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;41008:34;41031:2;41035:6;41008:22;:34::i;:::-;41070:6;41053:13;;:23;;;;;;;:::i;:::-;;;;;;;;40838:246:::0;;:::o;21731:100::-;21785:13;21818:5;21811:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21731:100;:::o;23290:221::-;23366:7;23394:16;23402:7;23394;:16::i;:::-;23386:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23479:15;:24;23495:7;23479:24;;;;;;;;;;;;;;;;;;;;;23472:31;;23290:221;;;:::o;22813:411::-;22894:13;22910:23;22925:7;22910:14;:23::i;:::-;22894:39;;22958:5;22952:11;;:2;:11;;;;22944:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23052:5;23036:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23061:37;23078:5;23085:12;:10;:12::i;:::-;23061:16;:37::i;:::-;23036:62;23014:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23195:21;23204:2;23208:7;23195:8;:21::i;:::-;22813:411;;;:::o;46729:184::-;46822:4;46846:59;46868:19;;46889:5;46896:8;46846:21;:59::i;:::-;46839:66;;46729:184;;;;:::o;39947:27::-;;;;:::o;24180:339::-;24375:41;24394:12;:10;:12::i;:::-;24408:7;24375:18;:41::i;:::-;24367:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24483:28;24493:4;24499:2;24503:7;24483:9;:28::i;:::-;24180:339;;;:::o;50174:120::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50273:13:::1;50258:12;:28;;;;;;;;;;;;:::i;:::-;;50174:120:::0;:::o;39714:29::-;;;;:::o;40117:35::-;;;;;;;;;;;;;:::o;39864:31::-;;;;:::o;39827:30::-;;;;:::o;43731:1107::-;43787:13;;;;;;;;;;;43786:14;43778:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43898:14;43927:12;;43915:9;:24;;;;:::i;:::-;43898:41;;43971:1;43958:9;:14;43950:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44110:11;44136:12;;44124:9;:24;;;;:::i;:::-;44110:38;;44176:1;44167:6;:10;44159:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;44214:18;44235:22;:20;:22::i;:::-;44214:43;;44268:18;44289:22;:20;:22::i;:::-;44268:43;;44402:1;44386:13;:17;:38;;;;44423:1;44407:13;:17;44386:38;44377:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44549:23;44614:1;44598:13;:17;;;;:::i;:::-;44592:1;44576:13;:17;;;;:::i;:::-;44575:41;;;;:::i;:::-;44549:67;;44629:25;44657:21;44667:10;44657:9;:21::i;:::-;44629:49;;44732:18;44721:6;44698:20;:29;;;;:::i;:::-;44697:53;;44689:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;44788:42;44811:10;44823:6;44788:22;:42::i;:::-;43731:1107;;;;;;:::o;46426:295::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46584:17:::1;46565:16;;:36;;;;;;;;;;;;;;;;;;46634:20;46612:19;:42;;;;46690:23;46665:22;;:48;;;;;;;;;;;;;;;;;;46426:295:::0;;;:::o;41863:326::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41959:13:::1;;41949:6;41932:14;;:23;;;;:::i;:::-;:40;;41924:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42038:1;42024:11;;:15;;;;:::i;:::-;41999:22;:40;;;;42050:45;42081:4;42088:6;42050:22;:45::i;:::-;42140:6;42106:15;:30;42130:4;42106:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;42175:6;42157:14;;:24;;;;;;;:::i;:::-;;;;;;;;41863:326:::0;:::o;41371:236::-;41485:4;41509:90;41522:28;;41579:8;41589:7;41562:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41552:46;;;;;;41509:5;:12;;:90;;;;;:::i;:::-;41502:97;;41371:236;;;;;:::o;24590:185::-;24728:39;24745:4;24751:2;24755:7;24728:39;;;;;;;;;;;;:16;:39::i;:::-;24590:185;;;:::o;39674:33::-;;;;:::o;21425:239::-;21497:7;21517:13;21533:7;:16;21541:7;21533:16;;;;;;;;;;;;;;;;;;;;;21517:32;;21585:1;21568:19;;:5;:19;;;;21560:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21651:5;21644:12;;;21425:239;;;:::o;41615:240::-;41662:4;41679:18;41700:22;:20;:22::i;:::-;41679:43;;41733:18;41754:22;:20;:22::i;:::-;41733:43;;41794:53;41818:13;41833;41794:23;:53::i;:::-;41787:60;;;;41615:240;:::o;40078:32::-;;;;;;;;;;;;;:::o;41187:176::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41326:29:::1;41295:28;:60;;;;41187:176:::0;:::o;49188:130::-;49241:7;49268:20;;;;;;;;;;;:30;;;49299:10;49268:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49261:49;;49188:130;:::o;46921:1342::-;47093:16;;;;;;;;;;;47092:17;47084:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47207:14;47236:15;;47224:9;:27;;;;:::i;:::-;47207:44;;47283:1;47270:9;:14;47262:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47422:11;47448:15;;47436:9;:27;;;;:::i;:::-;47422:41;;47494:13;;47484:6;:23;;47476:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;47620:22;;;;;;;;;;;47616:585;;;47658:18;47679:22;:20;:22::i;:::-;47658:43;;47716:18;47737:22;:20;:22::i;:::-;47716:43;;47883:1;47866:13;:18;:40;;;;;47905:1;47888:13;:18;47866:40;47862:328;;;48110:39;48131:5;48138:10;48110:20;:39::i;:::-;48102:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47862:328;47616:585;;;48213:42;48236:10;48248:6;48213:22;:42::i;:::-;46921:1342;;;:::o;21155:208::-;21227:7;21272:1;21255:19;;:5;:19;;;;21247:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21339:9;:16;21349:5;21339:16;;;;;;;;;;;;;;;;21332:23;;21155:208;;;:::o;36826:94::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36891:21:::1;36909:1;36891:9;:21::i;:::-;36826:94::o:0;40286:47::-;;;;;;;;;;;;;;;;;:::o;49326:130::-;49379:7;49406:20;;;;;;;;;;;:30;;;49437:10;49406:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49399:49;;49326:130;:::o;45216:211::-;45324:4;45348:71;45370:31;;45403:5;45410:8;45348:21;:71::i;:::-;45341:78;;45216:211;;;;:::o;42197:352::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42264:11:::1;42278:15;:30;42302:4;42278:30;;;;;;;;;;;;;;;;42264:44;;42324:6;42319:124;42340:6;42336:1;:10;42319:124;;;42367:64;42385:4;42392:10;42429:1;42404:22;;:26;;;;:::i;:::-;42367:9;:64::i;:::-;42348:3;;;;;:::i;:::-;;;;42319:124;;;;42484:6;42453:15;:27;42469:10;42453:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;42535:6;42501:15;:30;42525:4;42501:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;36466:1;42197:352::o:0;50302:573::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50355:12:::1;50400:4;50394:3;50370:21;:27;;;;:::i;:::-;:34;;;;:::i;:::-;50355:49;;50415:12;50460:4;50454:3;50430:21;:27;;;;:::i;:::-;:34;;;;:::i;:::-;50415:49;;50475:12;50502:1;50500;50490:7;:11;;;;:::i;:::-;:13;;;;:::i;:::-;50475:28;;50514:12;50541:1;50539;50529:7;:11;;;;:::i;:::-;:13;;;;:::i;:::-;50514:28;;50553:12;50580:1;50578;50568:7;:11;;;;:::i;:::-;:13;;;;:::i;:::-;50553:28;;50594:60;50602:42;50646:7;50594;:60::i;:::-;50665;50673:42;50717:7;50665;:60::i;:::-;50736;50744:42;50788:7;50736;:60::i;:::-;50807;50815:42;50859:7;50807;:60::i;:::-;36466:1;;;;;50302:573::o:0;42557:960::-;42664:1;42631:15;:30;42655:4;42631:30;;;;;;;;;;;;;;;;:34;42623:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42749:18;42770:22;:20;:22::i;:::-;42749:43;;42813:61;42841:5;42848:10;42860:13;42813:27;:61::i;:::-;42805:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;42912:18;42933:22;:20;:22::i;:::-;42912:43;;42968:11;42982:53;43006:13;43021;42982:23;:53::i;:::-;42968:67;;43110:1;43101:6;:10;:50;;;;;43145:6;43115:15;:27;43131:10;43115:27;;;;;;;;;;;;;;;;:36;43101:50;43092:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43246:6;43241:125;43262:6;43258:1;:10;43241:125;;;43290:64;43308:4;43315:10;43352:1;43327:22;;:26;;;;:::i;:::-;43290:9;:64::i;:::-;43270:3;;;;;:::i;:::-;;;;43241:125;;;;43409:6;43378:15;:27;43394:10;43378:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;43460:6;43426:15;:30;43450:4;43426:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;43503:6;43477:22;;:32;;;;;;;:::i;:::-;;;;;;;;42557:960;;;;:::o;36175:87::-;36221:7;36248:6;;;;;;;;;;;36241:13;;36175:87;:::o;21900:104::-;21956:13;21989:7;21982:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21900:104;:::o;39583:37::-;;;;:::o;23583:295::-;23698:12;:10;:12::i;:::-;23686:24;;:8;:24;;;;23678:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23798:8;23753:18;:32;23772:12;:10;:12::i;:::-;23753:32;;;;;;;;;;;;;;;:42;23786:8;23753:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23851:8;23822:48;;23837:12;:10;:12::i;:::-;23822:48;;;23861:8;23822:48;;;;;;:::i;:::-;;;;;;;;23583:295;;:::o;50050:116::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50143:15:::1;50127:13;:31;;;;50050:116:::0;:::o;24846:328::-;25021:41;25040:12;:10;:12::i;:::-;25054:7;25021:18;:41::i;:::-;25013:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25127:39;25141:4;25147:2;25151:7;25160:5;25127:13;:39::i;:::-;24846:328;;;;:::o;51254:179::-;51327:13;51384:12;51398:25;51415:7;51398:16;:25::i;:::-;51367:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51353:72;;51254:179;;;:::o;40340:49::-;;;;;;;;;;;;;;;;;:::o;49869:173::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49976:13:::1;49961:12;:28;;;;50018:16;50000:15;:34;;;;49869:173:::0;;:::o;39786:34::-;;;;:::o;39548:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40028:41::-;;;;;;;;;;;;;:::o;39902:38::-;;;;:::o;39627:40::-;;;;:::o;44942:266::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45109:32:::1;45075:31;:66;;;;45177:23;45152:22;:48;;;;44942:266:::0;;:::o;23949:164::-;24046:4;24070:18;:25;24089:5;24070:25;;;;;;;;;;;;;;;:35;24096:8;24070:35;;;;;;;;;;;;;;;;;;;;;;;;;24063:42;;23949:164;;;;:::o;39750:29::-;;;;:::o;43610:113::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43701:14:::1;43685:13;;:30;;;;;;;;;;;;;;;;;;43610:113:::0;:::o;39981:38::-;;;;:::o;37075:192::-;36406:12;:10;:12::i;:::-;36395:23;;:7;:5;:7::i;:::-;:23;;;36387:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37184:1:::1;37164:22;;:8;:22;;;;37156:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37240:19;37250:8;37240:9;:19::i;:::-;37075:192:::0;:::o;45435:876::-;45522:13;;;;;;;;;;;45521:14;45513:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45570:54;45606:5;45613:10;45570:35;:54::i;:::-;45562:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;45725:14;45754:15;;45742:9;:27;;;;:::i;:::-;45725:44;;45801:1;45788:9;:14;45780:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45940:11;45966:15;;45954:9;:27;;;;:::i;:::-;45940:41;;46009:1;46000:6;:10;45992:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46087:22;;46055:17;:29;46073:10;46055:29;;;;;;;;;;;;;;;;:54;46047:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46192:22;;46183:6;46151:17;:29;46169:10;46151:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:63;46143:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;46261:42;46284:10;46296:6;46261:22;:42::i;:::-;45435:876;;;:::o;19286:157::-;19371:4;19410:25;19395:40;;;:11;:40;;;;19388:47;;19286:157;;;:::o;16194:98::-;16247:7;16274:10;16267:17;;16194:98;:::o;48366:311::-;48477:14;;48466:6;48452:11;;:20;;;;:::i;:::-;48451:40;;48443:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48520:6;48515:155;48536:6;48532:1;:10;48515:155;;;48579:1;48564:11;;:16;;;;;;;:::i;:::-;;;;;;;;48595:22;48601:2;48605:11;;48595:5;:22::i;:::-;48642:2;48637:21;;;48646:11;;48637:21;;;;;;:::i;:::-;;;;;;;;48544:3;;;;;:::i;:::-;;;;48515:155;;;;48366:311;;:::o;26684:127::-;26749:4;26801:1;26773:30;;:7;:16;26781:7;26773:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26766:37;;26684:127;;;:::o;30666:174::-;30768:2;30741:15;:24;30757:7;30741:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30824:7;30820:2;30786:46;;30795:23;30810:7;30795:14;:23::i;:::-;30786:46;;;;;;;;;;;;30666:174;;:::o;49464:308::-;49580:4;49701:63;49714:10;49753:8;49736:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;49726:37;;;;;;49701:5;:12;;:63;;;;;:::i;:::-;49694:70;;49464:308;;;;;:::o;26978:348::-;27071:4;27096:16;27104:7;27096;:16::i;:::-;27088:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27172:13;27188:23;27203:7;27188:14;:23::i;:::-;27172:39;;27241:5;27230:16;;:7;:16;;;:51;;;;27274:7;27250:31;;:20;27262:7;27250:11;:20::i;:::-;:31;;;27230:51;:87;;;;27285:32;27302:5;27309:7;27285:16;:32::i;:::-;27230:87;27222:96;;;26978:348;;;;:::o;29970:578::-;30129:4;30102:31;;:23;30117:7;30102:14;:23::i;:::-;:31;;;30094:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30212:1;30198:16;;:2;:16;;;;30190:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30268:39;30289:4;30295:2;30299:7;30268:20;:39::i;:::-;30372:29;30389:1;30393:7;30372:8;:29::i;:::-;30433:1;30414:9;:15;30424:4;30414:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30462:1;30445:9;:13;30455:2;30445:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30493:2;30474:7;:16;30482:7;30474:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30532:7;30528:2;30513:27;;30522:4;30513:27;;;;;;;;;;;;29970:578;;;:::o;38298:830::-;38423:4;38440:20;38463:4;38440:27;;38485:9;38480:525;38504:5;:12;38500:1;:16;38480:525;;;38538:20;38561:5;38567:1;38561:8;;;;;;;;;;;;;;;;;;;;;;38538:31;;38606:12;38590;:28;38586:408;;38760:12;38774;38743:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38733:55;;;;;;38718:70;;38586:408;;;38950:12;38964;38933:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38923:55;;;;;;38908:70;;38586:408;38480:525;38518:3;;;;;:::i;:::-;;;;38480:525;;;;39116:4;39100:12;:20;39093:27;;;38298:830;;;;;:::o;48685:495::-;48781:4;48817:1;48801:13;:17;:38;;;;;48838:1;48822:13;:17;48801:38;48797:357;;;48951:11;48965:13;48951:27;;49013:13;48997;:29;48993:92;;;49056:13;49047:22;;48993:92;49115:15;:27;49131:10;49115:27;;;;;;;;;;;;;;;;49106:6;:36;;;;:::i;:::-;49099:43;;;;;48797:357;49171:1;49164:8;;48685:495;;;;;:::o;37275:173::-;37331:16;37350:6;;;;;;;;;;;37331:25;;37376:8;37367:6;;:17;;;;;;;;;;;;;;;;;;37431:8;37400:40;;37421:8;37400:40;;;;;;;;;;;;37275:173;;:::o;50883:165::-;50946:12;50963:2;:7;;50978:6;50963:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50945:44;;;51008:7;51000:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;50883:165;;;:::o;26056:315::-;26213:28;26223:4;26229:2;26233:7;26213:9;:28::i;:::-;26260:48;26283:4;26289:2;26293:7;26302:5;26260:22;:48::i;:::-;26252:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26056:315;;;;:::o;16725:723::-;16781:13;17011:1;17002:5;:10;16998:53;;;17029:10;;;;;;;;;;;;;;;;;;;;;16998:53;17061:12;17076:5;17061:20;;17092:14;17117:78;17132:1;17124:4;:9;17117:78;;17150:8;;;;;:::i;:::-;;;;17181:2;17173:10;;;;;:::i;:::-;;;17117:78;;;17205:19;17237:6;17227:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17205:39;;17255:154;17271:1;17262:5;:10;17255:154;;17299:1;17289:11;;;;;:::i;:::-;;;17366:2;17358:5;:10;;;;:::i;:::-;17345:2;:24;;;;:::i;:::-;17332:39;;17315:6;17322;17315:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17395:2;17386:11;;;;;:::i;:::-;;;17255:154;;;17433:6;17419:21;;;;;16725:723;;;;:::o;28662:382::-;28756:1;28742:16;;:2;:16;;;;28734:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28815:16;28823:7;28815;:16::i;:::-;28814:17;28806:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28877:45;28906:1;28910:2;28914:7;28877:20;:45::i;:::-;28952:1;28935:9;:13;28945:2;28935:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28983:2;28964:7;:16;28972:7;28964:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29028:7;29024:2;29003:33;;29020:1;29003:33;;;;;;;;;;;;28662:382;;:::o;32776:126::-;;;;:::o;31405:799::-;31560:4;31581:15;:2;:13;;;:15::i;:::-;31577:620;;;31633:2;31617:36;;;31654:12;:10;:12::i;:::-;31668:4;31674:7;31683:5;31617:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31613:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31876:1;31859:6;:13;:18;31855:272;;;31902:60;;;;;;;;;;:::i;:::-;;;;;;;;31855:272;32077:6;32071:13;32062:6;32058:2;32054:15;32047:38;31613:529;31750:41;;;31740:51;;;:6;:51;;;;31733:58;;;;;31577:620;32181:4;32174:11;;31405:799;;;;;;;:::o;8232:387::-;8292:4;8500:12;8567:7;8555:20;8547:28;;8610:1;8603:4;:8;8596:15;;;8232:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:139::-;;2047:6;2034:20;2025:29;;2063:33;2090:5;2063:33;:::i;:::-;2015:87;;;;:::o;2108:137::-;;2191:6;2178:20;2169:29;;2207:32;2233:5;2207:32;:::i;:::-;2159:86;;;;:::o;2251:141::-;;2338:6;2332:13;2323:22;;2354:32;2380:5;2354:32;:::i;:::-;2313:79;;;;:::o;2411:271::-;;2515:3;2508:4;2500:6;2496:17;2492:27;2482:2;;2533:1;2530;2523:12;2482:2;2573:6;2560:20;2598:78;2672:3;2664:6;2657:4;2649:6;2645:17;2598:78;:::i;:::-;2589:87;;2472:210;;;;;:::o;2702:273::-;;2807:3;2800:4;2792:6;2788:17;2784:27;2774:2;;2825:1;2822;2815:12;2774:2;2865:6;2852:20;2890:79;2965:3;2957:6;2950:4;2942:6;2938:17;2890:79;:::i;:::-;2881:88;;2764:211;;;;;:::o;2981:139::-;;3065:6;3052:20;3043:29;;3081:33;3108:5;3081:33;:::i;:::-;3033:87;;;;:::o;3126:143::-;;3214:6;3208:13;3199:22;;3230:33;3257:5;3230:33;:::i;:::-;3189:80;;;;:::o;3275:262::-;;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;3399:1;3396;3389:12;3351:2;3442:1;3467:53;3512:7;3503:6;3492:9;3488:22;3467:53;:::i;:::-;3457:63;;3413:117;3341:196;;;;:::o;3543:407::-;;;3668:2;3656:9;3647:7;3643:23;3639:32;3636:2;;;3684:1;3681;3674:12;3636:2;3727:1;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3698:117;3854:2;3880:53;3925:7;3916:6;3905:9;3901:22;3880:53;:::i;:::-;3870:63;;3825:118;3626:324;;;;;:::o;3956:552::-;;;;4098:2;4086:9;4077:7;4073:23;4069:32;4066:2;;;4114:1;4111;4104:12;4066:2;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4056:452;;;;;:::o;4514:809::-;;;;;4682:3;4670:9;4661:7;4657:23;4653:33;4650:2;;;4699:1;4696;4689:12;4650:2;4742:1;4767:53;4812:7;4803:6;4792:9;4788:22;4767:53;:::i;:::-;4757:63;;4713:117;4869:2;4895:53;4940:7;4931:6;4920:9;4916:22;4895:53;:::i;:::-;4885:63;;4840:118;4997:2;5023:53;5068:7;5059:6;5048:9;5044:22;5023:53;:::i;:::-;5013:63;;4968:118;5153:2;5142:9;5138:18;5125:32;5184:18;5176:6;5173:30;5170:2;;;5216:1;5213;5206:12;5170:2;5244:62;5298:7;5289:6;5278:9;5274:22;5244:62;:::i;:::-;5234:72;;5096:220;4640:683;;;;;;;:::o;5329:401::-;;;5451:2;5439:9;5430:7;5426:23;5422:32;5419:2;;;5467:1;5464;5457:12;5419:2;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:50;5705:7;5696:6;5685:9;5681:22;5663:50;:::i;:::-;5653:60;;5608:115;5409:321;;;;;:::o;5736:407::-;;;5861:2;5849:9;5840:7;5836:23;5832:32;5829:2;;;5877:1;5874;5867:12;5829:2;5920:1;5945:53;5990:7;5981:6;5970:9;5966:22;5945:53;:::i;:::-;5935:63;;5891:117;6047:2;6073:53;6118:7;6109:6;6098:9;6094:22;6073:53;:::i;:::-;6063:63;;6018:118;5819:324;;;;;:::o;6149:405::-;;6282:2;6270:9;6261:7;6257:23;6253:32;6250:2;;;6298:1;6295;6288:12;6250:2;6369:1;6358:9;6354:17;6341:31;6399:18;6391:6;6388:30;6385:2;;;6431:1;6428;6421:12;6385:2;6459:78;6529:7;6520:6;6509:9;6505:22;6459:78;:::i;:::-;6449:88;;6312:235;6240:314;;;;:::o;6560:550::-;;;6710:2;6698:9;6689:7;6685:23;6681:32;6678:2;;;6726:1;6723;6716:12;6678:2;6797:1;6786:9;6782:17;6769:31;6827:18;6819:6;6816:30;6813:2;;;6859:1;6856;6849:12;6813:2;6887:78;6957:7;6948:6;6937:9;6933:22;6887:78;:::i;:::-;6877:88;;6740:235;7014:2;7040:53;7085:7;7076:6;7065:9;7061:22;7040:53;:::i;:::-;7030:63;;6985:118;6668:442;;;;;:::o;7116:695::-;;;;7283:2;7271:9;7262:7;7258:23;7254:32;7251:2;;;7299:1;7296;7289:12;7251:2;7370:1;7359:9;7355:17;7342:31;7400:18;7392:6;7389:30;7386:2;;;7432:1;7429;7422:12;7386:2;7460:78;7530:7;7521:6;7510:9;7506:22;7460:78;:::i;:::-;7450:88;;7313:235;7587:2;7613:53;7658:7;7649:6;7638:9;7634:22;7613:53;:::i;:::-;7603:63;;7558:118;7715:2;7741:53;7786:7;7777:6;7766:9;7762:22;7741:53;:::i;:::-;7731:63;;7686:118;7241:570;;;;;:::o;7817:256::-;;7922:2;7910:9;7901:7;7897:23;7893:32;7890:2;;;7938:1;7935;7928:12;7890:2;7981:1;8006:50;8048:7;8039:6;8028:9;8024:22;8006:50;:::i;:::-;7996:60;;7952:114;7880:193;;;;:::o;8079:540::-;;;;8215:2;8203:9;8194:7;8190:23;8186:32;8183:2;;;8231:1;8228;8221:12;8183:2;8274:1;8299:50;8341:7;8332:6;8321:9;8317:22;8299:50;:::i;:::-;8289:60;;8245:114;8398:2;8424:50;8466:7;8457:6;8446:9;8442:22;8424:50;:::i;:::-;8414:60;;8369:115;8523:2;8549:53;8594:7;8585:6;8574:9;8570:22;8549:53;:::i;:::-;8539:63;;8494:118;8173:446;;;;;:::o;8625:262::-;;8733:2;8721:9;8712:7;8708:23;8704:32;8701:2;;;8749:1;8746;8739:12;8701:2;8792:1;8817:53;8862:7;8853:6;8842:9;8838:22;8817:53;:::i;:::-;8807:63;;8763:117;8691:196;;;;:::o;8893:260::-;;9000:2;8988:9;8979:7;8975:23;8971:32;8968:2;;;9016:1;9013;9006:12;8968:2;9059:1;9084:52;9128:7;9119:6;9108:9;9104:22;9084:52;:::i;:::-;9074:62;;9030:116;8958:195;;;;:::o;9159:282::-;;9277:2;9265:9;9256:7;9252:23;9248:32;9245:2;;;9293:1;9290;9283:12;9245:2;9336:1;9361:63;9416:7;9407:6;9396:9;9392:22;9361:63;:::i;:::-;9351:73;;9307:127;9235:206;;;;:::o;9447:375::-;;9565:2;9553:9;9544:7;9540:23;9536:32;9533:2;;;9581:1;9578;9571:12;9533:2;9652:1;9641:9;9637:17;9624:31;9682:18;9674:6;9671:30;9668:2;;;9714:1;9711;9704:12;9668:2;9742:63;9797:7;9788:6;9777:9;9773:22;9742:63;:::i;:::-;9732:73;;9595:220;9523:299;;;;:::o;9828:262::-;;9936:2;9924:9;9915:7;9911:23;9907:32;9904:2;;;9952:1;9949;9942:12;9904:2;9995:1;10020:53;10065:7;10056:6;10045:9;10041:22;10020:53;:::i;:::-;10010:63;;9966:117;9894:196;;;;:::o;10096:284::-;;10215:2;10203:9;10194:7;10190:23;10186:32;10183:2;;;10231:1;10228;10221:12;10183:2;10274:1;10299:64;10355:7;10346:6;10335:9;10331:22;10299:64;:::i;:::-;10289:74;;10245:128;10173:207;;;;:::o;10386:407::-;;;10511:2;10499:9;10490:7;10486:23;10482:32;10479:2;;;10527:1;10524;10517:12;10479:2;10570:1;10595:53;10640:7;10631:6;10620:9;10616:22;10595:53;:::i;:::-;10585:63;;10541:117;10697:2;10723:53;10768:7;10759:6;10748:9;10744:22;10723:53;:::i;:::-;10713:63;;10668:118;10469:324;;;;;:::o;10799:407::-;;;10924:2;10912:9;10903:7;10899:23;10895:32;10892:2;;;10940:1;10937;10930:12;10892:2;10983:1;11008:53;11053:7;11044:6;11033:9;11029:22;11008:53;:::i;:::-;10998:63;;10954:117;11110:2;11136:53;11181:7;11172:6;11161:9;11157:22;11136:53;:::i;:::-;11126:63;;11081:118;10882:324;;;;;:::o;11212:118::-;11299:24;11317:5;11299:24;:::i;:::-;11294:3;11287:37;11277:53;;:::o;11336:157::-;11441:45;11461:24;11479:5;11461:24;:::i;:::-;11441:45;:::i;:::-;11436:3;11429:58;11419:74;;:::o;11499:109::-;11580:21;11595:5;11580:21;:::i;:::-;11575:3;11568:34;11558:50;;:::o;11614:157::-;11719:45;11739:24;11757:5;11739:24;:::i;:::-;11719:45;:::i;:::-;11714:3;11707:58;11697:74;;:::o;11777:360::-;;11891:38;11923:5;11891:38;:::i;:::-;11945:70;12008:6;12003:3;11945:70;:::i;:::-;11938:77;;12024:52;12069:6;12064:3;12057:4;12050:5;12046:16;12024:52;:::i;:::-;12101:29;12123:6;12101:29;:::i;:::-;12096:3;12092:39;12085:46;;11867:270;;;;;:::o;12143:364::-;;12259:39;12292:5;12259:39;:::i;:::-;12314:71;12378:6;12373:3;12314:71;:::i;:::-;12307:78;;12394:52;12439:6;12434:3;12427:4;12420:5;12416:16;12394:52;:::i;:::-;12471:29;12493:6;12471:29;:::i;:::-;12466:3;12462:39;12455:46;;12235:272;;;;;:::o;12513:377::-;;12647:39;12680:5;12647:39;:::i;:::-;12702:89;12784:6;12779:3;12702:89;:::i;:::-;12695:96;;12800:52;12845:6;12840:3;12833:4;12826:5;12822:16;12800:52;:::i;:::-;12877:6;12872:3;12868:16;12861:23;;12623:267;;;;;:::o;12920:845::-;;13060:5;13054:12;13089:36;13115:9;13089:36;:::i;:::-;13141:89;13223:6;13218:3;13141:89;:::i;:::-;13134:96;;13261:1;13250:9;13246:17;13277:1;13272:137;;;;13423:1;13418:341;;;;13239:520;;13272:137;13356:4;13352:9;13341;13337:25;13332:3;13325:38;13392:6;13387:3;13383:16;13376:23;;13272:137;;13418:341;13485:38;13517:5;13485:38;:::i;:::-;13545:1;13559:154;13573:6;13570:1;13567:13;13559:154;;;13647:7;13641:14;13637:1;13632:3;13628:11;13621:35;13697:1;13688:7;13684:15;13673:26;;13595:4;13592:1;13588:12;13583:17;;13559:154;;;13742:6;13737:3;13733:16;13726:23;;13425:334;;13239:520;;13027:738;;;;;;:::o;13771:366::-;;13934:67;13998:2;13993:3;13934:67;:::i;:::-;13927:74;;14010:93;14099:3;14010:93;:::i;:::-;14128:2;14123:3;14119:12;14112:19;;13917:220;;;:::o;14143:366::-;;14306:67;14370:2;14365:3;14306:67;:::i;:::-;14299:74;;14382:93;14471:3;14382:93;:::i;:::-;14500:2;14495:3;14491:12;14484:19;;14289:220;;;:::o;14515:366::-;;14678:67;14742:2;14737:3;14678:67;:::i;:::-;14671:74;;14754:93;14843:3;14754:93;:::i;:::-;14872:2;14867:3;14863:12;14856:19;;14661:220;;;:::o;14887:366::-;;15050:67;15114:2;15109:3;15050:67;:::i;:::-;15043:74;;15126:93;15215:3;15126:93;:::i;:::-;15244:2;15239:3;15235:12;15228:19;;15033:220;;;:::o;15259:366::-;;15422:67;15486:2;15481:3;15422:67;:::i;:::-;15415:74;;15498:93;15587:3;15498:93;:::i;:::-;15616:2;15611:3;15607:12;15600:19;;15405:220;;;:::o;15631:366::-;;15794:67;15858:2;15853:3;15794:67;:::i;:::-;15787:74;;15870:93;15959:3;15870:93;:::i;:::-;15988:2;15983:3;15979:12;15972:19;;15777:220;;;:::o;16003:366::-;;16166:67;16230:2;16225:3;16166:67;:::i;:::-;16159:74;;16242:93;16331:3;16242:93;:::i;:::-;16360:2;16355:3;16351:12;16344:19;;16149:220;;;:::o;16375:366::-;;16538:67;16602:2;16597:3;16538:67;:::i;:::-;16531:74;;16614:93;16703:3;16614:93;:::i;:::-;16732:2;16727:3;16723:12;16716:19;;16521:220;;;:::o;16747:366::-;;16910:67;16974:2;16969:3;16910:67;:::i;:::-;16903:74;;16986:93;17075:3;16986:93;:::i;:::-;17104:2;17099:3;17095:12;17088:19;;16893:220;;;:::o;17119:366::-;;17282:67;17346:2;17341:3;17282:67;:::i;:::-;17275:74;;17358:93;17447:3;17358:93;:::i;:::-;17476:2;17471:3;17467:12;17460:19;;17265:220;;;:::o;17491:365::-;;17654:66;17718:1;17713:3;17654:66;:::i;:::-;17647:73;;17729:93;17818:3;17729:93;:::i;:::-;17847:2;17842:3;17838:12;17831:19;;17637:219;;;:::o;17862:366::-;;18025:67;18089:2;18084:3;18025:67;:::i;:::-;18018:74;;18101:93;18190:3;18101:93;:::i;:::-;18219:2;18214:3;18210:12;18203:19;;18008:220;;;:::o;18234:366::-;;18397:67;18461:2;18456:3;18397:67;:::i;:::-;18390:74;;18473:93;18562:3;18473:93;:::i;:::-;18591:2;18586:3;18582:12;18575:19;;18380:220;;;:::o;18606:366::-;;18769:67;18833:2;18828:3;18769:67;:::i;:::-;18762:74;;18845:93;18934:3;18845:93;:::i;:::-;18963:2;18958:3;18954:12;18947:19;;18752:220;;;:::o;18978:366::-;;19141:67;19205:2;19200:3;19141:67;:::i;:::-;19134:74;;19217:93;19306:3;19217:93;:::i;:::-;19335:2;19330:3;19326:12;19319:19;;19124:220;;;:::o;19350:366::-;;19513:67;19577:2;19572:3;19513:67;:::i;:::-;19506:74;;19589:93;19678:3;19589:93;:::i;:::-;19707:2;19702:3;19698:12;19691:19;;19496:220;;;:::o;19722:366::-;;19885:67;19949:2;19944:3;19885:67;:::i;:::-;19878:74;;19961:93;20050:3;19961:93;:::i;:::-;20079:2;20074:3;20070:12;20063:19;;19868:220;;;:::o;20094:366::-;;20257:67;20321:2;20316:3;20257:67;:::i;:::-;20250:74;;20333:93;20422:3;20333:93;:::i;:::-;20451:2;20446:3;20442:12;20435:19;;20240:220;;;:::o;20466:366::-;;20629:67;20693:2;20688:3;20629:67;:::i;:::-;20622:74;;20705:93;20794:3;20705:93;:::i;:::-;20823:2;20818:3;20814:12;20807:19;;20612:220;;;:::o;20838:366::-;;21001:67;21065:2;21060:3;21001:67;:::i;:::-;20994:74;;21077:93;21166:3;21077:93;:::i;:::-;21195:2;21190:3;21186:12;21179:19;;20984:220;;;:::o;21210:366::-;;21373:67;21437:2;21432:3;21373:67;:::i;:::-;21366:74;;21449:93;21538:3;21449:93;:::i;:::-;21567:2;21562:3;21558:12;21551:19;;21356:220;;;:::o;21582:366::-;;21745:67;21809:2;21804:3;21745:67;:::i;:::-;21738:74;;21821:93;21910:3;21821:93;:::i;:::-;21939:2;21934:3;21930:12;21923:19;;21728:220;;;:::o;21954:366::-;;22117:67;22181:2;22176:3;22117:67;:::i;:::-;22110:74;;22193:93;22282:3;22193:93;:::i;:::-;22311:2;22306:3;22302:12;22295:19;;22100:220;;;:::o;22326:366::-;;22489:67;22553:2;22548:3;22489:67;:::i;:::-;22482:74;;22565:93;22654:3;22565:93;:::i;:::-;22683:2;22678:3;22674:12;22667:19;;22472:220;;;:::o;22698:366::-;;22861:67;22925:2;22920:3;22861:67;:::i;:::-;22854:74;;22937:93;23026:3;22937:93;:::i;:::-;23055:2;23050:3;23046:12;23039:19;;22844:220;;;:::o;23070:398::-;;23250:83;23331:1;23326:3;23250:83;:::i;:::-;23243:90;;23342:93;23431:3;23342:93;:::i;:::-;23460:1;23455:3;23451:11;23444:18;;23233:235;;;:::o;23474:366::-;;23637:67;23701:2;23696:3;23637:67;:::i;:::-;23630:74;;23713:93;23802:3;23713:93;:::i;:::-;23831:2;23826:3;23822:12;23815:19;;23620:220;;;:::o;23846:366::-;;24009:67;24073:2;24068:3;24009:67;:::i;:::-;24002:74;;24085:93;24174:3;24085:93;:::i;:::-;24203:2;24198:3;24194:12;24187:19;;23992:220;;;:::o;24218:366::-;;24381:67;24445:2;24440:3;24381:67;:::i;:::-;24374:74;;24457:93;24546:3;24457:93;:::i;:::-;24575:2;24570:3;24566:12;24559:19;;24364:220;;;:::o;24590:366::-;;24753:67;24817:2;24812:3;24753:67;:::i;:::-;24746:74;;24829:93;24918:3;24829:93;:::i;:::-;24947:2;24942:3;24938:12;24931:19;;24736:220;;;:::o;24962:366::-;;25125:67;25189:2;25184:3;25125:67;:::i;:::-;25118:74;;25201:93;25290:3;25201:93;:::i;:::-;25319:2;25314:3;25310:12;25303:19;;25108:220;;;:::o;25334:118::-;25421:24;25439:5;25421:24;:::i;:::-;25416:3;25409:37;25399:53;;:::o;25458:157::-;25563:45;25583:24;25601:5;25583:24;:::i;:::-;25563:45;:::i;:::-;25558:3;25551:58;25541:74;;:::o;25621:256::-;;25748:75;25819:3;25810:6;25748:75;:::i;:::-;25848:2;25843:3;25839:12;25832:19;;25868:3;25861:10;;25737:140;;;;:::o;25883:397::-;;26038:75;26109:3;26100:6;26038:75;:::i;:::-;26138:2;26133:3;26129:12;26122:19;;26151:75;26222:3;26213:6;26151:75;:::i;:::-;26251:2;26246:3;26242:12;26235:19;;26271:3;26264:10;;26027:253;;;;;:::o;26286:397::-;;26441:75;26512:3;26503:6;26441:75;:::i;:::-;26541:2;26536:3;26532:12;26525:19;;26554:75;26625:3;26616:6;26554:75;:::i;:::-;26654:2;26649:3;26645:12;26638:19;;26674:3;26667:10;;26430:253;;;;;:::o;26689:429::-;;26888:92;26976:3;26967:6;26888:92;:::i;:::-;26881:99;;26997:95;27088:3;27079:6;26997:95;:::i;:::-;26990:102;;27109:3;27102:10;;26870:248;;;;;:::o;27124:379::-;;27330:147;27473:3;27330:147;:::i;:::-;27323:154;;27494:3;27487:10;;27312:191;;;:::o;27509:222::-;;27640:2;27629:9;27625:18;27617:26;;27653:71;27721:1;27710:9;27706:17;27697:6;27653:71;:::i;:::-;27607:124;;;;:::o;27737:640::-;;27970:3;27959:9;27955:19;27947:27;;27984:71;28052:1;28041:9;28037:17;28028:6;27984:71;:::i;:::-;28065:72;28133:2;28122:9;28118:18;28109:6;28065:72;:::i;:::-;28147;28215:2;28204:9;28200:18;28191:6;28147:72;:::i;:::-;28266:9;28260:4;28256:20;28251:2;28240:9;28236:18;28229:48;28294:76;28365:4;28356:6;28294:76;:::i;:::-;28286:84;;27937:440;;;;;;;:::o;28383:210::-;;28508:2;28497:9;28493:18;28485:26;;28521:65;28583:1;28572:9;28568:17;28559:6;28521:65;:::i;:::-;28475:118;;;;:::o;28599:313::-;;28750:2;28739:9;28735:18;28727:26;;28799:9;28793:4;28789:20;28785:1;28774:9;28770:17;28763:47;28827:78;28900:4;28891:6;28827:78;:::i;:::-;28819:86;;28717:195;;;;:::o;28918:419::-;;29122:2;29111:9;29107:18;29099:26;;29171:9;29165:4;29161:20;29157:1;29146:9;29142:17;29135:47;29199:131;29325:4;29199:131;:::i;:::-;29191:139;;29089:248;;;:::o;29343:419::-;;29547:2;29536:9;29532:18;29524:26;;29596:9;29590:4;29586:20;29582:1;29571:9;29567:17;29560:47;29624:131;29750:4;29624:131;:::i;:::-;29616:139;;29514:248;;;:::o;29768:419::-;;29972:2;29961:9;29957:18;29949:26;;30021:9;30015:4;30011:20;30007:1;29996:9;29992:17;29985:47;30049:131;30175:4;30049:131;:::i;:::-;30041:139;;29939:248;;;:::o;30193:419::-;;30397:2;30386:9;30382:18;30374:26;;30446:9;30440:4;30436:20;30432:1;30421:9;30417:17;30410:47;30474:131;30600:4;30474:131;:::i;:::-;30466:139;;30364:248;;;:::o;30618:419::-;;30822:2;30811:9;30807:18;30799:26;;30871:9;30865:4;30861:20;30857:1;30846:9;30842:17;30835:47;30899:131;31025:4;30899:131;:::i;:::-;30891:139;;30789:248;;;:::o;31043:419::-;;31247:2;31236:9;31232:18;31224:26;;31296:9;31290:4;31286:20;31282:1;31271:9;31267:17;31260:47;31324:131;31450:4;31324:131;:::i;:::-;31316:139;;31214:248;;;:::o;31468:419::-;;31672:2;31661:9;31657:18;31649:26;;31721:9;31715:4;31711:20;31707:1;31696:9;31692:17;31685:47;31749:131;31875:4;31749:131;:::i;:::-;31741:139;;31639:248;;;:::o;31893:419::-;;32097:2;32086:9;32082:18;32074:26;;32146:9;32140:4;32136:20;32132:1;32121:9;32117:17;32110:47;32174:131;32300:4;32174:131;:::i;:::-;32166:139;;32064:248;;;:::o;32318:419::-;;32522:2;32511:9;32507:18;32499:26;;32571:9;32565:4;32561:20;32557:1;32546:9;32542:17;32535:47;32599:131;32725:4;32599:131;:::i;:::-;32591:139;;32489:248;;;:::o;32743:419::-;;32947:2;32936:9;32932:18;32924:26;;32996:9;32990:4;32986:20;32982:1;32971:9;32967:17;32960:47;33024:131;33150:4;33024:131;:::i;:::-;33016:139;;32914:248;;;:::o;33168:419::-;;33372:2;33361:9;33357:18;33349:26;;33421:9;33415:4;33411:20;33407:1;33396:9;33392:17;33385:47;33449:131;33575:4;33449:131;:::i;:::-;33441:139;;33339:248;;;:::o;33593:419::-;;33797:2;33786:9;33782:18;33774:26;;33846:9;33840:4;33836:20;33832:1;33821:9;33817:17;33810:47;33874:131;34000:4;33874:131;:::i;:::-;33866:139;;33764:248;;;:::o;34018:419::-;;34222:2;34211:9;34207:18;34199:26;;34271:9;34265:4;34261:20;34257:1;34246:9;34242:17;34235:47;34299:131;34425:4;34299:131;:::i;:::-;34291:139;;34189:248;;;:::o;34443:419::-;;34647:2;34636:9;34632:18;34624:26;;34696:9;34690:4;34686:20;34682:1;34671:9;34667:17;34660:47;34724:131;34850:4;34724:131;:::i;:::-;34716:139;;34614:248;;;:::o;34868:419::-;;35072:2;35061:9;35057:18;35049:26;;35121:9;35115:4;35111:20;35107:1;35096:9;35092:17;35085:47;35149:131;35275:4;35149:131;:::i;:::-;35141:139;;35039:248;;;:::o;35293:419::-;;35497:2;35486:9;35482:18;35474:26;;35546:9;35540:4;35536:20;35532:1;35521:9;35517:17;35510:47;35574:131;35700:4;35574:131;:::i;:::-;35566:139;;35464:248;;;:::o;35718:419::-;;35922:2;35911:9;35907:18;35899:26;;35971:9;35965:4;35961:20;35957:1;35946:9;35942:17;35935:47;35999:131;36125:4;35999:131;:::i;:::-;35991:139;;35889:248;;;:::o;36143:419::-;;36347:2;36336:9;36332:18;36324:26;;36396:9;36390:4;36386:20;36382:1;36371:9;36367:17;36360:47;36424:131;36550:4;36424:131;:::i;:::-;36416:139;;36314:248;;;:::o;36568:419::-;;36772:2;36761:9;36757:18;36749:26;;36821:9;36815:4;36811:20;36807:1;36796:9;36792:17;36785:47;36849:131;36975:4;36849:131;:::i;:::-;36841:139;;36739:248;;;:::o;36993:419::-;;37197:2;37186:9;37182:18;37174:26;;37246:9;37240:4;37236:20;37232:1;37221:9;37217:17;37210:47;37274:131;37400:4;37274:131;:::i;:::-;37266:139;;37164:248;;;:::o;37418:419::-;;37622:2;37611:9;37607:18;37599:26;;37671:9;37665:4;37661:20;37657:1;37646:9;37642:17;37635:47;37699:131;37825:4;37699:131;:::i;:::-;37691:139;;37589:248;;;:::o;37843:419::-;;38047:2;38036:9;38032:18;38024:26;;38096:9;38090:4;38086:20;38082:1;38071:9;38067:17;38060:47;38124:131;38250:4;38124:131;:::i;:::-;38116:139;;38014:248;;;:::o;38268:419::-;;38472:2;38461:9;38457:18;38449:26;;38521:9;38515:4;38511:20;38507:1;38496:9;38492:17;38485:47;38549:131;38675:4;38549:131;:::i;:::-;38541:139;;38439:248;;;:::o;38693:419::-;;38897:2;38886:9;38882:18;38874:26;;38946:9;38940:4;38936:20;38932:1;38921:9;38917:17;38910:47;38974:131;39100:4;38974:131;:::i;:::-;38966:139;;38864:248;;;:::o;39118:419::-;;39322:2;39311:9;39307:18;39299:26;;39371:9;39365:4;39361:20;39357:1;39346:9;39342:17;39335:47;39399:131;39525:4;39399:131;:::i;:::-;39391:139;;39289:248;;;:::o;39543:419::-;;39747:2;39736:9;39732:18;39724:26;;39796:9;39790:4;39786:20;39782:1;39771:9;39767:17;39760:47;39824:131;39950:4;39824:131;:::i;:::-;39816:139;;39714:248;;;:::o;39968:419::-;;40172:2;40161:9;40157:18;40149:26;;40221:9;40215:4;40211:20;40207:1;40196:9;40192:17;40185:47;40249:131;40375:4;40249:131;:::i;:::-;40241:139;;40139:248;;;:::o;40393:419::-;;40597:2;40586:9;40582:18;40574:26;;40646:9;40640:4;40636:20;40632:1;40621:9;40617:17;40610:47;40674:131;40800:4;40674:131;:::i;:::-;40666:139;;40564:248;;;:::o;40818:419::-;;41022:2;41011:9;41007:18;40999:26;;41071:9;41065:4;41061:20;41057:1;41046:9;41042:17;41035:47;41099:131;41225:4;41099:131;:::i;:::-;41091:139;;40989:248;;;:::o;41243:419::-;;41447:2;41436:9;41432:18;41424:26;;41496:9;41490:4;41486:20;41482:1;41471:9;41467:17;41460:47;41524:131;41650:4;41524:131;:::i;:::-;41516:139;;41414:248;;;:::o;41668:222::-;;41799:2;41788:9;41784:18;41776:26;;41812:71;41880:1;41869:9;41865:17;41856:6;41812:71;:::i;:::-;41766:124;;;;:::o;41896:129::-;;41957:20;;:::i;:::-;41947:30;;41986:33;42014:4;42006:6;41986:33;:::i;:::-;41937:88;;;:::o;42031:75::-;;42097:2;42091:9;42081:19;;42071:35;:::o;42112:311::-;;42279:18;42271:6;42268:30;42265:2;;;42301:18;;:::i;:::-;42265:2;42351:4;42343:6;42339:17;42331:25;;42411:4;42405;42401:15;42393:23;;42194:229;;;:::o;42429:307::-;;42580:18;42572:6;42569:30;42566:2;;;42602:18;;:::i;:::-;42566:2;42640:29;42662:6;42640:29;:::i;:::-;42632:37;;42724:4;42718;42714:15;42706:23;;42495:241;;;:::o;42742:308::-;;42894:18;42886:6;42883:30;42880:2;;;42916:18;;:::i;:::-;42880:2;42954:29;42976:6;42954:29;:::i;:::-;42946:37;;43038:4;43032;43028:15;43020:23;;42809:241;;;:::o;43056:141::-;;43128:3;43120:11;;43151:3;43148:1;43141:14;43185:4;43182:1;43172:18;43164:26;;43110:87;;;:::o;43203:98::-;;43288:5;43282:12;43272:22;;43261:40;;;:::o;43307:99::-;;43393:5;43387:12;43377:22;;43366:40;;;:::o;43412:168::-;;43529:6;43524:3;43517:19;43569:4;43564:3;43560:14;43545:29;;43507:73;;;;:::o;43586:147::-;;43724:3;43709:18;;43699:34;;;;:::o;43739:169::-;;43857:6;43852:3;43845:19;43897:4;43892:3;43888:14;43873:29;;43835:73;;;;:::o;43914:148::-;;44053:3;44038:18;;44028:34;;;;:::o;44068:305::-;;44127:20;44145:1;44127:20;:::i;:::-;44122:25;;44161:20;44179:1;44161:20;:::i;:::-;44156:25;;44315:1;44247:66;44243:74;44240:1;44237:81;44234:2;;;44321:18;;:::i;:::-;44234:2;44365:1;44362;44358:9;44351:16;;44112:261;;;;:::o;44379:185::-;;44436:20;44454:1;44436:20;:::i;:::-;44431:25;;44470:20;44488:1;44470:20;:::i;:::-;44465:25;;44509:1;44499:2;;44514:18;;:::i;:::-;44499:2;44556:1;44553;44549:9;44544:14;;44421:143;;;;:::o;44570:348::-;;44633:20;44651:1;44633:20;:::i;:::-;44628:25;;44667:20;44685:1;44667:20;:::i;:::-;44662:25;;44855:1;44787:66;44783:74;44780:1;44777:81;44772:1;44765:9;44758:17;44754:105;44751:2;;;44862:18;;:::i;:::-;44751:2;44910:1;44907;44903:9;44892:20;;44618:300;;;;:::o;44924:191::-;;44984:20;45002:1;44984:20;:::i;:::-;44979:25;;45018:20;45036:1;45018:20;:::i;:::-;45013:25;;45057:1;45054;45051:8;45048:2;;;45062:18;;:::i;:::-;45048:2;45107:1;45104;45100:9;45092:17;;44969:146;;;;:::o;45121:96::-;;45187:24;45205:5;45187:24;:::i;:::-;45176:35;;45166:51;;;:::o;45223:90::-;;45300:5;45293:13;45286:21;45275:32;;45265:48;;;:::o;45319:77::-;;45385:5;45374:16;;45364:32;;;:::o;45402:149::-;;45478:66;45471:5;45467:78;45456:89;;45446:105;;;:::o;45557:126::-;;45634:42;45627:5;45623:54;45612:65;;45602:81;;;:::o;45689:77::-;;45755:5;45744:16;;45734:32;;;:::o;45772:154::-;45856:6;45851:3;45846;45833:30;45918:1;45909:6;45904:3;45900:16;45893:27;45823:103;;;:::o;45932:307::-;46000:1;46010:113;46024:6;46021:1;46018:13;46010:113;;;46109:1;46104:3;46100:11;46094:18;46090:1;46085:3;46081:11;46074:39;46046:2;46043:1;46039:10;46034:15;;46010:113;;;46141:6;46138:1;46135:13;46132:2;;;46221:1;46212:6;46207:3;46203:16;46196:27;46132:2;45981:258;;;;:::o;46245:320::-;;46326:1;46320:4;46316:12;46306:22;;46373:1;46367:4;46363:12;46394:18;46384:2;;46450:4;46442:6;46438:17;46428:27;;46384:2;46512;46504:6;46501:14;46481:18;46478:38;46475:2;;;46531:18;;:::i;:::-;46475:2;46296:269;;;;:::o;46571:281::-;46654:27;46676:4;46654:27;:::i;:::-;46646:6;46642:40;46784:6;46772:10;46769:22;46748:18;46736:10;46733:34;46730:62;46727:2;;;46795:18;;:::i;:::-;46727:2;46835:10;46831:2;46824:22;46614:238;;;:::o;46858:233::-;;46920:24;46938:5;46920:24;:::i;:::-;46911:33;;46966:66;46959:5;46956:77;46953:2;;;47036:18;;:::i;:::-;46953:2;47083:1;47076:5;47072:13;47065:20;;46901:190;;;:::o;47097:100::-;;47165:26;47185:5;47165:26;:::i;:::-;47154:37;;47144:53;;;:::o;47203:79::-;;47271:5;47260:16;;47250:32;;;:::o;47288:94::-;;47356:20;47370:5;47356:20;:::i;:::-;47345:31;;47335:47;;;:::o;47388:79::-;;47456:5;47445:16;;47435:32;;;:::o;47473:176::-;;47522:20;47540:1;47522:20;:::i;:::-;47517:25;;47556:20;47574:1;47556:20;:::i;:::-;47551:25;;47595:1;47585:2;;47600:18;;:::i;:::-;47585:2;47641:1;47638;47634:9;47629:14;;47507:142;;;;:::o;47655:180::-;47703:77;47700:1;47693:88;47800:4;47797:1;47790:15;47824:4;47821:1;47814:15;47841:180;47889:77;47886:1;47879:88;47986:4;47983:1;47976:15;48010:4;48007:1;48000:15;48027:180;48075:77;48072:1;48065:88;48172:4;48169:1;48162:15;48196:4;48193:1;48186:15;48213:180;48261:77;48258:1;48251:88;48358:4;48355:1;48348:15;48382:4;48379:1;48372:15;48399:102;;48491:2;48487:7;48482:2;48475:5;48471:14;48467:28;48457:38;;48447:54;;;:::o;48507:94::-;;48588:5;48584:2;48580:14;48559:35;;48549:52;;;:::o;48607:237::-;48747:34;48743:1;48735:6;48731:14;48724:58;48816:20;48811:2;48803:6;48799:15;48792:45;48713:131;:::o;48850:225::-;48990:34;48986:1;48978:6;48974:14;48967:58;49059:8;49054:2;49046:6;49042:15;49035:33;48956:119;:::o;49081:178::-;49221:30;49217:1;49209:6;49205:14;49198:54;49187:72;:::o;49265:170::-;49405:22;49401:1;49393:6;49389:14;49382:46;49371:64;:::o;49441:162::-;49581:14;49577:1;49569:6;49565:14;49558:38;49547:56;:::o;49609:223::-;49749:34;49745:1;49737:6;49733:14;49726:58;49818:6;49813:2;49805:6;49801:15;49794:31;49715:117;:::o;49838:175::-;49978:27;49974:1;49966:6;49962:14;49955:51;49944:69;:::o;50019:177::-;50159:29;50155:1;50147:6;50143:14;50136:53;50125:71;:::o;50202:179::-;50342:31;50338:1;50330:6;50326:14;50319:55;50308:73;:::o;50387:231::-;50527:34;50523:1;50515:6;50511:14;50504:58;50596:14;50591:2;50583:6;50579:15;50572:39;50493:125;:::o;50624:158::-;50764:10;50760:1;50752:6;50748:14;50741:34;50730:52;:::o;50788:161::-;50928:13;50924:1;50916:6;50912:14;50905:37;50894:55;:::o;50955:170::-;51095:22;51091:1;51083:6;51079:14;51072:46;51061:64;:::o;51131:243::-;51271:34;51267:1;51259:6;51255:14;51248:58;51340:26;51335:2;51327:6;51323:15;51316:51;51237:137;:::o;51380:229::-;51520:34;51516:1;51508:6;51504:14;51497:58;51589:12;51584:2;51576:6;51572:15;51565:37;51486:123;:::o;51615:228::-;51755:34;51751:1;51743:6;51739:14;51732:58;51824:11;51819:2;51811:6;51807:15;51800:36;51721:122;:::o;51849:161::-;51989:13;51985:1;51977:6;51973:14;51966:37;51955:55;:::o;52016:182::-;52156:34;52152:1;52144:6;52140:14;52133:58;52122:76;:::o;52204:169::-;52344:21;52340:1;52332:6;52328:14;52321:45;52310:63;:::o;52379:231::-;52519:34;52515:1;52507:6;52503:14;52496:58;52588:14;52583:2;52575:6;52571:15;52564:39;52485:125;:::o;52616:182::-;52756:34;52752:1;52744:6;52740:14;52733:58;52722:76;:::o;52804:170::-;52944:22;52940:1;52932:6;52928:14;52921:46;52910:64;:::o;52980:228::-;53120:34;53116:1;53108:6;53104:14;53097:58;53189:11;53184:2;53176:6;53172:15;53165:36;53086:122;:::o;53214:161::-;53354:13;53350:1;53342:6;53338:14;53331:37;53320:55;:::o;53381:220::-;53521:34;53517:1;53509:6;53505:14;53498:58;53590:3;53585:2;53577:6;53573:15;53566:28;53487:114;:::o;53607:::-;53713:8;:::o;53727:162::-;53867:14;53863:1;53855:6;53851:14;53844:38;53833:56;:::o;53895:168::-;54035:20;54031:1;54023:6;54019:14;54012:44;54001:62;:::o;54069:236::-;54209:34;54205:1;54197:6;54193:14;54186:58;54278:19;54273:2;54265:6;54261:15;54254:44;54175:130;:::o;54311:180::-;54451:32;54447:1;54439:6;54435:14;54428:56;54417:74;:::o;54497:170::-;54637:22;54633:1;54625:6;54621:14;54614:46;54603:64;:::o;54673:122::-;54746:24;54764:5;54746:24;:::i;:::-;54739:5;54736:35;54726:2;;54785:1;54782;54775:12;54726:2;54716:79;:::o;54801:116::-;54871:21;54886:5;54871:21;:::i;:::-;54864:5;54861:32;54851:2;;54907:1;54904;54897:12;54851:2;54841:76;:::o;54923:122::-;54996:24;55014:5;54996:24;:::i;:::-;54989:5;54986:35;54976:2;;55035:1;55032;55025:12;54976:2;54966:79;:::o;55051:120::-;55123:23;55140:5;55123:23;:::i;:::-;55116:5;55113:34;55103:2;;55161:1;55158;55151:12;55103:2;55093:78;:::o;55177:122::-;55250:24;55268:5;55250:24;:::i;:::-;55243:5;55240:35;55230:2;;55289:1;55286;55279:12;55230:2;55220:79;:::o

Swarm Source

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