ETH Price: $3,166.34 (+1.82%)
Gas: 2 Gwei

Token

Lost Puffins (LOST)
 

Overview

Max Total Supply

90 LOST

Holders

52

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
baxmachina.eth
Balance
8 LOST
0xcb92828352227755009d444f606a339d0937bf95
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Lost Puffins are a collection of 8,888 unique NFT's that live on the Ethereum network and follow the ERC-721 non-fungible token standard.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LostPuffins

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-16
*/

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


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

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

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

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

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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

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

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

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

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract LostPuffins is
  ERC721Burnable,
  ERC721Enumerable,
  ERC721Pausable,
  Ownable
{
  using SafeMath for uint256;
  uint256 public constant MAX_PUFFINS = 8888;
  uint256 public constant MAX_PER_MINT = 10;
  uint256 public constant PRICE = 0.05 * 10**18;
  uint256 public constant PRE_MINT_AMOUNT = 10;
  string public baseTokenURI;
  
  event CreateLostPuffin(uint256 indexed id);
  constructor(string memory baseURI)
  ERC721(
    "Lost Puffins",
    "LOST"
  ) {
    setBaseURI(baseURI);
    
    for (uint i = 0; i < PRE_MINT_AMOUNT; i++) {
      uint id = totalSupply();
      _safeMint(owner(), id);
      emit CreateLostPuffin(id);
    }

    pause();
  }

  function mint(uint256 count)
  public
  payable {
    uint256 currentTotal = totalSupply();
    require(count > 0,
      "Count must be greater than 0");
    require(count <= MAX_PER_MINT,
      "Count is too high, you can only buy 10 at once.");
    require(currentTotal.add(count) <= MAX_PUFFINS,
      "Requested amount exceeds what is available!");
    require(currentTotal <= MAX_PUFFINS,
      "Not enough puffins available.");
    require(msg.value >= PRICE.mul(count),
      "Incorrect price.");

    for (uint i = 0; i < count; i++) {
      uint id = totalSupply();
      _safeMint(msg.sender, id);
      emit CreateLostPuffin(id);
    }
  }

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

  function setBaseURI(string memory baseURI)
  public
  onlyOwner {
    baseTokenURI = baseURI;
  }
  
  function pause()
  public
  onlyOwner {
    _pause();
  }

  function unpause()
  public
  onlyOwner {
    _unpause();
  }

  function withdrawAll()
  public
  payable
  onlyOwner {
    _widthdraw(owner(), address(this).balance);
  }

  function _widthdraw(address _address, uint256 _amount)
  private {
    (bool success, ) = _address.call{value: _amount}("");
    require(success, "Recovery failed.");
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  )
  internal
  virtual
  override(ERC721, ERC721Enumerable, ERC721Pausable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function supportsInterface(bytes4 interfaceId)
  public
  view
  virtual
  override(ERC721, ERC721Enumerable)
  returns (bool) {
    return super.supportsInterface(interfaceId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CreateLostPuffin","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":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUFFINS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"count","type":"uint256"}],"name":"mint","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005f6b38038062005f6b8339818101604052810190620000379190620010cd565b6040518060400160405280600c81526020017f4c6f73742050756666696e7300000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c4f5354000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000f56565b508060019080519060200190620000d492919062000f56565b5050506000600a60006101000a81548160ff0219169083151502179055506200011262000106620001c160201b60201c565b620001c960201b60201c565b62000123816200028f60201b60201c565b60005b600a811015620001a9576000620001426200033a60201b60201c565b905062000165620001586200034760201b60201c565b826200037160201b60201c565b807fd1926350c47a4d1a0ae54d5d955de9ff88d0a7a07f43368495be58fa7ef1121660405160405180910390a2508080620001a09062001621565b91505062000126565b50620001ba6200039760201b60201c565b506200192a565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029f620001c160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c56200034760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031590620013cf565b60405180910390fd5b80600b90805190602001906200033692919062000f56565b5050565b6000600880549050905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003938282604051806020016040528060008152506200043860201b60201c565b5050565b620003a7620001c160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003cd6200034760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041d90620013cf565b60405180910390fd5b62000436620004a660201b60201c565b565b6200044a83836200055e60201b60201c565b6200045f60008484846200074460201b60201c565b620004a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004989062001325565b60405180910390fd5b505050565b620004b6620008fe60201b60201c565b15620004f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f09062001369565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000545620001c160201b60201c565b60405162000554919062001292565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c890620013ad565b60405180910390fd5b620005e2816200091560201b60201c565b1562000625576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061c9062001347565b60405180910390fd5b62000639600083836200098160201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200068b91906200147d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620007728473ffffffffffffffffffffffffffffffffffffffff166200099e60201b6200170d1760201c565b15620008f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007a4620001c160201b60201c565b8786866040518563ffffffff1660e01b8152600401620007c89493929190620012af565b602060405180830381600087803b158015620007e357600080fd5b505af19250505080156200081757506040513d601f19601f820116820180604052508101906200081491906200109b565b60015b620008a0573d80600081146200084a576040519150601f19603f3d011682016040523d82523d6000602084013e6200084f565b606091505b5060008151141562000898576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088f9062001325565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008f6565b600190505b949350505050565b6000600a60009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000999838383620009b160201b620017201760201c565b505050565b600080823b905060008111915050919050565b620009c983838362000a2160201b620017781760201c565b620009d9620008fe60201b60201c565b1562000a1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a139062001303565b60405180910390fd5b505050565b62000a3983838362000b6860201b6200188c1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000a865762000a808162000b6d60201b60201c565b62000ace565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000acd5762000acc838262000bb660201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b1b5762000b158162000d3360201b60201c565b62000b63565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b625762000b61828262000e0f60201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000bd08462000e9b60201b62000d501760201c565b62000bdc9190620014da565b905060006007600084815260200190815260200160002054905081811462000cc2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000d499190620014da565b905060006009600084815260200190815260200160002054905060006008838154811062000d7c5762000d7b620016fc565b5b90600052602060002001549050806008838154811062000da15762000da0620016fc565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000df35762000df2620016cd565b5b6001900381819060005260206000200160009055905550505050565b600062000e278362000e9b60201b62000d501760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f06906200138b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000f6490620015b5565b90600052602060002090601f01602090048101928262000f88576000855562000fd4565b82601f1062000fa357805160ff191683800117855562000fd4565b8280016001018555821562000fd4579182015b8281111562000fd357825182559160200191906001019062000fb6565b5b50905062000fe3919062000fe7565b5090565b5b808211156200100257600081600090555060010162000fe8565b5090565b60006200101d62001017846200141a565b620013f1565b9050828152602081018484840111156200103c576200103b6200175f565b5b620010498482856200157f565b509392505050565b600081519050620010628162001910565b92915050565b600082601f83011262001080576200107f6200175a565b5b81516200109284826020860162001006565b91505092915050565b600060208284031215620010b457620010b362001769565b5b6000620010c48482850162001051565b91505092915050565b600060208284031215620010e657620010e562001769565b5b600082015167ffffffffffffffff81111562001107576200110662001764565b5b620011158482850162001068565b91505092915050565b620011298162001515565b82525050565b60006200113c8262001450565b6200114881856200145b565b93506200115a8185602086016200157f565b62001165816200176e565b840191505092915050565b60006200117f602b836200146c565b91506200118c826200177f565b604082019050919050565b6000620011a66032836200146c565b9150620011b382620017ce565b604082019050919050565b6000620011cd601c836200146c565b9150620011da826200181d565b602082019050919050565b6000620011f46010836200146c565b9150620012018262001846565b602082019050919050565b60006200121b602a836200146c565b915062001228826200186f565b604082019050919050565b6000620012426020836200146c565b91506200124f82620018be565b602082019050919050565b6000620012696020836200146c565b91506200127682620018e7565b602082019050919050565b6200128c8162001575565b82525050565b6000602082019050620012a960008301846200111e565b92915050565b6000608082019050620012c660008301876200111e565b620012d560208301866200111e565b620012e4604083018562001281565b8181036060830152620012f881846200112f565b905095945050505050565b600060208201905081810360008301526200131e8162001170565b9050919050565b60006020820190508181036000830152620013408162001197565b9050919050565b600060208201905081810360008301526200136281620011be565b9050919050565b600060208201905081810360008301526200138481620011e5565b9050919050565b60006020820190508181036000830152620013a6816200120c565b9050919050565b60006020820190508181036000830152620013c88162001233565b9050919050565b60006020820190508181036000830152620013ea816200125a565b9050919050565b6000620013fd62001410565b90506200140b8282620015eb565b919050565b6000604051905090565b600067ffffffffffffffff8211156200143857620014376200172b565b5b62001443826200176e565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200148a8262001575565b9150620014978362001575565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620014cf57620014ce6200166f565b5b828201905092915050565b6000620014e78262001575565b9150620014f48362001575565b9250828210156200150a57620015096200166f565b5b828203905092915050565b6000620015228262001555565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200159f57808201518184015260208101905062001582565b83811115620015af576000848401525b50505050565b60006002820490506001821680620015ce57607f821691505b60208210811415620015e557620015e46200169e565b5b50919050565b620015f6826200176e565b810181811067ffffffffffffffff821117156200161857620016176200172b565b5b80604052505050565b60006200162e8262001575565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200166457620016636200166f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200191b8162001529565b81146200192757600080fd5b50565b614631806200193a6000396000f3fe6080604052600436106101d85760003560e01c806370a0823111610102578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610658578063d547cfb714610695578063e985e9c5146106c0578063f2fde38b146106fd576101d8565b8063a0712d68146105bf578063a22cb465146105db578063a76d21f514610604578063b88d4fde1461062f576101d8565b80638d859f3e116100d15780638d859f3e146105135780638da5cb5b1461053e57806395d89b41146105695780639dabd94314610594576101d8565b806370a082311461049e578063715018a6146104db5780638456cb59146104f2578063853828b614610509576101d8565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103d057806355f804b31461040d5780635c975abb146104365780636352211e14610461576101d8565b80632f745c591461032a5780633f4ba83a1461036757806342842e0e1461037e57806342966c68146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806309d42b30146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612fa9565b610726565b60405161021191906135e0565b60405180910390f35b34801561022657600080fd5b5061022f610738565b60405161023c91906135fb565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061304c565b6107ca565b6040516102799190613579565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612f69565b61084f565b005b3480156102b757600080fd5b506102c0610967565b6040516102cd919061399d565b60405180910390f35b3480156102e257600080fd5b506102eb61096c565b6040516102f8919061399d565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190612e53565b610979565b005b34801561033657600080fd5b50610351600480360381019061034c9190612f69565b6109d9565b60405161035e919061399d565b60405180910390f35b34801561037357600080fd5b5061037c610a7e565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612e53565b610b04565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061304c565b610b24565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061304c565b610b80565b604051610404919061399d565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613003565b610bf1565b005b34801561044257600080fd5b5061044b610c87565b60405161045891906135e0565b60405180910390f35b34801561046d57600080fd5b506104886004803603810190610483919061304c565b610c9e565b6040516104959190613579565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612de6565b610d50565b6040516104d2919061399d565b60405180910390f35b3480156104e757600080fd5b506104f0610e08565b005b3480156104fe57600080fd5b50610507610e90565b005b610511610f16565b005b34801561051f57600080fd5b50610528610fa5565b604051610535919061399d565b60405180910390f35b34801561054a57600080fd5b50610553610fb0565b6040516105609190613579565b60405180910390f35b34801561057557600080fd5b5061057e610fda565b60405161058b91906135fb565b60405180910390f35b3480156105a057600080fd5b506105a961106c565b6040516105b6919061399d565b60405180910390f35b6105d960048036038101906105d4919061304c565b611072565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190612f29565b611264565b005b34801561061057600080fd5b506106196113e5565b604051610626919061399d565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612ea6565b6113ea565b005b34801561066457600080fd5b5061067f600480360381019061067a919061304c565b61144c565b60405161068c91906135fb565b60405180910390f35b3480156106a157600080fd5b506106aa6114f3565b6040516106b791906135fb565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190612e13565b611581565b6040516106f491906135e0565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612de6565b611615565b005b600061073182611891565b9050919050565b60606000805461074790613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613c58565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261190b565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b9061383d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82610c9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906138bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea611977565b73ffffffffffffffffffffffffffffffffffffffff161480610919575061091881610913611977565b611581565b5b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9061379d565b60405180910390fd5b610962838361197f565b505050565b600a81565b6000600880549050905090565b61098a610984611977565b82611a38565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c0906138dd565b60405180910390fd5b6109d4838383611b16565b505050565b60006109e483610d50565b8210610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061365d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a86611977565b73ffffffffffffffffffffffffffffffffffffffff16610aa4610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061385d565b60405180910390fd5b610b02611d72565b565b610b1f838383604051806020016040528060008152506113ea565b505050565b610b35610b2f611977565b82611a38565b610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061397d565b60405180910390fd5b610b7d81611e14565b50565b6000610b8a61096c565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061391d565b60405180910390fd5b60088281548110610bdf57610bde613df1565b5b90600052602060002001549050919050565b610bf9611977565b73ffffffffffffffffffffffffffffffffffffffff16610c17610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c649061385d565b60405180910390fd5b80600b9080519060200190610c83929190612bfa565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906137dd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906137bd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e10611977565b73ffffffffffffffffffffffffffffffffffffffff16610e2e610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b9061385d565b60405180910390fd5b610e8e6000611f25565b565b610e98611977565b73ffffffffffffffffffffffffffffffffffffffff16610eb6610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061385d565b60405180910390fd5b610f14611feb565b565b610f1e611977565b73ffffffffffffffffffffffffffffffffffffffff16610f3c610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f899061385d565b60405180910390fd5b610fa3610f9d610fb0565b4761208e565b565b66b1a2bc2ec5000081565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fe990613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613c58565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6122b881565b600061107c61096c565b9050600082116110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b89061395d565b60405180910390fd5b600a821115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061375d565b60405180910390fd5b6122b861111b838361213f90919063ffffffff16565b111561115c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611153906137fd565b60405180910390fd5b6122b88111156111a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611198906138fd565b60405180910390fd5b6111bb8266b1a2bc2ec5000061215590919063ffffffff16565b3410156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f49061393d565b60405180910390fd5b60005b8281101561125f57600061121261096c565b905061121e338261216b565b807fd1926350c47a4d1a0ae54d5d955de9ff88d0a7a07f43368495be58fa7ef1121660405160405180910390a250808061125790613cbb565b915050611200565b505050565b61126c611977565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061371d565b60405180910390fd5b80600560006112e7611977565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611394611977565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d991906135e0565b60405180910390a35050565b600a81565b6113fb6113f5611977565b83611a38565b61143a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611431906138dd565b60405180910390fd5b61144684848484612189565b50505050565b60606114578261190b565b611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061389d565b60405180910390fd5b60006114a06121e5565b905060008151116114c057604051806020016040528060008152506114eb565b806114ca84612277565b6040516020016114db929190613540565b6040516020818303038152906040525b915050919050565b600b805461150090613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461152c90613c58565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161d611977565b73ffffffffffffffffffffffffffffffffffffffff1661163b610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061385d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f89061369d565b60405180910390fd5b61170a81611f25565b50565b600080823b905060008111915050919050565b61172b838383611778565b611733610c87565b15611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a9061361d565b60405180910390fd5b505050565b61178383838361188c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117c6576117c1816123d8565b611805565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611804576118038382612421565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611848576118438161258e565b611887565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461188657611885828261265f565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119045750611903826126de565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119f283610c9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a438261190b565b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061373d565b60405180910390fd5b6000611a8d83610c9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611afc57508373ffffffffffffffffffffffffffffffffffffffff16611ae4846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b0d5750611b0c8185611581565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3682610c9e565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b839061387d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf3906136fd565b60405180910390fd5b611c078383836127c0565b611c1260008261197f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c629190613b6e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb99190613a8d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d7a610c87565b611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db09061363d565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611dfd611977565b604051611e0a9190613579565b60405180910390a1565b6000611e1f82610c9e565b9050611e2d816000846127c0565b611e3860008361197f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e889190613b6e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff3610c87565b15612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061377d565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612077611977565b6040516120849190613579565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120b490613564565b60006040518083038185875af1925050503d80600081146120f1576040519150601f19603f3d011682016040523d82523d6000602084013e6120f6565b606091505b505090508061213a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612131906136bd565b60405180910390fd5b505050565b6000818361214d9190613a8d565b905092915050565b600081836121639190613b14565b905092915050565b6121858282604051806020016040528060008152506127d0565b5050565b612194848484611b16565b6121a08484848461282b565b6121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d69061367d565b60405180910390fd5b50505050565b6060600b80546121f490613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461222090613c58565b801561226d5780601f106122425761010080835404028352916020019161226d565b820191906000526020600020905b81548152906001019060200180831161225057829003601f168201915b5050505050905090565b606060008214156122bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123d3565b600082905060005b600082146122f15780806122da90613cbb565b915050600a826122ea9190613ae3565b91506122c7565b60008167ffffffffffffffff81111561230d5761230c613e20565b5b6040519080825280601f01601f19166020018201604052801561233f5781602001600182028036833780820191505090505b5090505b600085146123cc576001826123589190613b6e565b9150600a856123679190613d04565b60306123739190613a8d565b60f81b81838151811061238957612388613df1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123c59190613ae3565b9450612343565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161242e84610d50565b6124389190613b6e565b905060006007600084815260200190815260200160002054905081811461251d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125a29190613b6e565b90506000600960008481526020019081526020016000205490506000600883815481106125d2576125d1613df1565b5b9060005260206000200154905080600883815481106125f4576125f3613df1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061264357612642613dc2565b5b6001900381819060005260206000200160009055905550505050565b600061266a83610d50565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127b957506127b8826129c2565b5b9050919050565b6127cb838383611720565b505050565b6127da8383612a2c565b6127e7600084848461282b565b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9061367d565b60405180910390fd5b505050565b600061284c8473ffffffffffffffffffffffffffffffffffffffff1661170d565b156129b5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612875611977565b8786866040518563ffffffff1660e01b81526004016128979493929190613594565b602060405180830381600087803b1580156128b157600080fd5b505af19250505080156128e257506040513d601f19601f820116820180604052508101906128df9190612fd6565b60015b612965573d8060008114612912576040519150601f19603f3d011682016040523d82523d6000602084013e612917565b606091505b5060008151141561295d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129549061367d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ba565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a939061381d565b60405180910390fd5b612aa58161190b565b15612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc906136dd565b60405180910390fd5b612af1600083836127c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b419190613a8d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c0690613c58565b90600052602060002090601f016020900481019282612c285760008555612c6f565b82601f10612c4157805160ff1916838001178555612c6f565b82800160010185558215612c6f579182015b82811115612c6e578251825591602001919060010190612c53565b5b509050612c7c9190612c80565b5090565b5b80821115612c99576000816000905550600101612c81565b5090565b6000612cb0612cab846139dd565b6139b8565b905082815260208101848484011115612ccc57612ccb613e54565b5b612cd7848285613c16565b509392505050565b6000612cf2612ced84613a0e565b6139b8565b905082815260208101848484011115612d0e57612d0d613e54565b5b612d19848285613c16565b509392505050565b600081359050612d308161459f565b92915050565b600081359050612d45816145b6565b92915050565b600081359050612d5a816145cd565b92915050565b600081519050612d6f816145cd565b92915050565b600082601f830112612d8a57612d89613e4f565b5b8135612d9a848260208601612c9d565b91505092915050565b600082601f830112612db857612db7613e4f565b5b8135612dc8848260208601612cdf565b91505092915050565b600081359050612de0816145e4565b92915050565b600060208284031215612dfc57612dfb613e5e565b5b6000612e0a84828501612d21565b91505092915050565b60008060408385031215612e2a57612e29613e5e565b5b6000612e3885828601612d21565b9250506020612e4985828601612d21565b9150509250929050565b600080600060608486031215612e6c57612e6b613e5e565b5b6000612e7a86828701612d21565b9350506020612e8b86828701612d21565b9250506040612e9c86828701612dd1565b9150509250925092565b60008060008060808587031215612ec057612ebf613e5e565b5b6000612ece87828801612d21565b9450506020612edf87828801612d21565b9350506040612ef087828801612dd1565b925050606085013567ffffffffffffffff811115612f1157612f10613e59565b5b612f1d87828801612d75565b91505092959194509250565b60008060408385031215612f4057612f3f613e5e565b5b6000612f4e85828601612d21565b9250506020612f5f85828601612d36565b9150509250929050565b60008060408385031215612f8057612f7f613e5e565b5b6000612f8e85828601612d21565b9250506020612f9f85828601612dd1565b9150509250929050565b600060208284031215612fbf57612fbe613e5e565b5b6000612fcd84828501612d4b565b91505092915050565b600060208284031215612fec57612feb613e5e565b5b6000612ffa84828501612d60565b91505092915050565b60006020828403121561301957613018613e5e565b5b600082013567ffffffffffffffff81111561303757613036613e59565b5b61304384828501612da3565b91505092915050565b60006020828403121561306257613061613e5e565b5b600061307084828501612dd1565b91505092915050565b61308281613ba2565b82525050565b61309181613bb4565b82525050565b60006130a282613a3f565b6130ac8185613a55565b93506130bc818560208601613c25565b6130c581613e63565b840191505092915050565b60006130db82613a4a565b6130e58185613a71565b93506130f5818560208601613c25565b6130fe81613e63565b840191505092915050565b600061311482613a4a565b61311e8185613a82565b935061312e818560208601613c25565b80840191505092915050565b6000613147602b83613a71565b915061315282613e74565b604082019050919050565b600061316a601483613a71565b915061317582613ec3565b602082019050919050565b600061318d602b83613a71565b915061319882613eec565b604082019050919050565b60006131b0603283613a71565b91506131bb82613f3b565b604082019050919050565b60006131d3602683613a71565b91506131de82613f8a565b604082019050919050565b60006131f6601083613a71565b915061320182613fd9565b602082019050919050565b6000613219601c83613a71565b915061322482614002565b602082019050919050565b600061323c602483613a71565b91506132478261402b565b604082019050919050565b600061325f601983613a71565b915061326a8261407a565b602082019050919050565b6000613282602c83613a71565b915061328d826140a3565b604082019050919050565b60006132a5602f83613a71565b91506132b0826140f2565b604082019050919050565b60006132c8601083613a71565b91506132d382614141565b602082019050919050565b60006132eb603883613a71565b91506132f68261416a565b604082019050919050565b600061330e602a83613a71565b9150613319826141b9565b604082019050919050565b6000613331602983613a71565b915061333c82614208565b604082019050919050565b6000613354602b83613a71565b915061335f82614257565b604082019050919050565b6000613377602083613a71565b9150613382826142a6565b602082019050919050565b600061339a602c83613a71565b91506133a5826142cf565b604082019050919050565b60006133bd602083613a71565b91506133c88261431e565b602082019050919050565b60006133e0602983613a71565b91506133eb82614347565b604082019050919050565b6000613403602f83613a71565b915061340e82614396565b604082019050919050565b6000613426602183613a71565b9150613431826143e5565b604082019050919050565b6000613449600083613a66565b915061345482614434565b600082019050919050565b600061346c603183613a71565b915061347782614437565b604082019050919050565b600061348f601d83613a71565b915061349a82614486565b602082019050919050565b60006134b2602c83613a71565b91506134bd826144af565b604082019050919050565b60006134d5601083613a71565b91506134e0826144fe565b602082019050919050565b60006134f8601c83613a71565b915061350382614527565b602082019050919050565b600061351b603083613a71565b915061352682614550565b604082019050919050565b61353a81613c0c565b82525050565b600061354c8285613109565b91506135588284613109565b91508190509392505050565b600061356f8261343c565b9150819050919050565b600060208201905061358e6000830184613079565b92915050565b60006080820190506135a96000830187613079565b6135b66020830186613079565b6135c36040830185613531565b81810360608301526135d58184613097565b905095945050505050565b60006020820190506135f56000830184613088565b92915050565b6000602082019050818103600083015261361581846130d0565b905092915050565b600060208201905081810360008301526136368161313a565b9050919050565b600060208201905081810360008301526136568161315d565b9050919050565b6000602082019050818103600083015261367681613180565b9050919050565b60006020820190508181036000830152613696816131a3565b9050919050565b600060208201905081810360008301526136b6816131c6565b9050919050565b600060208201905081810360008301526136d6816131e9565b9050919050565b600060208201905081810360008301526136f68161320c565b9050919050565b600060208201905081810360008301526137168161322f565b9050919050565b6000602082019050818103600083015261373681613252565b9050919050565b6000602082019050818103600083015261375681613275565b9050919050565b6000602082019050818103600083015261377681613298565b9050919050565b60006020820190508181036000830152613796816132bb565b9050919050565b600060208201905081810360008301526137b6816132de565b9050919050565b600060208201905081810360008301526137d681613301565b9050919050565b600060208201905081810360008301526137f681613324565b9050919050565b6000602082019050818103600083015261381681613347565b9050919050565b600060208201905081810360008301526138368161336a565b9050919050565b600060208201905081810360008301526138568161338d565b9050919050565b60006020820190508181036000830152613876816133b0565b9050919050565b60006020820190508181036000830152613896816133d3565b9050919050565b600060208201905081810360008301526138b6816133f6565b9050919050565b600060208201905081810360008301526138d681613419565b9050919050565b600060208201905081810360008301526138f68161345f565b9050919050565b6000602082019050818103600083015261391681613482565b9050919050565b60006020820190508181036000830152613936816134a5565b9050919050565b60006020820190508181036000830152613956816134c8565b9050919050565b60006020820190508181036000830152613976816134eb565b9050919050565b600060208201905081810360008301526139968161350e565b9050919050565b60006020820190506139b26000830184613531565b92915050565b60006139c26139d3565b90506139ce8282613c8a565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f8576139f7613e20565b5b613a0182613e63565b9050602081019050919050565b600067ffffffffffffffff821115613a2957613a28613e20565b5b613a3282613e63565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9882613c0c565b9150613aa383613c0c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad857613ad7613d35565b5b828201905092915050565b6000613aee82613c0c565b9150613af983613c0c565b925082613b0957613b08613d64565b5b828204905092915050565b6000613b1f82613c0c565b9150613b2a83613c0c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6357613b62613d35565b5b828202905092915050565b6000613b7982613c0c565b9150613b8483613c0c565b925082821015613b9757613b96613d35565b5b828203905092915050565b6000613bad82613bec565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c43578082015181840152602081019050613c28565b83811115613c52576000848401525b50505050565b60006002820490506001821680613c7057607f821691505b60208210811415613c8457613c83613d93565b5b50919050565b613c9382613e63565b810181811067ffffffffffffffff82111715613cb257613cb1613e20565b5b80604052505050565b6000613cc682613c0c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cf957613cf8613d35565b5b600182019050919050565b6000613d0f82613c0c565b9150613d1a83613c0c565b925082613d2a57613d29613d64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5265636f76657279206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436f756e7420697320746f6f20686967682c20796f752063616e206f6e6c792060008201527f627579203130206174206f6e63652e0000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f52657175657374656420616d6f756e742065786365656473207768617420697360008201527f20617661696c61626c6521000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682070756666696e7320617661696c61626c652e000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f72726563742070726963652e00000000000000000000000000000000600082015250565b7f436f756e74206d7573742062652067726561746572207468616e203000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6145a881613ba2565b81146145b357600080fd5b50565b6145bf81613bb4565b81146145ca57600080fd5b50565b6145d681613bc0565b81146145e157600080fd5b50565b6145ed81613c0c565b81146145f857600080fd5b5056fea26469706673582212200a546b546916b9d4607881a459e450c0729156aead159038b9766cbd33e84c0764736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f6170692e6c6f737470756666696e732e636f6d2f00000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806370a0823111610102578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610658578063d547cfb714610695578063e985e9c5146106c0578063f2fde38b146106fd576101d8565b8063a0712d68146105bf578063a22cb465146105db578063a76d21f514610604578063b88d4fde1461062f576101d8565b80638d859f3e116100d15780638d859f3e146105135780638da5cb5b1461053e57806395d89b41146105695780639dabd94314610594576101d8565b806370a082311461049e578063715018a6146104db5780638456cb59146104f2578063853828b614610509576101d8565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103d057806355f804b31461040d5780635c975abb146104365780636352211e14610461576101d8565b80632f745c591461032a5780633f4ba83a1461036757806342842e0e1461037e57806342966c68146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806309d42b30146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612fa9565b610726565b60405161021191906135e0565b60405180910390f35b34801561022657600080fd5b5061022f610738565b60405161023c91906135fb565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061304c565b6107ca565b6040516102799190613579565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612f69565b61084f565b005b3480156102b757600080fd5b506102c0610967565b6040516102cd919061399d565b60405180910390f35b3480156102e257600080fd5b506102eb61096c565b6040516102f8919061399d565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190612e53565b610979565b005b34801561033657600080fd5b50610351600480360381019061034c9190612f69565b6109d9565b60405161035e919061399d565b60405180910390f35b34801561037357600080fd5b5061037c610a7e565b005b34801561038a57600080fd5b506103a560048036038101906103a09190612e53565b610b04565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061304c565b610b24565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061304c565b610b80565b604051610404919061399d565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613003565b610bf1565b005b34801561044257600080fd5b5061044b610c87565b60405161045891906135e0565b60405180910390f35b34801561046d57600080fd5b506104886004803603810190610483919061304c565b610c9e565b6040516104959190613579565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612de6565b610d50565b6040516104d2919061399d565b60405180910390f35b3480156104e757600080fd5b506104f0610e08565b005b3480156104fe57600080fd5b50610507610e90565b005b610511610f16565b005b34801561051f57600080fd5b50610528610fa5565b604051610535919061399d565b60405180910390f35b34801561054a57600080fd5b50610553610fb0565b6040516105609190613579565b60405180910390f35b34801561057557600080fd5b5061057e610fda565b60405161058b91906135fb565b60405180910390f35b3480156105a057600080fd5b506105a961106c565b6040516105b6919061399d565b60405180910390f35b6105d960048036038101906105d4919061304c565b611072565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190612f29565b611264565b005b34801561061057600080fd5b506106196113e5565b604051610626919061399d565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612ea6565b6113ea565b005b34801561066457600080fd5b5061067f600480360381019061067a919061304c565b61144c565b60405161068c91906135fb565b60405180910390f35b3480156106a157600080fd5b506106aa6114f3565b6040516106b791906135fb565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190612e13565b611581565b6040516106f491906135e0565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612de6565b611615565b005b600061073182611891565b9050919050565b60606000805461074790613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613c58565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261190b565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b9061383d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82610c9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906138bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea611977565b73ffffffffffffffffffffffffffffffffffffffff161480610919575061091881610913611977565b611581565b5b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9061379d565b60405180910390fd5b610962838361197f565b505050565b600a81565b6000600880549050905090565b61098a610984611977565b82611a38565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c0906138dd565b60405180910390fd5b6109d4838383611b16565b505050565b60006109e483610d50565b8210610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061365d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a86611977565b73ffffffffffffffffffffffffffffffffffffffff16610aa4610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061385d565b60405180910390fd5b610b02611d72565b565b610b1f838383604051806020016040528060008152506113ea565b505050565b610b35610b2f611977565b82611a38565b610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061397d565b60405180910390fd5b610b7d81611e14565b50565b6000610b8a61096c565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061391d565b60405180910390fd5b60088281548110610bdf57610bde613df1565b5b90600052602060002001549050919050565b610bf9611977565b73ffffffffffffffffffffffffffffffffffffffff16610c17610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c649061385d565b60405180910390fd5b80600b9080519060200190610c83929190612bfa565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906137dd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906137bd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e10611977565b73ffffffffffffffffffffffffffffffffffffffff16610e2e610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b9061385d565b60405180910390fd5b610e8e6000611f25565b565b610e98611977565b73ffffffffffffffffffffffffffffffffffffffff16610eb6610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061385d565b60405180910390fd5b610f14611feb565b565b610f1e611977565b73ffffffffffffffffffffffffffffffffffffffff16610f3c610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f899061385d565b60405180910390fd5b610fa3610f9d610fb0565b4761208e565b565b66b1a2bc2ec5000081565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fe990613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613c58565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6122b881565b600061107c61096c565b9050600082116110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b89061395d565b60405180910390fd5b600a821115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061375d565b60405180910390fd5b6122b861111b838361213f90919063ffffffff16565b111561115c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611153906137fd565b60405180910390fd5b6122b88111156111a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611198906138fd565b60405180910390fd5b6111bb8266b1a2bc2ec5000061215590919063ffffffff16565b3410156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f49061393d565b60405180910390fd5b60005b8281101561125f57600061121261096c565b905061121e338261216b565b807fd1926350c47a4d1a0ae54d5d955de9ff88d0a7a07f43368495be58fa7ef1121660405160405180910390a250808061125790613cbb565b915050611200565b505050565b61126c611977565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061371d565b60405180910390fd5b80600560006112e7611977565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611394611977565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d991906135e0565b60405180910390a35050565b600a81565b6113fb6113f5611977565b83611a38565b61143a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611431906138dd565b60405180910390fd5b61144684848484612189565b50505050565b60606114578261190b565b611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061389d565b60405180910390fd5b60006114a06121e5565b905060008151116114c057604051806020016040528060008152506114eb565b806114ca84612277565b6040516020016114db929190613540565b6040516020818303038152906040525b915050919050565b600b805461150090613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461152c90613c58565b80156115795780601f1061154e57610100808354040283529160200191611579565b820191906000526020600020905b81548152906001019060200180831161155c57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161d611977565b73ffffffffffffffffffffffffffffffffffffffff1661163b610fb0565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061385d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f89061369d565b60405180910390fd5b61170a81611f25565b50565b600080823b905060008111915050919050565b61172b838383611778565b611733610c87565b15611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a9061361d565b60405180910390fd5b505050565b61178383838361188c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117c6576117c1816123d8565b611805565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611804576118038382612421565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611848576118438161258e565b611887565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461188657611885828261265f565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119045750611903826126de565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119f283610c9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a438261190b565b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061373d565b60405180910390fd5b6000611a8d83610c9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611afc57508373ffffffffffffffffffffffffffffffffffffffff16611ae4846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b0d5750611b0c8185611581565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3682610c9e565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b839061387d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf3906136fd565b60405180910390fd5b611c078383836127c0565b611c1260008261197f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c629190613b6e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb99190613a8d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d7a610c87565b611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db09061363d565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611dfd611977565b604051611e0a9190613579565b60405180910390a1565b6000611e1f82610c9e565b9050611e2d816000846127c0565b611e3860008361197f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e889190613b6e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff3610c87565b15612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061377d565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612077611977565b6040516120849190613579565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516120b490613564565b60006040518083038185875af1925050503d80600081146120f1576040519150601f19603f3d011682016040523d82523d6000602084013e6120f6565b606091505b505090508061213a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612131906136bd565b60405180910390fd5b505050565b6000818361214d9190613a8d565b905092915050565b600081836121639190613b14565b905092915050565b6121858282604051806020016040528060008152506127d0565b5050565b612194848484611b16565b6121a08484848461282b565b6121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d69061367d565b60405180910390fd5b50505050565b6060600b80546121f490613c58565b80601f016020809104026020016040519081016040528092919081815260200182805461222090613c58565b801561226d5780601f106122425761010080835404028352916020019161226d565b820191906000526020600020905b81548152906001019060200180831161225057829003601f168201915b5050505050905090565b606060008214156122bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123d3565b600082905060005b600082146122f15780806122da90613cbb565b915050600a826122ea9190613ae3565b91506122c7565b60008167ffffffffffffffff81111561230d5761230c613e20565b5b6040519080825280601f01601f19166020018201604052801561233f5781602001600182028036833780820191505090505b5090505b600085146123cc576001826123589190613b6e565b9150600a856123679190613d04565b60306123739190613a8d565b60f81b81838151811061238957612388613df1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123c59190613ae3565b9450612343565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161242e84610d50565b6124389190613b6e565b905060006007600084815260200190815260200160002054905081811461251d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125a29190613b6e565b90506000600960008481526020019081526020016000205490506000600883815481106125d2576125d1613df1565b5b9060005260206000200154905080600883815481106125f4576125f3613df1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061264357612642613dc2565b5b6001900381819060005260206000200160009055905550505050565b600061266a83610d50565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127b957506127b8826129c2565b5b9050919050565b6127cb838383611720565b505050565b6127da8383612a2c565b6127e7600084848461282b565b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9061367d565b60405180910390fd5b505050565b600061284c8473ffffffffffffffffffffffffffffffffffffffff1661170d565b156129b5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612875611977565b8786866040518563ffffffff1660e01b81526004016128979493929190613594565b602060405180830381600087803b1580156128b157600080fd5b505af19250505080156128e257506040513d601f19601f820116820180604052508101906128df9190612fd6565b60015b612965573d8060008114612912576040519150601f19603f3d011682016040523d82523d6000602084013e612917565b606091505b5060008151141561295d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129549061367d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ba565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a939061381d565b60405180910390fd5b612aa58161190b565b15612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc906136dd565b60405180910390fd5b612af1600083836127c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b419190613a8d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c0690613c58565b90600052602060002090601f016020900481019282612c285760008555612c6f565b82601f10612c4157805160ff1916838001178555612c6f565b82800160010185558215612c6f579182015b82811115612c6e578251825591602001919060010190612c53565b5b509050612c7c9190612c80565b5090565b5b80821115612c99576000816000905550600101612c81565b5090565b6000612cb0612cab846139dd565b6139b8565b905082815260208101848484011115612ccc57612ccb613e54565b5b612cd7848285613c16565b509392505050565b6000612cf2612ced84613a0e565b6139b8565b905082815260208101848484011115612d0e57612d0d613e54565b5b612d19848285613c16565b509392505050565b600081359050612d308161459f565b92915050565b600081359050612d45816145b6565b92915050565b600081359050612d5a816145cd565b92915050565b600081519050612d6f816145cd565b92915050565b600082601f830112612d8a57612d89613e4f565b5b8135612d9a848260208601612c9d565b91505092915050565b600082601f830112612db857612db7613e4f565b5b8135612dc8848260208601612cdf565b91505092915050565b600081359050612de0816145e4565b92915050565b600060208284031215612dfc57612dfb613e5e565b5b6000612e0a84828501612d21565b91505092915050565b60008060408385031215612e2a57612e29613e5e565b5b6000612e3885828601612d21565b9250506020612e4985828601612d21565b9150509250929050565b600080600060608486031215612e6c57612e6b613e5e565b5b6000612e7a86828701612d21565b9350506020612e8b86828701612d21565b9250506040612e9c86828701612dd1565b9150509250925092565b60008060008060808587031215612ec057612ebf613e5e565b5b6000612ece87828801612d21565b9450506020612edf87828801612d21565b9350506040612ef087828801612dd1565b925050606085013567ffffffffffffffff811115612f1157612f10613e59565b5b612f1d87828801612d75565b91505092959194509250565b60008060408385031215612f4057612f3f613e5e565b5b6000612f4e85828601612d21565b9250506020612f5f85828601612d36565b9150509250929050565b60008060408385031215612f8057612f7f613e5e565b5b6000612f8e85828601612d21565b9250506020612f9f85828601612dd1565b9150509250929050565b600060208284031215612fbf57612fbe613e5e565b5b6000612fcd84828501612d4b565b91505092915050565b600060208284031215612fec57612feb613e5e565b5b6000612ffa84828501612d60565b91505092915050565b60006020828403121561301957613018613e5e565b5b600082013567ffffffffffffffff81111561303757613036613e59565b5b61304384828501612da3565b91505092915050565b60006020828403121561306257613061613e5e565b5b600061307084828501612dd1565b91505092915050565b61308281613ba2565b82525050565b61309181613bb4565b82525050565b60006130a282613a3f565b6130ac8185613a55565b93506130bc818560208601613c25565b6130c581613e63565b840191505092915050565b60006130db82613a4a565b6130e58185613a71565b93506130f5818560208601613c25565b6130fe81613e63565b840191505092915050565b600061311482613a4a565b61311e8185613a82565b935061312e818560208601613c25565b80840191505092915050565b6000613147602b83613a71565b915061315282613e74565b604082019050919050565b600061316a601483613a71565b915061317582613ec3565b602082019050919050565b600061318d602b83613a71565b915061319882613eec565b604082019050919050565b60006131b0603283613a71565b91506131bb82613f3b565b604082019050919050565b60006131d3602683613a71565b91506131de82613f8a565b604082019050919050565b60006131f6601083613a71565b915061320182613fd9565b602082019050919050565b6000613219601c83613a71565b915061322482614002565b602082019050919050565b600061323c602483613a71565b91506132478261402b565b604082019050919050565b600061325f601983613a71565b915061326a8261407a565b602082019050919050565b6000613282602c83613a71565b915061328d826140a3565b604082019050919050565b60006132a5602f83613a71565b91506132b0826140f2565b604082019050919050565b60006132c8601083613a71565b91506132d382614141565b602082019050919050565b60006132eb603883613a71565b91506132f68261416a565b604082019050919050565b600061330e602a83613a71565b9150613319826141b9565b604082019050919050565b6000613331602983613a71565b915061333c82614208565b604082019050919050565b6000613354602b83613a71565b915061335f82614257565b604082019050919050565b6000613377602083613a71565b9150613382826142a6565b602082019050919050565b600061339a602c83613a71565b91506133a5826142cf565b604082019050919050565b60006133bd602083613a71565b91506133c88261431e565b602082019050919050565b60006133e0602983613a71565b91506133eb82614347565b604082019050919050565b6000613403602f83613a71565b915061340e82614396565b604082019050919050565b6000613426602183613a71565b9150613431826143e5565b604082019050919050565b6000613449600083613a66565b915061345482614434565b600082019050919050565b600061346c603183613a71565b915061347782614437565b604082019050919050565b600061348f601d83613a71565b915061349a82614486565b602082019050919050565b60006134b2602c83613a71565b91506134bd826144af565b604082019050919050565b60006134d5601083613a71565b91506134e0826144fe565b602082019050919050565b60006134f8601c83613a71565b915061350382614527565b602082019050919050565b600061351b603083613a71565b915061352682614550565b604082019050919050565b61353a81613c0c565b82525050565b600061354c8285613109565b91506135588284613109565b91508190509392505050565b600061356f8261343c565b9150819050919050565b600060208201905061358e6000830184613079565b92915050565b60006080820190506135a96000830187613079565b6135b66020830186613079565b6135c36040830185613531565b81810360608301526135d58184613097565b905095945050505050565b60006020820190506135f56000830184613088565b92915050565b6000602082019050818103600083015261361581846130d0565b905092915050565b600060208201905081810360008301526136368161313a565b9050919050565b600060208201905081810360008301526136568161315d565b9050919050565b6000602082019050818103600083015261367681613180565b9050919050565b60006020820190508181036000830152613696816131a3565b9050919050565b600060208201905081810360008301526136b6816131c6565b9050919050565b600060208201905081810360008301526136d6816131e9565b9050919050565b600060208201905081810360008301526136f68161320c565b9050919050565b600060208201905081810360008301526137168161322f565b9050919050565b6000602082019050818103600083015261373681613252565b9050919050565b6000602082019050818103600083015261375681613275565b9050919050565b6000602082019050818103600083015261377681613298565b9050919050565b60006020820190508181036000830152613796816132bb565b9050919050565b600060208201905081810360008301526137b6816132de565b9050919050565b600060208201905081810360008301526137d681613301565b9050919050565b600060208201905081810360008301526137f681613324565b9050919050565b6000602082019050818103600083015261381681613347565b9050919050565b600060208201905081810360008301526138368161336a565b9050919050565b600060208201905081810360008301526138568161338d565b9050919050565b60006020820190508181036000830152613876816133b0565b9050919050565b60006020820190508181036000830152613896816133d3565b9050919050565b600060208201905081810360008301526138b6816133f6565b9050919050565b600060208201905081810360008301526138d681613419565b9050919050565b600060208201905081810360008301526138f68161345f565b9050919050565b6000602082019050818103600083015261391681613482565b9050919050565b60006020820190508181036000830152613936816134a5565b9050919050565b60006020820190508181036000830152613956816134c8565b9050919050565b60006020820190508181036000830152613976816134eb565b9050919050565b600060208201905081810360008301526139968161350e565b9050919050565b60006020820190506139b26000830184613531565b92915050565b60006139c26139d3565b90506139ce8282613c8a565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f8576139f7613e20565b5b613a0182613e63565b9050602081019050919050565b600067ffffffffffffffff821115613a2957613a28613e20565b5b613a3282613e63565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9882613c0c565b9150613aa383613c0c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad857613ad7613d35565b5b828201905092915050565b6000613aee82613c0c565b9150613af983613c0c565b925082613b0957613b08613d64565b5b828204905092915050565b6000613b1f82613c0c565b9150613b2a83613c0c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6357613b62613d35565b5b828202905092915050565b6000613b7982613c0c565b9150613b8483613c0c565b925082821015613b9757613b96613d35565b5b828203905092915050565b6000613bad82613bec565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c43578082015181840152602081019050613c28565b83811115613c52576000848401525b50505050565b60006002820490506001821680613c7057607f821691505b60208210811415613c8457613c83613d93565b5b50919050565b613c9382613e63565b810181811067ffffffffffffffff82111715613cb257613cb1613e20565b5b80604052505050565b6000613cc682613c0c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cf957613cf8613d35565b5b600182019050919050565b6000613d0f82613c0c565b9150613d1a83613c0c565b925082613d2a57613d29613d64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5265636f76657279206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436f756e7420697320746f6f20686967682c20796f752063616e206f6e6c792060008201527f627579203130206174206f6e63652e0000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f52657175657374656420616d6f756e742065786365656473207768617420697360008201527f20617661696c61626c6521000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682070756666696e7320617661696c61626c652e000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f72726563742070726963652e00000000000000000000000000000000600082015250565b7f436f756e74206d7573742062652067726561746572207468616e203000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6145a881613ba2565b81146145b357600080fd5b50565b6145bf81613bb4565b81146145ca57600080fd5b50565b6145d681613bc0565b81146145e157600080fd5b50565b6145ed81613c0c565b81146145f857600080fd5b5056fea26469706673582212200a546b546916b9d4607881a459e450c0729156aead159038b9766cbd33e84c0764736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f6170692e6c6f737470756666696e732e636f6d2f00000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://api.lostpuffins.com/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [2] : 68747470733a2f2f6170692e6c6f737470756666696e732e636f6d2f00000000


Deployed Bytecode Sourcemap

52387:2477:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54673:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20786:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22345:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21868:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52565:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34889:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23235:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34557:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54070:65;;;;;;;;;;;;;:::i;:::-;;23645:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32307:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35079:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53894:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41380:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20480:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20210:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44894:94;;;;;;;;;;;;;:::i;:::-;;54003:61;;;;;;;;;;;;;:::i;:::-;;54141:112;;;:::i;:::-;;52611:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44243:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20955:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52518:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53090:670;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22638:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52661:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23901:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21130:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52710:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23004:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45143:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54673:188;54799:4;54819:36;54843:11;54819:23;:36::i;:::-;54812:43;;54673:188;;;:::o;20786:100::-;20840:13;20873:5;20866:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20786:100;:::o;22345:221::-;22421:7;22449:16;22457:7;22449;:16::i;:::-;22441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22534:15;:24;22550:7;22534:24;;;;;;;;;;;;;;;;;;;;;22527:31;;22345:221;;;:::o;21868:411::-;21949:13;21965:23;21980:7;21965:14;:23::i;:::-;21949:39;;22013:5;22007:11;;:2;:11;;;;21999:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22107:5;22091:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22116:37;22133:5;22140:12;:10;:12::i;:::-;22116:16;:37::i;:::-;22091:62;22069:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22250:21;22259:2;22263:7;22250:8;:21::i;:::-;21938:341;21868:411;;:::o;52565:41::-;52604:2;52565:41;:::o;34889:113::-;34950:7;34977:10;:17;;;;34970:24;;34889:113;:::o;23235:339::-;23430:41;23449:12;:10;:12::i;:::-;23463:7;23430:18;:41::i;:::-;23422:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23538:28;23548:4;23554:2;23558:7;23538:9;:28::i;:::-;23235:339;;;:::o;34557:256::-;34654:7;34690:23;34707:5;34690:16;:23::i;:::-;34682:5;:31;34674:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34779:12;:19;34792:5;34779:19;;;;;;;;;;;;;;;:26;34799:5;34779:26;;;;;;;;;;;;34772:33;;34557:256;;;;:::o;54070:65::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54119:10:::1;:8;:10::i;:::-;54070:65::o:0;23645:185::-;23783:39;23800:4;23806:2;23810:7;23783:39;;;;;;;;;;;;:16;:39::i;:::-;23645:185;;;:::o;32307:245::-;32425:41;32444:12;:10;:12::i;:::-;32458:7;32425:18;:41::i;:::-;32417:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;32530:14;32536:7;32530:5;:14::i;:::-;32307:245;:::o;35079:233::-;35154:7;35190:30;:28;:30::i;:::-;35182:5;:38;35174:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35287:10;35298:5;35287:17;;;;;;;;:::i;:::-;;;;;;;;;;35280:24;;35079:233;;;:::o;53894:101::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53982:7:::1;53967:12;:22;;;;;;;;;;;;:::i;:::-;;53894:101:::0;:::o;41380:86::-;41427:4;41451:7;;;;;;;;;;;41444:14;;41380:86;:::o;20480:239::-;20552:7;20572:13;20588:7;:16;20596:7;20588:16;;;;;;;;;;;;;;;;;;;;;20572:32;;20640:1;20623:19;;:5;:19;;;;20615:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20706:5;20699:12;;;20480:239;;;:::o;20210:208::-;20282:7;20327:1;20310:19;;:5;:19;;;;20302:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20394:9;:16;20404:5;20394:16;;;;;;;;;;;;;;;;20387:23;;20210:208;;;:::o;44894:94::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44959:21:::1;44977:1;44959:9;:21::i;:::-;44894:94::o:0;54003:61::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54050:8:::1;:6;:8::i;:::-;54003:61::o:0;54141:112::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54205:42:::1;54216:7;:5;:7::i;:::-;54225:21;54205:10;:42::i;:::-;54141:112::o:0;52611:45::-;52643:13;52611:45;:::o;44243:87::-;44289:7;44316:6;;;;;;;;;;;44309:13;;44243:87;:::o;20955:104::-;21011:13;21044:7;21037:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20955:104;:::o;52518:42::-;52556:4;52518:42;:::o;53090:670::-;53147:20;53170:13;:11;:13::i;:::-;53147:36;;53206:1;53198:5;:9;53190:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52604:2;53262:5;:21;;53254:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52556:4;53357:23;53374:5;53357:12;:16;;:23;;;;:::i;:::-;:38;;53349:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;52556:4;53465:12;:27;;53457:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53561:16;53571:5;52643:13;53561:9;;:16;;;;:::i;:::-;53548:9;:29;;53540:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53619:6;53614:141;53635:5;53631:1;:9;53614:141;;;53656:7;53666:13;:11;:13::i;:::-;53656:23;;53688:25;53698:10;53710:2;53688:9;:25::i;:::-;53744:2;53727:20;;;;;;;;;;53647:108;53642:3;;;;;:::i;:::-;;;;53614:141;;;;53140:620;53090:670;:::o;22638:295::-;22753:12;:10;:12::i;:::-;22741:24;;:8;:24;;;;22733:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22853:8;22808:18;:32;22827:12;:10;:12::i;:::-;22808:32;;;;;;;;;;;;;;;:42;22841:8;22808:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22906:8;22877:48;;22892:12;:10;:12::i;:::-;22877:48;;;22916:8;22877:48;;;;;;:::i;:::-;;;;;;;;22638:295;;:::o;52661:44::-;52703:2;52661:44;:::o;23901:328::-;24076:41;24095:12;:10;:12::i;:::-;24109:7;24076:18;:41::i;:::-;24068:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24182:39;24196:4;24202:2;24206:7;24215:5;24182:13;:39::i;:::-;23901:328;;;;:::o;21130:334::-;21203:13;21237:16;21245:7;21237;:16::i;:::-;21229:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21318:21;21342:10;:8;:10::i;:::-;21318:34;;21394:1;21376:7;21370:21;:25;:86;;;;;;;;;;;;;;;;;21422:7;21431:18;:7;:16;:18::i;:::-;21405:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21370:86;21363:93;;;21130:334;;;:::o;52710:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23004:164::-;23101:4;23125:18;:25;23144:5;23125:25;;;;;;;;;;;;;;;:35;23151:8;23125:35;;;;;;;;;;;;;;;;;;;;;;;;;23118:42;;23004:164;;;;:::o;45143:192::-;44474:12;:10;:12::i;:::-;44463:23;;:7;:5;:7::i;:::-;:23;;;44455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45252:1:::1;45232:22;;:8;:22;;;;45224:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45308:19;45318:8;45308:9;:19::i;:::-;45143:192:::0;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;43051:275::-;43195:45;43222:4;43228:2;43232:7;43195:26;:45::i;:::-;43262:8;:6;:8::i;:::-;43261:9;43253:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43051:275;;;:::o;35925:589::-;36069:45;36096:4;36102:2;36106:7;36069:26;:45::i;:::-;36147:1;36131:18;;:4;:18;;;36127:187;;;36166:40;36198:7;36166:31;:40::i;:::-;36127:187;;;36236:2;36228:10;;:4;:10;;;36224:90;;36255:47;36288:4;36294:7;36255:32;:47::i;:::-;36224:90;36127:187;36342:1;36328:16;;:2;:16;;;36324:183;;;36361:45;36398:7;36361:36;:45::i;:::-;36324:183;;;36434:4;36428:10;;:2;:10;;;36424:83;;36455:40;36483:2;36487:7;36455:27;:40::i;:::-;36424:83;36324:183;35925:589;;;:::o;31831:126::-;;;;:::o;34249:224::-;34351:4;34390:35;34375:50;;;:11;:50;;;;:90;;;;34429:36;34453:11;34429:23;:36::i;:::-;34375:90;34368:97;;34249:224;;;:::o;25739:127::-;25804:4;25856:1;25828:30;;:7;:16;25836:7;25828:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25821:37;;25739:127;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;29721:174::-;29823:2;29796:15;:24;29812:7;29796:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29879:7;29875:2;29841:46;;29850:23;29865:7;29850:14;:23::i;:::-;29841:46;;;;;;;;;;;;29721:174;;:::o;26033:348::-;26126:4;26151:16;26159:7;26151;:16::i;:::-;26143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26227:13;26243:23;26258:7;26243:14;:23::i;:::-;26227:39;;26296:5;26285:16;;:7;:16;;;:51;;;;26329:7;26305:31;;:20;26317:7;26305:11;:20::i;:::-;:31;;;26285:51;:87;;;;26340:32;26357:5;26364:7;26340:16;:32::i;:::-;26285:87;26277:96;;;26033:348;;;;:::o;29025:578::-;29184:4;29157:31;;:23;29172:7;29157:14;:23::i;:::-;:31;;;29149:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29267:1;29253:16;;:2;:16;;;;29245:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29323:39;29344:4;29350:2;29354:7;29323:20;:39::i;:::-;29427:29;29444:1;29448:7;29427:8;:29::i;:::-;29488:1;29469:9;:15;29479:4;29469:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29517:1;29500:9;:13;29510:2;29500:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29548:2;29529:7;:16;29537:7;29529:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29587:7;29583:2;29568:27;;29577:4;29568:27;;;;;;;;;;;;29025:578;;;:::o;42439:120::-;41983:8;:6;:8::i;:::-;41975:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42508:5:::1;42498:7;;:15;;;;;;;;;;;;;;;;;;42529:22;42538:12;:10;:12::i;:::-;42529:22;;;;;;:::i;:::-;;;;;;;;42439:120::o:0;28328:360::-;28388:13;28404:23;28419:7;28404:14;:23::i;:::-;28388:39;;28440:48;28461:5;28476:1;28480:7;28440:20;:48::i;:::-;28529:29;28546:1;28550:7;28529:8;:29::i;:::-;28591:1;28571:9;:16;28581:5;28571:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28610:7;:16;28618:7;28610:16;;;;;;;;;;;;28603:23;;;;;;;;;;;28672:7;28668:1;28644:36;;28653:5;28644:36;;;;;;;;;;;;28377:311;28328:360;:::o;45343:173::-;45399:16;45418:6;;;;;;;;;;;45399:25;;45444:8;45435:6;;:17;;;;;;;;;;;;;;;;;;45499:8;45468:40;;45489:8;45468:40;;;;;;;;;;;;45388:128;45343:173;:::o;42180:118::-;41706:8;:6;:8::i;:::-;41705:9;41697:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42250:4:::1;42240:7;;:14;;;;;;;;;;;;;;;;;;42270:20;42277:12;:10;:12::i;:::-;42270:20;;;;;;:::i;:::-;;;;;;;;42180:118::o:0;54259:174::-;54333:12;54351:8;:13;;54372:7;54351:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54332:52;;;54399:7;54391:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;54325:108;54259:174;;:::o;48222:98::-;48280:7;48311:1;48307;:5;;;;:::i;:::-;48300:12;;48222:98;;;;:::o;48960:::-;49018:7;49049:1;49045;:5;;;;:::i;:::-;49038:12;;48960:98;;;;:::o;26723:110::-;26799:26;26809:2;26813:7;26799:26;;;;;;;;;;;;:9;:26::i;:::-;26723:110;;:::o;25111:315::-;25268:28;25278:4;25284:2;25288:7;25268:9;:28::i;:::-;25315:48;25338:4;25344:2;25348:7;25357:5;25315:22;:48::i;:::-;25307:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25111:315;;;;:::o;53766:122::-;53841:13;53870:12;53863:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53766:122;:::o;15993:723::-;16049:13;16279:1;16270:5;:10;16266:53;;;16297:10;;;;;;;;;;;;;;;;;;;;;16266:53;16329:12;16344:5;16329:20;;16360:14;16385:78;16400:1;16392:4;:9;16385:78;;16418:8;;;;;:::i;:::-;;;;16449:2;16441:10;;;;;:::i;:::-;;;16385:78;;;16473:19;16505:6;16495:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16473:39;;16523:154;16539:1;16530:5;:10;16523:154;;16567:1;16557:11;;;;;:::i;:::-;;;16634:2;16626:5;:10;;;;:::i;:::-;16613:2;:24;;;;:::i;:::-;16600:39;;16583:6;16590;16583:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16663:2;16654:11;;;;;:::i;:::-;;;16523:154;;;16701:6;16687:21;;;;;15993:723;;;;:::o;37237:164::-;37341:10;:17;;;;37314:15;:24;37330:7;37314:24;;;;;;;;;;;:44;;;;37369:10;37385:7;37369:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37237:164;:::o;38028:988::-;38294:22;38344:1;38319:22;38336:4;38319:16;:22::i;:::-;:26;;;;:::i;:::-;38294:51;;38356:18;38377:17;:26;38395:7;38377:26;;;;;;;;;;;;38356:47;;38524:14;38510:10;:28;38506:328;;38555:19;38577:12;:18;38590:4;38577:18;;;;;;;;;;;;;;;:34;38596:14;38577:34;;;;;;;;;;;;38555:56;;38661:11;38628:12;:18;38641:4;38628:18;;;;;;;;;;;;;;;:30;38647:10;38628:30;;;;;;;;;;;:44;;;;38778:10;38745:17;:30;38763:11;38745:30;;;;;;;;;;;:43;;;;38540:294;38506:328;38930:17;:26;38948:7;38930:26;;;;;;;;;;;38923:33;;;38974:12;:18;38987:4;38974:18;;;;;;;;;;;;;;;:34;38993:14;38974:34;;;;;;;;;;;38967:41;;;38109:907;;38028:988;;:::o;39311:1079::-;39564:22;39609:1;39589:10;:17;;;;:21;;;;:::i;:::-;39564:46;;39621:18;39642:15;:24;39658:7;39642:24;;;;;;;;;;;;39621:45;;39993:19;40015:10;40026:14;40015:26;;;;;;;;:::i;:::-;;;;;;;;;;39993:48;;40079:11;40054:10;40065;40054:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40190:10;40159:15;:28;40175:11;40159:28;;;;;;;;;;;:41;;;;40331:15;:24;40347:7;40331:24;;;;;;;;;;;40324:31;;;40366:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39382:1008;;;39311:1079;:::o;36815:221::-;36900:14;36917:20;36934:2;36917:16;:20::i;:::-;36900:37;;36975:7;36948:12;:16;36961:2;36948:16;;;;;;;;;;;;;;;:24;36965:6;36948:24;;;;;;;;;;;:34;;;;37022:6;36993:17;:26;37011:7;36993:26;;;;;;;;;;;:35;;;;36889:147;36815:221;;:::o;19841:305::-;19943:4;19995:25;19980:40;;;:11;:40;;;;:105;;;;20052:33;20037:48;;;:11;:48;;;;19980:105;:158;;;;20102:36;20126:11;20102:23;:36::i;:::-;19980:158;19960:178;;19841:305;;;:::o;54439:228::-;54616:45;54643:4;54649:2;54653:7;54616:26;:45::i;:::-;54439:228;;;:::o;27060:321::-;27190:18;27196:2;27200:7;27190:5;:18::i;:::-;27241:54;27272:1;27276:2;27280:7;27289:5;27241:22;:54::i;:::-;27219:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27060:321;;;:::o;30460:799::-;30615:4;30636:15;:2;:13;;;:15::i;:::-;30632:620;;;30688:2;30672:36;;;30709:12;:10;:12::i;:::-;30723:4;30729:7;30738:5;30672:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30668:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30931:1;30914:6;:13;:18;30910:272;;;30957:60;;;;;;;;;;:::i;:::-;;;;;;;;30910:272;31132:6;31126:13;31117:6;31113:2;31109:15;31102:38;30668:529;30805:41;;;30795:51;;;:6;:51;;;;30788:58;;;;;30632:620;31236:4;31229:11;;30460:799;;;;;;;:::o;18450:157::-;18535:4;18574:25;18559:40;;;:11;:40;;;;18552:47;;18450:157;;;:::o;27717:382::-;27811:1;27797:16;;:2;:16;;;;27789:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27870:16;27878:7;27870;:16::i;:::-;27869:17;27861:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27932:45;27961:1;27965:2;27969:7;27932:20;:45::i;:::-;28007:1;27990:9;:13;28000:2;27990:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28038:2;28019:7;:16;28027:7;28019:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28083:7;28079:2;28058:33;;28075:1;28058:33;;;;;;;;;;;;27717:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:398::-;16859:3;16880:83;16961:1;16956:3;16880:83;:::i;:::-;16873:90;;16972:93;17061:3;16972:93;:::i;:::-;17090:1;17085:3;17081:11;17074:18;;16700:398;;;:::o;17104:366::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:::-;19106:3;19127:67;19191:2;19186:3;19127:67;:::i;:::-;19120:74;;19203:93;19292:3;19203:93;:::i;:::-;19321:2;19316:3;19312:12;19305:19;;18964:366;;;:::o;19336:118::-;19423:24;19441:5;19423:24;:::i;:::-;19418:3;19411:37;19336:118;;:::o;19460:435::-;19640:3;19662:95;19753:3;19744:6;19662:95;:::i;:::-;19655:102;;19774:95;19865:3;19856:6;19774:95;:::i;:::-;19767:102;;19886:3;19879:10;;19460:435;;;;;:::o;19901:379::-;20085:3;20107:147;20250:3;20107:147;:::i;:::-;20100:154;;20271:3;20264:10;;19901:379;;;:::o;20286:222::-;20379:4;20417:2;20406:9;20402:18;20394:26;;20430:71;20498:1;20487:9;20483:17;20474:6;20430:71;:::i;:::-;20286:222;;;;:::o;20514:640::-;20709:4;20747:3;20736:9;20732:19;20724:27;;20761:71;20829:1;20818:9;20814:17;20805:6;20761:71;:::i;:::-;20842:72;20910:2;20899:9;20895:18;20886:6;20842:72;:::i;:::-;20924;20992:2;20981:9;20977:18;20968:6;20924:72;:::i;:::-;21043:9;21037:4;21033:20;21028:2;21017:9;21013:18;21006:48;21071:76;21142:4;21133:6;21071:76;:::i;:::-;21063:84;;20514:640;;;;;;;:::o;21160:210::-;21247:4;21285:2;21274:9;21270:18;21262:26;;21298:65;21360:1;21349:9;21345:17;21336:6;21298:65;:::i;:::-;21160:210;;;;:::o;21376:313::-;21489:4;21527:2;21516:9;21512:18;21504:26;;21576:9;21570:4;21566:20;21562:1;21551:9;21547:17;21540:47;21604:78;21677:4;21668:6;21604:78;:::i;:::-;21596:86;;21376:313;;;;:::o;21695:419::-;21861:4;21899:2;21888:9;21884:18;21876:26;;21948:9;21942:4;21938:20;21934:1;21923:9;21919:17;21912:47;21976:131;22102:4;21976:131;:::i;:::-;21968:139;;21695:419;;;:::o;22120:::-;22286:4;22324:2;22313:9;22309:18;22301:26;;22373:9;22367:4;22363:20;22359:1;22348:9;22344:17;22337:47;22401:131;22527:4;22401:131;:::i;:::-;22393:139;;22120:419;;;:::o;22545:::-;22711:4;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22545:419;;;:::o;22970:::-;23136:4;23174:2;23163:9;23159:18;23151:26;;23223:9;23217:4;23213:20;23209:1;23198:9;23194:17;23187:47;23251:131;23377:4;23251:131;:::i;:::-;23243:139;;22970:419;;;:::o;23395:::-;23561:4;23599:2;23588:9;23584:18;23576:26;;23648:9;23642:4;23638:20;23634:1;23623:9;23619:17;23612:47;23676:131;23802:4;23676:131;:::i;:::-;23668:139;;23395:419;;;:::o;23820:::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:131;24227:4;24101:131;:::i;:::-;24093:139;;23820:419;;;:::o;24245:::-;24411:4;24449:2;24438:9;24434:18;24426:26;;24498:9;24492:4;24488:20;24484:1;24473:9;24469:17;24462:47;24526:131;24652:4;24526:131;:::i;:::-;24518:139;;24245:419;;;:::o;24670:::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24670:419;;;:::o;25095:::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25095:419;;;:::o;25520:::-;25686:4;25724:2;25713:9;25709:18;25701:26;;25773:9;25767:4;25763:20;25759:1;25748:9;25744:17;25737:47;25801:131;25927:4;25801:131;:::i;:::-;25793:139;;25520:419;;;:::o;25945:::-;26111:4;26149:2;26138:9;26134:18;26126:26;;26198:9;26192:4;26188:20;26184:1;26173:9;26169:17;26162:47;26226:131;26352:4;26226:131;:::i;:::-;26218:139;;25945:419;;;:::o;26370:::-;26536:4;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26370:419;;;:::o;26795:::-;26961:4;26999:2;26988:9;26984:18;26976:26;;27048:9;27042:4;27038:20;27034:1;27023:9;27019:17;27012:47;27076:131;27202:4;27076:131;:::i;:::-;27068:139;;26795:419;;;:::o;27220:::-;27386:4;27424:2;27413:9;27409:18;27401:26;;27473:9;27467:4;27463:20;27459:1;27448:9;27444:17;27437:47;27501:131;27627:4;27501:131;:::i;:::-;27493:139;;27220:419;;;:::o;27645:::-;27811:4;27849:2;27838:9;27834:18;27826:26;;27898:9;27892:4;27888:20;27884:1;27873:9;27869:17;27862:47;27926:131;28052:4;27926:131;:::i;:::-;27918:139;;27645:419;;;:::o;28070:::-;28236:4;28274:2;28263:9;28259:18;28251:26;;28323:9;28317:4;28313:20;28309:1;28298:9;28294:17;28287:47;28351:131;28477:4;28351:131;:::i;:::-;28343:139;;28070:419;;;:::o;28495:::-;28661:4;28699:2;28688:9;28684:18;28676:26;;28748:9;28742:4;28738:20;28734:1;28723:9;28719:17;28712:47;28776:131;28902:4;28776:131;:::i;:::-;28768:139;;28495:419;;;:::o;28920:::-;29086:4;29124:2;29113:9;29109:18;29101:26;;29173:9;29167:4;29163:20;29159:1;29148:9;29144:17;29137:47;29201:131;29327:4;29201:131;:::i;:::-;29193:139;;28920:419;;;:::o;29345:::-;29511:4;29549:2;29538:9;29534:18;29526:26;;29598:9;29592:4;29588:20;29584:1;29573:9;29569:17;29562:47;29626:131;29752:4;29626:131;:::i;:::-;29618:139;;29345:419;;;:::o;29770:::-;29936:4;29974:2;29963:9;29959:18;29951:26;;30023:9;30017:4;30013:20;30009:1;29998:9;29994:17;29987:47;30051:131;30177:4;30051:131;:::i;:::-;30043:139;;29770:419;;;:::o;30195:::-;30361:4;30399:2;30388:9;30384:18;30376:26;;30448:9;30442:4;30438:20;30434:1;30423:9;30419:17;30412:47;30476:131;30602:4;30476:131;:::i;:::-;30468:139;;30195:419;;;:::o;30620:::-;30786:4;30824:2;30813:9;30809:18;30801:26;;30873:9;30867:4;30863:20;30859:1;30848:9;30844:17;30837:47;30901:131;31027:4;30901:131;:::i;:::-;30893:139;;30620:419;;;:::o;31045:::-;31211:4;31249:2;31238:9;31234:18;31226:26;;31298:9;31292:4;31288:20;31284:1;31273:9;31269:17;31262:47;31326:131;31452:4;31326:131;:::i;:::-;31318:139;;31045:419;;;:::o;31470:::-;31636:4;31674:2;31663:9;31659:18;31651:26;;31723:9;31717:4;31713:20;31709:1;31698:9;31694:17;31687:47;31751:131;31877:4;31751:131;:::i;:::-;31743:139;;31470:419;;;:::o;31895:::-;32061:4;32099:2;32088:9;32084:18;32076:26;;32148:9;32142:4;32138:20;32134:1;32123:9;32119:17;32112:47;32176:131;32302:4;32176:131;:::i;:::-;32168:139;;31895:419;;;:::o;32320:::-;32486:4;32524:2;32513:9;32509:18;32501:26;;32573:9;32567:4;32563:20;32559:1;32548:9;32544:17;32537:47;32601:131;32727:4;32601:131;:::i;:::-;32593:139;;32320:419;;;:::o;32745:::-;32911:4;32949:2;32938:9;32934:18;32926:26;;32998:9;32992:4;32988:20;32984:1;32973:9;32969:17;32962:47;33026:131;33152:4;33026:131;:::i;:::-;33018:139;;32745:419;;;:::o;33170:::-;33336:4;33374:2;33363:9;33359:18;33351:26;;33423:9;33417:4;33413:20;33409:1;33398:9;33394:17;33387:47;33451:131;33577:4;33451:131;:::i;:::-;33443:139;;33170:419;;;:::o;33595:222::-;33688:4;33726:2;33715:9;33711:18;33703:26;;33739:71;33807:1;33796:9;33792:17;33783:6;33739:71;:::i;:::-;33595:222;;;;:::o;33823:129::-;33857:6;33884:20;;:::i;:::-;33874:30;;33913:33;33941:4;33933:6;33913:33;:::i;:::-;33823:129;;;:::o;33958:75::-;33991:6;34024:2;34018:9;34008:19;;33958:75;:::o;34039:307::-;34100:4;34190:18;34182:6;34179:30;34176:56;;;34212:18;;:::i;:::-;34176:56;34250:29;34272:6;34250:29;:::i;:::-;34242:37;;34334:4;34328;34324:15;34316:23;;34039:307;;;:::o;34352:308::-;34414:4;34504:18;34496:6;34493:30;34490:56;;;34526:18;;:::i;:::-;34490:56;34564:29;34586:6;34564:29;:::i;:::-;34556:37;;34648:4;34642;34638:15;34630:23;;34352:308;;;:::o;34666:98::-;34717:6;34751:5;34745:12;34735:22;;34666:98;;;:::o;34770:99::-;34822:6;34856:5;34850:12;34840:22;;34770:99;;;:::o;34875:168::-;34958:11;34992:6;34987:3;34980:19;35032:4;35027:3;35023:14;35008:29;;34875:168;;;;:::o;35049:147::-;35150:11;35187:3;35172:18;;35049:147;;;;:::o;35202:169::-;35286:11;35320:6;35315:3;35308:19;35360:4;35355:3;35351:14;35336:29;;35202:169;;;;:::o;35377:148::-;35479:11;35516:3;35501:18;;35377:148;;;;:::o;35531:305::-;35571:3;35590:20;35608:1;35590:20;:::i;:::-;35585:25;;35624:20;35642:1;35624:20;:::i;:::-;35619:25;;35778:1;35710:66;35706:74;35703:1;35700:81;35697:107;;;35784:18;;:::i;:::-;35697:107;35828:1;35825;35821:9;35814:16;;35531:305;;;;:::o;35842:185::-;35882:1;35899:20;35917:1;35899:20;:::i;:::-;35894:25;;35933:20;35951:1;35933:20;:::i;:::-;35928:25;;35972:1;35962:35;;35977:18;;:::i;:::-;35962:35;36019:1;36016;36012:9;36007:14;;35842:185;;;;:::o;36033:348::-;36073:7;36096:20;36114:1;36096:20;:::i;:::-;36091:25;;36130:20;36148:1;36130:20;:::i;:::-;36125:25;;36318:1;36250:66;36246:74;36243:1;36240:81;36235:1;36228:9;36221:17;36217:105;36214:131;;;36325:18;;:::i;:::-;36214:131;36373:1;36370;36366:9;36355:20;;36033:348;;;;:::o;36387:191::-;36427:4;36447:20;36465:1;36447:20;:::i;:::-;36442:25;;36481:20;36499:1;36481:20;:::i;:::-;36476:25;;36520:1;36517;36514:8;36511:34;;;36525:18;;:::i;:::-;36511:34;36570:1;36567;36563:9;36555:17;;36387:191;;;;:::o;36584:96::-;36621:7;36650:24;36668:5;36650:24;:::i;:::-;36639:35;;36584:96;;;:::o;36686:90::-;36720:7;36763:5;36756:13;36749:21;36738:32;;36686:90;;;:::o;36782:149::-;36818:7;36858:66;36851:5;36847:78;36836:89;;36782:149;;;:::o;36937:126::-;36974:7;37014:42;37007:5;37003:54;36992:65;;36937:126;;;:::o;37069:77::-;37106:7;37135:5;37124:16;;37069:77;;;:::o;37152:154::-;37236:6;37231:3;37226;37213:30;37298:1;37289:6;37284:3;37280:16;37273:27;37152:154;;;:::o;37312:307::-;37380:1;37390:113;37404:6;37401:1;37398:13;37390:113;;;37489:1;37484:3;37480:11;37474:18;37470:1;37465:3;37461:11;37454:39;37426:2;37423:1;37419:10;37414:15;;37390:113;;;37521:6;37518:1;37515:13;37512:101;;;37601:1;37592:6;37587:3;37583:16;37576:27;37512:101;37361:258;37312:307;;;:::o;37625:320::-;37669:6;37706:1;37700:4;37696:12;37686:22;;37753:1;37747:4;37743:12;37774:18;37764:81;;37830:4;37822:6;37818:17;37808:27;;37764:81;37892:2;37884:6;37881:14;37861:18;37858:38;37855:84;;;37911:18;;:::i;:::-;37855:84;37676:269;37625:320;;;:::o;37951:281::-;38034:27;38056:4;38034:27;:::i;:::-;38026:6;38022:40;38164:6;38152:10;38149:22;38128:18;38116:10;38113:34;38110:62;38107:88;;;38175:18;;:::i;:::-;38107:88;38215:10;38211:2;38204:22;37994:238;37951:281;;:::o;38238:233::-;38277:3;38300:24;38318:5;38300:24;:::i;:::-;38291:33;;38346:66;38339:5;38336:77;38333:103;;;38416:18;;:::i;:::-;38333:103;38463:1;38456:5;38452:13;38445:20;;38238:233;;;:::o;38477:176::-;38509:1;38526:20;38544:1;38526:20;:::i;:::-;38521:25;;38560:20;38578:1;38560:20;:::i;:::-;38555:25;;38599:1;38589:35;;38604:18;;:::i;:::-;38589:35;38645:1;38642;38638:9;38633:14;;38477:176;;;;:::o;38659:180::-;38707:77;38704:1;38697:88;38804:4;38801:1;38794:15;38828:4;38825:1;38818:15;38845:180;38893:77;38890:1;38883:88;38990:4;38987:1;38980:15;39014:4;39011:1;39004:15;39031:180;39079:77;39076:1;39069:88;39176:4;39173:1;39166:15;39200:4;39197:1;39190:15;39217:180;39265:77;39262:1;39255:88;39362:4;39359:1;39352:15;39386:4;39383:1;39376:15;39403:180;39451:77;39448:1;39441:88;39548:4;39545:1;39538:15;39572:4;39569:1;39562:15;39589:180;39637:77;39634:1;39627:88;39734:4;39731:1;39724:15;39758:4;39755:1;39748:15;39775:117;39884:1;39881;39874:12;39898:117;40007:1;40004;39997:12;40021:117;40130:1;40127;40120:12;40144:117;40253:1;40250;40243:12;40267:102;40308:6;40359:2;40355:7;40350:2;40343:5;40339:14;40335:28;40325:38;;40267:102;;;:::o;40375:230::-;40515:34;40511:1;40503:6;40499:14;40492:58;40584:13;40579:2;40571:6;40567:15;40560:38;40375:230;:::o;40611:170::-;40751:22;40747:1;40739:6;40735:14;40728:46;40611:170;:::o;40787:230::-;40927:34;40923:1;40915:6;40911:14;40904:58;40996:13;40991:2;40983:6;40979:15;40972:38;40787:230;:::o;41023:237::-;41163:34;41159:1;41151:6;41147:14;41140:58;41232:20;41227:2;41219:6;41215:15;41208:45;41023:237;:::o;41266:225::-;41406:34;41402:1;41394:6;41390:14;41383:58;41475:8;41470:2;41462:6;41458:15;41451:33;41266:225;:::o;41497:166::-;41637:18;41633:1;41625:6;41621:14;41614:42;41497:166;:::o;41669:178::-;41809:30;41805:1;41797:6;41793:14;41786:54;41669:178;:::o;41853:223::-;41993:34;41989:1;41981:6;41977:14;41970:58;42062:6;42057:2;42049:6;42045:15;42038:31;41853:223;:::o;42082:175::-;42222:27;42218:1;42210:6;42206:14;42199:51;42082:175;:::o;42263:231::-;42403:34;42399:1;42391:6;42387:14;42380:58;42472:14;42467:2;42459:6;42455:15;42448:39;42263:231;:::o;42500:234::-;42640:34;42636:1;42628:6;42624:14;42617:58;42709:17;42704:2;42696:6;42692:15;42685:42;42500:234;:::o;42740:166::-;42880:18;42876:1;42868:6;42864:14;42857:42;42740:166;:::o;42912:243::-;43052:34;43048:1;43040:6;43036:14;43029:58;43121:26;43116:2;43108:6;43104:15;43097:51;42912:243;:::o;43161:229::-;43301:34;43297:1;43289:6;43285:14;43278:58;43370:12;43365:2;43357:6;43353:15;43346:37;43161:229;:::o;43396:228::-;43536:34;43532:1;43524:6;43520:14;43513:58;43605:11;43600:2;43592:6;43588:15;43581:36;43396:228;:::o;43630:230::-;43770:34;43766:1;43758:6;43754:14;43747:58;43839:13;43834:2;43826:6;43822:15;43815:38;43630:230;:::o;43866:182::-;44006:34;44002:1;43994:6;43990:14;43983:58;43866:182;:::o;44054:231::-;44194:34;44190:1;44182:6;44178:14;44171:58;44263:14;44258:2;44250:6;44246:15;44239:39;44054:231;:::o;44291:182::-;44431:34;44427:1;44419:6;44415:14;44408:58;44291:182;:::o;44479:228::-;44619:34;44615:1;44607:6;44603:14;44596:58;44688:11;44683:2;44675:6;44671:15;44664:36;44479:228;:::o;44713:234::-;44853:34;44849:1;44841:6;44837:14;44830:58;44922:17;44917:2;44909:6;44905:15;44898:42;44713:234;:::o;44953:220::-;45093:34;45089:1;45081:6;45077:14;45070:58;45162:3;45157:2;45149:6;45145:15;45138:28;44953:220;:::o;45179:114::-;;:::o;45299:236::-;45439:34;45435:1;45427:6;45423:14;45416:58;45508:19;45503:2;45495:6;45491:15;45484:44;45299:236;:::o;45541:179::-;45681:31;45677:1;45669:6;45665:14;45658:55;45541:179;:::o;45726:231::-;45866:34;45862:1;45854:6;45850:14;45843:58;45935:14;45930:2;45922:6;45918:15;45911:39;45726:231;:::o;45963:166::-;46103:18;46099:1;46091:6;46087:14;46080:42;45963:166;:::o;46135:178::-;46275:30;46271:1;46263:6;46259:14;46252:54;46135:178;:::o;46319:235::-;46459:34;46455:1;46447:6;46443:14;46436:58;46528:18;46523:2;46515:6;46511:15;46504:43;46319:235;:::o;46560:122::-;46633:24;46651:5;46633:24;:::i;:::-;46626:5;46623:35;46613:63;;46672:1;46669;46662:12;46613:63;46560:122;:::o;46688:116::-;46758:21;46773:5;46758:21;:::i;:::-;46751:5;46748:32;46738:60;;46794:1;46791;46784:12;46738:60;46688:116;:::o;46810:120::-;46882:23;46899:5;46882:23;:::i;:::-;46875:5;46872:34;46862:62;;46920:1;46917;46910:12;46862:62;46810:120;:::o;46936:122::-;47009:24;47027:5;47009:24;:::i;:::-;47002:5;46999:35;46989:63;;47048:1;47045;47038:12;46989:63;46936:122;:::o

Swarm Source

ipfs://0a546b546916b9d4607881a459e450c0729156aead159038b9766cbd33e84c07
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.