ETH Price: $3,260.40 (+2.81%)
Gas: 8 Gwei

The Last Raptor (TLR)
 

Overview

TokenID

1455

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

"Do you know what's better than a high-quality piece of art? A high-quality piece of art with a utility!“ With this concept in mind, we went above and beyond to create an NFT collection that becomes a game-changer.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheLastRaptor

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).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 Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

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

    bool private _paused;

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

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

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

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

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

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

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

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

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

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

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

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

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

contract TheLastRaptor is ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    uint256 private constant _maxTokens = 1923;
    uint256 private constant _maxMint = 2;
    uint256 private constant _maxPresaleMint = 2;
    uint256 public constant _price = 90000000000000000; // 0.09 ETH

    mapping (address => bool) private _whitelist;
    mapping (address => uint256) private _presaleMints;
    bool private _presaleActive = false;
    bool private _saleActive = false;

    string public _prefixURI;

    constructor() ERC721("The Last Raptor", "TLR") {
        _pause();
    }

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

    function setBaseURI(string memory _uri) public onlyOwner {
        _prefixURI = _uri;
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIds.current();
    }

    function isWhitelisted(address addr) public view returns (bool) {
        return _whitelist[addr];
    }

    function addToWhitelist(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _whitelist[addrs[i]] = true;
            _presaleMints[addrs[i]] = 0;
        }
    }

    function presaleMintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(amount <= _maxPresaleMint);
        require(isWhitelisted(msg.sender));
        require(msg.value >= amount * _price);
        require(_presaleMints[msg.sender] + amount <= _maxPresaleMint);
        require(_presaleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);

        for (uint256 i = 0; i < amount; i++) {
            _presaleMints[msg.sender] += 1;
            _mintItem(msg.sender);
        }
    }

    function mintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(_saleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);

        require(msg.value >= amount * _price);

        for (uint256 i = 0; i < amount; i++) {
            _mintItem(msg.sender);
        }
    }

    function _mintItem(address to) internal returns (uint256) {
        _tokenIds.increment();

        uint256 id = _tokenIds.current();
        _safeMint(to, id);

        return id;
    }

    function togglePreSale() public onlyOwner {
        _presaleActive = !_presaleActive;
    }

    function toggleSale() public onlyOwner {
        _saleActive = !_saleActive;
    }

    function toggleTransferPause() public onlyOwner {
        paused() ? _unpause() : _pause();
    }

    function reserve(uint256 quantity) public onlyOwner {
        for(uint i = _tokenIds.current(); i < quantity; i++) {
            if (i < _maxTokens) {
                _tokenIds.increment();
                _safeMint(msg.sender, i + 1);
            }
        }
    }

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

    // Allows minting(transfer from 0 address), but not transferring while paused() except from owner
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        if (!(from == address(0)) && !(from == owner())) {
            require(!paused(), "ERC721Pausable: token transfer while paused");
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presaleMintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTransferPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600f81526020017f546865204c61737420526170746f7200000000000000000000000000000000008152506040518060400160405280600381526020017f544c5200000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620002d6565b508060019080519060200190620000e5929190620002d6565b5050506000600660006101000a81548160ff02191690831515021790555062000123620001176200013960201b60201c565b6200014160201b60201c565b620001336200020760201b60201c565b620004c2565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000217620002bf60201b60201c565b156200025a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025190620003f6565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002a66200013960201b60201c565b604051620002b59190620003d9565b60405180910390a1565b6000600660009054906101000a900460ff16905090565b828054620002e4906200045d565b90600052602060002090601f01602090048101928262000308576000855562000354565b82601f106200032357805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035357825182559160200191906001019062000336565b5b50905062000363919062000367565b5090565b5b808211156200038257600081600090555060010162000368565b5090565b620003918162000429565b82525050565b6000620003a660108362000418565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000602082019050620003f0600083018462000386565b92915050565b60006020820190508181036000830152620004118162000397565b9050919050565b600082825260208201905092915050565b600062000436826200043d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200047657607f821691505b602082108114156200048d576200048c62000493565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613d2980620004d26000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cd6565b6106b9565b604051610206919061359b565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b60405161023191906135b6565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d69565b61082d565b60405161026e9190613534565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c59565b6108b2565b005b6102ba60048036038101906102b59190612d69565b6109ca565b005b3480156102c857600080fd5b506102d1610b35565b6040516102de9190613838565b60405180910390f35b3480156102f357600080fd5b506102fc610b46565b6040516103099190613838565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612b53565b610b52565b005b34801561034757600080fd5b50610362600480360381019061035d9190612aee565b610bb2565b60405161036f919061359b565b60405180910390f35b610380610c08565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612b53565b610cc4565b005b6103c560048036038101906103c09190612d69565b610ce4565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d28565b610d80565b005b3480156103fc57600080fd5b50610405610e16565b604051610412919061359b565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d69565b610e2d565b60405161044f9190613534565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612aee565b610edf565b60405161048c9190613838565b60405180910390f35b3480156104a157600080fd5b506104aa610f97565b005b3480156104b857600080fd5b506104c161101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c95565b6110c7565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d69565b611283565b005b34801561052157600080fd5b5061052a611358565b6040516105379190613534565b60405180910390f35b34801561054c57600080fd5b50610555611382565b60405161056291906135b6565b60405180910390f35b34801561057757600080fd5b50610580611410565b60405161058d91906135b6565b60405180910390f35b3480156105a257600080fd5b506105ab6114a2565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612c1d565b611542565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612ba2565b6116c3565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d69565b611725565b60405161063391906135b6565b60405180910390f35b34801561064857600080fd5b506106516117cc565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612b17565b611874565b604051610687919061359b565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612aee565b611908565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610794575061079382611a00565b5b9050919050565b6060600080546107aa90613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546107d690613b1e565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a6a565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613778565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610925906137f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611ad6565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611ad6565b611874565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b2906136f8565b60405180910390fd5b6109c58383611ade565b505050565b60028111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb2565b6109f857600080fd5b67013fbe85edc9000081610a0c91906139da565b341015610a1857600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a659190613953565b1115610a7057600080fd5b600a60009054906101000a900460ff16610a8957600080fd5b6000610a956007611b97565b90506107838282610aa69190613953565b1115610ab157600080fd5b60005b82811015610b30576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0c9190613953565b92505081905550610b1c33611ba5565b508080610b2890613b50565b915050610ab4565b505050565b6000610b416007611b97565b905090565b67013fbe85edc9000081565b610b63610b5d611ad6565b82611bd2565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990613818565b60405180910390fd5b610bad838383611cb0565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c10611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611358565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613798565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc257600080fd5b565b610cdf838383604051806020016040528060008152506116c3565b505050565b6002811115610cf257600080fd5b600a60019054906101000a900460ff16610d0b57600080fd5b6000610d176007611b97565b90506107838282610d289190613953565b1115610d3357600080fd5b67013fbe85edc9000082610d4791906139da565b341015610d5357600080fd5b60005b82811015610d7b57610d6733611ba5565b508080610d7390613b50565b915050610d56565b505050565b610d88611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610da6611358565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613798565b60405180910390fd5b80600b9080519060200190610e1292919061287c565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613738565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613718565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9f611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610fbd611358565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613798565b60405180910390fd5b61101d6000611f0c565b565b611027611ad6565b73ffffffffffffffffffffffffffffffffffffffff16611045611358565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613798565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cf611ad6565b73ffffffffffffffffffffffffffffffffffffffff166110ed611358565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613798565b60405180910390fd5b60005b815181101561127f5760016008600084848151811061118e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000848481518110611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061127790613b50565b915050611146565b5050565b61128b611ad6565b73ffffffffffffffffffffffffffffffffffffffff166112a9611358565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613798565b60405180910390fd5b600061130b6007611b97565b90505b81811015611354576107838110156113415761132a6007611fd2565b6113403360018361133b9190613953565b611fe8565b5b808061134c90613b50565b91505061130e565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b805461138f90613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb90613b1e565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b60606001805461141f90613b1e565b80601f016020809104026020016040519081016040528092919081815260200182805461144b90613b1e565b80156114985780601f1061146d57610100808354040283529160200191611498565b820191906000526020600020905b81548152906001019060200180831161147b57829003601f168201915b5050505050905090565b6114aa611ad6565b73ffffffffffffffffffffffffffffffffffffffff166114c8611358565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590613798565b60405180910390fd5b611526610e16565b61153757611532612006565b611540565b61153f6120a9565b5b565b61154a611ad6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613698565b60405180910390fd5b80600560006115c5611ad6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611672611ad6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b7919061359b565b60405180910390a35050565b6116d46116ce611ad6565b83611bd2565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90613818565b60405180910390fd5b61171f8484848461214b565b50505050565b606061173082611a6a565b61176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906137d8565b60405180910390fd5b60006117796121a7565b9050600081511161179957604051806020016040528060008152506117c4565b806117a384612239565b6040516020016117b4929190613510565b6040516020818303038152906040525b915050919050565b6117d4611ad6565b73ffffffffffffffffffffffffffffffffffffffff166117f2611358565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613798565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611910611ad6565b73ffffffffffffffffffffffffffffffffffffffff1661192e611358565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613798565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613638565b60405180910390fd5b6119fd81611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610e2d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611bb16007611fd2565b6000611bbd6007611b97565b9050611bc98382611fe8565b80915050919050565b6000611bdd82611a6a565b611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906136b8565b60405180910390fd5b6000611c2783610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9657508373ffffffffffffffffffffffffffffffffffffffff16611c7e8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca75750611ca68185611874565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd082610e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906137b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613678565b60405180910390fd5b611da18383836123e6565b611dac600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dfc9190613a34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613953565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6120028282604051806020016040528060008152506124a9565b5050565b61200e610e16565b1561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906136d8565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612092611ad6565b60405161209f9190613534565b60405180910390a1565b6120b1610e16565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906135f8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612134611ad6565b6040516121419190613534565b60405180910390a1565b612156848484611cb0565b61216284848484612504565b6121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890613618565b60405180910390fd5b50505050565b6060600b80546121b690613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613b1e565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b5050505050905090565b60606000821415612281576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e1565b600082905060005b600082146122b357808061229c90613b50565b915050600a826122ac91906139a9565b9150612289565b60008167ffffffffffffffff8111156122f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123275781602001600182028036833780820191505090505b5090505b600085146123da576001826123409190613a34565b9150600a8561234f9190613b99565b603061235b9190613953565b60f81b818381518110612397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d391906139a9565b945061232b565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124565750612426611358565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156124a457612463610e16565b156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906135d8565b60405180910390fd5b5b505050565b6124b3838361269b565b6124c06000848484612504565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613618565b60405180910390fd5b505050565b60006125258473ffffffffffffffffffffffffffffffffffffffff16612869565b1561268e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261254e611ad6565b8786866040518563ffffffff1660e01b8152600401612570949392919061354f565b602060405180830381600087803b15801561258a57600080fd5b505af19250505080156125bb57506040513d601f19601f820116820180604052508101906125b89190612cff565b60015b61263e573d80600081146125eb576040519150601f19603f3d011682016040523d82523d6000602084013e6125f0565b606091505b50600081511415612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613618565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612693565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613758565b60405180910390fd5b61271481611a6a565b15612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b90613658565b60405180910390fd5b612760600083836123e6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b09190613953565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461288890613b1e565b90600052602060002090601f0160209004810192826128aa57600085556128f1565b82601f106128c357805160ff19168380011785556128f1565b828001600101855582156128f1579182015b828111156128f05782518255916020019190600101906128d5565b5b5090506128fe9190612902565b5090565b5b8082111561291b576000816000905550600101612903565b5090565b600061293261292d84613884565b613853565b9050808382526020820190508285602086028201111561295157600080fd5b60005b8581101561298157816129678882612a07565b845260208401935060208301925050600181019050612954565b5050509392505050565b600061299e612999846138b0565b613853565b9050828152602081018484840111156129b657600080fd5b6129c1848285613adc565b509392505050565b60006129dc6129d7846138e0565b613853565b9050828152602081018484840111156129f457600080fd5b6129ff848285613adc565b509392505050565b600081359050612a1681613c97565b92915050565b600082601f830112612a2d57600080fd5b8135612a3d84826020860161291f565b91505092915050565b600081359050612a5581613cae565b92915050565b600081359050612a6a81613cc5565b92915050565b600081519050612a7f81613cc5565b92915050565b600082601f830112612a9657600080fd5b8135612aa684826020860161298b565b91505092915050565b600082601f830112612ac057600080fd5b8135612ad08482602086016129c9565b91505092915050565b600081359050612ae881613cdc565b92915050565b600060208284031215612b0057600080fd5b6000612b0e84828501612a07565b91505092915050565b60008060408385031215612b2a57600080fd5b6000612b3885828601612a07565b9250506020612b4985828601612a07565b9150509250929050565b600080600060608486031215612b6857600080fd5b6000612b7686828701612a07565b9350506020612b8786828701612a07565b9250506040612b9886828701612ad9565b9150509250925092565b60008060008060808587031215612bb857600080fd5b6000612bc687828801612a07565b9450506020612bd787828801612a07565b9350506040612be887828801612ad9565b925050606085013567ffffffffffffffff811115612c0557600080fd5b612c1187828801612a85565b91505092959194509250565b60008060408385031215612c3057600080fd5b6000612c3e85828601612a07565b9250506020612c4f85828601612a46565b9150509250929050565b60008060408385031215612c6c57600080fd5b6000612c7a85828601612a07565b9250506020612c8b85828601612ad9565b9150509250929050565b600060208284031215612ca757600080fd5b600082013567ffffffffffffffff811115612cc157600080fd5b612ccd84828501612a1c565b91505092915050565b600060208284031215612ce857600080fd5b6000612cf684828501612a5b565b91505092915050565b600060208284031215612d1157600080fd5b6000612d1f84828501612a70565b91505092915050565b600060208284031215612d3a57600080fd5b600082013567ffffffffffffffff811115612d5457600080fd5b612d6084828501612aaf565b91505092915050565b600060208284031215612d7b57600080fd5b6000612d8984828501612ad9565b91505092915050565b612d9b81613a68565b82525050565b612daa81613a7a565b82525050565b6000612dbb82613910565b612dc58185613926565b9350612dd5818560208601613aeb565b612dde81613c86565b840191505092915050565b6000612df48261391b565b612dfe8185613937565b9350612e0e818560208601613aeb565b612e1781613c86565b840191505092915050565b6000612e2d8261391b565b612e378185613948565b9350612e47818560208601613aeb565b80840191505092915050565b6000612e60602b83613937565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b6000612ec6601483613937565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000612f06603283613937565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f6c602683613937565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd2601c83613937565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613012602483613937565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613078601983613937565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130b8602c83613937565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061311e601083613937565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b600061315e603883613937565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131c4602a83613937565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061322a602983613937565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613290602083613937565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006132d0602c83613937565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613336602083613937565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613376602983613937565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006133dc602f83613937565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613442602183613937565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134a8603183613937565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b61350a81613ad2565b82525050565b600061351c8285612e22565b91506135288284612e22565b91508190509392505050565b60006020820190506135496000830184612d92565b92915050565b60006080820190506135646000830187612d92565b6135716020830186612d92565b61357e6040830185613501565b81810360608301526135908184612db0565b905095945050505050565b60006020820190506135b06000830184612da1565b92915050565b600060208201905081810360008301526135d08184612de9565b905092915050565b600060208201905081810360008301526135f181612e53565b9050919050565b6000602082019050818103600083015261361181612eb9565b9050919050565b6000602082019050818103600083015261363181612ef9565b9050919050565b6000602082019050818103600083015261365181612f5f565b9050919050565b6000602082019050818103600083015261367181612fc5565b9050919050565b6000602082019050818103600083015261369181613005565b9050919050565b600060208201905081810360008301526136b18161306b565b9050919050565b600060208201905081810360008301526136d1816130ab565b9050919050565b600060208201905081810360008301526136f181613111565b9050919050565b6000602082019050818103600083015261371181613151565b9050919050565b60006020820190508181036000830152613731816131b7565b9050919050565b600060208201905081810360008301526137518161321d565b9050919050565b6000602082019050818103600083015261377181613283565b9050919050565b60006020820190508181036000830152613791816132c3565b9050919050565b600060208201905081810360008301526137b181613329565b9050919050565b600060208201905081810360008301526137d181613369565b9050919050565b600060208201905081810360008301526137f1816133cf565b9050919050565b6000602082019050818103600083015261381181613435565b9050919050565b600060208201905081810360008301526138318161349b565b9050919050565b600060208201905061384d6000830184613501565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561387a57613879613c57565b5b8060405250919050565b600067ffffffffffffffff82111561389f5761389e613c57565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138cb576138ca613c57565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138fb576138fa613c57565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061395e82613ad2565b915061396983613ad2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399e5761399d613bca565b5b828201905092915050565b60006139b482613ad2565b91506139bf83613ad2565b9250826139cf576139ce613bf9565b5b828204905092915050565b60006139e582613ad2565b91506139f083613ad2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2957613a28613bca565b5b828202905092915050565b6000613a3f82613ad2565b9150613a4a83613ad2565b925082821015613a5d57613a5c613bca565b5b828203905092915050565b6000613a7382613ab2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b09578082015181840152602081019050613aee565b83811115613b18576000848401525b50505050565b60006002820490506001821680613b3657607f821691505b60208210811415613b4a57613b49613c28565b5b50919050565b6000613b5b82613ad2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8e57613b8d613bca565b5b600182019050919050565b6000613ba482613ad2565b9150613baf83613ad2565b925082613bbf57613bbe613bf9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613ca081613a68565b8114613cab57600080fd5b50565b613cb781613a7a565b8114613cc257600080fd5b50565b613cce81613a86565b8114613cd957600080fd5b50565b613ce581613ad2565b8114613cf057600080fd5b5056fea2646970667358221220516b12be3c9242d58ef1286af67fd893f610f4daae7346fae3dbd92b85a07f5264736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cd6565b6106b9565b604051610206919061359b565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b60405161023191906135b6565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d69565b61082d565b60405161026e9190613534565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c59565b6108b2565b005b6102ba60048036038101906102b59190612d69565b6109ca565b005b3480156102c857600080fd5b506102d1610b35565b6040516102de9190613838565b60405180910390f35b3480156102f357600080fd5b506102fc610b46565b6040516103099190613838565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612b53565b610b52565b005b34801561034757600080fd5b50610362600480360381019061035d9190612aee565b610bb2565b60405161036f919061359b565b60405180910390f35b610380610c08565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612b53565b610cc4565b005b6103c560048036038101906103c09190612d69565b610ce4565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d28565b610d80565b005b3480156103fc57600080fd5b50610405610e16565b604051610412919061359b565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d69565b610e2d565b60405161044f9190613534565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612aee565b610edf565b60405161048c9190613838565b60405180910390f35b3480156104a157600080fd5b506104aa610f97565b005b3480156104b857600080fd5b506104c161101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c95565b6110c7565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d69565b611283565b005b34801561052157600080fd5b5061052a611358565b6040516105379190613534565b60405180910390f35b34801561054c57600080fd5b50610555611382565b60405161056291906135b6565b60405180910390f35b34801561057757600080fd5b50610580611410565b60405161058d91906135b6565b60405180910390f35b3480156105a257600080fd5b506105ab6114a2565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612c1d565b611542565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612ba2565b6116c3565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d69565b611725565b60405161063391906135b6565b60405180910390f35b34801561064857600080fd5b506106516117cc565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612b17565b611874565b604051610687919061359b565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612aee565b611908565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610794575061079382611a00565b5b9050919050565b6060600080546107aa90613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546107d690613b1e565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a6a565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613778565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610925906137f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611ad6565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611ad6565b611874565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b2906136f8565b60405180910390fd5b6109c58383611ade565b505050565b60028111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb2565b6109f857600080fd5b67013fbe85edc9000081610a0c91906139da565b341015610a1857600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a659190613953565b1115610a7057600080fd5b600a60009054906101000a900460ff16610a8957600080fd5b6000610a956007611b97565b90506107838282610aa69190613953565b1115610ab157600080fd5b60005b82811015610b30576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0c9190613953565b92505081905550610b1c33611ba5565b508080610b2890613b50565b915050610ab4565b505050565b6000610b416007611b97565b905090565b67013fbe85edc9000081565b610b63610b5d611ad6565b82611bd2565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990613818565b60405180910390fd5b610bad838383611cb0565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c10611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611358565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613798565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc257600080fd5b565b610cdf838383604051806020016040528060008152506116c3565b505050565b6002811115610cf257600080fd5b600a60019054906101000a900460ff16610d0b57600080fd5b6000610d176007611b97565b90506107838282610d289190613953565b1115610d3357600080fd5b67013fbe85edc9000082610d4791906139da565b341015610d5357600080fd5b60005b82811015610d7b57610d6733611ba5565b508080610d7390613b50565b915050610d56565b505050565b610d88611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610da6611358565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613798565b60405180910390fd5b80600b9080519060200190610e1292919061287c565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613738565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613718565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9f611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610fbd611358565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613798565b60405180910390fd5b61101d6000611f0c565b565b611027611ad6565b73ffffffffffffffffffffffffffffffffffffffff16611045611358565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613798565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cf611ad6565b73ffffffffffffffffffffffffffffffffffffffff166110ed611358565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613798565b60405180910390fd5b60005b815181101561127f5760016008600084848151811061118e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000848481518110611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061127790613b50565b915050611146565b5050565b61128b611ad6565b73ffffffffffffffffffffffffffffffffffffffff166112a9611358565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613798565b60405180910390fd5b600061130b6007611b97565b90505b81811015611354576107838110156113415761132a6007611fd2565b6113403360018361133b9190613953565b611fe8565b5b808061134c90613b50565b91505061130e565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b805461138f90613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb90613b1e565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b60606001805461141f90613b1e565b80601f016020809104026020016040519081016040528092919081815260200182805461144b90613b1e565b80156114985780601f1061146d57610100808354040283529160200191611498565b820191906000526020600020905b81548152906001019060200180831161147b57829003601f168201915b5050505050905090565b6114aa611ad6565b73ffffffffffffffffffffffffffffffffffffffff166114c8611358565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590613798565b60405180910390fd5b611526610e16565b61153757611532612006565b611540565b61153f6120a9565b5b565b61154a611ad6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613698565b60405180910390fd5b80600560006115c5611ad6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611672611ad6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b7919061359b565b60405180910390a35050565b6116d46116ce611ad6565b83611bd2565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90613818565b60405180910390fd5b61171f8484848461214b565b50505050565b606061173082611a6a565b61176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906137d8565b60405180910390fd5b60006117796121a7565b9050600081511161179957604051806020016040528060008152506117c4565b806117a384612239565b6040516020016117b4929190613510565b6040516020818303038152906040525b915050919050565b6117d4611ad6565b73ffffffffffffffffffffffffffffffffffffffff166117f2611358565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613798565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611910611ad6565b73ffffffffffffffffffffffffffffffffffffffff1661192e611358565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613798565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613638565b60405180910390fd5b6119fd81611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610e2d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611bb16007611fd2565b6000611bbd6007611b97565b9050611bc98382611fe8565b80915050919050565b6000611bdd82611a6a565b611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906136b8565b60405180910390fd5b6000611c2783610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9657508373ffffffffffffffffffffffffffffffffffffffff16611c7e8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca75750611ca68185611874565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd082610e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906137b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613678565b60405180910390fd5b611da18383836123e6565b611dac600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dfc9190613a34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613953565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6120028282604051806020016040528060008152506124a9565b5050565b61200e610e16565b1561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906136d8565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612092611ad6565b60405161209f9190613534565b60405180910390a1565b6120b1610e16565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906135f8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612134611ad6565b6040516121419190613534565b60405180910390a1565b612156848484611cb0565b61216284848484612504565b6121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890613618565b60405180910390fd5b50505050565b6060600b80546121b690613b1e565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613b1e565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b5050505050905090565b60606000821415612281576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e1565b600082905060005b600082146122b357808061229c90613b50565b915050600a826122ac91906139a9565b9150612289565b60008167ffffffffffffffff8111156122f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123275781602001600182028036833780820191505090505b5090505b600085146123da576001826123409190613a34565b9150600a8561234f9190613b99565b603061235b9190613953565b60f81b818381518110612397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d391906139a9565b945061232b565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124565750612426611358565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156124a457612463610e16565b156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906135d8565b60405180910390fd5b5b505050565b6124b3838361269b565b6124c06000848484612504565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613618565b60405180910390fd5b505050565b60006125258473ffffffffffffffffffffffffffffffffffffffff16612869565b1561268e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261254e611ad6565b8786866040518563ffffffff1660e01b8152600401612570949392919061354f565b602060405180830381600087803b15801561258a57600080fd5b505af19250505080156125bb57506040513d601f19601f820116820180604052508101906125b89190612cff565b60015b61263e573d80600081146125eb576040519150601f19603f3d011682016040523d82523d6000602084013e6125f0565b606091505b50600081511415612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613618565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612693565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613758565b60405180910390fd5b61271481611a6a565b15612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b90613658565b60405180910390fd5b612760600083836123e6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b09190613953565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461288890613b1e565b90600052602060002090601f0160209004810192826128aa57600085556128f1565b82601f106128c357805160ff19168380011785556128f1565b828001600101855582156128f1579182015b828111156128f05782518255916020019190600101906128d5565b5b5090506128fe9190612902565b5090565b5b8082111561291b576000816000905550600101612903565b5090565b600061293261292d84613884565b613853565b9050808382526020820190508285602086028201111561295157600080fd5b60005b8581101561298157816129678882612a07565b845260208401935060208301925050600181019050612954565b5050509392505050565b600061299e612999846138b0565b613853565b9050828152602081018484840111156129b657600080fd5b6129c1848285613adc565b509392505050565b60006129dc6129d7846138e0565b613853565b9050828152602081018484840111156129f457600080fd5b6129ff848285613adc565b509392505050565b600081359050612a1681613c97565b92915050565b600082601f830112612a2d57600080fd5b8135612a3d84826020860161291f565b91505092915050565b600081359050612a5581613cae565b92915050565b600081359050612a6a81613cc5565b92915050565b600081519050612a7f81613cc5565b92915050565b600082601f830112612a9657600080fd5b8135612aa684826020860161298b565b91505092915050565b600082601f830112612ac057600080fd5b8135612ad08482602086016129c9565b91505092915050565b600081359050612ae881613cdc565b92915050565b600060208284031215612b0057600080fd5b6000612b0e84828501612a07565b91505092915050565b60008060408385031215612b2a57600080fd5b6000612b3885828601612a07565b9250506020612b4985828601612a07565b9150509250929050565b600080600060608486031215612b6857600080fd5b6000612b7686828701612a07565b9350506020612b8786828701612a07565b9250506040612b9886828701612ad9565b9150509250925092565b60008060008060808587031215612bb857600080fd5b6000612bc687828801612a07565b9450506020612bd787828801612a07565b9350506040612be887828801612ad9565b925050606085013567ffffffffffffffff811115612c0557600080fd5b612c1187828801612a85565b91505092959194509250565b60008060408385031215612c3057600080fd5b6000612c3e85828601612a07565b9250506020612c4f85828601612a46565b9150509250929050565b60008060408385031215612c6c57600080fd5b6000612c7a85828601612a07565b9250506020612c8b85828601612ad9565b9150509250929050565b600060208284031215612ca757600080fd5b600082013567ffffffffffffffff811115612cc157600080fd5b612ccd84828501612a1c565b91505092915050565b600060208284031215612ce857600080fd5b6000612cf684828501612a5b565b91505092915050565b600060208284031215612d1157600080fd5b6000612d1f84828501612a70565b91505092915050565b600060208284031215612d3a57600080fd5b600082013567ffffffffffffffff811115612d5457600080fd5b612d6084828501612aaf565b91505092915050565b600060208284031215612d7b57600080fd5b6000612d8984828501612ad9565b91505092915050565b612d9b81613a68565b82525050565b612daa81613a7a565b82525050565b6000612dbb82613910565b612dc58185613926565b9350612dd5818560208601613aeb565b612dde81613c86565b840191505092915050565b6000612df48261391b565b612dfe8185613937565b9350612e0e818560208601613aeb565b612e1781613c86565b840191505092915050565b6000612e2d8261391b565b612e378185613948565b9350612e47818560208601613aeb565b80840191505092915050565b6000612e60602b83613937565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b6000612ec6601483613937565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000612f06603283613937565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f6c602683613937565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd2601c83613937565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613012602483613937565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613078601983613937565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130b8602c83613937565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061311e601083613937565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b600061315e603883613937565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131c4602a83613937565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061322a602983613937565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613290602083613937565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006132d0602c83613937565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613336602083613937565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613376602983613937565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006133dc602f83613937565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613442602183613937565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134a8603183613937565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b61350a81613ad2565b82525050565b600061351c8285612e22565b91506135288284612e22565b91508190509392505050565b60006020820190506135496000830184612d92565b92915050565b60006080820190506135646000830187612d92565b6135716020830186612d92565b61357e6040830185613501565b81810360608301526135908184612db0565b905095945050505050565b60006020820190506135b06000830184612da1565b92915050565b600060208201905081810360008301526135d08184612de9565b905092915050565b600060208201905081810360008301526135f181612e53565b9050919050565b6000602082019050818103600083015261361181612eb9565b9050919050565b6000602082019050818103600083015261363181612ef9565b9050919050565b6000602082019050818103600083015261365181612f5f565b9050919050565b6000602082019050818103600083015261367181612fc5565b9050919050565b6000602082019050818103600083015261369181613005565b9050919050565b600060208201905081810360008301526136b18161306b565b9050919050565b600060208201905081810360008301526136d1816130ab565b9050919050565b600060208201905081810360008301526136f181613111565b9050919050565b6000602082019050818103600083015261371181613151565b9050919050565b60006020820190508181036000830152613731816131b7565b9050919050565b600060208201905081810360008301526137518161321d565b9050919050565b6000602082019050818103600083015261377181613283565b9050919050565b60006020820190508181036000830152613791816132c3565b9050919050565b600060208201905081810360008301526137b181613329565b9050919050565b600060208201905081810360008301526137d181613369565b9050919050565b600060208201905081810360008301526137f1816133cf565b9050919050565b6000602082019050818103600083015261381181613435565b9050919050565b600060208201905081810360008301526138318161349b565b9050919050565b600060208201905061384d6000830184613501565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561387a57613879613c57565b5b8060405250919050565b600067ffffffffffffffff82111561389f5761389e613c57565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156138cb576138ca613c57565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138fb576138fa613c57565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061395e82613ad2565b915061396983613ad2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399e5761399d613bca565b5b828201905092915050565b60006139b482613ad2565b91506139bf83613ad2565b9250826139cf576139ce613bf9565b5b828204905092915050565b60006139e582613ad2565b91506139f083613ad2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2957613a28613bca565b5b828202905092915050565b6000613a3f82613ad2565b9150613a4a83613ad2565b925082821015613a5d57613a5c613bca565b5b828203905092915050565b6000613a7382613ab2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b09578082015181840152602081019050613aee565b83811115613b18576000848401525b50505050565b60006002820490506001821680613b3657607f821691505b60208210811415613b4a57613b49613c28565b5b50919050565b6000613b5b82613ad2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8e57613b8d613bca565b5b600182019050919050565b6000613ba482613ad2565b9150613baf83613ad2565b925082613bbf57613bbe613bf9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613ca081613a68565b8114613cab57600080fd5b50565b613cb781613a7a565b8114613cc257600080fd5b50565b613cce81613a86565b8114613cd957600080fd5b50565b613ce581613ad2565b8114613cf057600080fd5b5056fea2646970667358221220516b12be3c9242d58ef1286af67fd893f610f4daae7346fae3dbd92b85a07f5264736f6c63430008000033

Deployed Bytecode Sourcemap

38200:3628:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19623:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20568:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21650:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39525:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39075:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38486:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23017:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39181:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41302:120;;;:::i;:::-;;23427:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40131:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38974:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32733:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20262:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19992:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37571:94;;;;;;;;;;;;;:::i;:::-;;40823:84;;;;;;;;;;;;;:::i;:::-;;39295:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41022:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38748:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20737:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40915:99;;;;;;;;;;;;;:::i;:::-;;22420:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23683:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20912:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40722:93;;;;;;;;;;;;;:::i;:::-;;22786:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37820:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19623:305;19725:4;19777:25;19762:40;;;:11;:40;;;;:105;;;;19834:33;19819:48;;;:11;:48;;;;19762:105;:158;;;;19884:36;19908:11;19884:23;:36::i;:::-;19762:158;19742:178;;19623:305;;;:::o;20568:100::-;20622:13;20655:5;20648:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20568:100;:::o;22127:221::-;22203:7;22231:16;22239:7;22231;:16::i;:::-;22223:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22316:15;:24;22332:7;22316:24;;;;;;;;;;;;;;;;;;;;;22309:31;;22127:221;;;:::o;21650:411::-;21731:13;21747:23;21762:7;21747:14;:23::i;:::-;21731:39;;21795:5;21789:11;;:2;:11;;;;21781:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21889:5;21873:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21898:37;21915:5;21922:12;:10;:12::i;:::-;21898:16;:37::i;:::-;21873:62;21851:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22032:21;22041:2;22045:7;22032:8;:21::i;:::-;21650:411;;;:::o;39525:598::-;38427:1;39601:6;:18;;39593:27;;;;;;38478:1;39639:6;:25;;39631:34;;;;;;39684:25;39698:10;39684:13;:25::i;:::-;39676:34;;;;;;38519:17;39742:6;:15;;;;:::i;:::-;39729:9;:28;;39721:37;;;;;;38478:1;39805:6;39777:13;:25;39791:10;39777:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:53;;39769:62;;;;;;39850:14;;;;;;;;;;;39842:23;;;;;;39878:19;39900;:9;:17;:19::i;:::-;39878:41;;38380:4;39952:6;39938:11;:20;;;;:::i;:::-;:34;;39930:43;;;;;;39991:9;39986:130;40010:6;40006:1;:10;39986:130;;;40067:1;40038:13;:25;40052:10;40038:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;40083:21;40093:10;40083:9;:21::i;:::-;;40018:3;;;;;:::i;:::-;;;;39986:130;;;;39525:598;;:::o;39075:98::-;39119:7;39146:19;:9;:17;:19::i;:::-;39139:26;;39075:98;:::o;38486:50::-;38519:17;38486:50;:::o;23017:339::-;23212:41;23231:12;:10;:12::i;:::-;23245:7;23212:18;:41::i;:::-;23204:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23320:28;23330:4;23336:2;23340:7;23320:9;:28::i;:::-;23017:339;;;:::o;39181:106::-;39239:4;39263:10;:16;39274:4;39263:16;;;;;;;;;;;;;;;;;;;;;;;;;39256:23;;39181:106;;;:::o;41302:120::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41374:10:::1;41366:24;;:47;41391:21;41366:47;;;;;;;;;;;;;;;;;;;;;;;41358:56;;;::::0;::::1;;41302:120::o:0;23427:185::-;23565:39;23582:4;23588:2;23592:7;23565:39;;;;;;;;;;;;:16;:39::i;:::-;23427:185;;;:::o;40131:382::-;38427:1;40200:6;:18;;40192:27;;;;;;40238:11;;;;;;;;;;;40230:20;;;;;;40263:19;40285;:9;:17;:19::i;:::-;40263:41;;38380:4;40337:6;40323:11;:20;;;;:::i;:::-;:34;;40315:43;;;;;;38519:17;40392:6;:15;;;;:::i;:::-;40379:9;:28;;40371:37;;;;;;40426:9;40421:85;40445:6;40441:1;:10;40421:85;;;40473:21;40483:10;40473:9;:21::i;:::-;;40453:3;;;;;:::i;:::-;;;;40421:85;;;;40131:382;;:::o;38974:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39055:4:::1;39042:10;:17;;;;;;;;;;;;:::i;:::-;;38974:93:::0;:::o;32733:86::-;32780:4;32804:7;;;;;;;;;;;32797:14;;32733:86;:::o;20262:239::-;20334:7;20354:13;20370:7;:16;20378:7;20370:16;;;;;;;;;;;;;;;;;;;;;20354:32;;20422:1;20405:19;;:5;:19;;;;20397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20488:5;20481:12;;;20262:239;;;:::o;19992:208::-;20064:7;20109:1;20092:19;;:5;:19;;;;20084:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20176:9;:16;20186:5;20176:16;;;;;;;;;;;;;;;;20169:23;;19992:208;;;:::o;37571:94::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37636:21:::1;37654:1;37636:9;:21::i;:::-;37571:94::o:0;40823:84::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40888:11:::1;;;;;;;;;;;40887:12;40873:11;;:26;;;;;;;;;;;;;;;;;;40823:84::o:0;39295:222::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39376:9:::1;39371:139;39395:5;:12;39391:1;:16;39371:139;;;39452:4;39429:10;:20;39440:5;39446:1;39440:8;;;;;;;;;;;;;;;;;;;;;;39429:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;39497:1;39471:13;:23;39485:5;39491:1;39485:8;;;;;;;;;;;;;;;;;;;;;;39471:23;;;;;;;;;;;;;;;:27;;;;39409:3;;;;;:::i;:::-;;;;39371:139;;;;39295:222:::0;:::o;41022:272::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41089:6:::1;41098:19;:9;:17;:19::i;:::-;41089:28;;41085:202;41123:8;41119:1;:12;41085:202;;;38380:4;41157:1;:14;41153:123;;;41192:21;:9;:19;:21::i;:::-;41232:28;41242:10;41258:1;41254;:5;;;;:::i;:::-;41232:9;:28::i;:::-;41153:123;41133:3;;;;;:::i;:::-;;;;41085:202;;;;41022:272:::0;:::o;36920:87::-;36966:7;36993:6;;;;;;;;;;;36986:13;;36920:87;:::o;38748:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20737:104::-;20793:13;20826:7;20819:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20737:104;:::o;40915:99::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40974:8:::1;:6;:8::i;:::-;:32;;40998:8;:6;:8::i;:::-;40974:32;;;40985:10;:8;:10::i;:::-;40974:32;40915:99::o:0;22420:295::-;22535:12;:10;:12::i;:::-;22523:24;;:8;:24;;;;22515:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22635:8;22590:18;:32;22609:12;:10;:12::i;:::-;22590:32;;;;;;;;;;;;;;;:42;22623:8;22590:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22688:8;22659:48;;22674:12;:10;:12::i;:::-;22659:48;;;22698:8;22659:48;;;;;;:::i;:::-;;;;;;;;22420:295;;:::o;23683:328::-;23858:41;23877:12;:10;:12::i;:::-;23891:7;23858:18;:41::i;:::-;23850:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23964:39;23978:4;23984:2;23988:7;23997:5;23964:13;:39::i;:::-;23683:328;;;;:::o;20912:334::-;20985:13;21019:16;21027:7;21019;:16::i;:::-;21011:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21100:21;21124:10;:8;:10::i;:::-;21100:34;;21176:1;21158:7;21152:21;:25;:86;;;;;;;;;;;;;;;;;21204:7;21213:18;:7;:16;:18::i;:::-;21187:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21152:86;21145:93;;;20912:334;;;:::o;40722:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40793:14:::1;;;;;;;;;;;40792:15;40775:14;;:32;;;;;;;;;;;;;;;;;;40722:93::o:0;22786:164::-;22883:4;22907:18;:25;22926:5;22907:25;;;;;;;;;;;;;;;:35;22933:8;22907:35;;;;;;;;;;;;;;;;;;;;;;;;;22900:42;;22786:164;;;;:::o;37820:192::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37929:1:::1;37909:22;;:8;:22;;;;37901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37985:19;37995:8;37985:9;:19::i;:::-;37820:192:::0;:::o;18232:157::-;18317:4;18356:25;18341:40;;;:11;:40;;;;18334:47;;18232:157;;;:::o;25521:127::-;25586:4;25638:1;25610:30;;:7;:16;25618:7;25610:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25603:37;;25521:127;;;:::o;15335:98::-;15388:7;15415:10;15408:17;;15335:98;:::o;29503:174::-;29605:2;29578:15;:24;29594:7;29578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29661:7;29657:2;29623:46;;29632:23;29647:7;29632:14;:23::i;:::-;29623:46;;;;;;;;;;;;29503:174;;:::o;35417:114::-;35482:7;35509;:14;;;35502:21;;35417:114;;;:::o;40521:193::-;40570:7;40590:21;:9;:19;:21::i;:::-;40624:10;40637:19;:9;:17;:19::i;:::-;40624:32;;40667:17;40677:2;40681;40667:9;:17::i;:::-;40704:2;40697:9;;;40521:193;;;:::o;25815:348::-;25908:4;25933:16;25941:7;25933;:16::i;:::-;25925:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26009:13;26025:23;26040:7;26025:14;:23::i;:::-;26009:39;;26078:5;26067:16;;:7;:16;;;:51;;;;26111:7;26087:31;;:20;26099:7;26087:11;:20::i;:::-;:31;;;26067:51;:87;;;;26122:32;26139:5;26146:7;26122:16;:32::i;:::-;26067:87;26059:96;;;25815:348;;;;:::o;28807:578::-;28966:4;28939:31;;:23;28954:7;28939:14;:23::i;:::-;:31;;;28931:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29049:1;29035:16;;:2;:16;;;;29027:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29105:39;29126:4;29132:2;29136:7;29105:20;:39::i;:::-;29209:29;29226:1;29230:7;29209:8;:29::i;:::-;29270:1;29251:9;:15;29261:4;29251:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29299:1;29282:9;:13;29292:2;29282:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29330:2;29311:7;:16;29319:7;29311:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29369:7;29365:2;29350:27;;29359:4;29350:27;;;;;;;;;;;;28807:578;;;:::o;38020:173::-;38076:16;38095:6;;;;;;;;;;;38076:25;;38121:8;38112:6;;:17;;;;;;;;;;;;;;;;;;38176:8;38145:40;;38166:8;38145:40;;;;;;;;;;;;38020:173;;:::o;35539:127::-;35646:1;35628:7;:14;;;:19;;;;;;;;;;;35539:127;:::o;26505:110::-;26581:26;26591:2;26595:7;26581:26;;;;;;;;;;;;:9;:26::i;:::-;26505:110;;:::o;33533:118::-;33059:8;:6;:8::i;:::-;33058:9;33050:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33603:4:::1;33593:7;;:14;;;;;;;;;;;;;;;;;;33623:20;33630:12;:10;:12::i;:::-;33623:20;;;;;;:::i;:::-;;;;;;;;33533:118::o:0;33792:120::-;33336:8;:6;:8::i;:::-;33328:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33861:5:::1;33851:7;;:15;;;;;;;;;;;;;;;;;;33882:22;33891:12;:10;:12::i;:::-;33882:22;;;;;;:::i;:::-;;;;;;;;33792:120::o:0;24893:315::-;25050:28;25060:4;25066:2;25070:7;25050:9;:28::i;:::-;25097:48;25120:4;25126:2;25130:7;25139:5;25097:22;:48::i;:::-;25089:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24893:315;;;;:::o;38863:103::-;38915:13;38948:10;38941:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38863:103;:::o;15775:723::-;15831:13;16061:1;16052:5;:10;16048:53;;;16079:10;;;;;;;;;;;;;;;;;;;;;16048:53;16111:12;16126:5;16111:20;;16142:14;16167:78;16182:1;16174:4;:9;16167:78;;16200:8;;;;;:::i;:::-;;;;16231:2;16223:10;;;;;:::i;:::-;;;16167:78;;;16255:19;16287:6;16277:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16255:39;;16305:154;16321:1;16312:5;:10;16305:154;;16349:1;16339:11;;;;;:::i;:::-;;;16416:2;16408:5;:10;;;;:::i;:::-;16395:2;:24;;;;:::i;:::-;16382:39;;16365:6;16372;16365:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16445:2;16436:11;;;;;:::i;:::-;;;16305:154;;;16483:6;16469:21;;;;;15775:723;;;;:::o;41533:292::-;41699:1;41683:18;;:4;:18;;;41681:21;:43;;;;;41716:7;:5;:7::i;:::-;41708:15;;:4;:15;;;41706:18;41681:43;41677:141;;;41750:8;:6;:8::i;:::-;41749:9;41741:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41677:141;41533:292;;;:::o;26842:321::-;26972:18;26978:2;26982:7;26972:5;:18::i;:::-;27023:54;27054:1;27058:2;27062:7;27071:5;27023:22;:54::i;:::-;27001:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26842:321;;;:::o;30242:803::-;30397:4;30418:15;:2;:13;;;:15::i;:::-;30414:624;;;30470:2;30454:36;;;30491:12;:10;:12::i;:::-;30505:4;30511:7;30520:5;30454:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30450:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30717:1;30700:6;:13;:18;30696:272;;;30743:60;;;;;;;;;;:::i;:::-;;;;;;;;30696:272;30918:6;30912:13;30903:6;30899:2;30895:15;30888:38;30450:533;30587:45;;;30577:55;;;:6;:55;;;;30570:62;;;;;30414:624;31022:4;31015:11;;30242:803;;;;;;;:::o;27499:382::-;27593:1;27579:16;;:2;:16;;;;27571:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27652:16;27660:7;27652;:16::i;:::-;27651:17;27643:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27714:45;27743:1;27747:2;27751:7;27714:20;:45::i;:::-;27789:1;27772:9;:13;27782:2;27772:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27820:2;27801:7;:16;27809:7;27801:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27865:7;27861:2;27840:33;;27857:1;27840:33;;;;;;;;;;;;27499:382;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:260::-;;6370:2;6358:9;6349:7;6345:23;6341:32;6338:2;;;6386:1;6383;6376:12;6338:2;6429:1;6454:52;6498:7;6489:6;6478:9;6474:22;6454:52;:::i;:::-;6444:62;;6400:116;6328:195;;;;:::o;6529:282::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6706:1;6731:63;6786:7;6777:6;6766:9;6762:22;6731:63;:::i;:::-;6721:73;;6677:127;6605:206;;;;:::o;6817:375::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;7022:1;7011:9;7007:17;6994:31;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:63;7167:7;7158:6;7147:9;7143:22;7112:63;:::i;:::-;7102:73;;6965:220;6893:299;;;;:::o;7198:262::-;;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;7365:1;7390:53;7435:7;7426:6;7415:9;7411:22;7390:53;:::i;:::-;7380:63;;7336:117;7264:196;;;;:::o;7466:118::-;7553:24;7571:5;7553:24;:::i;:::-;7548:3;7541:37;7531:53;;:::o;7590:109::-;7671:21;7686:5;7671:21;:::i;:::-;7666:3;7659:34;7649:50;;:::o;7705:360::-;;7819:38;7851:5;7819:38;:::i;:::-;7873:70;7936:6;7931:3;7873:70;:::i;:::-;7866:77;;7952:52;7997:6;7992:3;7985:4;7978:5;7974:16;7952:52;:::i;:::-;8029:29;8051:6;8029:29;:::i;:::-;8024:3;8020:39;8013:46;;7795:270;;;;;:::o;8071:364::-;;8187:39;8220:5;8187:39;:::i;:::-;8242:71;8306:6;8301:3;8242:71;:::i;:::-;8235:78;;8322:52;8367:6;8362:3;8355:4;8348:5;8344:16;8322:52;:::i;:::-;8399:29;8421:6;8399:29;:::i;:::-;8394:3;8390:39;8383:46;;8163:272;;;;;:::o;8441:377::-;;8575:39;8608:5;8575:39;:::i;:::-;8630:89;8712:6;8707:3;8630:89;:::i;:::-;8623:96;;8728:52;8773:6;8768:3;8761:4;8754:5;8750:16;8728:52;:::i;:::-;8805:6;8800:3;8796:16;8789:23;;8551:267;;;;;:::o;8824:375::-;;8987:67;9051:2;9046:3;8987:67;:::i;:::-;8980:74;;9084:34;9080:1;9075:3;9071:11;9064:55;9150:13;9145:2;9140:3;9136:12;9129:35;9190:2;9185:3;9181:12;9174:19;;8970:229;;;:::o;9205:318::-;;9368:67;9432:2;9427:3;9368:67;:::i;:::-;9361:74;;9465:22;9461:1;9456:3;9452:11;9445:43;9514:2;9509:3;9505:12;9498:19;;9351:172;;;:::o;9529:382::-;;9692:67;9756:2;9751:3;9692:67;:::i;:::-;9685:74;;9789:34;9785:1;9780:3;9776:11;9769:55;9855:20;9850:2;9845:3;9841:12;9834:42;9902:2;9897:3;9893:12;9886:19;;9675:236;;;:::o;9917:370::-;;10080:67;10144:2;10139:3;10080:67;:::i;:::-;10073:74;;10177:34;10173:1;10168:3;10164:11;10157:55;10243:8;10238:2;10233:3;10229:12;10222:30;10278:2;10273:3;10269:12;10262:19;;10063:224;;;:::o;10293:326::-;;10456:67;10520:2;10515:3;10456:67;:::i;:::-;10449:74;;10553:30;10549:1;10544:3;10540:11;10533:51;10610:2;10605:3;10601:12;10594:19;;10439:180;;;:::o;10625:368::-;;10788:67;10852:2;10847:3;10788:67;:::i;:::-;10781:74;;10885:34;10881:1;10876:3;10872:11;10865:55;10951:6;10946:2;10941:3;10937:12;10930:28;10984:2;10979:3;10975:12;10968:19;;10771:222;;;:::o;10999:323::-;;11162:67;11226:2;11221:3;11162:67;:::i;:::-;11155:74;;11259:27;11255:1;11250:3;11246:11;11239:48;11313:2;11308:3;11304:12;11297:19;;11145:177;;;:::o;11328:376::-;;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11588:34;11584:1;11579:3;11575:11;11568:55;11654:14;11649:2;11644:3;11640:12;11633:36;11695:2;11690:3;11686:12;11679:19;;11474:230;;;:::o;11710:314::-;;11873:67;11937:2;11932:3;11873:67;:::i;:::-;11866:74;;11970:18;11966:1;11961:3;11957:11;11950:39;12015:2;12010:3;12006:12;11999:19;;11856:168;;;:::o;12030:388::-;;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12290:34;12286:1;12281:3;12277:11;12270:55;12356:26;12351:2;12346:3;12342:12;12335:48;12409:2;12404:3;12400:12;12393:19;;12176:242;;;:::o;12424:374::-;;12587:67;12651:2;12646:3;12587:67;:::i;:::-;12580:74;;12684:34;12680:1;12675:3;12671:11;12664:55;12750:12;12745:2;12740:3;12736:12;12729:34;12789:2;12784:3;12780:12;12773:19;;12570:228;;;:::o;12804:373::-;;12967:67;13031:2;13026:3;12967:67;:::i;:::-;12960:74;;13064:34;13060:1;13055:3;13051:11;13044:55;13130:11;13125:2;13120:3;13116:12;13109:33;13168:2;13163:3;13159:12;13152:19;;12950:227;;;:::o;13183:330::-;;13346:67;13410:2;13405:3;13346:67;:::i;:::-;13339:74;;13443:34;13439:1;13434:3;13430:11;13423:55;13504:2;13499:3;13495:12;13488:19;;13329:184;;;:::o;13519:376::-;;13682:67;13746:2;13741:3;13682:67;:::i;:::-;13675:74;;13779:34;13775:1;13770:3;13766:11;13759:55;13845:14;13840:2;13835:3;13831:12;13824:36;13886:2;13881:3;13877:12;13870:19;;13665:230;;;:::o;13901:330::-;;14064:67;14128:2;14123:3;14064:67;:::i;:::-;14057:74;;14161:34;14157:1;14152:3;14148:11;14141:55;14222:2;14217:3;14213:12;14206:19;;14047:184;;;:::o;14237:373::-;;14400:67;14464:2;14459:3;14400:67;:::i;:::-;14393:74;;14497:34;14493:1;14488:3;14484:11;14477:55;14563:11;14558:2;14553:3;14549:12;14542:33;14601:2;14596:3;14592:12;14585:19;;14383:227;;;:::o;14616:379::-;;14779:67;14843:2;14838:3;14779:67;:::i;:::-;14772:74;;14876:34;14872:1;14867:3;14863:11;14856:55;14942:17;14937:2;14932:3;14928:12;14921:39;14986:2;14981:3;14977:12;14970:19;;14762:233;;;:::o;15001:365::-;;15164:67;15228:2;15223:3;15164:67;:::i;:::-;15157:74;;15261:34;15257:1;15252:3;15248:11;15241:55;15327:3;15322:2;15317:3;15313:12;15306:25;15357:2;15352:3;15348:12;15341:19;;15147:219;;;:::o;15372:381::-;;15535:67;15599:2;15594:3;15535:67;:::i;:::-;15528:74;;15632:34;15628:1;15623:3;15619:11;15612:55;15698:19;15693:2;15688:3;15684:12;15677:41;15744:2;15739:3;15735:12;15728:19;;15518:235;;;:::o;15759:118::-;15846:24;15864:5;15846:24;:::i;:::-;15841:3;15834:37;15824:53;;:::o;15883:435::-;;16085:95;16176:3;16167:6;16085:95;:::i;:::-;16078:102;;16197:95;16288:3;16279:6;16197:95;:::i;:::-;16190:102;;16309:3;16302:10;;16067:251;;;;;:::o;16324:222::-;;16455:2;16444:9;16440:18;16432:26;;16468:71;16536:1;16525:9;16521:17;16512:6;16468:71;:::i;:::-;16422:124;;;;:::o;16552:640::-;;16785:3;16774:9;16770:19;16762:27;;16799:71;16867:1;16856:9;16852:17;16843:6;16799:71;:::i;:::-;16880:72;16948:2;16937:9;16933:18;16924:6;16880:72;:::i;:::-;16962;17030:2;17019:9;17015:18;17006:6;16962:72;:::i;:::-;17081:9;17075:4;17071:20;17066:2;17055:9;17051:18;17044:48;17109:76;17180:4;17171:6;17109:76;:::i;:::-;17101:84;;16752:440;;;;;;;:::o;17198:210::-;;17323:2;17312:9;17308:18;17300:26;;17336:65;17398:1;17387:9;17383:17;17374:6;17336:65;:::i;:::-;17290:118;;;;:::o;17414:313::-;;17565:2;17554:9;17550:18;17542:26;;17614:9;17608:4;17604:20;17600:1;17589:9;17585:17;17578:47;17642:78;17715:4;17706:6;17642:78;:::i;:::-;17634:86;;17532:195;;;;:::o;17733:419::-;;17937:2;17926:9;17922:18;17914:26;;17986:9;17980:4;17976:20;17972:1;17961:9;17957:17;17950:47;18014:131;18140:4;18014:131;:::i;:::-;18006:139;;17904:248;;;:::o;18158:419::-;;18362:2;18351:9;18347:18;18339:26;;18411:9;18405:4;18401:20;18397:1;18386:9;18382:17;18375:47;18439:131;18565:4;18439:131;:::i;:::-;18431:139;;18329:248;;;:::o;18583:419::-;;18787:2;18776:9;18772:18;18764:26;;18836:9;18830:4;18826:20;18822:1;18811:9;18807:17;18800:47;18864:131;18990:4;18864:131;:::i;:::-;18856:139;;18754:248;;;:::o;19008:419::-;;19212:2;19201:9;19197:18;19189:26;;19261:9;19255:4;19251:20;19247:1;19236:9;19232:17;19225:47;19289:131;19415:4;19289:131;:::i;:::-;19281:139;;19179:248;;;:::o;19433:419::-;;19637:2;19626:9;19622:18;19614:26;;19686:9;19680:4;19676:20;19672:1;19661:9;19657:17;19650:47;19714:131;19840:4;19714:131;:::i;:::-;19706:139;;19604:248;;;:::o;19858:419::-;;20062:2;20051:9;20047:18;20039:26;;20111:9;20105:4;20101:20;20097:1;20086:9;20082:17;20075:47;20139:131;20265:4;20139:131;:::i;:::-;20131:139;;20029:248;;;:::o;20283:419::-;;20487:2;20476:9;20472:18;20464:26;;20536:9;20530:4;20526:20;20522:1;20511:9;20507:17;20500:47;20564:131;20690:4;20564:131;:::i;:::-;20556:139;;20454:248;;;:::o;20708:419::-;;20912:2;20901:9;20897:18;20889:26;;20961:9;20955:4;20951:20;20947:1;20936:9;20932:17;20925:47;20989:131;21115:4;20989:131;:::i;:::-;20981:139;;20879:248;;;:::o;21133:419::-;;21337:2;21326:9;21322:18;21314:26;;21386:9;21380:4;21376:20;21372:1;21361:9;21357:17;21350:47;21414:131;21540:4;21414:131;:::i;:::-;21406:139;;21304:248;;;:::o;21558:419::-;;21762:2;21751:9;21747:18;21739:26;;21811:9;21805:4;21801:20;21797:1;21786:9;21782:17;21775:47;21839:131;21965:4;21839:131;:::i;:::-;21831:139;;21729:248;;;:::o;21983:419::-;;22187:2;22176:9;22172:18;22164:26;;22236:9;22230:4;22226:20;22222:1;22211:9;22207:17;22200:47;22264:131;22390:4;22264:131;:::i;:::-;22256:139;;22154:248;;;:::o;22408:419::-;;22612:2;22601:9;22597:18;22589:26;;22661:9;22655:4;22651:20;22647:1;22636:9;22632:17;22625:47;22689:131;22815:4;22689:131;:::i;:::-;22681:139;;22579:248;;;:::o;22833:419::-;;23037:2;23026:9;23022:18;23014:26;;23086:9;23080:4;23076:20;23072:1;23061:9;23057:17;23050:47;23114:131;23240:4;23114:131;:::i;:::-;23106:139;;23004:248;;;:::o;23258:419::-;;23462:2;23451:9;23447:18;23439:26;;23511:9;23505:4;23501:20;23497:1;23486:9;23482:17;23475:47;23539:131;23665:4;23539:131;:::i;:::-;23531:139;;23429:248;;;:::o;23683:419::-;;23887:2;23876:9;23872:18;23864:26;;23936:9;23930:4;23926:20;23922:1;23911:9;23907:17;23900:47;23964:131;24090:4;23964:131;:::i;:::-;23956:139;;23854:248;;;:::o;24108:419::-;;24312:2;24301:9;24297:18;24289:26;;24361:9;24355:4;24351:20;24347:1;24336:9;24332:17;24325:47;24389:131;24515:4;24389:131;:::i;:::-;24381:139;;24279:248;;;:::o;24533:419::-;;24737:2;24726:9;24722:18;24714:26;;24786:9;24780:4;24776:20;24772:1;24761:9;24757:17;24750:47;24814:131;24940:4;24814:131;:::i;:::-;24806:139;;24704:248;;;:::o;24958:419::-;;25162:2;25151:9;25147:18;25139:26;;25211:9;25205:4;25201:20;25197:1;25186:9;25182:17;25175:47;25239:131;25365:4;25239:131;:::i;:::-;25231:139;;25129:248;;;:::o;25383:419::-;;25587:2;25576:9;25572:18;25564:26;;25636:9;25630:4;25626:20;25622:1;25611:9;25607:17;25600:47;25664:131;25790:4;25664:131;:::i;:::-;25656:139;;25554:248;;;:::o;25808:222::-;;25939:2;25928:9;25924:18;25916:26;;25952:71;26020:1;26009:9;26005:17;25996:6;25952:71;:::i;:::-;25906:124;;;;:::o;26036:283::-;;26102:2;26096:9;26086:19;;26144:4;26136:6;26132:17;26251:6;26239:10;26236:22;26215:18;26203:10;26200:34;26197:62;26194:2;;;26262:18;;:::i;:::-;26194:2;26302:10;26298:2;26291:22;26076:243;;;;:::o;26325:311::-;;26492:18;26484:6;26481:30;26478:2;;;26514:18;;:::i;:::-;26478:2;26564:4;26556:6;26552:17;26544:25;;26624:4;26618;26614:15;26606:23;;26407:229;;;:::o;26642:331::-;;26793:18;26785:6;26782:30;26779:2;;;26815:18;;:::i;:::-;26779:2;26900:4;26896:9;26889:4;26881:6;26877:17;26873:33;26865:41;;26961:4;26955;26951:15;26943:23;;26708:265;;;:::o;26979:332::-;;27131:18;27123:6;27120:30;27117:2;;;27153:18;;:::i;:::-;27117:2;27238:4;27234:9;27227:4;27219:6;27215:17;27211:33;27203:41;;27299:4;27293;27289:15;27281:23;;27046:265;;;:::o;27317:98::-;;27402:5;27396:12;27386:22;;27375:40;;;:::o;27421:99::-;;27507:5;27501:12;27491:22;;27480:40;;;:::o;27526:168::-;;27643:6;27638:3;27631:19;27683:4;27678:3;27674:14;27659:29;;27621:73;;;;:::o;27700:169::-;;27818:6;27813:3;27806:19;27858:4;27853:3;27849:14;27834:29;;27796:73;;;;:::o;27875:148::-;;28014:3;27999:18;;27989:34;;;;:::o;28029:305::-;;28088:20;28106:1;28088:20;:::i;:::-;28083:25;;28122:20;28140:1;28122:20;:::i;:::-;28117:25;;28276:1;28208:66;28204:74;28201:1;28198:81;28195:2;;;28282:18;;:::i;:::-;28195:2;28326:1;28323;28319:9;28312:16;;28073:261;;;;:::o;28340:185::-;;28397:20;28415:1;28397:20;:::i;:::-;28392:25;;28431:20;28449:1;28431:20;:::i;:::-;28426:25;;28470:1;28460:2;;28475:18;;:::i;:::-;28460:2;28517:1;28514;28510:9;28505:14;;28382:143;;;;:::o;28531:348::-;;28594:20;28612:1;28594:20;:::i;:::-;28589:25;;28628:20;28646:1;28628:20;:::i;:::-;28623:25;;28816:1;28748:66;28744:74;28741:1;28738:81;28733:1;28726:9;28719:17;28715:105;28712:2;;;28823:18;;:::i;:::-;28712:2;28871:1;28868;28864:9;28853:20;;28579:300;;;;:::o;28885:191::-;;28945:20;28963:1;28945:20;:::i;:::-;28940:25;;28979:20;28997:1;28979:20;:::i;:::-;28974:25;;29018:1;29015;29012:8;29009:2;;;29023:18;;:::i;:::-;29009:2;29068:1;29065;29061:9;29053:17;;28930:146;;;;:::o;29082:96::-;;29148:24;29166:5;29148:24;:::i;:::-;29137:35;;29127:51;;;:::o;29184:90::-;;29261:5;29254:13;29247:21;29236:32;;29226:48;;;:::o;29280:149::-;;29356:66;29349:5;29345:78;29334:89;;29324:105;;;:::o;29435:126::-;;29512:42;29505:5;29501:54;29490:65;;29480:81;;;:::o;29567:77::-;;29633:5;29622:16;;29612:32;;;:::o;29650:154::-;29734:6;29729:3;29724;29711:30;29796:1;29787:6;29782:3;29778:16;29771:27;29701:103;;;:::o;29810:307::-;29878:1;29888:113;29902:6;29899:1;29896:13;29888:113;;;29987:1;29982:3;29978:11;29972:18;29968:1;29963:3;29959:11;29952:39;29924:2;29921:1;29917:10;29912:15;;29888:113;;;30019:6;30016:1;30013:13;30010:2;;;30099:1;30090:6;30085:3;30081:16;30074:27;30010:2;29859:258;;;;:::o;30123:320::-;;30204:1;30198:4;30194:12;30184:22;;30251:1;30245:4;30241:12;30272:18;30262:2;;30328:4;30320:6;30316:17;30306:27;;30262:2;30390;30382:6;30379:14;30359:18;30356:38;30353:2;;;30409:18;;:::i;:::-;30353:2;30174:269;;;;:::o;30449:233::-;;30511:24;30529:5;30511:24;:::i;:::-;30502:33;;30557:66;30550:5;30547:77;30544:2;;;30627:18;;:::i;:::-;30544:2;30674:1;30667:5;30663:13;30656:20;;30492:190;;;:::o;30688:176::-;;30737:20;30755:1;30737:20;:::i;:::-;30732:25;;30771:20;30789:1;30771:20;:::i;:::-;30766:25;;30810:1;30800:2;;30815:18;;:::i;:::-;30800:2;30856:1;30853;30849:9;30844:14;;30722:142;;;;:::o;30870:180::-;30918:77;30915:1;30908:88;31015:4;31012:1;31005:15;31039:4;31036:1;31029:15;31056:180;31104:77;31101:1;31094:88;31201:4;31198:1;31191:15;31225:4;31222:1;31215:15;31242:180;31290:77;31287:1;31280:88;31387:4;31384:1;31377:15;31411:4;31408:1;31401:15;31428:180;31476:77;31473:1;31466:88;31573:4;31570:1;31563:15;31597:4;31594:1;31587:15;31614:102;;31706:2;31702:7;31697:2;31690:5;31686:14;31682:28;31672:38;;31662:54;;;:::o;31722:122::-;31795:24;31813:5;31795:24;:::i;:::-;31788:5;31785:35;31775:2;;31834:1;31831;31824:12;31775:2;31765:79;:::o;31850:116::-;31920:21;31935:5;31920:21;:::i;:::-;31913:5;31910:32;31900:2;;31956:1;31953;31946:12;31900:2;31890:76;:::o;31972:120::-;32044:23;32061:5;32044:23;:::i;:::-;32037:5;32034:34;32024:2;;32082:1;32079;32072:12;32024:2;32014:78;:::o;32098:122::-;32171:24;32189:5;32171:24;:::i;:::-;32164:5;32161:35;32151:2;;32210:1;32207;32200:12;32151:2;32141:79;:::o

Swarm Source

ipfs://516b12be3c9242d58ef1286af67fd893f610f4daae7346fae3dbd92b85a07f52
Loading...
Loading
Loading...
Loading
[ 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.