ETH Price: $3,827.97 (+4.92%)

Token

BloodWars (BW)
 

Overview

Max Total Supply

2,816 BW

Holders

418

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 BW
0x48Bd243C68ca8E8e5144eA7092831faA48F4a1a8
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BloodWar

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address, RecoverError)
    {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs &
            bytes32(
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            );
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n",
                    Strings.toString(s.length),
                    s
                )
            );
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );
    }
}

// File: contracts/BloodWars.sol

contract BloodWar is ERC721, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    //NFT params
    string public baseURI;
    string public defaultURI;
    string public mycontractURI;
    bool public finalizeBaseUri = false;

    //sale stages:
    //stage 0: init(no minting)
    //stage 1: pre-sale
    //stage 2: public sale
    //stage 3: reserve mint
    uint8 public stage = 0;

    event stageChanged(uint8 stage);

    //pre-sale (stage=1)
    address private _signer;

    uint256 public presalePrice = 0.03 ether;
    uint256 public presaleMintMax = 5;
    uint256 public presaleSupply = 8488;

    mapping(address => uint8) public presaleMintCount;

    //public sale (stage=2)
    uint256 public salePrice = 0.05 ether;
    uint256 public saleMintMax = 10;
    uint256 public totalSaleSupply = 8488;
    mapping(address => uint8) public saleMintCount;

    uint256 public maxCollectionSupply = 8888;

    // // stage struct
    // struct Stage {
    //     uint256 supply;
    //     uint256 maxMint;
    //     uint256 price;
    // }
    // // stage => price
    // mapping(uint8 => Stage) public stageConfig;

    //others
    bool public paused = false;
    uint256 public currentSupply;

    //sale holders
    address[2] public fundRecipients = [
        0xc8403Eb0ffEFdB129b1C3b18E9268e58e26D9f61,
        0x975b9adF63A36cAaFA1870e3A3CF01f2dc8FFD03
    ];
    uint256[] public receivePercentagePt = [8500, 1500]; //distribution in basis points

    //royalty
    address public royaltyAddr = 0xc8403Eb0ffEFdB129b1C3b18E9268e58e26D9f61;
    uint256 public royaltyBasis = 600;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _defaultURI,
        address _whitelistSigner
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        defaultURI = _defaultURI;
        _signer = _whitelistSigner;
    }

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == 0xe8a3d485 || /* contractURI() */
            interfaceId == 0x2a55205a || /* ERC-2981 royaltyInfo() */
            super.supportsInterface(interfaceId);
    }

    // public
    function mintWhitelist(uint8 _mintAmount, bytes memory signature)
        public
        payable
    {
        uint256 supply = totalSupply();
        require(!paused);
        require(stage > 0, "Sale not started");
        require(isWhitelisted(msg.sender, signature), "Must be whitelisted");
        require(stage == 1, "invalid stage");
        require(_mintAmount > 0, "Must mint at least 1");
        require(
            supply + _mintAmount <= presaleSupply,
            "Mint exceed presale supply"
        );
        require(
            msg.value >= presalePrice * _mintAmount,
            "Insufficient amount sent"
        );
        require(
            _mintAmount + presaleMintCount[msg.sender] <= presaleMintMax,
            "Cannot mint more than presaleMintMax"
        );

        presaleMintCount[msg.sender] += _mintAmount;
        currentSupply += _mintAmount;

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

    function mintPublic(uint8 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused);
        require(stage == 2, "Not public sale");
        require(_mintAmount > 0, "Must mint at least 1");
        require(
            supply + _mintAmount <= totalSaleSupply,
            "Mint exceed total supply"
        );
        require(
            _mintAmount + saleMintCount[tx.origin] <= saleMintMax,
            "Cannot mint more than saleMintMax"
        );
        require(
            msg.value >= salePrice * _mintAmount,
            "Insufficient amount sent"
        );
        saleMintCount[tx.origin] += _mintAmount;
        currentSupply += _mintAmount;
        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function isWhitelisted(address _addr, bytes memory signature)
        public
        view
        returns (bool)
    {
        return
            _signer ==
            ECDSA.recover(
                keccak256(abi.encodePacked(address(this), _addr)),
                signature
            );
    }

    function totalSupply() public view returns (uint256) {
        return currentSupply;
    }

    function tokensOfOwner(
        address _owner,
        uint256 startId,
        uint256 endId
    ) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index = 0;

            for (uint256 tokenId = startId; tokenId < endId; tokenId++) {
                if (index == tokenCount) break;

                if (ownerOf(tokenId) == _owner) {
                    result[index] = tokenId;
                    index++;
                }
            }

            return result;
        }
    }

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

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

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(mycontractURI));
    }

    //ERC-2981
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddr, (_salePrice * royaltyBasis) / 10000);
    }

    //only owner functions ---

    function nextStage() public onlyOwner {
        require(stage < 2, "Stage cannot be more than 2");
        stage++;
        emit stageChanged(stage);
    }

    function setwhitelistSigner(address _whitelistSigner) public onlyOwner {
        _signer = _whitelistSigner;
    }

    function setPresaleMintMax(uint256 _presaleMintMax) public onlyOwner {
        presaleMintMax = _presaleMintMax;
    }

    function setPresalePrice(uint256 _presalePrice) public onlyOwner {
        presalePrice = _presalePrice;
    }

    function setSaleMintMax(uint256 _saleMintMax) public onlyOwner {
        saleMintMax = _saleMintMax;
    }

    function setSalePrice(uint256 _salePrice) public onlyOwner {
        salePrice = _salePrice;
    }

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

    function finalizeBaseURI() public onlyOwner {
        finalizeBaseUri = true;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        mycontractURI = _contractURI;
    }

    function setRoyalty(address _royaltyAddr, uint256 _royaltyBasis)
        public
        onlyOwner
    {
        royaltyAddr = _royaltyAddr;
        royaltyBasis = _royaltyBasis;
    }

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

    function reserveMint(uint256 _mintAmount, address _to) public onlyOwner {
        uint256 supply = totalSupply();
        require(
            supply + _mintAmount <= maxCollectionSupply,
            "Mint exceed total supply"
        );

        currentSupply += _mintAmount;
        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(_to, supply + i);
        }
    }

    //fund withdraw functions ---
    function withdrawFund() public onlyOwner {
        uint256 currentBal = address(this).balance;
        require(currentBal > 0);

        for (uint256 i = 0; i < fundRecipients.length - 1; i++) {
            _withdraw(
                fundRecipients[i],
                (currentBal * receivePercentagePt[i]) / 10000
            );
        }
        //final address receives remainder to prevent ether dust
        _withdraw(
            fundRecipients[fundRecipients.length - 1],
            address(this).balance
        );
    }

    function _withdraw(address _addr, uint256 _amt) private {
        (bool success, ) = _addr.call{value: _amt}("");
        require(success, "Transfer failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_defaultURI","type":"string"},{"internalType":"address","name":"_whitelistSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"stage","type":"uint8"}],"name":"stageChanged","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeBaseUri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fundRecipients","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCollectionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mycontractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMintCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receivePercentagePt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleMintCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleMintMax","type":"uint256"}],"name":"setPresaleMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddr","type":"address"},{"internalType":"uint256","name":"_royaltyBasis","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleMintMax","type":"uint256"}],"name":"setSaleMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelistSigner","type":"address"}],"name":"setwhitelistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"withdrawFund","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff021916908360ff160217905550666a94d74f430000600b556005600c55612128600d5566b1a2bc2ec50000600f55600a6010556121286011556122b86013556000601460006101000a81548160ff021916908315150217905550604051806040016040528073c8403eb0ffefdb129b1c3b18e9268e58e26d9f6173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173975b9adf63a36caafa1870e3a3cf01f2dc8ffd0373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060169060026200012f9291906200047c565b50604051806040016040528061213461ffff1681526020016105dc61ffff16815250601890600262000163929190620004fe565b5073c8403eb0ffefdb129b1c3b18e9268e58e26d9f61601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610258601a55348015620001cc57600080fd5b50604051620069ee380380620069ee8339818101604052810190620001f291906200069b565b848481600090805190602001906200020c92919062000556565b5080600190805190602001906200022592919062000556565b505050620002486200023c620002be60201b60201c565b620002c660201b60201c565b62000259836200038c60201b60201c565b81600890805190602001906200027192919062000556565b5080600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050620009f4565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200039c620002be60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003c26200045260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200041b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041290620007c6565b60405180910390fd5b600a60009054906101000a900460ff16156200043657600080fd5b80600790805190602001906200044e92919062000556565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8260028101928215620004eb579160200282015b82811115620004ea5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000490565b5b509050620004fa9190620005e7565b5090565b82805482825590600052602060002090810192821562000543579160200282015b8281111562000542578251829061ffff169055916020019190600101906200051f565b5b509050620005529190620005e7565b5090565b8280546200056490620008c2565b90600052602060002090601f016020900481019282620005885760008555620005d4565b82601f10620005a357805160ff1916838001178555620005d4565b82800160010185558215620005d4579182015b82811115620005d3578251825591602001919060010190620005b6565b5b509050620005e39190620005e7565b5090565b5b8082111562000602576000816000905550600101620005e8565b5090565b60006200061d620006178462000811565b620007e8565b9050828152602081018484840111156200063c576200063b62000991565b5b620006498482856200088c565b509392505050565b6000815190506200066281620009da565b92915050565b600082601f83011262000680576200067f6200098c565b5b81516200069284826020860162000606565b91505092915050565b600080600080600060a08688031215620006ba57620006b96200099b565b5b600086015167ffffffffffffffff811115620006db57620006da62000996565b5b620006e98882890162000668565b955050602086015167ffffffffffffffff8111156200070d576200070c62000996565b5b6200071b8882890162000668565b945050604086015167ffffffffffffffff8111156200073f576200073e62000996565b5b6200074d8882890162000668565b935050606086015167ffffffffffffffff81111562000771576200077062000996565b5b6200077f8882890162000668565b9250506080620007928882890162000651565b9150509295509295909350565b6000620007ae60208362000847565b9150620007bb82620009b1565b602082019050919050565b60006020820190508181036000830152620007e1816200079f565b9050919050565b6000620007f462000807565b9050620008028282620008f8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200082f576200082e6200095d565b5b6200083a82620009a0565b9050602081019050919050565b600082825260208201905092915050565b600062000865826200086c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620008ac5780820151818401526020810190506200088f565b83811115620008bc576000848401525b50505050565b60006002820490506001821680620008db57607f821691505b60208210811415620008f257620008f16200092e565b5b50919050565b6200090382620009a0565b810181811067ffffffffffffffff821117156200092557620009246200095d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620009e58162000858565b8114620009f157600080fd5b50565b615fea8062000a046000396000f3fe60806040526004361061036a5760003560e01c806370a08231116101c6578063c0f6baa4116100f7578063e7e989c011610095578063ee3743ab1161006f578063ee3743ab14610c9e578063f053d37014610cb5578063f2fde38b14610ce0578063f51f96dd14610d095761036a565b8063e7e989c014610bf9578063e8a3d48514610c36578063e985e9c514610c615761036a565b8063c87b56dd116100d1578063c87b56dd14610b5e578063d9ab128814610b9b578063e07fa3c114610bb7578063e6cbb6b114610bce5761036a565b8063c0f6baa414610ab9578063c6ec690914610af6578063c839fe9414610b215761036a565b806395d89b4111610164578063b3a196e91161013e578063b3a196e9146109fd578063b7aa670a14610a28578063b88d4fde14610a65578063c040e6b814610a8e5761036a565b806395d89b4114610980578063a22cb465146109ab578063a5d19b9f146109d45761036a565b806378231978116101a057806378231978146108d65780638925286e146109015780638da5cb5b1461092c578063938e3d7b146109575761036a565b806370a0823114610857578063715018a614610894578063771282f6146108ab5761036a565b80632a55205a116102a05780635c975abb1161023e578063639d7e1111610218578063639d7e11146107ba57806366d6ae1a146107e557806367dce1ed146108105780636c0360eb1461082c5761036a565b80635c975abb1461072957806360b02f70146107545780636352211e1461077d5761036a565b806337c3fdbc1161027a57806337c3fdbc146106955780633a367a67146106ac57806342842e0e146106d757806355f804b3146107005761036a565b80632a55205a146106035780633009c083146106415780633549345e1461066c5761036a565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd146105495780631919fed7146105745780631f0a8fa71461059d57806323b872dd146105da5761036a565b8063095ea7b3146104ce5780630f945a29146104f757806310fd332b146105205761036a565b806306fdde031161034957806306fdde0314610400578063081812fc1461042b57806308f2875114610468578063094e4072146104915761036a565b80620e7fa81461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610d34565b60405161039191906151d5565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906143c0565b610d3a565b6040516103ce9190614d53565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190614393565b610e14565b005b34801561040c57600080fd5b50610415610ead565b6040516104229190614db3565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190614463565b610f3f565b60405161045f9190614ca1565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190614463565b610fc4565b005b34801561049d57600080fd5b506104b860048036038101906104b39190614121565b61104a565b6040516104c591906151f0565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190614300565b61106a565b005b34801561050357600080fd5b5061051e60048036038101906105199190614121565b611182565b005b34801561052c57600080fd5b5061054760048036038101906105429190614300565b611242565b005b34801561055557600080fd5b5061055e61130a565b60405161056b91906151d5565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614463565b611314565b005b3480156105a957600080fd5b506105c460048036038101906105bf91906142a4565b61139a565b6040516105d19190614d53565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061418e565b611426565b005b34801561060f57600080fd5b5061062a600480360381019061062591906144d0565b611486565b604051610638929190614d08565b60405180910390f35b34801561064d57600080fd5b506106566114d2565b6040516106639190614ca1565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190614463565b6114f8565b005b3480156106a157600080fd5b506106aa61157e565b005b3480156106b857600080fd5b506106c1611617565b6040516106ce9190614db3565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f9919061418e565b6116a5565b005b34801561070c57600080fd5b506107276004803603810190610722919061441a565b6116c5565b005b34801561073557600080fd5b5061073e611775565b60405161074b9190614d53565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190614490565b611788565b005b34801561078957600080fd5b506107a4600480360381019061079f9190614463565b6118b5565b6040516107b19190614ca1565b60405180910390f35b3480156107c657600080fd5b506107cf611967565b6040516107dc9190614db3565b60405180910390f35b3480156107f157600080fd5b506107fa6119f5565b60405161080791906151d5565b60405180910390f35b61082a60048036038101906108259190614510565b6119fb565b005b34801561083857600080fd5b50610841611cce565b60405161084e9190614db3565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614121565b611d5c565b60405161088b91906151d5565b60405180910390f35b3480156108a057600080fd5b506108a9611e14565b005b3480156108b757600080fd5b506108c0611e9c565b6040516108cd91906151d5565b60405180910390f35b3480156108e257600080fd5b506108eb611ea2565b6040516108f891906151d5565b60405180910390f35b34801561090d57600080fd5b50610916611ea8565b60405161092391906151d5565b60405180910390f35b34801561093857600080fd5b50610941611eae565b60405161094e9190614ca1565b60405180910390f35b34801561096357600080fd5b5061097e6004803603810190610979919061441a565b611ed8565b005b34801561098c57600080fd5b50610995611f6e565b6040516109a29190614db3565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614264565b612000565b005b3480156109e057600080fd5b506109fb60048036038101906109f69190614463565b612016565b005b348015610a0957600080fd5b50610a1261209c565b604051610a1f91906151d5565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190614463565b6120a2565b604051610a5c9190614ca1565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a8791906141e1565b6120d8565b005b348015610a9a57600080fd5b50610aa361213a565b604051610ab091906151f0565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614121565b61214d565b604051610aed91906151f0565b60405180910390f35b348015610b0257600080fd5b50610b0b61216d565b604051610b1891906151d5565b60405180910390f35b348015610b2d57600080fd5b50610b486004803603810190610b439190614340565b612173565b604051610b559190614d31565b60405180910390f35b348015610b6a57600080fd5b50610b856004803603810190610b809190614463565b6122d3565b604051610b929190614db3565b60405180910390f35b610bb56004803603810190610bb0919061453d565b6123f5565b005b348015610bc357600080fd5b50610bcc612767565b005b348015610bda57600080fd5b50610be36128e5565b604051610bf091906151d5565b60405180910390f35b348015610c0557600080fd5b50610c206004803603810190610c1b9190614463565b6128eb565b604051610c2d91906151d5565b60405180910390f35b348015610c4257600080fd5b50610c4b61290f565b604051610c589190614db3565b60405180910390f35b348015610c6d57600080fd5b50610c886004803603810190610c83919061414e565b612937565b604051610c959190614d53565b60405180910390f35b348015610caa57600080fd5b50610cb36129cb565b005b348015610cc157600080fd5b50610cca612b1c565b604051610cd79190614d53565b60405180910390f35b348015610cec57600080fd5b50610d076004803603810190610d029190614121565b612b2f565b005b348015610d1557600080fd5b50610d1e612c27565b604051610d2b91906151d5565b60405180910390f35b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dcd575063e8a3d48560e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dfd5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0d5750610e0c82612c2d565b5b9050919050565b610e1c612d0f565b73ffffffffffffffffffffffffffffffffffffffff16610e3a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906150d5565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b606060008054610ebc90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee890615547565b8015610f355780601f10610f0a57610100808354040283529160200191610f35565b820191906000526020600020905b815481529060010190602001808311610f1857829003601f168201915b5050505050905090565b6000610f4a82612d17565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906150b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fcc612d0f565b73ffffffffffffffffffffffffffffffffffffffff16610fea611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906150d5565b60405180910390fd5b8060108190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000611075826118b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90615135565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611105612d0f565b73ffffffffffffffffffffffffffffffffffffffff16148061113457506111338161112e612d0f565b612937565b5b611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614fd5565b60405180910390fd5b61117d8383612d83565b505050565b61118a612d0f565b73ffffffffffffffffffffffffffffffffffffffff166111a8611eae565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906150d5565b60405180910390fd5b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61124a612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611268611eae565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906150d5565b60405180910390fd5b81601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601a819055505050565b6000601554905090565b61131c612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661133a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906150d5565b60405180910390fd5b80600f8190555050565b60006113ce30846040516020016113b2929190614c25565b6040516020818303038152906040528051906020012083612e3c565b73ffffffffffffffffffffffffffffffffffffffff16600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611437611431612d0f565b82612e63565b611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90615195565b60405180910390fd5b611481838383612f41565b505050565b600080601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710601a54856114bd91906153ec565b6114c791906153bb565b915091509250929050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611500612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661151e611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906150d5565b60405180910390fd5b80600b8190555050565b611586612d0f565b73ffffffffffffffffffffffffffffffffffffffff166115a4611eae565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f1906150d5565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6008805461162490615547565b80601f016020809104026020016040519081016040528092919081815260200182805461165090615547565b801561169d5780601f106116725761010080835404028352916020019161169d565b820191906000526020600020905b81548152906001019060200180831161168057829003601f168201915b505050505081565b6116c0838383604051806020016040528060008152506120d8565b505050565b6116cd612d0f565b73ffffffffffffffffffffffffffffffffffffffff166116eb611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906150d5565b60405180910390fd5b600a60009054906101000a900460ff161561175b57600080fd5b8060079080519060200190611771929190613f20565b5050565b601460009054906101000a900460ff1681565b611790612d0f565b73ffffffffffffffffffffffffffffffffffffffff166117ae611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb906150d5565b60405180910390fd5b600061180e61130a565b9050601354838261181f919061532e565b1115611860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185790614df5565b60405180910390fd5b8260156000828254611872919061532e565b925050819055506000600190505b8381116118af5761189c838284611897919061532e565b6131a8565b80806118a7906155aa565b915050611880565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590615015565b60405180910390fd5b80915050919050565b6009805461197490615547565b80601f01602080910402602001604051908101604052809291908181526020018280546119a090615547565b80156119ed5780601f106119c2576101008083540402835291602001916119ed565b820191906000526020600020905b8154815290600101906020018083116119d057829003601f168201915b505050505081565b60105481565b6000611a0561130a565b9050601460009054906101000a900460ff1615611a2157600080fd5b6002600a60019054906101000a900460ff1660ff1614611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90615175565b60405180910390fd5b60008260ff1611611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390615155565b60405180910390fd5b6011548260ff1682611ace919061532e565b1115611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0690614df5565b60405180910390fd5b601054601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1683611b6a9190615384565b60ff161115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590615035565b60405180910390fd5b8160ff16600f54611bbf91906153ec565b341015611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890615115565b60405180910390fd5b81601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611c5c9190615384565b92506101000a81548160ff021916908360ff1602179055508160ff1660156000828254611c89919061532e565b925050819055506000600190505b8260ff168111611cc957611cb6338284611cb1919061532e565b6131a8565b8080611cc1906155aa565b915050611c97565b505050565b60078054611cdb90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0790615547565b8015611d545780601f10611d2957610100808354040283529160200191611d54565b820191906000526020600020905b815481529060010190602001808311611d3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614ff5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e1c612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611e3a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906150d5565b60405180910390fd5b611e9a60006131c6565b565b60155481565b60115481565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee0612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611efe611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b906150d5565b60405180910390fd5b8060099080519060200190611f6a929190613f20565b5050565b606060018054611f7d90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa990615547565b8015611ff65780601f10611fcb57610100808354040283529160200191611ff6565b820191906000526020600020905b815481529060010190602001808311611fd957829003601f168201915b5050505050905090565b61201261200b612d0f565b838361328c565b5050565b61201e612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661203c611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612092576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612089906150d5565b60405180910390fd5b80600c8190555050565b600d5481565b601681600281106120b257600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120e96120e3612d0f565b83612e63565b612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90615195565b60405180910390fd5b612134848484846133f9565b50505050565b600a60019054906101000a900460ff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b601a5481565b6060600061218085611d5c565b905060008114156121dd57600067ffffffffffffffff8111156121a6576121a561575d565b5b6040519080825280602002602001820160405280156121d45781602001602082028036833780820191505090505b509150506122cc565b60008167ffffffffffffffff8111156121f9576121f861575d565b5b6040519080825280602002602001820160405280156122275781602001602082028036833780820191505090505b5090506000808690505b858110156122c45783821415612246576122c4565b8773ffffffffffffffffffffffffffffffffffffffff16612266826118b5565b73ffffffffffffffffffffffffffffffffffffffff1614156122b157808383815181106122965761229561572e565b5b60200260200101818152505081806122ad906155aa565b9250505b80806122bc906155aa565b915050612231565b508193505050505b9392505050565b60606122de82612d17565b61231d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612314906150f5565b60405180910390fd5b6000612327613455565b905060008151116123c2576008805461233f90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461236b90615547565b80156123b85780601f1061238d576101008083540402835291602001916123b8565b820191906000526020600020905b81548152906001019060200180831161239b57829003601f168201915b50505050506123ed565b806123cc846134e7565b6040516020016123dd929190614c51565b6040516020818303038152906040525b915050919050565b60006123ff61130a565b9050601460009054906101000a900460ff161561241b57600080fd5b6000600a60019054906101000a900460ff1660ff1611612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614fb5565b60405180910390fd5b61247a338361139a565b6124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614e55565b60405180910390fd5b6001600a60019054906101000a900460ff1660ff161461250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614f75565b60405180910390fd5b60008360ff1611612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90615155565b60405180910390fd5b600d548360ff1682612566919061532e565b11156125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e90614e15565b60405180910390fd5b8260ff16600b546125b891906153ec565b3410156125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190615115565b60405180910390fd5b600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16846126559190615384565b60ff161115612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906151b5565b60405180910390fd5b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166126f49190615384565b92506101000a81548160ff021916908360ff1602179055508260ff1660156000828254612721919061532e565b925050819055506000600190505b8360ff1681116127615761274e338284612749919061532e565b6131a8565b8080612759906155aa565b91505061272f565b50505050565b61276f612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661278d611eae565b73ffffffffffffffffffffffffffffffffffffffff16146127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906150d5565b60405180910390fd5b6000479050600081116127f557600080fd5b60005b600160026128069190615446565b81101561289557612882601682600281106128245761282361572e565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106018848154811061285d5761285c61572e565b5b90600052602060002001548561287391906153ec565b61287d91906153bb565b613648565b808061288d906155aa565b9150506127f8565b506128e26016600160026128a99190615446565b600281106128ba576128b961572e565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647613648565b50565b600c5481565b601881815481106128fb57600080fd5b906000526020600020016000915090505481565b606060096040516020016129239190614c75565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129d3612d0f565b73ffffffffffffffffffffffffffffffffffffffff166129f1611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3e906150d5565b60405180910390fd5b6002600a60019054906101000a900460ff1660ff1610612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9390615095565b60405180910390fd5b600a600181819054906101000a900460ff1680929190612abb906155f3565b91906101000a81548160ff021916908360ff160217905550507f36e08625927f4c20a74363a4c118d06899c5dbd5a27024d11ca0075e206a7ded600a60019054906101000a900460ff16604051612b1291906151f0565b60405180910390a1565b600a60009054906101000a900460ff1681565b612b37612d0f565b73ffffffffffffffffffffffffffffffffffffffff16612b55611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba2906150d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614e95565b60405180910390fd5b612c24816131c6565b50565b600f5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d085750612d07826136f9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df6836118b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000612e4b8585613763565b91509150612e58816137e6565b819250505092915050565b6000612e6e82612d17565b612ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea490614f95565b60405180910390fd5b6000612eb8836118b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f2757508373ffffffffffffffffffffffffffffffffffffffff16612f0f84610f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f385750612f378185612937565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f61826118b5565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90614ed5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614f15565b60405180910390fd5b6130328383836139bb565b61303d600082612d83565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461308d9190615446565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130e4919061532e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a38383836139c0565b505050565b6131c28282604051806020016040528060008152506139c5565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f290614f35565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133ec9190614d53565b60405180910390a3505050565b613404848484612f41565b61341084848484613a20565b61344f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344690614e75565b60405180910390fd5b50505050565b60606007805461346490615547565b80601f016020809104026020016040519081016040528092919081815260200182805461349090615547565b80156134dd5780601f106134b2576101008083540402835291602001916134dd565b820191906000526020600020905b8154815290600101906020018083116134c057829003601f168201915b5050505050905090565b6060600082141561352f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613643565b600082905060005b6000821461356157808061354a906155aa565b915050600a8261355a91906153bb565b9150613537565b60008167ffffffffffffffff81111561357d5761357c61575d565b5b6040519080825280601f01601f1916602001820160405280156135af5781602001600182028036833780820191505090505b5090505b6000851461363c576001826135c89190615446565b9150600a856135d79190615641565b60306135e3919061532e565b60f81b8183815181106135f9576135f861572e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561363591906153bb565b94506135b3565b8093505050505b919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161366e90614c8c565b60006040518083038185875af1925050503d80600081146136ab576040519150601f19603f3d011682016040523d82523d6000602084013e6136b0565b606091505b50509050806136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90614eb5565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806041835114156137a55760008060006020860151925060408601519150606086015160001a905061379987828585613bb7565b945094505050506137df565b6040835114156137d65760008060208501519150604085015190506137cb868383613cc4565b9350935050506137df565b60006002915091505b9250929050565b600060048111156137fa576137f96156d0565b5b81600481111561380d5761380c6156d0565b5b1415613818576139b8565b6001600481111561382c5761382b6156d0565b5b81600481111561383f5761383e6156d0565b5b1415613880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387790614dd5565b60405180910390fd5b60026004811115613894576138936156d0565b5b8160048111156138a7576138a66156d0565b5b14156138e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138df90614e35565b60405180910390fd5b600360048111156138fc576138fb6156d0565b5b81600481111561390f5761390e6156d0565b5b1415613950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394790614f55565b60405180910390fd5b600480811115613963576139626156d0565b5b816004811115613976576139756156d0565b5b14156139b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ae90615055565b60405180910390fd5b5b50565b505050565b505050565b6139cf8383613d23565b6139dc6000848484613a20565b613a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1290614e75565b60405180910390fd5b505050565b6000613a418473ffffffffffffffffffffffffffffffffffffffff16613efd565b15613baa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a6a612d0f565b8786866040518563ffffffff1660e01b8152600401613a8c9493929190614cbc565b602060405180830381600087803b158015613aa657600080fd5b505af1925050508015613ad757506040513d601f19601f82011682018060405250810190613ad491906143ed565b60015b613b5a573d8060008114613b07576040519150601f19603f3d011682016040523d82523d6000602084013e613b0c565b606091505b50600081511415613b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4990614e75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613baf565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613bf2576000600391509150613cbb565b601b8560ff1614158015613c0a5750601c8560ff1614155b15613c1c576000600491509150613cbb565b600060018787878760405160008152602001604052604051613c419493929190614d6e565b6020604051602081039080840390855afa158015613c63573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613cb257600060019250925050613cbb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613d07919061532e565b9050613d1587828885613bb7565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8a90615075565b60405180910390fd5b613d9c81612d17565b15613ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd390614ef5565b60405180910390fd5b613de8600083836139bb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e38919061532e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ef9600083836139c0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613f2c90615547565b90600052602060002090601f016020900481019282613f4e5760008555613f95565b82601f10613f6757805160ff1916838001178555613f95565b82800160010185558215613f95579182015b82811115613f94578251825591602001919060010190613f79565b5b509050613fa29190613fa6565b5090565b5b80821115613fbf576000816000905550600101613fa7565b5090565b6000613fd6613fd184615230565b61520b565b905082815260208101848484011115613ff257613ff1615791565b5b613ffd848285615505565b509392505050565b600061401861401384615261565b61520b565b90508281526020810184848401111561403457614033615791565b5b61403f848285615505565b509392505050565b60008135905061405681615f41565b92915050565b60008135905061406b81615f58565b92915050565b60008135905061408081615f6f565b92915050565b60008151905061409581615f6f565b92915050565b600082601f8301126140b0576140af61578c565b5b81356140c0848260208601613fc3565b91505092915050565b600082601f8301126140de576140dd61578c565b5b81356140ee848260208601614005565b91505092915050565b60008135905061410681615f86565b92915050565b60008135905061411b81615f9d565b92915050565b6000602082840312156141375761413661579b565b5b600061414584828501614047565b91505092915050565b600080604083850312156141655761416461579b565b5b600061417385828601614047565b925050602061418485828601614047565b9150509250929050565b6000806000606084860312156141a7576141a661579b565b5b60006141b586828701614047565b93505060206141c686828701614047565b92505060406141d7868287016140f7565b9150509250925092565b600080600080608085870312156141fb576141fa61579b565b5b600061420987828801614047565b945050602061421a87828801614047565b935050604061422b878288016140f7565b925050606085013567ffffffffffffffff81111561424c5761424b615796565b5b6142588782880161409b565b91505092959194509250565b6000806040838503121561427b5761427a61579b565b5b600061428985828601614047565b925050602061429a8582860161405c565b9150509250929050565b600080604083850312156142bb576142ba61579b565b5b60006142c985828601614047565b925050602083013567ffffffffffffffff8111156142ea576142e9615796565b5b6142f68582860161409b565b9150509250929050565b600080604083850312156143175761431661579b565b5b600061432585828601614047565b9250506020614336858286016140f7565b9150509250929050565b6000806000606084860312156143595761435861579b565b5b600061436786828701614047565b9350506020614378868287016140f7565b9250506040614389868287016140f7565b9150509250925092565b6000602082840312156143a9576143a861579b565b5b60006143b78482850161405c565b91505092915050565b6000602082840312156143d6576143d561579b565b5b60006143e484828501614071565b91505092915050565b6000602082840312156144035761440261579b565b5b600061441184828501614086565b91505092915050565b6000602082840312156144305761442f61579b565b5b600082013567ffffffffffffffff81111561444e5761444d615796565b5b61445a848285016140c9565b91505092915050565b6000602082840312156144795761447861579b565b5b6000614487848285016140f7565b91505092915050565b600080604083850312156144a7576144a661579b565b5b60006144b5858286016140f7565b92505060206144c685828601614047565b9150509250929050565b600080604083850312156144e7576144e661579b565b5b60006144f5858286016140f7565b9250506020614506858286016140f7565b9150509250929050565b6000602082840312156145265761452561579b565b5b60006145348482850161410c565b91505092915050565b600080604083850312156145545761455361579b565b5b60006145628582860161410c565b925050602083013567ffffffffffffffff81111561458357614582615796565b5b61458f8582860161409b565b9150509250929050565b60006145a58383614bf8565b60208301905092915050565b6145ba8161547a565b82525050565b6145d16145cc8261547a565b61561d565b82525050565b60006145e2826152b7565b6145ec81856152e5565b93506145f783615292565b8060005b8381101561462857815161460f8882614599565b975061461a836152d8565b9250506001810190506145fb565b5085935050505092915050565b61463e8161548c565b82525050565b61464d81615498565b82525050565b600061465e826152c2565b61466881856152f6565b9350614678818560208601615514565b614681816157a0565b840191505092915050565b6000614697826152cd565b6146a18185615312565b93506146b1818560208601615514565b6146ba816157a0565b840191505092915050565b60006146d0826152cd565b6146da8185615323565b93506146ea818560208601615514565b80840191505092915050565b6000815461470381615547565b61470d8186615323565b9450600182166000811461472857600181146147395761476c565b60ff1983168652818601935061476c565b614742856152a2565b60005b8381101561476457815481890152600182019150602081019050614745565b838801955050505b50505092915050565b6000614782601883615312565b915061478d826157be565b602082019050919050565b60006147a5601883615312565b91506147b0826157e7565b602082019050919050565b60006147c8601a83615312565b91506147d382615810565b602082019050919050565b60006147eb601f83615312565b91506147f682615839565b602082019050919050565b600061480e601383615312565b915061481982615862565b602082019050919050565b6000614831603283615312565b915061483c8261588b565b604082019050919050565b6000614854602683615312565b915061485f826158da565b604082019050919050565b6000614877600f83615312565b915061488282615929565b602082019050919050565b600061489a602583615312565b91506148a582615952565b604082019050919050565b60006148bd601c83615312565b91506148c8826159a1565b602082019050919050565b60006148e0602483615312565b91506148eb826159ca565b604082019050919050565b6000614903601983615312565b915061490e82615a19565b602082019050919050565b6000614926602283615312565b915061493182615a42565b604082019050919050565b6000614949600d83615312565b915061495482615a91565b602082019050919050565b600061496c602c83615312565b915061497782615aba565b604082019050919050565b600061498f601083615312565b915061499a82615b09565b602082019050919050565b60006149b2603883615312565b91506149bd82615b32565b604082019050919050565b60006149d5602a83615312565b91506149e082615b81565b604082019050919050565b60006149f8602983615312565b9150614a0382615bd0565b604082019050919050565b6000614a1b602183615312565b9150614a2682615c1f565b604082019050919050565b6000614a3e602283615312565b9150614a4982615c6e565b604082019050919050565b6000614a61602083615312565b9150614a6c82615cbd565b602082019050919050565b6000614a84601b83615312565b9150614a8f82615ce6565b602082019050919050565b6000614aa7602c83615312565b9150614ab282615d0f565b604082019050919050565b6000614aca602083615312565b9150614ad582615d5e565b602082019050919050565b6000614aed602f83615312565b9150614af882615d87565b604082019050919050565b6000614b10601883615312565b9150614b1b82615dd6565b602082019050919050565b6000614b33602183615312565b9150614b3e82615dff565b604082019050919050565b6000614b56601483615312565b9150614b6182615e4e565b602082019050919050565b6000614b79600f83615312565b9150614b8482615e77565b602082019050919050565b6000614b9c600083615307565b9150614ba782615ea0565b600082019050919050565b6000614bbf603183615312565b9150614bca82615ea3565b604082019050919050565b6000614be2602483615312565b9150614bed82615ef2565b604082019050919050565b614c01816154ee565b82525050565b614c10816154ee565b82525050565b614c1f816154f8565b82525050565b6000614c3182856145c0565b601482019150614c4182846145c0565b6014820191508190509392505050565b6000614c5d82856146c5565b9150614c6982846146c5565b91508190509392505050565b6000614c8182846146f6565b915081905092915050565b6000614c9782614b8f565b9150819050919050565b6000602082019050614cb660008301846145b1565b92915050565b6000608082019050614cd160008301876145b1565b614cde60208301866145b1565b614ceb6040830185614c07565b8181036060830152614cfd8184614653565b905095945050505050565b6000604082019050614d1d60008301856145b1565b614d2a6020830184614c07565b9392505050565b60006020820190508181036000830152614d4b81846145d7565b905092915050565b6000602082019050614d686000830184614635565b92915050565b6000608082019050614d836000830187614644565b614d906020830186614c16565b614d9d6040830185614644565b614daa6060830184614644565b95945050505050565b60006020820190508181036000830152614dcd818461468c565b905092915050565b60006020820190508181036000830152614dee81614775565b9050919050565b60006020820190508181036000830152614e0e81614798565b9050919050565b60006020820190508181036000830152614e2e816147bb565b9050919050565b60006020820190508181036000830152614e4e816147de565b9050919050565b60006020820190508181036000830152614e6e81614801565b9050919050565b60006020820190508181036000830152614e8e81614824565b9050919050565b60006020820190508181036000830152614eae81614847565b9050919050565b60006020820190508181036000830152614ece8161486a565b9050919050565b60006020820190508181036000830152614eee8161488d565b9050919050565b60006020820190508181036000830152614f0e816148b0565b9050919050565b60006020820190508181036000830152614f2e816148d3565b9050919050565b60006020820190508181036000830152614f4e816148f6565b9050919050565b60006020820190508181036000830152614f6e81614919565b9050919050565b60006020820190508181036000830152614f8e8161493c565b9050919050565b60006020820190508181036000830152614fae8161495f565b9050919050565b60006020820190508181036000830152614fce81614982565b9050919050565b60006020820190508181036000830152614fee816149a5565b9050919050565b6000602082019050818103600083015261500e816149c8565b9050919050565b6000602082019050818103600083015261502e816149eb565b9050919050565b6000602082019050818103600083015261504e81614a0e565b9050919050565b6000602082019050818103600083015261506e81614a31565b9050919050565b6000602082019050818103600083015261508e81614a54565b9050919050565b600060208201905081810360008301526150ae81614a77565b9050919050565b600060208201905081810360008301526150ce81614a9a565b9050919050565b600060208201905081810360008301526150ee81614abd565b9050919050565b6000602082019050818103600083015261510e81614ae0565b9050919050565b6000602082019050818103600083015261512e81614b03565b9050919050565b6000602082019050818103600083015261514e81614b26565b9050919050565b6000602082019050818103600083015261516e81614b49565b9050919050565b6000602082019050818103600083015261518e81614b6c565b9050919050565b600060208201905081810360008301526151ae81614bb2565b9050919050565b600060208201905081810360008301526151ce81614bd5565b9050919050565b60006020820190506151ea6000830184614c07565b92915050565b60006020820190506152056000830184614c16565b92915050565b6000615215615226565b90506152218282615579565b919050565b6000604051905090565b600067ffffffffffffffff82111561524b5761524a61575d565b5b615254826157a0565b9050602081019050919050565b600067ffffffffffffffff82111561527c5761527b61575d565b5b615285826157a0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615339826154ee565b9150615344836154ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561537957615378615672565b5b828201905092915050565b600061538f826154f8565b915061539a836154f8565b92508260ff038211156153b0576153af615672565b5b828201905092915050565b60006153c6826154ee565b91506153d1836154ee565b9250826153e1576153e06156a1565b5b828204905092915050565b60006153f7826154ee565b9150615402836154ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543b5761543a615672565b5b828202905092915050565b6000615451826154ee565b915061545c836154ee565b92508282101561546f5761546e615672565b5b828203905092915050565b6000615485826154ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b60208210811415615573576155726156ff565b5b50919050565b615582826157a0565b810181811067ffffffffffffffff821117156155a1576155a061575d565b5b80604052505050565b60006155b5826154ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615672565b5b600182019050919050565b60006155fe826154f8565b915060ff82141561561257615611615672565b5b600182019050919050565b60006156288261562f565b9050919050565b600061563a826157b1565b9050919050565b600061564c826154ee565b9150615657836154ee565b925082615667576156666156a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e742065786365656420746f74616c20737570706c790000000000000000600082015250565b7f4d696e74206578636565642070726573616c6520737570706c79000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4d7573742062652077686974656c697374656400000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2073616c654d696e744d6160008201527f7800000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20320000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420616d6f756e742073656e740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2070726573616c654d696e60008201527f744d617800000000000000000000000000000000000000000000000000000000602082015250565b615f4a8161547a565b8114615f5557600080fd5b50565b615f618161548c565b8114615f6c57600080fd5b50565b615f78816154a2565b8114615f8357600080fd5b50565b615f8f816154ee565b8114615f9a57600080fd5b50565b615fa6816154f8565b8114615fb157600080fd5b5056fea2646970667358221220a6264a8185466b1264d12ef0f4f4db6d44975bfc6178d69da374b9302a17ae8964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000901f714cd8676652dd9fab0c8c2581916939fd900000000000000000000000000000000000000000000000000000000000000009426c6f6f6457617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024257000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d702f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d702f000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036a5760003560e01c806370a08231116101c6578063c0f6baa4116100f7578063e7e989c011610095578063ee3743ab1161006f578063ee3743ab14610c9e578063f053d37014610cb5578063f2fde38b14610ce0578063f51f96dd14610d095761036a565b8063e7e989c014610bf9578063e8a3d48514610c36578063e985e9c514610c615761036a565b8063c87b56dd116100d1578063c87b56dd14610b5e578063d9ab128814610b9b578063e07fa3c114610bb7578063e6cbb6b114610bce5761036a565b8063c0f6baa414610ab9578063c6ec690914610af6578063c839fe9414610b215761036a565b806395d89b4111610164578063b3a196e91161013e578063b3a196e9146109fd578063b7aa670a14610a28578063b88d4fde14610a65578063c040e6b814610a8e5761036a565b806395d89b4114610980578063a22cb465146109ab578063a5d19b9f146109d45761036a565b806378231978116101a057806378231978146108d65780638925286e146109015780638da5cb5b1461092c578063938e3d7b146109575761036a565b806370a0823114610857578063715018a614610894578063771282f6146108ab5761036a565b80632a55205a116102a05780635c975abb1161023e578063639d7e1111610218578063639d7e11146107ba57806366d6ae1a146107e557806367dce1ed146108105780636c0360eb1461082c5761036a565b80635c975abb1461072957806360b02f70146107545780636352211e1461077d5761036a565b806337c3fdbc1161027a57806337c3fdbc146106955780633a367a67146106ac57806342842e0e146106d757806355f804b3146107005761036a565b80632a55205a146106035780633009c083146106415780633549345e1461066c5761036a565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd146105495780631919fed7146105745780631f0a8fa71461059d57806323b872dd146105da5761036a565b8063095ea7b3146104ce5780630f945a29146104f757806310fd332b146105205761036a565b806306fdde031161034957806306fdde0314610400578063081812fc1461042b57806308f2875114610468578063094e4072146104915761036a565b80620e7fa81461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610d34565b60405161039191906151d5565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906143c0565b610d3a565b6040516103ce9190614d53565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190614393565b610e14565b005b34801561040c57600080fd5b50610415610ead565b6040516104229190614db3565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190614463565b610f3f565b60405161045f9190614ca1565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190614463565b610fc4565b005b34801561049d57600080fd5b506104b860048036038101906104b39190614121565b61104a565b6040516104c591906151f0565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190614300565b61106a565b005b34801561050357600080fd5b5061051e60048036038101906105199190614121565b611182565b005b34801561052c57600080fd5b5061054760048036038101906105429190614300565b611242565b005b34801561055557600080fd5b5061055e61130a565b60405161056b91906151d5565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614463565b611314565b005b3480156105a957600080fd5b506105c460048036038101906105bf91906142a4565b61139a565b6040516105d19190614d53565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061418e565b611426565b005b34801561060f57600080fd5b5061062a600480360381019061062591906144d0565b611486565b604051610638929190614d08565b60405180910390f35b34801561064d57600080fd5b506106566114d2565b6040516106639190614ca1565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190614463565b6114f8565b005b3480156106a157600080fd5b506106aa61157e565b005b3480156106b857600080fd5b506106c1611617565b6040516106ce9190614db3565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f9919061418e565b6116a5565b005b34801561070c57600080fd5b506107276004803603810190610722919061441a565b6116c5565b005b34801561073557600080fd5b5061073e611775565b60405161074b9190614d53565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190614490565b611788565b005b34801561078957600080fd5b506107a4600480360381019061079f9190614463565b6118b5565b6040516107b19190614ca1565b60405180910390f35b3480156107c657600080fd5b506107cf611967565b6040516107dc9190614db3565b60405180910390f35b3480156107f157600080fd5b506107fa6119f5565b60405161080791906151d5565b60405180910390f35b61082a60048036038101906108259190614510565b6119fb565b005b34801561083857600080fd5b50610841611cce565b60405161084e9190614db3565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614121565b611d5c565b60405161088b91906151d5565b60405180910390f35b3480156108a057600080fd5b506108a9611e14565b005b3480156108b757600080fd5b506108c0611e9c565b6040516108cd91906151d5565b60405180910390f35b3480156108e257600080fd5b506108eb611ea2565b6040516108f891906151d5565b60405180910390f35b34801561090d57600080fd5b50610916611ea8565b60405161092391906151d5565b60405180910390f35b34801561093857600080fd5b50610941611eae565b60405161094e9190614ca1565b60405180910390f35b34801561096357600080fd5b5061097e6004803603810190610979919061441a565b611ed8565b005b34801561098c57600080fd5b50610995611f6e565b6040516109a29190614db3565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614264565b612000565b005b3480156109e057600080fd5b506109fb60048036038101906109f69190614463565b612016565b005b348015610a0957600080fd5b50610a1261209c565b604051610a1f91906151d5565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190614463565b6120a2565b604051610a5c9190614ca1565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a8791906141e1565b6120d8565b005b348015610a9a57600080fd5b50610aa361213a565b604051610ab091906151f0565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614121565b61214d565b604051610aed91906151f0565b60405180910390f35b348015610b0257600080fd5b50610b0b61216d565b604051610b1891906151d5565b60405180910390f35b348015610b2d57600080fd5b50610b486004803603810190610b439190614340565b612173565b604051610b559190614d31565b60405180910390f35b348015610b6a57600080fd5b50610b856004803603810190610b809190614463565b6122d3565b604051610b929190614db3565b60405180910390f35b610bb56004803603810190610bb0919061453d565b6123f5565b005b348015610bc357600080fd5b50610bcc612767565b005b348015610bda57600080fd5b50610be36128e5565b604051610bf091906151d5565b60405180910390f35b348015610c0557600080fd5b50610c206004803603810190610c1b9190614463565b6128eb565b604051610c2d91906151d5565b60405180910390f35b348015610c4257600080fd5b50610c4b61290f565b604051610c589190614db3565b60405180910390f35b348015610c6d57600080fd5b50610c886004803603810190610c83919061414e565b612937565b604051610c959190614d53565b60405180910390f35b348015610caa57600080fd5b50610cb36129cb565b005b348015610cc157600080fd5b50610cca612b1c565b604051610cd79190614d53565b60405180910390f35b348015610cec57600080fd5b50610d076004803603810190610d029190614121565b612b2f565b005b348015610d1557600080fd5b50610d1e612c27565b604051610d2b91906151d5565b60405180910390f35b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dcd575063e8a3d48560e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dfd5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0d5750610e0c82612c2d565b5b9050919050565b610e1c612d0f565b73ffffffffffffffffffffffffffffffffffffffff16610e3a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906150d5565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b606060008054610ebc90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee890615547565b8015610f355780601f10610f0a57610100808354040283529160200191610f35565b820191906000526020600020905b815481529060010190602001808311610f1857829003601f168201915b5050505050905090565b6000610f4a82612d17565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906150b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fcc612d0f565b73ffffffffffffffffffffffffffffffffffffffff16610fea611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906150d5565b60405180910390fd5b8060108190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000611075826118b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90615135565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611105612d0f565b73ffffffffffffffffffffffffffffffffffffffff16148061113457506111338161112e612d0f565b612937565b5b611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614fd5565b60405180910390fd5b61117d8383612d83565b505050565b61118a612d0f565b73ffffffffffffffffffffffffffffffffffffffff166111a8611eae565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906150d5565b60405180910390fd5b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61124a612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611268611eae565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906150d5565b60405180910390fd5b81601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601a819055505050565b6000601554905090565b61131c612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661133a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611387906150d5565b60405180910390fd5b80600f8190555050565b60006113ce30846040516020016113b2929190614c25565b6040516020818303038152906040528051906020012083612e3c565b73ffffffffffffffffffffffffffffffffffffffff16600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611437611431612d0f565b82612e63565b611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90615195565b60405180910390fd5b611481838383612f41565b505050565b600080601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710601a54856114bd91906153ec565b6114c791906153bb565b915091509250929050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611500612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661151e611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906150d5565b60405180910390fd5b80600b8190555050565b611586612d0f565b73ffffffffffffffffffffffffffffffffffffffff166115a4611eae565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f1906150d5565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6008805461162490615547565b80601f016020809104026020016040519081016040528092919081815260200182805461165090615547565b801561169d5780601f106116725761010080835404028352916020019161169d565b820191906000526020600020905b81548152906001019060200180831161168057829003601f168201915b505050505081565b6116c0838383604051806020016040528060008152506120d8565b505050565b6116cd612d0f565b73ffffffffffffffffffffffffffffffffffffffff166116eb611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906150d5565b60405180910390fd5b600a60009054906101000a900460ff161561175b57600080fd5b8060079080519060200190611771929190613f20565b5050565b601460009054906101000a900460ff1681565b611790612d0f565b73ffffffffffffffffffffffffffffffffffffffff166117ae611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb906150d5565b60405180910390fd5b600061180e61130a565b9050601354838261181f919061532e565b1115611860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185790614df5565b60405180910390fd5b8260156000828254611872919061532e565b925050819055506000600190505b8381116118af5761189c838284611897919061532e565b6131a8565b80806118a7906155aa565b915050611880565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590615015565b60405180910390fd5b80915050919050565b6009805461197490615547565b80601f01602080910402602001604051908101604052809291908181526020018280546119a090615547565b80156119ed5780601f106119c2576101008083540402835291602001916119ed565b820191906000526020600020905b8154815290600101906020018083116119d057829003601f168201915b505050505081565b60105481565b6000611a0561130a565b9050601460009054906101000a900460ff1615611a2157600080fd5b6002600a60019054906101000a900460ff1660ff1614611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90615175565b60405180910390fd5b60008260ff1611611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390615155565b60405180910390fd5b6011548260ff1682611ace919061532e565b1115611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0690614df5565b60405180910390fd5b601054601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1683611b6a9190615384565b60ff161115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590615035565b60405180910390fd5b8160ff16600f54611bbf91906153ec565b341015611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890615115565b60405180910390fd5b81601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611c5c9190615384565b92506101000a81548160ff021916908360ff1602179055508160ff1660156000828254611c89919061532e565b925050819055506000600190505b8260ff168111611cc957611cb6338284611cb1919061532e565b6131a8565b8080611cc1906155aa565b915050611c97565b505050565b60078054611cdb90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0790615547565b8015611d545780601f10611d2957610100808354040283529160200191611d54565b820191906000526020600020905b815481529060010190602001808311611d3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614ff5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e1c612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611e3a611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906150d5565b60405180910390fd5b611e9a60006131c6565b565b60155481565b60115481565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee0612d0f565b73ffffffffffffffffffffffffffffffffffffffff16611efe611eae565b73ffffffffffffffffffffffffffffffffffffffff1614611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b906150d5565b60405180910390fd5b8060099080519060200190611f6a929190613f20565b5050565b606060018054611f7d90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa990615547565b8015611ff65780601f10611fcb57610100808354040283529160200191611ff6565b820191906000526020600020905b815481529060010190602001808311611fd957829003601f168201915b5050505050905090565b61201261200b612d0f565b838361328c565b5050565b61201e612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661203c611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612092576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612089906150d5565b60405180910390fd5b80600c8190555050565b600d5481565b601681600281106120b257600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120e96120e3612d0f565b83612e63565b612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90615195565b60405180910390fd5b612134848484846133f9565b50505050565b600a60019054906101000a900460ff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b601a5481565b6060600061218085611d5c565b905060008114156121dd57600067ffffffffffffffff8111156121a6576121a561575d565b5b6040519080825280602002602001820160405280156121d45781602001602082028036833780820191505090505b509150506122cc565b60008167ffffffffffffffff8111156121f9576121f861575d565b5b6040519080825280602002602001820160405280156122275781602001602082028036833780820191505090505b5090506000808690505b858110156122c45783821415612246576122c4565b8773ffffffffffffffffffffffffffffffffffffffff16612266826118b5565b73ffffffffffffffffffffffffffffffffffffffff1614156122b157808383815181106122965761229561572e565b5b60200260200101818152505081806122ad906155aa565b9250505b80806122bc906155aa565b915050612231565b508193505050505b9392505050565b60606122de82612d17565b61231d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612314906150f5565b60405180910390fd5b6000612327613455565b905060008151116123c2576008805461233f90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461236b90615547565b80156123b85780601f1061238d576101008083540402835291602001916123b8565b820191906000526020600020905b81548152906001019060200180831161239b57829003601f168201915b50505050506123ed565b806123cc846134e7565b6040516020016123dd929190614c51565b6040516020818303038152906040525b915050919050565b60006123ff61130a565b9050601460009054906101000a900460ff161561241b57600080fd5b6000600a60019054906101000a900460ff1660ff1611612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614fb5565b60405180910390fd5b61247a338361139a565b6124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614e55565b60405180910390fd5b6001600a60019054906101000a900460ff1660ff161461250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614f75565b60405180910390fd5b60008360ff1611612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90615155565b60405180910390fd5b600d548360ff1682612566919061532e565b11156125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e90614e15565b60405180910390fd5b8260ff16600b546125b891906153ec565b3410156125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190615115565b60405180910390fd5b600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16846126559190615384565b60ff161115612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906151b5565b60405180910390fd5b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166126f49190615384565b92506101000a81548160ff021916908360ff1602179055508260ff1660156000828254612721919061532e565b925050819055506000600190505b8360ff1681116127615761274e338284612749919061532e565b6131a8565b8080612759906155aa565b91505061272f565b50505050565b61276f612d0f565b73ffffffffffffffffffffffffffffffffffffffff1661278d611eae565b73ffffffffffffffffffffffffffffffffffffffff16146127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906150d5565b60405180910390fd5b6000479050600081116127f557600080fd5b60005b600160026128069190615446565b81101561289557612882601682600281106128245761282361572e565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106018848154811061285d5761285c61572e565b5b90600052602060002001548561287391906153ec565b61287d91906153bb565b613648565b808061288d906155aa565b9150506127f8565b506128e26016600160026128a99190615446565b600281106128ba576128b961572e565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647613648565b50565b600c5481565b601881815481106128fb57600080fd5b906000526020600020016000915090505481565b606060096040516020016129239190614c75565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129d3612d0f565b73ffffffffffffffffffffffffffffffffffffffff166129f1611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3e906150d5565b60405180910390fd5b6002600a60019054906101000a900460ff1660ff1610612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9390615095565b60405180910390fd5b600a600181819054906101000a900460ff1680929190612abb906155f3565b91906101000a81548160ff021916908360ff160217905550507f36e08625927f4c20a74363a4c118d06899c5dbd5a27024d11ca0075e206a7ded600a60019054906101000a900460ff16604051612b1291906151f0565b60405180910390a1565b600a60009054906101000a900460ff1681565b612b37612d0f565b73ffffffffffffffffffffffffffffffffffffffff16612b55611eae565b73ffffffffffffffffffffffffffffffffffffffff1614612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba2906150d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614e95565b60405180910390fd5b612c24816131c6565b50565b600f5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d085750612d07826136f9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df6836118b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000612e4b8585613763565b91509150612e58816137e6565b819250505092915050565b6000612e6e82612d17565b612ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea490614f95565b60405180910390fd5b6000612eb8836118b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f2757508373ffffffffffffffffffffffffffffffffffffffff16612f0f84610f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f385750612f378185612937565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f61826118b5565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90614ed5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614f15565b60405180910390fd5b6130328383836139bb565b61303d600082612d83565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461308d9190615446565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130e4919061532e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a38383836139c0565b505050565b6131c28282604051806020016040528060008152506139c5565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f290614f35565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133ec9190614d53565b60405180910390a3505050565b613404848484612f41565b61341084848484613a20565b61344f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344690614e75565b60405180910390fd5b50505050565b60606007805461346490615547565b80601f016020809104026020016040519081016040528092919081815260200182805461349090615547565b80156134dd5780601f106134b2576101008083540402835291602001916134dd565b820191906000526020600020905b8154815290600101906020018083116134c057829003601f168201915b5050505050905090565b6060600082141561352f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613643565b600082905060005b6000821461356157808061354a906155aa565b915050600a8261355a91906153bb565b9150613537565b60008167ffffffffffffffff81111561357d5761357c61575d565b5b6040519080825280601f01601f1916602001820160405280156135af5781602001600182028036833780820191505090505b5090505b6000851461363c576001826135c89190615446565b9150600a856135d79190615641565b60306135e3919061532e565b60f81b8183815181106135f9576135f861572e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561363591906153bb565b94506135b3565b8093505050505b919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161366e90614c8c565b60006040518083038185875af1925050503d80600081146136ab576040519150601f19603f3d011682016040523d82523d6000602084013e6136b0565b606091505b50509050806136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90614eb5565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806041835114156137a55760008060006020860151925060408601519150606086015160001a905061379987828585613bb7565b945094505050506137df565b6040835114156137d65760008060208501519150604085015190506137cb868383613cc4565b9350935050506137df565b60006002915091505b9250929050565b600060048111156137fa576137f96156d0565b5b81600481111561380d5761380c6156d0565b5b1415613818576139b8565b6001600481111561382c5761382b6156d0565b5b81600481111561383f5761383e6156d0565b5b1415613880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387790614dd5565b60405180910390fd5b60026004811115613894576138936156d0565b5b8160048111156138a7576138a66156d0565b5b14156138e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138df90614e35565b60405180910390fd5b600360048111156138fc576138fb6156d0565b5b81600481111561390f5761390e6156d0565b5b1415613950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394790614f55565b60405180910390fd5b600480811115613963576139626156d0565b5b816004811115613976576139756156d0565b5b14156139b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ae90615055565b60405180910390fd5b5b50565b505050565b505050565b6139cf8383613d23565b6139dc6000848484613a20565b613a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1290614e75565b60405180910390fd5b505050565b6000613a418473ffffffffffffffffffffffffffffffffffffffff16613efd565b15613baa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a6a612d0f565b8786866040518563ffffffff1660e01b8152600401613a8c9493929190614cbc565b602060405180830381600087803b158015613aa657600080fd5b505af1925050508015613ad757506040513d601f19601f82011682018060405250810190613ad491906143ed565b60015b613b5a573d8060008114613b07576040519150601f19603f3d011682016040523d82523d6000602084013e613b0c565b606091505b50600081511415613b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4990614e75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613baf565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613bf2576000600391509150613cbb565b601b8560ff1614158015613c0a5750601c8560ff1614155b15613c1c576000600491509150613cbb565b600060018787878760405160008152602001604052604051613c419493929190614d6e565b6020604051602081039080840390855afa158015613c63573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613cb257600060019250925050613cbb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613d07919061532e565b9050613d1587828885613bb7565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8a90615075565b60405180910390fd5b613d9c81612d17565b15613ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd390614ef5565b60405180910390fd5b613de8600083836139bb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e38919061532e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ef9600083836139c0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613f2c90615547565b90600052602060002090601f016020900481019282613f4e5760008555613f95565b82601f10613f6757805160ff1916838001178555613f95565b82800160010185558215613f95579182015b82811115613f94578251825591602001919060010190613f79565b5b509050613fa29190613fa6565b5090565b5b80821115613fbf576000816000905550600101613fa7565b5090565b6000613fd6613fd184615230565b61520b565b905082815260208101848484011115613ff257613ff1615791565b5b613ffd848285615505565b509392505050565b600061401861401384615261565b61520b565b90508281526020810184848401111561403457614033615791565b5b61403f848285615505565b509392505050565b60008135905061405681615f41565b92915050565b60008135905061406b81615f58565b92915050565b60008135905061408081615f6f565b92915050565b60008151905061409581615f6f565b92915050565b600082601f8301126140b0576140af61578c565b5b81356140c0848260208601613fc3565b91505092915050565b600082601f8301126140de576140dd61578c565b5b81356140ee848260208601614005565b91505092915050565b60008135905061410681615f86565b92915050565b60008135905061411b81615f9d565b92915050565b6000602082840312156141375761413661579b565b5b600061414584828501614047565b91505092915050565b600080604083850312156141655761416461579b565b5b600061417385828601614047565b925050602061418485828601614047565b9150509250929050565b6000806000606084860312156141a7576141a661579b565b5b60006141b586828701614047565b93505060206141c686828701614047565b92505060406141d7868287016140f7565b9150509250925092565b600080600080608085870312156141fb576141fa61579b565b5b600061420987828801614047565b945050602061421a87828801614047565b935050604061422b878288016140f7565b925050606085013567ffffffffffffffff81111561424c5761424b615796565b5b6142588782880161409b565b91505092959194509250565b6000806040838503121561427b5761427a61579b565b5b600061428985828601614047565b925050602061429a8582860161405c565b9150509250929050565b600080604083850312156142bb576142ba61579b565b5b60006142c985828601614047565b925050602083013567ffffffffffffffff8111156142ea576142e9615796565b5b6142f68582860161409b565b9150509250929050565b600080604083850312156143175761431661579b565b5b600061432585828601614047565b9250506020614336858286016140f7565b9150509250929050565b6000806000606084860312156143595761435861579b565b5b600061436786828701614047565b9350506020614378868287016140f7565b9250506040614389868287016140f7565b9150509250925092565b6000602082840312156143a9576143a861579b565b5b60006143b78482850161405c565b91505092915050565b6000602082840312156143d6576143d561579b565b5b60006143e484828501614071565b91505092915050565b6000602082840312156144035761440261579b565b5b600061441184828501614086565b91505092915050565b6000602082840312156144305761442f61579b565b5b600082013567ffffffffffffffff81111561444e5761444d615796565b5b61445a848285016140c9565b91505092915050565b6000602082840312156144795761447861579b565b5b6000614487848285016140f7565b91505092915050565b600080604083850312156144a7576144a661579b565b5b60006144b5858286016140f7565b92505060206144c685828601614047565b9150509250929050565b600080604083850312156144e7576144e661579b565b5b60006144f5858286016140f7565b9250506020614506858286016140f7565b9150509250929050565b6000602082840312156145265761452561579b565b5b60006145348482850161410c565b91505092915050565b600080604083850312156145545761455361579b565b5b60006145628582860161410c565b925050602083013567ffffffffffffffff81111561458357614582615796565b5b61458f8582860161409b565b9150509250929050565b60006145a58383614bf8565b60208301905092915050565b6145ba8161547a565b82525050565b6145d16145cc8261547a565b61561d565b82525050565b60006145e2826152b7565b6145ec81856152e5565b93506145f783615292565b8060005b8381101561462857815161460f8882614599565b975061461a836152d8565b9250506001810190506145fb565b5085935050505092915050565b61463e8161548c565b82525050565b61464d81615498565b82525050565b600061465e826152c2565b61466881856152f6565b9350614678818560208601615514565b614681816157a0565b840191505092915050565b6000614697826152cd565b6146a18185615312565b93506146b1818560208601615514565b6146ba816157a0565b840191505092915050565b60006146d0826152cd565b6146da8185615323565b93506146ea818560208601615514565b80840191505092915050565b6000815461470381615547565b61470d8186615323565b9450600182166000811461472857600181146147395761476c565b60ff1983168652818601935061476c565b614742856152a2565b60005b8381101561476457815481890152600182019150602081019050614745565b838801955050505b50505092915050565b6000614782601883615312565b915061478d826157be565b602082019050919050565b60006147a5601883615312565b91506147b0826157e7565b602082019050919050565b60006147c8601a83615312565b91506147d382615810565b602082019050919050565b60006147eb601f83615312565b91506147f682615839565b602082019050919050565b600061480e601383615312565b915061481982615862565b602082019050919050565b6000614831603283615312565b915061483c8261588b565b604082019050919050565b6000614854602683615312565b915061485f826158da565b604082019050919050565b6000614877600f83615312565b915061488282615929565b602082019050919050565b600061489a602583615312565b91506148a582615952565b604082019050919050565b60006148bd601c83615312565b91506148c8826159a1565b602082019050919050565b60006148e0602483615312565b91506148eb826159ca565b604082019050919050565b6000614903601983615312565b915061490e82615a19565b602082019050919050565b6000614926602283615312565b915061493182615a42565b604082019050919050565b6000614949600d83615312565b915061495482615a91565b602082019050919050565b600061496c602c83615312565b915061497782615aba565b604082019050919050565b600061498f601083615312565b915061499a82615b09565b602082019050919050565b60006149b2603883615312565b91506149bd82615b32565b604082019050919050565b60006149d5602a83615312565b91506149e082615b81565b604082019050919050565b60006149f8602983615312565b9150614a0382615bd0565b604082019050919050565b6000614a1b602183615312565b9150614a2682615c1f565b604082019050919050565b6000614a3e602283615312565b9150614a4982615c6e565b604082019050919050565b6000614a61602083615312565b9150614a6c82615cbd565b602082019050919050565b6000614a84601b83615312565b9150614a8f82615ce6565b602082019050919050565b6000614aa7602c83615312565b9150614ab282615d0f565b604082019050919050565b6000614aca602083615312565b9150614ad582615d5e565b602082019050919050565b6000614aed602f83615312565b9150614af882615d87565b604082019050919050565b6000614b10601883615312565b9150614b1b82615dd6565b602082019050919050565b6000614b33602183615312565b9150614b3e82615dff565b604082019050919050565b6000614b56601483615312565b9150614b6182615e4e565b602082019050919050565b6000614b79600f83615312565b9150614b8482615e77565b602082019050919050565b6000614b9c600083615307565b9150614ba782615ea0565b600082019050919050565b6000614bbf603183615312565b9150614bca82615ea3565b604082019050919050565b6000614be2602483615312565b9150614bed82615ef2565b604082019050919050565b614c01816154ee565b82525050565b614c10816154ee565b82525050565b614c1f816154f8565b82525050565b6000614c3182856145c0565b601482019150614c4182846145c0565b6014820191508190509392505050565b6000614c5d82856146c5565b9150614c6982846146c5565b91508190509392505050565b6000614c8182846146f6565b915081905092915050565b6000614c9782614b8f565b9150819050919050565b6000602082019050614cb660008301846145b1565b92915050565b6000608082019050614cd160008301876145b1565b614cde60208301866145b1565b614ceb6040830185614c07565b8181036060830152614cfd8184614653565b905095945050505050565b6000604082019050614d1d60008301856145b1565b614d2a6020830184614c07565b9392505050565b60006020820190508181036000830152614d4b81846145d7565b905092915050565b6000602082019050614d686000830184614635565b92915050565b6000608082019050614d836000830187614644565b614d906020830186614c16565b614d9d6040830185614644565b614daa6060830184614644565b95945050505050565b60006020820190508181036000830152614dcd818461468c565b905092915050565b60006020820190508181036000830152614dee81614775565b9050919050565b60006020820190508181036000830152614e0e81614798565b9050919050565b60006020820190508181036000830152614e2e816147bb565b9050919050565b60006020820190508181036000830152614e4e816147de565b9050919050565b60006020820190508181036000830152614e6e81614801565b9050919050565b60006020820190508181036000830152614e8e81614824565b9050919050565b60006020820190508181036000830152614eae81614847565b9050919050565b60006020820190508181036000830152614ece8161486a565b9050919050565b60006020820190508181036000830152614eee8161488d565b9050919050565b60006020820190508181036000830152614f0e816148b0565b9050919050565b60006020820190508181036000830152614f2e816148d3565b9050919050565b60006020820190508181036000830152614f4e816148f6565b9050919050565b60006020820190508181036000830152614f6e81614919565b9050919050565b60006020820190508181036000830152614f8e8161493c565b9050919050565b60006020820190508181036000830152614fae8161495f565b9050919050565b60006020820190508181036000830152614fce81614982565b9050919050565b60006020820190508181036000830152614fee816149a5565b9050919050565b6000602082019050818103600083015261500e816149c8565b9050919050565b6000602082019050818103600083015261502e816149eb565b9050919050565b6000602082019050818103600083015261504e81614a0e565b9050919050565b6000602082019050818103600083015261506e81614a31565b9050919050565b6000602082019050818103600083015261508e81614a54565b9050919050565b600060208201905081810360008301526150ae81614a77565b9050919050565b600060208201905081810360008301526150ce81614a9a565b9050919050565b600060208201905081810360008301526150ee81614abd565b9050919050565b6000602082019050818103600083015261510e81614ae0565b9050919050565b6000602082019050818103600083015261512e81614b03565b9050919050565b6000602082019050818103600083015261514e81614b26565b9050919050565b6000602082019050818103600083015261516e81614b49565b9050919050565b6000602082019050818103600083015261518e81614b6c565b9050919050565b600060208201905081810360008301526151ae81614bb2565b9050919050565b600060208201905081810360008301526151ce81614bd5565b9050919050565b60006020820190506151ea6000830184614c07565b92915050565b60006020820190506152056000830184614c16565b92915050565b6000615215615226565b90506152218282615579565b919050565b6000604051905090565b600067ffffffffffffffff82111561524b5761524a61575d565b5b615254826157a0565b9050602081019050919050565b600067ffffffffffffffff82111561527c5761527b61575d565b5b615285826157a0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615339826154ee565b9150615344836154ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561537957615378615672565b5b828201905092915050565b600061538f826154f8565b915061539a836154f8565b92508260ff038211156153b0576153af615672565b5b828201905092915050565b60006153c6826154ee565b91506153d1836154ee565b9250826153e1576153e06156a1565b5b828204905092915050565b60006153f7826154ee565b9150615402836154ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543b5761543a615672565b5b828202905092915050565b6000615451826154ee565b915061545c836154ee565b92508282101561546f5761546e615672565b5b828203905092915050565b6000615485826154ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b60208210811415615573576155726156ff565b5b50919050565b615582826157a0565b810181811067ffffffffffffffff821117156155a1576155a061575d565b5b80604052505050565b60006155b5826154ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615672565b5b600182019050919050565b60006155fe826154f8565b915060ff82141561561257615611615672565b5b600182019050919050565b60006156288261562f565b9050919050565b600061563a826157b1565b9050919050565b600061564c826154ee565b9150615657836154ee565b925082615667576156666156a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e742065786365656420746f74616c20737570706c790000000000000000600082015250565b7f4d696e74206578636565642070726573616c6520737570706c79000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4d7573742062652077686974656c697374656400000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2073616c654d696e744d6160008201527f7800000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20320000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420616d6f756e742073656e740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e2070726573616c654d696e60008201527f744d617800000000000000000000000000000000000000000000000000000000602082015250565b615f4a8161547a565b8114615f5557600080fd5b50565b615f618161548c565b8114615f6c57600080fd5b50565b615f78816154a2565b8114615f8357600080fd5b50565b615f8f816154ee565b8114615f9a57600080fd5b50565b615fa6816154f8565b8114615fb157600080fd5b5056fea2646970667358221220a6264a8185466b1264d12ef0f4f4db6d44975bfc6178d69da374b9302a17ae8964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000901f714cd8676652dd9fab0c8c2581916939fd900000000000000000000000000000000000000000000000000000000000000009426c6f6f6457617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024257000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d702f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d702f000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): BloodWars
Arg [1] : _symbol (string): BW
Arg [2] : _initBaseURI (string): https://www.bloodwars.io/api/temp/
Arg [3] : _defaultURI (string): https://www.bloodwars.io/api/temp/
Arg [4] : _whitelistSigner (address): 0x901F714cd8676652Dd9fAb0C8C2581916939FD90

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000901f714cd8676652dd9fab0c8c2581916939fd90
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 426c6f6f64576172730000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 4257000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [10] : 68747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d
Arg [11] : 702f000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [13] : 68747470733a2f2f7777772e626c6f6f64776172732e696f2f6170692f74656d
Arg [14] : 702f000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48723:9089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49250:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50873:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56564:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23259:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24952:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55778:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49381:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24475:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55406:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56367:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53486:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55894:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53170:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25871:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54966:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50285:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55658:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56150:85;;;;;;;;;;;;;:::i;:::-;;48877:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26318:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56002:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49934:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56651:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22866:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48908:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49512:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52330:832;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48849:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22509:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37871:103;;;;;;;;;;;;;:::i;:::-;;49967:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49550:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49649:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37220:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56243:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23428:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25332:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55530:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49337:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50024:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26574:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49121:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49594:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50363:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53586:719;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54313:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51293:1029;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57090:544;;;;;;;;;;;;;:::i;:::-;;49297:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50179:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54818:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25590:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55239:159;;;;;;;;;;;;;:::i;:::-;;48942:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38129:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49468:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49250:40;;;;:::o;50873:397::-;50994:4;51051:25;51036:40;;;:11;:40;;;;:82;;;;51108:10;51093:25;;:11;:25;;;;51036:82;:144;;;;51170:10;51155:25;;:11;:25;;;;51036:144;:226;;;;51226:36;51250:11;51226:23;:36::i;:::-;51036:226;51016:246;;50873:397;;;:::o;56564:79::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56629:6:::1;56620;;:15;;;;;;;;;;;;;;;;;;56564:79:::0;:::o;23259:100::-;23313:13;23346:5;23339:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:100;:::o;24952:308::-;25073:7;25120:16;25128:7;25120;:16::i;:::-;25098:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25228:15;:24;25244:7;25228:24;;;;;;;;;;;;;;;;;;;;;25221:31;;24952:308;;;:::o;55778:108::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55866:12:::1;55852:11;:26;;;;55778:108:::0;:::o;49381:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;24475:411::-;24556:13;24572:23;24587:7;24572:14;:23::i;:::-;24556:39;;24620:5;24614:11;;:2;:11;;;;24606:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24714:5;24698:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24723:37;24740:5;24747:12;:10;:12::i;:::-;24723:16;:37::i;:::-;24698:62;24676:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24857:21;24866:2;24870:7;24857:8;:21::i;:::-;24545:341;24475:411;;:::o;55406:116::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55498:16:::1;55488:7;;:26;;;;;;;;;;;;;;;;;;55406:116:::0;:::o;56367:189::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56497:12:::1;56483:11;;:26;;;;;;;;;;;;;;;;;;56535:13;56520:12;:28;;;;56367:189:::0;;:::o;53486:92::-;53530:7;53557:13;;53550:20;;53486:92;:::o;55894:100::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55976:10:::1;55964:9;:22;;;;55894:100:::0;:::o;53170:308::-;53280:4;53346:124;53413:4;53420:5;53388:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53378:49;;;;;;53446:9;53346:13;:124::i;:::-;53322:148;;:7;;;;;;;;;;;:148;;;53302:168;;53170:308;;;;:::o;25871:376::-;26080:41;26099:12;:10;:12::i;:::-;26113:7;26080:18;:41::i;:::-;26058:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26211:28;26221:4;26227:2;26231:7;26211:9;:28::i;:::-;25871:376;;;:::o;54966:231::-;55075:16;55093:21;55140:11;;;;;;;;;;;55183:5;55167:12;;55154:10;:25;;;;:::i;:::-;55153:35;;;;:::i;:::-;55132:57;;;;54966:231;;;;;:::o;50285:71::-;;;;;;;;;;;;;:::o;55658:112::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55749:13:::1;55734:12;:28;;;;55658:112:::0;:::o;56150:85::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56223:4:::1;56205:15;;:22;;;;;;;;;;;;;;;;;;56150:85::o:0;48877:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26318:185::-;26456:39;26473:4;26479:2;26483:7;26456:39;;;;;;;;;;;;:16;:39::i;:::-;26318:185;;;:::o;56002:140::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56086:15:::1;;;;;;;;;;;56085:16;56077:25;;;::::0;::::1;;56123:11;56113:7;:21;;;;;;;;;;;;:::i;:::-;;56002:140:::0;:::o;49934:26::-;;;;;;;;;;;;;:::o;56651:396::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56734:14:::1;56751:13;:11;:13::i;:::-;56734:30;;56821:19;;56806:11;56797:6;:20;;;;:::i;:::-;:43;;56775:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;56922:11;56905:13;;:28;;;;;;;:::i;:::-;;;;;;;;56949:9;56961:1;56949:13;;56944:96;56969:11;56964:1;:16;56944:96;;57002:26;57012:3;57026:1;57017:6;:10;;;;:::i;:::-;57002:9;:26::i;:::-;56982:3;;;;;:::i;:::-;;;;56944:96;;;;56723:324;56651:396:::0;;:::o;22866:326::-;22983:7;23008:13;23024:7;:16;23032:7;23024:16;;;;;;;;;;;;;;;;;;;;;23008:32;;23090:1;23073:19;;:5;:19;;;;23051:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23179:5;23172:12;;;22866:326;;;:::o;48908:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49512:31::-;;;;:::o;52330:832::-;52395:14;52412:13;:11;:13::i;:::-;52395:30;;52445:6;;;;;;;;;;;52444:7;52436:16;;;;;;52480:1;52471:5;;;;;;;;;;;:10;;;52463:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52534:1;52520:11;:15;;;52512:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;52617:15;;52602:11;52593:20;;:6;:20;;;;:::i;:::-;:39;;52571:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52759:11;;52731:13;:24;52745:9;52731:24;;;;;;;;;;;;;;;;;;;;;;;;;52717:11;:38;;;;:::i;:::-;:53;;;;52695:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;52889:11;52877:23;;:9;;:23;;;;:::i;:::-;52864:9;:36;;52842:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52991:11;52963:13;:24;52977:9;52963:24;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53030:11;53013:28;;:13;;:28;;;;;;;:::i;:::-;;;;;;;;53057:9;53069:1;53057:13;;53052:103;53077:11;53072:16;;:1;:16;53052:103;;53110:33;53120:10;53141:1;53132:6;:10;;;;:::i;:::-;53110:9;:33::i;:::-;53090:3;;;;;:::i;:::-;;;;53052:103;;;;52384:778;52330:832;:::o;48849:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22509:295::-;22626:7;22690:1;22673:19;;:5;:19;;;;22651:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22780:9;:16;22790:5;22780:16;;;;;;;;;;;;;;;;22773:23;;22509:295;;;:::o;37871:103::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37936:30:::1;37963:1;37936:18;:30::i;:::-;37871:103::o:0;49967:28::-;;;;:::o;49550:37::-;;;;:::o;49649:41::-;;;;:::o;37220:87::-;37266:7;37293:6;;;;;;;;;;;37286:13;;37220:87;:::o;56243:116::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56339:12:::1;56323:13;:28;;;;;;;;;;;;:::i;:::-;;56243:116:::0;:::o;23428:104::-;23484:13;23517:7;23510:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23428:104;:::o;25332:187::-;25459:52;25478:12;:10;:12::i;:::-;25492:8;25502;25459:18;:52::i;:::-;25332:187;;:::o;55530:120::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55627:15:::1;55610:14;:32;;;;55530:120:::0;:::o;49337:35::-;;;;:::o;50024:148::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26574:365::-;26763:41;26782:12;:10;:12::i;:::-;26796:7;26763:18;:41::i;:::-;26741:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26892:39;26906:4;26912:2;26916:7;26925:5;26892:13;:39::i;:::-;26574:365;;;;:::o;49121:22::-;;;;;;;;;;;;;:::o;49594:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;50363:33::-;;;;:::o;53586:719::-;53714:16;53743:18;53764:17;53774:6;53764:9;:17::i;:::-;53743:38;;53810:1;53796:10;:15;53792:506;;;53849:1;53835:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53828:23;;;;;53792:506;53884:23;53924:10;53910:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53884:51;;53950:13;53989:15;54007:7;53989:25;;53984:273;54026:5;54016:7;:15;53984:273;;;54076:10;54067:5;:19;54063:30;;;54088:5;;54063:30;54138:6;54118:26;;:16;54126:7;54118;:16::i;:::-;:26;;;54114:128;;;54185:7;54169:6;54176:5;54169:13;;;;;;;;:::i;:::-;;;;;;;:23;;;;;54215:7;;;;;:::i;:::-;;;;54114:128;54033:9;;;;;:::i;:::-;;;;53984:273;;;;54280:6;54273:13;;;;;53586:719;;;;;;:::o;54313:497::-;54431:13;54484:16;54492:7;54484;:16::i;:::-;54462:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;54588:28;54619:10;:8;:10::i;:::-;54588:41;;54691:1;54666:14;54660:28;:32;:142;;54792:10;54660:142;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54736:14;54752:18;:7;:16;:18::i;:::-;54719:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54660:142;54640:162;;;54313:497;;;:::o;51293:1029::-;51408:14;51425:13;:11;:13::i;:::-;51408:30;;51458:6;;;;;;;;;;;51457:7;51449:16;;;;;;51492:1;51484:5;;;;;;;;;;;:9;;;51476:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51533:36;51547:10;51559:9;51533:13;:36::i;:::-;51525:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51621:1;51612:5;;;;;;;;;;;:10;;;51604:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51673:1;51659:11;:15;;;51651:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;51756:13;;51741:11;51732:20;;:6;:20;;;;:::i;:::-;:37;;51710:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;51884:11;51869:26;;:12;;:26;;;;:::i;:::-;51856:9;:39;;51834:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52026:14;;51994:16;:28;52011:10;51994:28;;;;;;;;;;;;;;;;;;;;;;;;;51980:11;:42;;;;:::i;:::-;:60;;;;51958:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;52149:11;52117:16;:28;52134:10;52117:28;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52188:11;52171:28;;:13;;:28;;;;;;;:::i;:::-;;;;;;;;52217:9;52229:1;52217:13;;52212:103;52237:11;52232:16;;:1;:16;52212:103;;52270:33;52280:10;52301:1;52292:6;:10;;;;:::i;:::-;52270:9;:33::i;:::-;52250:3;;;;;:::i;:::-;;;;52212:103;;;;51397:925;51293:1029;;:::o;57090:544::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57142:18:::1;57163:21;57142:42;;57216:1;57203:10;:14;57195:23;;;::::0;::::1;;57236:9;57231:207;57279:1;57255:21;:25;;;;:::i;:::-;57251:1;:29;57231:207;;;57302:124;57330:14;57345:1;57330:17;;;;;;;:::i;:::-;;;;;;;;;;;;;57406:5;57380:19;57400:1;57380:22;;;;;;;;:::i;:::-;;;;;;;;;;57367:10;:35;;;;:::i;:::-;57366:45;;;;:::i;:::-;57302:9;:124::i;:::-;57282:3;;;;;:::i;:::-;;;;57231:207;;;;57514:112;57538:14;57577:1;57553:21;:25;;;;:::i;:::-;57538:41;;;;;;;:::i;:::-;;;;;;;;;;;;;57594:21;57514:9;:112::i;:::-;57131:503;57090:544::o:0;49297:33::-;;;;:::o;50179:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54818:124::-;54862:13;54919;54902:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;54888:46;;54818:124;:::o;25590:214::-;25732:4;25761:18;:25;25780:5;25761:25;;;;;;;;;;;;;;;:35;25787:8;25761:35;;;;;;;;;;;;;;;;;;;;;;;;;25754:42;;25590:214;;;;:::o;55239:159::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55304:1:::1;55296:5;;;;;;;;;;;:9;;;55288:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55348:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;55371:19;55384:5;;;;;;;;;;;55371:19;;;;;;:::i;:::-;;;;;;;;55239:159::o:0;48942:35::-;;;;;;;;;;;;;:::o;38129:238::-;37451:12;:10;:12::i;:::-;37440:23;;:7;:5;:7::i;:::-;:23;;;37432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38252:1:::1;38232:22;;:8;:22;;;;38210:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38331:28;38350:8;38331:18;:28::i;:::-;38129:238:::0;:::o;49468:37::-;;;;:::o;22090:355::-;22237:4;22294:25;22279:40;;;:11;:40;;;;:105;;;;22351:33;22336:48;;;:11;:48;;;;22279:105;:158;;;;22401:36;22425:11;22401:23;:36::i;:::-;22279:158;22259:178;;22090:355;;;:::o;17337:98::-;17390:7;17417:10;17410:17;;17337:98;:::o;28486:127::-;28551:4;28603:1;28575:30;;:7;:16;28583:7;28575:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28568:37;;28486:127;;;:::o;32773:174::-;32875:2;32848:15;:24;32864:7;32848:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32931:7;32927:2;32893:46;;32902:23;32917:7;32902:14;:23::i;:::-;32893:46;;;;;;;;;;;;32773:174;;:::o;43143:263::-;43248:7;43274:17;43293:18;43315:27;43326:4;43332:9;43315:10;:27::i;:::-;43273:69;;;;43353:18;43365:5;43353:11;:18::i;:::-;43389:9;43382:16;;;;43143:263;;;;:::o;28780:452::-;28909:4;28953:16;28961:7;28953;:16::i;:::-;28931:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29052:13;29068:23;29083:7;29068:14;:23::i;:::-;29052:39;;29121:5;29110:16;;:7;:16;;;:64;;;;29167:7;29143:31;;:20;29155:7;29143:11;:20::i;:::-;:31;;;29110:64;:113;;;;29191:32;29208:5;29215:7;29191:16;:32::i;:::-;29110:113;29102:122;;;28780:452;;;;:::o;31993:662::-;32166:4;32139:31;;:23;32154:7;32139:14;:23::i;:::-;:31;;;32117:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;32268:1;32254:16;;:2;:16;;;;32246:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32324:39;32345:4;32351:2;32355:7;32324:20;:39::i;:::-;32428:29;32445:1;32449:7;32428:8;:29::i;:::-;32489:1;32470:9;:15;32480:4;32470:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32518:1;32501:9;:13;32511:2;32501:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32549:2;32530:7;:16;32538:7;32530:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32588:7;32584:2;32569:27;;32578:4;32569:27;;;;;;;;;;;;32609:38;32629:4;32635:2;32639:7;32609:19;:38::i;:::-;31993:662;;;:::o;29574:110::-;29650:26;29660:2;29664:7;29650:26;;;;;;;;;;;;:9;:26::i;:::-;29574:110;;:::o;38527:191::-;38601:16;38620:6;;;;;;;;;;;38601:25;;38646:8;38637:6;;:17;;;;;;;;;;;;;;;;;;38701:8;38670:40;;38691:8;38670:40;;;;;;;;;;;;38590:128;38527:191;:::o;33089:315::-;33244:8;33235:17;;:5;:17;;;;33227:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33331:8;33293:18;:25;33312:5;33293:25;;;;;;;;;;;;;;;:35;33319:8;33293:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33377:8;33355:41;;33370:5;33355:41;;;33387:8;33355:41;;;;;;:::i;:::-;;;;;;;;33089:315;;;:::o;27821:352::-;27978:28;27988:4;27994:2;27998:7;27978:9;:28::i;:::-;28039:48;28062:4;28068:2;28072:7;28081:5;28039:22;:48::i;:::-;28017:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27821:352;;;;:::o;50757:108::-;50817:13;50850:7;50843:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50757:108;:::o;17887:723::-;17943:13;18173:1;18164:5;:10;18160:53;;;18191:10;;;;;;;;;;;;;;;;;;;;;18160:53;18223:12;18238:5;18223:20;;18254:14;18279:78;18294:1;18286:4;:9;18279:78;;18312:8;;;;;:::i;:::-;;;;18343:2;18335:10;;;;;:::i;:::-;;;18279:78;;;18367:19;18399:6;18389:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18367:39;;18417:154;18433:1;18424:5;:10;18417:154;;18461:1;18451:11;;;;;:::i;:::-;;;18528:2;18520:5;:10;;;;:::i;:::-;18507:2;:24;;;;:::i;:::-;18494:39;;18477:6;18484;18477:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18557:2;18548:11;;;;;:::i;:::-;;;18417:154;;;18595:6;18581:21;;;;;17887:723;;;;:::o;57642:167::-;57710:12;57728:5;:10;;57746:4;57728:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57709:46;;;57774:7;57766:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;57698:111;57642:167;;:::o;20512:207::-;20642:4;20686:25;20671:40;;;:11;:40;;;;20664:47;;20512:207;;;:::o;41001:1340::-;41109:7;41118:12;41368:2;41348:9;:16;:22;41344:990;;;41387:9;41411;41435:7;41644:4;41633:9;41629:20;41623:27;41618:32;;41694:4;41683:9;41679:20;41673:27;41668:32;;41752:4;41741:9;41737:20;41731:27;41728:1;41723:36;41718:41;;41795:25;41806:4;41812:1;41815;41818;41795:10;:25::i;:::-;41788:32;;;;;;;;;41344:990;41862:2;41842:9;:16;:22;41838:496;;;41881:9;41905:10;42117:4;42106:9;42102:20;42096:27;42091:32;;42168:4;42157:9;42153:20;42147:27;42141:33;;42210:23;42221:4;42227:1;42230:2;42210:10;:23::i;:::-;42203:30;;;;;;;;41838:496;42282:1;42286:35;42266:56;;;;41001:1340;;;;;;:::o;39272:643::-;39350:20;39341:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;39337:571;;;39387:7;;39337:571;39448:29;39439:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;39435:473;;;39494:34;;;;;;;;;;:::i;:::-;;;;;;;;39435:473;39559:35;39550:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;39546:362;;;39611:41;;;;;;;;;;:::i;:::-;;;;;;;;39546:362;39683:30;39674:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39670:238;;;39730:44;;;;;;;;;;:::i;:::-;;;;;;;;39670:238;39805:30;39796:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39792:116;;;39852:44;;;;;;;;;;:::i;:::-;;;;;;;;39792:116;39272:643;;:::o;35521:126::-;;;;:::o;36032:125::-;;;;:::o;29911:321::-;30041:18;30047:2;30051:7;30041:5;:18::i;:::-;30092:54;30123:1;30127:2;30131:7;30140:5;30092:22;:54::i;:::-;30070:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29911:321;;;:::o;33969:980::-;34124:4;34145:15;:2;:13;;;:15::i;:::-;34141:801;;;34214:2;34198:36;;;34257:12;:10;:12::i;:::-;34292:4;34319:7;34349:5;34198:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34177:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34573:1;34556:6;:13;:18;34552:320;;;34599:108;;;;;;;;;;:::i;:::-;;;;;;;;34552:320;34822:6;34816:13;34807:6;34803:2;34799:15;34792:38;34177:710;34447:41;;;34437:51;;;:6;:51;;;;34430:58;;;;;34141:801;34926:4;34919:11;;33969:980;;;;;;;:::o;44672:1669::-;44803:7;44812:12;45764:66;45746:1;45738:10;;:92;45720:200;;;45873:1;45877:30;45857:51;;;;;;45720:200;45939:2;45934:1;:7;;;;:18;;;;;45950:2;45945:1;:7;;;;45934:18;45930:102;;;45985:1;45989:30;45969:51;;;;;;45930:102;46129:14;46146:24;46156:4;46162:1;46165;46168;46146:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46129:41;;46203:1;46185:20;;:6;:20;;;46181:103;;;46238:1;46242:29;46222:50;;;;;;;46181:103;46304:6;46312:20;46296:37;;;;;44672:1669;;;;;;;;:::o;43669:389::-;43783:7;43792:12;43817:9;43873:66;43847:107;;43829:2;:125;43817:137;;43965:7;44004:2;43997:3;43990:2;43982:11;;:18;;43981:25;;;;:::i;:::-;43965:42;;44025:25;44036:4;44042:1;44045;44048;44025:10;:25::i;:::-;44018:32;;;;;;43669:389;;;;;;:::o;30568:439::-;30662:1;30648:16;;:2;:16;;;;30640:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30721:16;30729:7;30721;:16::i;:::-;30720:17;30712:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30783:45;30812:1;30816:2;30820:7;30783:20;:45::i;:::-;30858:1;30841:9;:13;30851:2;30841:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30889:2;30870:7;:16;30878:7;30870:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30934:7;30930:2;30909:33;;30926:1;30909:33;;;;;;;;;;;;30955:44;30983:1;30987:2;30991:7;30955:19;:44::i;:::-;30568:439;;:::o;8950:326::-;9010:4;9267:1;9245:7;:19;;;:23;9238:30;;8950:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:652::-;5358:6;5366;5415:2;5403:9;5394:7;5390:23;5386:32;5383:119;;;5421:79;;:::i;:::-;5383:119;5541:1;5566:53;5611:7;5602:6;5591:9;5587:22;5566:53;:::i;:::-;5556:63;;5512:117;5696:2;5685:9;5681:18;5668:32;5727:18;5719:6;5716:30;5713:117;;;5749:79;;:::i;:::-;5713:117;5854:62;5908:7;5899:6;5888:9;5884:22;5854:62;:::i;:::-;5844:72;;5639:287;5281:652;;;;;:::o;5939:474::-;6007:6;6015;6064:2;6052:9;6043:7;6039:23;6035:32;6032:119;;;6070:79;;:::i;:::-;6032:119;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:53;6388:7;6379:6;6368:9;6364:22;6343:53;:::i;:::-;6333:63;;6288:118;5939:474;;;;;:::o;6419:619::-;6496:6;6504;6512;6561:2;6549:9;6540:7;6536:23;6532:32;6529:119;;;6567:79;;:::i;:::-;6529:119;6687:1;6712:53;6757:7;6748:6;6737:9;6733:22;6712:53;:::i;:::-;6702:63;;6658:117;6814:2;6840:53;6885:7;6876:6;6865:9;6861:22;6840:53;:::i;:::-;6830:63;;6785:118;6942:2;6968:53;7013:7;7004:6;6993:9;6989:22;6968:53;:::i;:::-;6958:63;;6913:118;6419:619;;;;;:::o;7044:323::-;7100:6;7149:2;7137:9;7128:7;7124:23;7120:32;7117:119;;;7155:79;;:::i;:::-;7117:119;7275:1;7300:50;7342:7;7333:6;7322:9;7318:22;7300:50;:::i;:::-;7290:60;;7246:114;7044:323;;;;:::o;7373:327::-;7431:6;7480:2;7468:9;7459:7;7455:23;7451:32;7448:119;;;7486:79;;:::i;:::-;7448:119;7606:1;7631:52;7675:7;7666:6;7655:9;7651:22;7631:52;:::i;:::-;7621:62;;7577:116;7373:327;;;;:::o;7706:349::-;7775:6;7824:2;7812:9;7803:7;7799:23;7795:32;7792:119;;;7830:79;;:::i;:::-;7792:119;7950:1;7975:63;8030:7;8021:6;8010:9;8006:22;7975:63;:::i;:::-;7965:73;;7921:127;7706:349;;;;:::o;8061:509::-;8130:6;8179:2;8167:9;8158:7;8154:23;8150:32;8147:119;;;8185:79;;:::i;:::-;8147:119;8333:1;8322:9;8318:17;8305:31;8363:18;8355:6;8352:30;8349:117;;;8385:79;;:::i;:::-;8349:117;8490:63;8545:7;8536:6;8525:9;8521:22;8490:63;:::i;:::-;8480:73;;8276:287;8061:509;;;;:::o;8576:329::-;8635:6;8684:2;8672:9;8663:7;8659:23;8655:32;8652:119;;;8690:79;;:::i;:::-;8652:119;8810:1;8835:53;8880:7;8871:6;8860:9;8856:22;8835:53;:::i;:::-;8825:63;;8781:117;8576:329;;;;:::o;8911:474::-;8979:6;8987;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:53;9232:7;9223:6;9212:9;9208:22;9187:53;:::i;:::-;9177:63;;9133:117;9289:2;9315:53;9360:7;9351:6;9340:9;9336:22;9315:53;:::i;:::-;9305:63;;9260:118;8911:474;;;;;:::o;9391:::-;9459:6;9467;9516:2;9504:9;9495:7;9491:23;9487:32;9484:119;;;9522:79;;:::i;:::-;9484:119;9642:1;9667:53;9712:7;9703:6;9692:9;9688:22;9667:53;:::i;:::-;9657:63;;9613:117;9769:2;9795:53;9840:7;9831:6;9820:9;9816:22;9795:53;:::i;:::-;9785:63;;9740:118;9391:474;;;;;:::o;9871:325::-;9928:6;9977:2;9965:9;9956:7;9952:23;9948:32;9945:119;;;9983:79;;:::i;:::-;9945:119;10103:1;10128:51;10171:7;10162:6;10151:9;10147:22;10128:51;:::i;:::-;10118:61;;10074:115;9871:325;;;;:::o;10202:648::-;10277:6;10285;10334:2;10322:9;10313:7;10309:23;10305:32;10302:119;;;10340:79;;:::i;:::-;10302:119;10460:1;10485:51;10528:7;10519:6;10508:9;10504:22;10485:51;:::i;:::-;10475:61;;10431:115;10613:2;10602:9;10598:18;10585:32;10644:18;10636:6;10633:30;10630:117;;;10666:79;;:::i;:::-;10630:117;10771:62;10825:7;10816:6;10805:9;10801:22;10771:62;:::i;:::-;10761:72;;10556:287;10202:648;;;;;:::o;10856:179::-;10925:10;10946:46;10988:3;10980:6;10946:46;:::i;:::-;11024:4;11019:3;11015:14;11001:28;;10856:179;;;;:::o;11041:118::-;11128:24;11146:5;11128:24;:::i;:::-;11123:3;11116:37;11041:118;;:::o;11165:157::-;11270:45;11290:24;11308:5;11290:24;:::i;:::-;11270:45;:::i;:::-;11265:3;11258:58;11165:157;;:::o;11358:732::-;11477:3;11506:54;11554:5;11506:54;:::i;:::-;11576:86;11655:6;11650:3;11576:86;:::i;:::-;11569:93;;11686:56;11736:5;11686:56;:::i;:::-;11765:7;11796:1;11781:284;11806:6;11803:1;11800:13;11781:284;;;11882:6;11876:13;11909:63;11968:3;11953:13;11909:63;:::i;:::-;11902:70;;11995:60;12048:6;11995:60;:::i;:::-;11985:70;;11841:224;11828:1;11825;11821:9;11816:14;;11781:284;;;11785:14;12081:3;12074:10;;11482:608;;;11358:732;;;;:::o;12096:109::-;12177:21;12192:5;12177:21;:::i;:::-;12172:3;12165:34;12096:109;;:::o;12211:118::-;12298:24;12316:5;12298:24;:::i;:::-;12293:3;12286:37;12211:118;;:::o;12335:360::-;12421:3;12449:38;12481:5;12449:38;:::i;:::-;12503:70;12566:6;12561:3;12503:70;:::i;:::-;12496:77;;12582:52;12627:6;12622:3;12615:4;12608:5;12604:16;12582:52;:::i;:::-;12659:29;12681:6;12659:29;:::i;:::-;12654:3;12650:39;12643:46;;12425:270;12335:360;;;;:::o;12701:364::-;12789:3;12817:39;12850:5;12817:39;:::i;:::-;12872:71;12936:6;12931:3;12872:71;:::i;:::-;12865:78;;12952:52;12997:6;12992:3;12985:4;12978:5;12974:16;12952:52;:::i;:::-;13029:29;13051:6;13029:29;:::i;:::-;13024:3;13020:39;13013:46;;12793:272;12701:364;;;;:::o;13071:377::-;13177:3;13205:39;13238:5;13205:39;:::i;:::-;13260:89;13342:6;13337:3;13260:89;:::i;:::-;13253:96;;13358:52;13403:6;13398:3;13391:4;13384:5;13380:16;13358:52;:::i;:::-;13435:6;13430:3;13426:16;13419:23;;13181:267;13071:377;;;;:::o;13478:845::-;13581:3;13618:5;13612:12;13647:36;13673:9;13647:36;:::i;:::-;13699:89;13781:6;13776:3;13699:89;:::i;:::-;13692:96;;13819:1;13808:9;13804:17;13835:1;13830:137;;;;13981:1;13976:341;;;;13797:520;;13830:137;13914:4;13910:9;13899;13895:25;13890:3;13883:38;13950:6;13945:3;13941:16;13934:23;;13830:137;;13976:341;14043:38;14075:5;14043:38;:::i;:::-;14103:1;14117:154;14131:6;14128:1;14125:13;14117:154;;;14205:7;14199:14;14195:1;14190:3;14186:11;14179:35;14255:1;14246:7;14242:15;14231:26;;14153:4;14150:1;14146:12;14141:17;;14117:154;;;14300:6;14295:3;14291:16;14284:23;;13983:334;;13797:520;;13585:738;;13478:845;;;;:::o;14329:366::-;14471:3;14492:67;14556:2;14551:3;14492:67;:::i;:::-;14485:74;;14568:93;14657:3;14568:93;:::i;:::-;14686:2;14681:3;14677:12;14670:19;;14329:366;;;:::o;14701:::-;14843:3;14864:67;14928:2;14923:3;14864:67;:::i;:::-;14857:74;;14940:93;15029:3;14940:93;:::i;:::-;15058:2;15053:3;15049:12;15042:19;;14701:366;;;:::o;15073:::-;15215:3;15236:67;15300:2;15295:3;15236:67;:::i;:::-;15229:74;;15312:93;15401:3;15312:93;:::i;:::-;15430:2;15425:3;15421:12;15414:19;;15073:366;;;:::o;15445:::-;15587:3;15608:67;15672:2;15667:3;15608:67;:::i;:::-;15601:74;;15684:93;15773:3;15684:93;:::i;:::-;15802:2;15797:3;15793:12;15786:19;;15445:366;;;:::o;15817:::-;15959:3;15980:67;16044:2;16039:3;15980:67;:::i;:::-;15973:74;;16056:93;16145:3;16056:93;:::i;:::-;16174:2;16169:3;16165:12;16158:19;;15817:366;;;:::o;16189:::-;16331:3;16352:67;16416:2;16411:3;16352:67;:::i;:::-;16345:74;;16428:93;16517:3;16428:93;:::i;:::-;16546:2;16541:3;16537:12;16530:19;;16189:366;;;:::o;16561:::-;16703:3;16724:67;16788:2;16783:3;16724:67;:::i;:::-;16717:74;;16800:93;16889:3;16800:93;:::i;:::-;16918:2;16913:3;16909:12;16902:19;;16561:366;;;:::o;16933:::-;17075:3;17096:67;17160:2;17155:3;17096:67;:::i;:::-;17089:74;;17172:93;17261:3;17172:93;:::i;:::-;17290:2;17285:3;17281:12;17274:19;;16933:366;;;:::o;17305:::-;17447:3;17468:67;17532:2;17527:3;17468:67;:::i;:::-;17461:74;;17544:93;17633:3;17544:93;:::i;:::-;17662:2;17657:3;17653:12;17646:19;;17305:366;;;:::o;17677:::-;17819:3;17840:67;17904:2;17899:3;17840:67;:::i;:::-;17833:74;;17916:93;18005:3;17916:93;:::i;:::-;18034:2;18029:3;18025:12;18018:19;;17677:366;;;:::o;18049:::-;18191:3;18212:67;18276:2;18271:3;18212:67;:::i;:::-;18205:74;;18288:93;18377:3;18288:93;:::i;:::-;18406:2;18401:3;18397:12;18390:19;;18049:366;;;:::o;18421:::-;18563:3;18584:67;18648:2;18643:3;18584:67;:::i;:::-;18577:74;;18660:93;18749:3;18660:93;:::i;:::-;18778:2;18773:3;18769:12;18762:19;;18421:366;;;:::o;18793:::-;18935:3;18956:67;19020:2;19015:3;18956:67;:::i;:::-;18949:74;;19032:93;19121:3;19032:93;:::i;:::-;19150:2;19145:3;19141:12;19134:19;;18793:366;;;:::o;19165:::-;19307:3;19328:67;19392:2;19387:3;19328:67;:::i;:::-;19321:74;;19404:93;19493:3;19404:93;:::i;:::-;19522:2;19517:3;19513:12;19506:19;;19165:366;;;:::o;19537:::-;19679:3;19700:67;19764:2;19759:3;19700:67;:::i;:::-;19693:74;;19776:93;19865:3;19776:93;:::i;:::-;19894:2;19889:3;19885:12;19878:19;;19537:366;;;:::o;19909:::-;20051:3;20072:67;20136:2;20131:3;20072:67;:::i;:::-;20065:74;;20148:93;20237:3;20148:93;:::i;:::-;20266:2;20261:3;20257:12;20250:19;;19909:366;;;:::o;20281:::-;20423:3;20444:67;20508:2;20503:3;20444:67;:::i;:::-;20437:74;;20520:93;20609:3;20520:93;:::i;:::-;20638:2;20633:3;20629:12;20622:19;;20281:366;;;:::o;20653:::-;20795:3;20816:67;20880:2;20875:3;20816:67;:::i;:::-;20809:74;;20892:93;20981:3;20892:93;:::i;:::-;21010:2;21005:3;21001:12;20994:19;;20653:366;;;:::o;21025:::-;21167:3;21188:67;21252:2;21247:3;21188:67;:::i;:::-;21181:74;;21264:93;21353:3;21264:93;:::i;:::-;21382:2;21377:3;21373:12;21366:19;;21025:366;;;:::o;21397:::-;21539:3;21560:67;21624:2;21619:3;21560:67;:::i;:::-;21553:74;;21636:93;21725:3;21636:93;:::i;:::-;21754:2;21749:3;21745:12;21738:19;;21397:366;;;:::o;21769:::-;21911:3;21932:67;21996:2;21991:3;21932:67;:::i;:::-;21925:74;;22008:93;22097:3;22008:93;:::i;:::-;22126:2;22121:3;22117:12;22110:19;;21769:366;;;:::o;22141:::-;22283:3;22304:67;22368:2;22363:3;22304:67;:::i;:::-;22297:74;;22380:93;22469:3;22380:93;:::i;:::-;22498:2;22493:3;22489:12;22482:19;;22141:366;;;:::o;22513:::-;22655:3;22676:67;22740:2;22735:3;22676:67;:::i;:::-;22669:74;;22752:93;22841:3;22752:93;:::i;:::-;22870:2;22865:3;22861:12;22854:19;;22513:366;;;:::o;22885:::-;23027:3;23048:67;23112:2;23107:3;23048:67;:::i;:::-;23041:74;;23124:93;23213:3;23124:93;:::i;:::-;23242:2;23237:3;23233:12;23226:19;;22885:366;;;:::o;23257:::-;23399:3;23420:67;23484:2;23479:3;23420:67;:::i;:::-;23413:74;;23496:93;23585:3;23496:93;:::i;:::-;23614:2;23609:3;23605:12;23598:19;;23257:366;;;:::o;23629:::-;23771:3;23792:67;23856:2;23851:3;23792:67;:::i;:::-;23785:74;;23868:93;23957:3;23868:93;:::i;:::-;23986:2;23981:3;23977:12;23970:19;;23629:366;;;:::o;24001:::-;24143:3;24164:67;24228:2;24223:3;24164:67;:::i;:::-;24157:74;;24240:93;24329:3;24240:93;:::i;:::-;24358:2;24353:3;24349:12;24342:19;;24001:366;;;:::o;24373:::-;24515:3;24536:67;24600:2;24595:3;24536:67;:::i;:::-;24529:74;;24612:93;24701:3;24612:93;:::i;:::-;24730:2;24725:3;24721:12;24714:19;;24373:366;;;:::o;24745:::-;24887:3;24908:67;24972:2;24967:3;24908:67;:::i;:::-;24901:74;;24984:93;25073:3;24984:93;:::i;:::-;25102:2;25097:3;25093:12;25086:19;;24745:366;;;:::o;25117:::-;25259:3;25280:67;25344:2;25339:3;25280:67;:::i;:::-;25273:74;;25356:93;25445:3;25356:93;:::i;:::-;25474:2;25469:3;25465:12;25458:19;;25117:366;;;:::o;25489:398::-;25648:3;25669:83;25750:1;25745:3;25669:83;:::i;:::-;25662:90;;25761:93;25850:3;25761:93;:::i;:::-;25879:1;25874:3;25870:11;25863:18;;25489:398;;;:::o;25893:366::-;26035:3;26056:67;26120:2;26115:3;26056:67;:::i;:::-;26049:74;;26132:93;26221:3;26132:93;:::i;:::-;26250:2;26245:3;26241:12;26234:19;;25893:366;;;:::o;26265:::-;26407:3;26428:67;26492:2;26487:3;26428:67;:::i;:::-;26421:74;;26504:93;26593:3;26504:93;:::i;:::-;26622:2;26617:3;26613:12;26606:19;;26265:366;;;:::o;26637:108::-;26714:24;26732:5;26714:24;:::i;:::-;26709:3;26702:37;26637:108;;:::o;26751:118::-;26838:24;26856:5;26838:24;:::i;:::-;26833:3;26826:37;26751:118;;:::o;26875:112::-;26958:22;26974:5;26958:22;:::i;:::-;26953:3;26946:35;26875:112;;:::o;26993:397::-;27133:3;27148:75;27219:3;27210:6;27148:75;:::i;:::-;27248:2;27243:3;27239:12;27232:19;;27261:75;27332:3;27323:6;27261:75;:::i;:::-;27361:2;27356:3;27352:12;27345:19;;27381:3;27374:10;;26993:397;;;;;:::o;27396:435::-;27576:3;27598:95;27689:3;27680:6;27598:95;:::i;:::-;27591:102;;27710:95;27801:3;27792:6;27710:95;:::i;:::-;27703:102;;27822:3;27815:10;;27396:435;;;;;:::o;27837:269::-;27966:3;27988:92;28076:3;28067:6;27988:92;:::i;:::-;27981:99;;28097:3;28090:10;;27837:269;;;;:::o;28112:379::-;28296:3;28318:147;28461:3;28318:147;:::i;:::-;28311:154;;28482:3;28475:10;;28112:379;;;:::o;28497:222::-;28590:4;28628:2;28617:9;28613:18;28605:26;;28641:71;28709:1;28698:9;28694:17;28685:6;28641:71;:::i;:::-;28497:222;;;;:::o;28725:640::-;28920:4;28958:3;28947:9;28943:19;28935:27;;28972:71;29040:1;29029:9;29025:17;29016:6;28972:71;:::i;:::-;29053:72;29121:2;29110:9;29106:18;29097:6;29053:72;:::i;:::-;29135;29203:2;29192:9;29188:18;29179:6;29135:72;:::i;:::-;29254:9;29248:4;29244:20;29239:2;29228:9;29224:18;29217:48;29282:76;29353:4;29344:6;29282:76;:::i;:::-;29274:84;;28725:640;;;;;;;:::o;29371:332::-;29492:4;29530:2;29519:9;29515:18;29507:26;;29543:71;29611:1;29600:9;29596:17;29587:6;29543:71;:::i;:::-;29624:72;29692:2;29681:9;29677:18;29668:6;29624:72;:::i;:::-;29371:332;;;;;:::o;29709:373::-;29852:4;29890:2;29879:9;29875:18;29867:26;;29939:9;29933:4;29929:20;29925:1;29914:9;29910:17;29903:47;29967:108;30070:4;30061:6;29967:108;:::i;:::-;29959:116;;29709:373;;;;:::o;30088:210::-;30175:4;30213:2;30202:9;30198:18;30190:26;;30226:65;30288:1;30277:9;30273:17;30264:6;30226:65;:::i;:::-;30088:210;;;;:::o;30304:545::-;30477:4;30515:3;30504:9;30500:19;30492:27;;30529:71;30597:1;30586:9;30582:17;30573:6;30529:71;:::i;:::-;30610:68;30674:2;30663:9;30659:18;30650:6;30610:68;:::i;:::-;30688:72;30756:2;30745:9;30741:18;30732:6;30688:72;:::i;:::-;30770;30838:2;30827:9;30823:18;30814:6;30770:72;:::i;:::-;30304:545;;;;;;;:::o;30855:313::-;30968:4;31006:2;30995:9;30991:18;30983:26;;31055:9;31049:4;31045:20;31041:1;31030:9;31026:17;31019:47;31083:78;31156:4;31147:6;31083:78;:::i;:::-;31075:86;;30855:313;;;;:::o;31174:419::-;31340:4;31378:2;31367:9;31363:18;31355:26;;31427:9;31421:4;31417:20;31413:1;31402:9;31398:17;31391:47;31455:131;31581:4;31455:131;:::i;:::-;31447:139;;31174:419;;;:::o;31599:::-;31765:4;31803:2;31792:9;31788:18;31780:26;;31852:9;31846:4;31842:20;31838:1;31827:9;31823:17;31816:47;31880:131;32006:4;31880:131;:::i;:::-;31872:139;;31599:419;;;:::o;32024:::-;32190:4;32228:2;32217:9;32213:18;32205:26;;32277:9;32271:4;32267:20;32263:1;32252:9;32248:17;32241:47;32305:131;32431:4;32305:131;:::i;:::-;32297:139;;32024:419;;;:::o;32449:::-;32615:4;32653:2;32642:9;32638:18;32630:26;;32702:9;32696:4;32692:20;32688:1;32677:9;32673:17;32666:47;32730:131;32856:4;32730:131;:::i;:::-;32722:139;;32449:419;;;:::o;32874:::-;33040:4;33078:2;33067:9;33063:18;33055:26;;33127:9;33121:4;33117:20;33113:1;33102:9;33098:17;33091:47;33155:131;33281:4;33155:131;:::i;:::-;33147:139;;32874:419;;;:::o;33299:::-;33465:4;33503:2;33492:9;33488:18;33480:26;;33552:9;33546:4;33542:20;33538:1;33527:9;33523:17;33516:47;33580:131;33706:4;33580:131;:::i;:::-;33572:139;;33299:419;;;:::o;33724:::-;33890:4;33928:2;33917:9;33913:18;33905:26;;33977:9;33971:4;33967:20;33963:1;33952:9;33948:17;33941:47;34005:131;34131:4;34005:131;:::i;:::-;33997:139;;33724:419;;;:::o;34149:::-;34315:4;34353:2;34342:9;34338:18;34330:26;;34402:9;34396:4;34392:20;34388:1;34377:9;34373:17;34366:47;34430:131;34556:4;34430:131;:::i;:::-;34422:139;;34149:419;;;:::o;34574:::-;34740:4;34778:2;34767:9;34763:18;34755:26;;34827:9;34821:4;34817:20;34813:1;34802:9;34798:17;34791:47;34855:131;34981:4;34855:131;:::i;:::-;34847:139;;34574:419;;;:::o;34999:::-;35165:4;35203:2;35192:9;35188:18;35180:26;;35252:9;35246:4;35242:20;35238:1;35227:9;35223:17;35216:47;35280:131;35406:4;35280:131;:::i;:::-;35272:139;;34999:419;;;:::o;35424:::-;35590:4;35628:2;35617:9;35613:18;35605:26;;35677:9;35671:4;35667:20;35663:1;35652:9;35648:17;35641:47;35705:131;35831:4;35705:131;:::i;:::-;35697:139;;35424:419;;;:::o;35849:::-;36015:4;36053:2;36042:9;36038:18;36030:26;;36102:9;36096:4;36092:20;36088:1;36077:9;36073:17;36066:47;36130:131;36256:4;36130:131;:::i;:::-;36122:139;;35849:419;;;:::o;36274:::-;36440:4;36478:2;36467:9;36463:18;36455:26;;36527:9;36521:4;36517:20;36513:1;36502:9;36498:17;36491:47;36555:131;36681:4;36555:131;:::i;:::-;36547:139;;36274:419;;;:::o;36699:::-;36865:4;36903:2;36892:9;36888:18;36880:26;;36952:9;36946:4;36942:20;36938:1;36927:9;36923:17;36916:47;36980:131;37106:4;36980:131;:::i;:::-;36972:139;;36699:419;;;:::o;37124:::-;37290:4;37328:2;37317:9;37313:18;37305:26;;37377:9;37371:4;37367:20;37363:1;37352:9;37348:17;37341:47;37405:131;37531:4;37405:131;:::i;:::-;37397:139;;37124:419;;;:::o;37549:::-;37715:4;37753:2;37742:9;37738:18;37730:26;;37802:9;37796:4;37792:20;37788:1;37777:9;37773:17;37766:47;37830:131;37956:4;37830:131;:::i;:::-;37822:139;;37549:419;;;:::o;37974:::-;38140:4;38178:2;38167:9;38163:18;38155:26;;38227:9;38221:4;38217:20;38213:1;38202:9;38198:17;38191:47;38255:131;38381:4;38255:131;:::i;:::-;38247:139;;37974:419;;;:::o;38399:::-;38565:4;38603:2;38592:9;38588:18;38580:26;;38652:9;38646:4;38642:20;38638:1;38627:9;38623:17;38616:47;38680:131;38806:4;38680:131;:::i;:::-;38672:139;;38399:419;;;:::o;38824:::-;38990:4;39028:2;39017:9;39013:18;39005:26;;39077:9;39071:4;39067:20;39063:1;39052:9;39048:17;39041:47;39105:131;39231:4;39105:131;:::i;:::-;39097:139;;38824:419;;;:::o;39249:::-;39415:4;39453:2;39442:9;39438:18;39430:26;;39502:9;39496:4;39492:20;39488:1;39477:9;39473:17;39466:47;39530:131;39656:4;39530:131;:::i;:::-;39522:139;;39249:419;;;:::o;39674:::-;39840:4;39878:2;39867:9;39863:18;39855:26;;39927:9;39921:4;39917:20;39913:1;39902:9;39898:17;39891:47;39955:131;40081:4;39955:131;:::i;:::-;39947:139;;39674:419;;;:::o;40099:::-;40265:4;40303:2;40292:9;40288:18;40280:26;;40352:9;40346:4;40342:20;40338:1;40327:9;40323:17;40316:47;40380:131;40506:4;40380:131;:::i;:::-;40372:139;;40099:419;;;:::o;40524:::-;40690:4;40728:2;40717:9;40713:18;40705:26;;40777:9;40771:4;40767:20;40763:1;40752:9;40748:17;40741:47;40805:131;40931:4;40805:131;:::i;:::-;40797:139;;40524:419;;;:::o;40949:::-;41115:4;41153:2;41142:9;41138:18;41130:26;;41202:9;41196:4;41192:20;41188:1;41177:9;41173:17;41166:47;41230:131;41356:4;41230:131;:::i;:::-;41222:139;;40949:419;;;:::o;41374:::-;41540:4;41578:2;41567:9;41563:18;41555:26;;41627:9;41621:4;41617:20;41613:1;41602:9;41598:17;41591:47;41655:131;41781:4;41655:131;:::i;:::-;41647:139;;41374:419;;;:::o;41799:::-;41965:4;42003:2;41992:9;41988:18;41980:26;;42052:9;42046:4;42042:20;42038:1;42027:9;42023:17;42016:47;42080:131;42206:4;42080:131;:::i;:::-;42072:139;;41799:419;;;:::o;42224:::-;42390:4;42428:2;42417:9;42413:18;42405:26;;42477:9;42471:4;42467:20;42463:1;42452:9;42448:17;42441:47;42505:131;42631:4;42505:131;:::i;:::-;42497:139;;42224:419;;;:::o;42649:::-;42815:4;42853:2;42842:9;42838:18;42830:26;;42902:9;42896:4;42892:20;42888:1;42877:9;42873:17;42866:47;42930:131;43056:4;42930:131;:::i;:::-;42922:139;;42649:419;;;:::o;43074:::-;43240:4;43278:2;43267:9;43263:18;43255:26;;43327:9;43321:4;43317:20;43313:1;43302:9;43298:17;43291:47;43355:131;43481:4;43355:131;:::i;:::-;43347:139;;43074:419;;;:::o;43499:::-;43665:4;43703:2;43692:9;43688:18;43680:26;;43752:9;43746:4;43742:20;43738:1;43727:9;43723:17;43716:47;43780:131;43906:4;43780:131;:::i;:::-;43772:139;;43499:419;;;:::o;43924:::-;44090:4;44128:2;44117:9;44113:18;44105:26;;44177:9;44171:4;44167:20;44163:1;44152:9;44148:17;44141:47;44205:131;44331:4;44205:131;:::i;:::-;44197:139;;43924:419;;;:::o;44349:::-;44515:4;44553:2;44542:9;44538:18;44530:26;;44602:9;44596:4;44592:20;44588:1;44577:9;44573:17;44566:47;44630:131;44756:4;44630:131;:::i;:::-;44622:139;;44349:419;;;:::o;44774:222::-;44867:4;44905:2;44894:9;44890:18;44882:26;;44918:71;44986:1;44975:9;44971:17;44962:6;44918:71;:::i;:::-;44774:222;;;;:::o;45002:214::-;45091:4;45129:2;45118:9;45114:18;45106:26;;45142:67;45206:1;45195:9;45191:17;45182:6;45142:67;:::i;:::-;45002:214;;;;:::o;45222:129::-;45256:6;45283:20;;:::i;:::-;45273:30;;45312:33;45340:4;45332:6;45312:33;:::i;:::-;45222:129;;;:::o;45357:75::-;45390:6;45423:2;45417:9;45407:19;;45357:75;:::o;45438:307::-;45499:4;45589:18;45581:6;45578:30;45575:56;;;45611:18;;:::i;:::-;45575:56;45649:29;45671:6;45649:29;:::i;:::-;45641:37;;45733:4;45727;45723:15;45715:23;;45438:307;;;:::o;45751:308::-;45813:4;45903:18;45895:6;45892:30;45889:56;;;45925:18;;:::i;:::-;45889:56;45963:29;45985:6;45963:29;:::i;:::-;45955:37;;46047:4;46041;46037:15;46029:23;;45751:308;;;:::o;46065:132::-;46132:4;46155:3;46147:11;;46185:4;46180:3;46176:14;46168:22;;46065:132;;;:::o;46203:141::-;46252:4;46275:3;46267:11;;46298:3;46295:1;46288:14;46332:4;46329:1;46319:18;46311:26;;46203:141;;;:::o;46350:114::-;46417:6;46451:5;46445:12;46435:22;;46350:114;;;:::o;46470:98::-;46521:6;46555:5;46549:12;46539:22;;46470:98;;;:::o;46574:99::-;46626:6;46660:5;46654:12;46644:22;;46574:99;;;:::o;46679:113::-;46749:4;46781;46776:3;46772:14;46764:22;;46679:113;;;:::o;46798:184::-;46897:11;46931:6;46926:3;46919:19;46971:4;46966:3;46962:14;46947:29;;46798:184;;;;:::o;46988:168::-;47071:11;47105:6;47100:3;47093:19;47145:4;47140:3;47136:14;47121:29;;46988:168;;;;:::o;47162:147::-;47263:11;47300:3;47285:18;;47162:147;;;;:::o;47315:169::-;47399:11;47433:6;47428:3;47421:19;47473:4;47468:3;47464:14;47449:29;;47315:169;;;;:::o;47490:148::-;47592:11;47629:3;47614:18;;47490:148;;;;:::o;47644:305::-;47684:3;47703:20;47721:1;47703:20;:::i;:::-;47698:25;;47737:20;47755:1;47737:20;:::i;:::-;47732:25;;47891:1;47823:66;47819:74;47816:1;47813:81;47810:107;;;47897:18;;:::i;:::-;47810:107;47941:1;47938;47934:9;47927:16;;47644:305;;;;:::o;47955:237::-;47993:3;48012:18;48028:1;48012:18;:::i;:::-;48007:23;;48044:18;48060:1;48044:18;:::i;:::-;48039:23;;48134:1;48128:4;48124:12;48121:1;48118:19;48115:45;;;48140:18;;:::i;:::-;48115:45;48184:1;48181;48177:9;48170:16;;47955:237;;;;:::o;48198:185::-;48238:1;48255:20;48273:1;48255:20;:::i;:::-;48250:25;;48289:20;48307:1;48289:20;:::i;:::-;48284:25;;48328:1;48318:35;;48333:18;;:::i;:::-;48318:35;48375:1;48372;48368:9;48363:14;;48198:185;;;;:::o;48389:348::-;48429:7;48452:20;48470:1;48452:20;:::i;:::-;48447:25;;48486:20;48504:1;48486:20;:::i;:::-;48481:25;;48674:1;48606:66;48602:74;48599:1;48596:81;48591:1;48584:9;48577:17;48573:105;48570:131;;;48681:18;;:::i;:::-;48570:131;48729:1;48726;48722:9;48711:20;;48389:348;;;;:::o;48743:191::-;48783:4;48803:20;48821:1;48803:20;:::i;:::-;48798:25;;48837:20;48855:1;48837:20;:::i;:::-;48832:25;;48876:1;48873;48870:8;48867:34;;;48881:18;;:::i;:::-;48867:34;48926:1;48923;48919:9;48911:17;;48743:191;;;;:::o;48940:96::-;48977:7;49006:24;49024:5;49006:24;:::i;:::-;48995:35;;48940:96;;;:::o;49042:90::-;49076:7;49119:5;49112:13;49105:21;49094:32;;49042:90;;;:::o;49138:77::-;49175:7;49204:5;49193:16;;49138:77;;;:::o;49221:149::-;49257:7;49297:66;49290:5;49286:78;49275:89;;49221:149;;;:::o;49376:126::-;49413:7;49453:42;49446:5;49442:54;49431:65;;49376:126;;;:::o;49508:77::-;49545:7;49574:5;49563:16;;49508:77;;;:::o;49591:86::-;49626:7;49666:4;49659:5;49655:16;49644:27;;49591:86;;;:::o;49683:154::-;49767:6;49762:3;49757;49744:30;49829:1;49820:6;49815:3;49811:16;49804:27;49683:154;;;:::o;49843:307::-;49911:1;49921:113;49935:6;49932:1;49929:13;49921:113;;;50020:1;50015:3;50011:11;50005:18;50001:1;49996:3;49992:11;49985:39;49957:2;49954:1;49950:10;49945:15;;49921:113;;;50052:6;50049:1;50046:13;50043:101;;;50132:1;50123:6;50118:3;50114:16;50107:27;50043:101;49892:258;49843:307;;;:::o;50156:320::-;50200:6;50237:1;50231:4;50227:12;50217:22;;50284:1;50278:4;50274:12;50305:18;50295:81;;50361:4;50353:6;50349:17;50339:27;;50295:81;50423:2;50415:6;50412:14;50392:18;50389:38;50386:84;;;50442:18;;:::i;:::-;50386:84;50207:269;50156:320;;;:::o;50482:281::-;50565:27;50587:4;50565:27;:::i;:::-;50557:6;50553:40;50695:6;50683:10;50680:22;50659:18;50647:10;50644:34;50641:62;50638:88;;;50706:18;;:::i;:::-;50638:88;50746:10;50742:2;50735:22;50525:238;50482:281;;:::o;50769:233::-;50808:3;50831:24;50849:5;50831:24;:::i;:::-;50822:33;;50877:66;50870:5;50867:77;50864:103;;;50947:18;;:::i;:::-;50864:103;50994:1;50987:5;50983:13;50976:20;;50769:233;;;:::o;51008:167::-;51045:3;51068:22;51084:5;51068:22;:::i;:::-;51059:31;;51112:4;51105:5;51102:15;51099:41;;;51120:18;;:::i;:::-;51099:41;51167:1;51160:5;51156:13;51149:20;;51008:167;;;:::o;51181:100::-;51220:7;51249:26;51269:5;51249:26;:::i;:::-;51238:37;;51181:100;;;:::o;51287:94::-;51326:7;51355:20;51369:5;51355:20;:::i;:::-;51344:31;;51287:94;;;:::o;51387:176::-;51419:1;51436:20;51454:1;51436:20;:::i;:::-;51431:25;;51470:20;51488:1;51470:20;:::i;:::-;51465:25;;51509:1;51499:35;;51514:18;;:::i;:::-;51499:35;51555:1;51552;51548:9;51543:14;;51387:176;;;;:::o;51569:180::-;51617:77;51614:1;51607:88;51714:4;51711:1;51704:15;51738:4;51735:1;51728:15;51755:180;51803:77;51800:1;51793:88;51900:4;51897:1;51890:15;51924:4;51921:1;51914:15;51941:180;51989:77;51986:1;51979:88;52086:4;52083:1;52076:15;52110:4;52107:1;52100:15;52127:180;52175:77;52172:1;52165:88;52272:4;52269:1;52262:15;52296:4;52293:1;52286:15;52313:180;52361:77;52358:1;52351:88;52458:4;52455:1;52448:15;52482:4;52479:1;52472:15;52499:180;52547:77;52544:1;52537:88;52644:4;52641:1;52634:15;52668:4;52665:1;52658:15;52685:117;52794:1;52791;52784:12;52808:117;52917:1;52914;52907:12;52931:117;53040:1;53037;53030:12;53054:117;53163:1;53160;53153:12;53177:102;53218:6;53269:2;53265:7;53260:2;53253:5;53249:14;53245:28;53235:38;;53177:102;;;:::o;53285:94::-;53318:8;53366:5;53362:2;53358:14;53337:35;;53285:94;;;:::o;53385:174::-;53525:26;53521:1;53513:6;53509:14;53502:50;53385:174;:::o;53565:::-;53705:26;53701:1;53693:6;53689:14;53682:50;53565:174;:::o;53745:176::-;53885:28;53881:1;53873:6;53869:14;53862:52;53745:176;:::o;53927:181::-;54067:33;54063:1;54055:6;54051:14;54044:57;53927:181;:::o;54114:169::-;54254:21;54250:1;54242:6;54238:14;54231:45;54114:169;:::o;54289:237::-;54429:34;54425:1;54417:6;54413:14;54406:58;54498:20;54493:2;54485:6;54481:15;54474:45;54289:237;:::o;54532:225::-;54672:34;54668:1;54660:6;54656:14;54649:58;54741:8;54736:2;54728:6;54724:15;54717:33;54532:225;:::o;54763:165::-;54903:17;54899:1;54891:6;54887:14;54880:41;54763:165;:::o;54934:224::-;55074:34;55070:1;55062:6;55058:14;55051:58;55143:7;55138:2;55130:6;55126:15;55119:32;54934:224;:::o;55164:178::-;55304:30;55300:1;55292:6;55288:14;55281:54;55164:178;:::o;55348:223::-;55488:34;55484:1;55476:6;55472:14;55465:58;55557:6;55552:2;55544:6;55540:15;55533:31;55348:223;:::o;55577:175::-;55717:27;55713:1;55705:6;55701:14;55694:51;55577:175;:::o;55758:221::-;55898:34;55894:1;55886:6;55882:14;55875:58;55967:4;55962:2;55954:6;55950:15;55943:29;55758:221;:::o;55985:163::-;56125:15;56121:1;56113:6;56109:14;56102:39;55985:163;:::o;56154:231::-;56294:34;56290:1;56282:6;56278:14;56271:58;56363:14;56358:2;56350:6;56346:15;56339:39;56154:231;:::o;56391:166::-;56531:18;56527:1;56519:6;56515:14;56508:42;56391:166;:::o;56563:243::-;56703:34;56699:1;56691:6;56687:14;56680:58;56772:26;56767:2;56759:6;56755:15;56748:51;56563:243;:::o;56812:229::-;56952:34;56948:1;56940:6;56936:14;56929:58;57021:12;57016:2;57008:6;57004:15;56997:37;56812:229;:::o;57047:228::-;57187:34;57183:1;57175:6;57171:14;57164:58;57256:11;57251:2;57243:6;57239:15;57232:36;57047:228;:::o;57281:220::-;57421:34;57417:1;57409:6;57405:14;57398:58;57490:3;57485:2;57477:6;57473:15;57466:28;57281:220;:::o;57507:221::-;57647:34;57643:1;57635:6;57631:14;57624:58;57716:4;57711:2;57703:6;57699:15;57692:29;57507:221;:::o;57734:182::-;57874:34;57870:1;57862:6;57858:14;57851:58;57734:182;:::o;57922:177::-;58062:29;58058:1;58050:6;58046:14;58039:53;57922:177;:::o;58105:231::-;58245:34;58241:1;58233:6;58229:14;58222:58;58314:14;58309:2;58301:6;58297:15;58290:39;58105:231;:::o;58342:182::-;58482:34;58478:1;58470:6;58466:14;58459:58;58342:182;:::o;58530:234::-;58670:34;58666:1;58658:6;58654:14;58647:58;58739:17;58734:2;58726:6;58722:15;58715:42;58530:234;:::o;58770:174::-;58910:26;58906:1;58898:6;58894:14;58887:50;58770:174;:::o;58950:220::-;59090:34;59086:1;59078:6;59074:14;59067:58;59159:3;59154:2;59146:6;59142:15;59135:28;58950:220;:::o;59176:170::-;59316:22;59312:1;59304:6;59300:14;59293:46;59176:170;:::o;59352:165::-;59492:17;59488:1;59480:6;59476:14;59469:41;59352:165;:::o;59523:114::-;;:::o;59643:236::-;59783:34;59779:1;59771:6;59767:14;59760:58;59852:19;59847:2;59839:6;59835:15;59828:44;59643:236;:::o;59885:223::-;60025:34;60021:1;60013:6;60009:14;60002:58;60094:6;60089:2;60081:6;60077:15;60070:31;59885:223;:::o;60114:122::-;60187:24;60205:5;60187:24;:::i;:::-;60180:5;60177:35;60167:63;;60226:1;60223;60216:12;60167:63;60114:122;:::o;60242:116::-;60312:21;60327:5;60312:21;:::i;:::-;60305:5;60302:32;60292:60;;60348:1;60345;60338:12;60292:60;60242:116;:::o;60364:120::-;60436:23;60453:5;60436:23;:::i;:::-;60429:5;60426:34;60416:62;;60474:1;60471;60464:12;60416:62;60364:120;:::o;60490:122::-;60563:24;60581:5;60563:24;:::i;:::-;60556:5;60553:35;60543:63;;60602:1;60599;60592:12;60543:63;60490:122;:::o;60618:118::-;60689:22;60705:5;60689:22;:::i;:::-;60682:5;60679:33;60669:61;;60726:1;60723;60716:12;60669:61;60618:118;:::o

Swarm Source

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