ETH Price: $3,268.73 (-0.40%)
Gas: 2 Gwei

Token

Golden Poos (POO)
 

Overview

Max Total Supply

323 POO

Holders

148

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fewchure.$stoned.eth
Balance
1 POO
0xd9f23f997993020Eb67BFfC04b43b8d7DDd706BB
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GoldenPoo

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-01
*/

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File contracts/GoldenPoo.sol


pragma solidity ^0.8.0;



contract GoldenPoo is ERC721Enumerable, Ownable, PaymentSplitter {

    using Strings for uint256;

    string public _baseTokenURI = 'https://ipfs.io/ipfs/QmRkzTZoER5hxZVtxt8TwaHX2vGVDtoc8wjGg3SyfKyb8p/';

    string public POO_PROVENANCE = '';
    
    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    uint256 private _price = 0.05 ether;

    uint256 public MAX_TOKENS_PER_TRANSACTION = 20;

    uint256 public MAX_SUPPLY = 1000;

    bool public _paused = true;

    string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS

    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    mapping(uint => string) private _owners;

    event licenseisLocked(string _licenseText);

    // Withdrawal addresses
    address t1 = 0xda73C4DFa2F04B189A7f8EafB586501b4D0B73dC;
    address t2 = 0xD02bf9b3DA78BEc791014EB3cEecA65990cb046F;
    address t3 = 0xE3167f4698862cf2EB9615b6021459C2463349f1;
    address t4 = 0xDa58B66835129C3855fFBe8A01A6733BE391CD74;

    address[] addressList = [t1, t2, t3, t4];
    uint256[] shareList = [30, 40, 40, 40];

    constructor()
    ERC721("Golden Poos", "POO")
    PaymentSplitter(addressList, shareList)  {}

    function mint(uint256 num) public payable {
        uint256 supply = totalSupply();
        require( !_paused,                          "Sale paused" );
        require( num <= MAX_TOKENS_PER_TRANSACTION, "You can mint a maximum of 5 Poos per transation" );
        require( supply + num <= MAX_SUPPLY,        "Exceeds maximum Poo supply" );
        require( msg.value >= _price * num,         "Ether sent is not correct" );

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

        // If we haven't set the starting index and this is either:
        // 1) the last saleable token or
        // 2) the first token to be sold after the end of pre-sale
        // Set the starting index block
        if (startingIndexBlock == 0 && (totalSupply() == MAX_SUPPLY)) {
            startingIndexBlock = block.number;
        } 
    }

    // Just in case Eth does some crazy stuff
    function setPrice(uint256 _newPrice) public onlyOwner {
        _price = _newPrice;
    }

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

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function flipSaleState() public onlyOwner {
        _paused = !_paused;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        POO_PROVENANCE = provenanceHash;
    }
    
    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "Invalid ID");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    /**
     * Set the starting index for the collection
     */
    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");
        
        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if ((block.number - startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY;
        }
    }

    /**
     * Set the starting index block for the collection, essentially unblocking
     * setting starting index
     */
    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        
        startingIndexBlock = block.number;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POO_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052604051806080016040528060448152602001620063fe604491396010908051906020019062000035929190620009d6565b5060405180602001604052806000815250601190805190602001906200005d929190620009d6565b5066b1a2bc2ec5000060145560146015556103e86016556001601760006101000a81548160ff0219169083151502179055506040518060200160405280600081525060189080519060200190620000b6929190620009d6565b506000601960006101000a81548160ff02191690831515021790555073da73c4dfa2f04b189a7f8eafb586501b4d0b73dc601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d02bf9b3da78bec791014eb3ceeca65990cb046f601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e3167f4698862cf2eb9615b6021459c2463349f1601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073da58b66835129c3855ffbe8a01a6733be391cd74601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060800160405280601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601f9060046200039192919062000a67565b506040518060800160405280601e60ff168152602001602860ff168152602001602860ff168152602001602860ff168152506020906004620003d592919062000af6565b50348015620003e357600080fd5b50601f8054806020026020016040519081016040528092919081815260200182805480156200046857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116200041d575b50505050506020805480602002602001604051908101604052809291908181526020018280548015620004bb57602002820191906000526020600020905b815481526020019060010190808311620004a6575b50505050506040518060400160405280600b81526020017f476f6c64656e20506f6f730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f504f4f0000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000544929190620009d6565b5080600190805190602001906200055d929190620009d6565b5050506200058062000574620006ce60201b60201c565b620006d660201b60201c565b8051825114620005c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005be9062000ca0565b60405180910390fd5b60008251116200060e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006059062000ce4565b60405180910390fd5b60005b8251811015620006c557620006af83828151811062000659577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518383815181106200069b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516200079c60201b60201c565b8080620006bc9062000e0a565b91505062000611565b50505062000ff5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200080f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008069062000c7e565b60405180910390fd5b6000811162000855576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200084c9062000d06565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620008da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d19062000cc2565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5462000991919062000d39565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620009ca92919062000c51565b60405180910390a15050565b828054620009e49062000dd4565b90600052602060002090601f01602090048101928262000a08576000855562000a54565b82601f1062000a2357805160ff191683800117855562000a54565b8280016001018555821562000a54579182015b8281111562000a5357825182559160200191906001019062000a36565b5b50905062000a63919062000b4d565b5090565b82805482825590600052602060002090810192821562000ae3579160200282015b8281111562000ae25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000a88565b5b50905062000af2919062000b4d565b5090565b82805482825590600052602060002090810192821562000b3a579160200282015b8281111562000b39578251829060ff1690559160200191906001019062000b17565b5b50905062000b49919062000b4d565b5090565b5b8082111562000b6857600081600090555060010162000b4e565b5090565b62000b778162000d96565b82525050565b600062000b8c602c8362000d28565b915062000b998262000eb6565b604082019050919050565b600062000bb360328362000d28565b915062000bc08262000f05565b604082019050919050565b600062000bda602b8362000d28565b915062000be78262000f54565b604082019050919050565b600062000c01601a8362000d28565b915062000c0e8262000fa3565b602082019050919050565b600062000c28601d8362000d28565b915062000c358262000fcc565b602082019050919050565b62000c4b8162000dca565b82525050565b600060408201905062000c68600083018562000b6c565b62000c77602083018462000c40565b9392505050565b6000602082019050818103600083015262000c998162000b7d565b9050919050565b6000602082019050818103600083015262000cbb8162000ba4565b9050919050565b6000602082019050818103600083015262000cdd8162000bcb565b9050919050565b6000602082019050818103600083015262000cff8162000bf2565b9050919050565b6000602082019050818103600083015262000d218162000c19565b9050919050565b600082825260208201905092915050565b600062000d468262000dca565b915062000d538362000dca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d8b5762000d8a62000e58565b5b828201905092915050565b600062000da38262000daa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000ded57607f821691505b6020821081141562000e045762000e0362000e87565b5b50919050565b600062000e178262000dca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000e4d5762000e4c62000e58565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6153f980620010056000396000f3fe6080604052600436106102765760003560e01c80637d17fcbe1161014f578063b88d4fde116100c1578063d9b137b21161007a578063d9b137b2146109a2578063e33b7de3146109df578063e36d649814610a0a578063e985e9c514610a35578063e986655014610a72578063f2fde38b14610a89576102bd565b8063b88d4fde14610892578063bf4702fc146108bb578063c87b56dd146108d2578063cb774d471461090f578063ce7c2ac21461093a578063cfc86f7b14610977576102bd565b80639852595c116101135780639852595c1461079157806398d5fdca146107ce5780639c3e72bd146107f9578063a0712d6814610824578063a22cb46514610840578063b09904b514610869576102bd565b80637d17fcbe146106be5780638b83209b146106d55780638da5cb5b1461071257806391b7f5ed1461073d57806395d89b4114610766576102bd565b806332cb6b0c116101e85780634f6ccce7116101ac5780634f6ccce71461059c5780634fce1de3146105d957806355f804b3146106045780636352211e1461062d57806370a082311461066a578063715018a6146106a7576102bd565b806332cb6b0c146104c957806334918dfd146104f45780633a98ef391461050b57806342842e0e14610536578063438b63001461055f576102bd565b806314a760281161023a57806314a76028146103b957806316c61ccc146103e457806318160ddd1461040f578063191655871461043a57806323b872dd146104635780632f745c591461048c576102bd565b806301ffc9a7146102c257806306fdde03146102ff578063081812fc1461032a578063095ea7b3146103675780631096952314610390576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610ab2565b346040516102b392919061426e565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613ac8565b610aba565b6040516102f691906142b9565b60405180910390f35b34801561030b57600080fd5b50610314610b34565b60405161032191906142d4565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613b5b565b610bc6565b60405161035e91906141de565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613a8c565b610c4b565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613b1a565b610d63565b005b3480156103c557600080fd5b506103ce610df9565b6040516103db91906142d4565b60405180910390f35b3480156103f057600080fd5b506103f9610e87565b60405161040691906142b9565b60405180910390f35b34801561041b57600080fd5b50610424610e9a565b60405161043191906146d8565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613921565b610ea7565b005b34801561046f57600080fd5b5061048a60048036038101906104859190613986565b61110f565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613a8c565b61116f565b6040516104c091906146d8565b60405180910390f35b3480156104d557600080fd5b506104de611214565b6040516104eb91906146d8565b60405180910390f35b34801561050057600080fd5b5061050961121a565b005b34801561051757600080fd5b506105206112c2565b60405161052d91906146d8565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613986565b6112cc565b005b34801561056b57600080fd5b50610586600480360381019061058191906138f8565b6112ec565b6040516105939190614297565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190613b5b565b6113e6565b6040516105d091906146d8565b60405180910390f35b3480156105e557600080fd5b506105ee61147d565b6040516105fb91906146d8565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613b1a565b611483565b005b34801561063957600080fd5b50610654600480360381019061064f9190613b5b565b611519565b60405161066191906141de565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906138f8565b6115cb565b60405161069e91906146d8565b60405180910390f35b3480156106b357600080fd5b506106bc611683565b005b3480156106ca57600080fd5b506106d361170b565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613b5b565b6117d5565b60405161070991906141de565b60405180910390f35b34801561071e57600080fd5b50610727611843565b60405161073491906141de565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613b5b565b61186d565b005b34801561077257600080fd5b5061077b6118f3565b60405161078891906142d4565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b391906138f8565b611985565b6040516107c591906146d8565b60405180910390f35b3480156107da57600080fd5b506107e36119ce565b6040516107f091906146d8565b60405180910390f35b34801561080557600080fd5b5061080e6119d8565b60405161081b91906142d4565b60405180910390f35b61083e60048036038101906108399190613b5b565b611a66565b005b34801561084c57600080fd5b5061086760048036038101906108629190613a50565b611c06565b005b34801561087557600080fd5b50610890600480360381019061088b9190613b1a565b611d87565b005b34801561089e57600080fd5b506108b960048036038101906108b491906139d5565b611e73565b005b3480156108c757600080fd5b506108d0611ed5565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613b5b565b611fa6565b60405161090691906142d4565b60405180910390f35b34801561091b57600080fd5b5061092461204d565b60405161093191906146d8565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c91906138f8565b612053565b60405161096e91906146d8565b60405180910390f35b34801561098357600080fd5b5061098c61209c565b60405161099991906142d4565b60405180910390f35b3480156109ae57600080fd5b506109c960048036038101906109c49190613b5b565b61212a565b6040516109d691906142d4565b60405180910390f35b3480156109eb57600080fd5b506109f4612207565b604051610a0191906146d8565b60405180910390f35b348015610a1657600080fd5b50610a1f612211565b604051610a2c91906146d8565b60405180910390f35b348015610a4157600080fd5b50610a5c6004803603810190610a57919061394a565b612217565b604051610a6991906142b9565b60405180910390f35b348015610a7e57600080fd5b50610a876122ab565b005b348015610a9557600080fd5b50610ab06004803603810190610aab91906138f8565b61238d565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2d5750610b2c82612485565b5b9050919050565b606060008054610b4390614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614a29565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd182612567565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614598565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5682611519565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614618565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce6610ab2565b73ffffffffffffffffffffffffffffffffffffffff161480610d155750610d1481610d0f610ab2565b612217565b5b610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906144d8565b60405180910390fd5b610d5e83836125d3565b505050565b610d6b610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610d89611843565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906145b8565b60405180910390fd5b8060119080519060200190610df5929190613707565b5050565b60118054610e0690614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3290614a29565b8015610e7f5780601f10610e5457610100808354040283529160200191610e7f565b820191906000526020600020905b815481529060010190602001808311610e6257829003601f168201915b505050505081565b601760009054906101000a900460ff1681565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906143d8565b60405180910390fd5b6000600c5447610f399190614816565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610fcb919061489d565b610fd5919061486c565b610fdf91906148f7565b90506000811415611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90614498565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110709190614816565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546110c19190614816565b600c819055506110d1838261268c565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111029291906141f9565b60405180910390a1505050565b61112061111a610ab2565b82612780565b61115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690614698565b60405180910390fd5b61116a83838361285e565b505050565b600061117a836115cb565b82106111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290614338565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60165481565b611222610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611240611843565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906145b8565b60405180910390fd5b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6000600b54905090565b6112e783838360405180602001604052806000815250611e73565b505050565b606060006112f9836115cb565b905060008167ffffffffffffffff81111561133d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561136b5781602001602082028036833780820191505090505b50905060005b828110156113db57611383858261116f565b8282815181106113bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806113d390614a8c565b915050611371565b508092505050919050565b60006113f0610e9a565b8210611431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611428906146b8565b60405180910390fd5b6008828154811061146b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60155481565b61148b610ab2565b73ffffffffffffffffffffffffffffffffffffffff166114a9611843565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906145b8565b60405180910390fd5b8060109080519060200190611515929190613707565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614518565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906144f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b610ab2565b73ffffffffffffffffffffffffffffffffffffffff166116a9611843565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f6906145b8565b60405180910390fd5b6117096000612aba565b565b611713610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611731611843565b73ffffffffffffffffffffffffffffffffffffffff1614611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906145b8565b60405180910390fd5b6000601354146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c3906144b8565b60405180910390fd5b43601281905550565b6000600f8281548110611811577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611875610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611893611843565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906145b8565b60405180910390fd5b8060148190555050565b60606001805461190290614a29565b80601f016020809104026020016040519081016040528092919081815260200182805461192e90614a29565b801561197b5780601f106119505761010080835404028352916020019161197b565b820191906000526020600020905b81548152906001019060200180831161195e57829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601454905090565b601880546119e590614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1190614a29565b8015611a5e5780601f10611a3357610100808354040283529160200191611a5e565b820191906000526020600020905b815481529060010190602001808311611a4157829003601f168201915b505050505081565b6000611a70610e9a565b9050601760009054906101000a900460ff1615611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614318565b60405180910390fd5b601554821115611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906143b8565b60405180910390fd5b6016548282611b169190614816565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614538565b60405180910390fd5b81601454611b65919061489d565b341015611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614638565b60405180910390fd5b60005b82811015611bda57611bc7338284611bc29190614816565b612b80565b8080611bd290614a8c565b915050611baa565b506000601254148015611bf55750601654611bf3610e9a565b145b15611c0257436012819055505b5050565b611c0e610ab2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7390614418565b60405180910390fd5b8060056000611c89610ab2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d36610ab2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d7b91906142b9565b60405180910390a35050565b611d8f610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611dad611843565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906145b8565b60405180910390fd5b60001515601960009054906101000a900460ff16151514611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614658565b60405180910390fd5b8060189080519060200190611e6f929190613707565b5050565b611e84611e7e610ab2565b83612780565b611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614698565b60405180910390fd5b611ecf84848484612b9e565b50505050565b611edd610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611efb611843565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906145b8565b60405180910390fd5b6001601960006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06018604051611f9c91906142f6565b60405180910390a1565b6060611fb182612567565b611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe7906145f8565b60405180910390fd5b6000611ffa612bfa565b9050600081511161201a5760405180602001604052806000815250612045565b8061202484612c8c565b6040516020016120359291906141a5565b6040516020818303038152906040525b915050919050565b60135481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601080546120a990614a29565b80601f01602080910402602001604051908101604052809291908181526020018280546120d590614a29565b80156121225780601f106120f757610100808354040283529160200191612122565b820191906000526020600020905b81548152906001019060200180831161210557829003601f168201915b505050505081565b6060612134610e9a565b8210612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90614558565b60405180910390fd5b6018805461218290614a29565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90614a29565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b50505050509050919050565b6000600c54905090565b60125481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601354146122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906144b8565b60405180910390fd5b60006012541415612336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d90614678565b60405180910390fd5b6016546012544060001c61234a9190614ad5565b60138190555060ff6012544361236091906148f7565b111561238b5760165460014361237691906148f7565b4060001c6123849190614ad5565b6013819055505b565b612395610ab2565b73ffffffffffffffffffffffffffffffffffffffff166123b3611843565b73ffffffffffffffffffffffffffffffffffffffff1614612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906145b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614378565b60405180910390fd5b61248281612aba565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061255057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612560575061255f82612e39565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661264683611519565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614458565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126f5906141c9565b60006040518083038185875af1925050503d8060008114612732576040519150601f19603f3d011682016040523d82523d6000602084013e612737565b606091505b505090508061277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614438565b60405180910390fd5b505050565b600061278b82612567565b6127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190614478565b60405180910390fd5b60006127d583611519565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061284457508373ffffffffffffffffffffffffffffffffffffffff1661282c84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061285557506128548185612217565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661287e82611519565b73ffffffffffffffffffffffffffffffffffffffff16146128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906145d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b906143f8565b60405180910390fd5b61294f838383612ea3565b61295a6000826125d3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129aa91906148f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a019190614816565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b9a828260405180602001604052806000815250612fb7565b5050565b612ba984848461285e565b612bb584848484613012565b612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90614358565b60405180910390fd5b50505050565b606060108054612c0990614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3590614a29565b8015612c825780601f10612c5757610100808354040283529160200191612c82565b820191906000526020600020905b815481529060010190602001808311612c6557829003601f168201915b5050505050905090565b60606000821415612cd4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e34565b600082905060005b60008214612d06578080612cef90614a8c565b915050600a82612cff919061486c565b9150612cdc565b60008167ffffffffffffffff811115612d48577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d7a5781602001600182028036833780820191505090505b5090505b60008514612e2d57600182612d9391906148f7565b9150600a85612da29190614ad5565b6030612dae9190614816565b60f81b818381518110612dea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e26919061486c565b9450612d7e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612eae8383836131a9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ef157612eec816131ae565b612f30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f2f57612f2e83826131f7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7357612f6e81613364565b612fb2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fb157612fb082826134a7565b5b5b505050565b612fc18383613526565b612fce6000848484613012565b61300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490614358565b60405180910390fd5b505050565b60006130338473ffffffffffffffffffffffffffffffffffffffff166136f4565b1561319c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261305c610ab2565b8786866040518563ffffffff1660e01b815260040161307e9493929190614222565b602060405180830381600087803b15801561309857600080fd5b505af19250505080156130c957506040513d601f19601f820116820180604052508101906130c69190613af1565b60015b61314c573d80600081146130f9576040519150601f19603f3d011682016040523d82523d6000602084013e6130fe565b606091505b50600081511415613144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313b90614358565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613204846115cb565b61320e91906148f7565b90506000600760008481526020019081526020016000205490508181146132f3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061337891906148f7565b90506000600960008481526020019081526020016000205490506000600883815481106133ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613416577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134b2836115cb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358d90614578565b60405180910390fd5b61359f81612567565b156135df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690614398565b60405180910390fd5b6135eb60008383612ea3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461363b9190614816565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461371390614a29565b90600052602060002090601f016020900481019282613735576000855561377c565b82601f1061374e57805160ff191683800117855561377c565b8280016001018555821561377c579182015b8281111561377b578251825591602001919060010190613760565b5b509050613789919061378d565b5090565b5b808211156137a657600081600090555060010161378e565b5090565b60006137bd6137b884614718565b6146f3565b9050828152602081018484840111156137d557600080fd5b6137e08482856149e7565b509392505050565b60006137fb6137f684614749565b6146f3565b90508281526020810184848401111561381357600080fd5b61381e8482856149e7565b509392505050565b60008135905061383581615350565b92915050565b60008135905061384a81615367565b92915050565b60008135905061385f8161537e565b92915050565b60008135905061387481615395565b92915050565b60008151905061388981615395565b92915050565b600082601f8301126138a057600080fd5b81356138b08482602086016137aa565b91505092915050565b600082601f8301126138ca57600080fd5b81356138da8482602086016137e8565b91505092915050565b6000813590506138f2816153ac565b92915050565b60006020828403121561390a57600080fd5b600061391884828501613826565b91505092915050565b60006020828403121561393357600080fd5b60006139418482850161383b565b91505092915050565b6000806040838503121561395d57600080fd5b600061396b85828601613826565b925050602061397c85828601613826565b9150509250929050565b60008060006060848603121561399b57600080fd5b60006139a986828701613826565b93505060206139ba86828701613826565b92505060406139cb868287016138e3565b9150509250925092565b600080600080608085870312156139eb57600080fd5b60006139f987828801613826565b9450506020613a0a87828801613826565b9350506040613a1b878288016138e3565b925050606085013567ffffffffffffffff811115613a3857600080fd5b613a448782880161388f565b91505092959194509250565b60008060408385031215613a6357600080fd5b6000613a7185828601613826565b9250506020613a8285828601613850565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad85828601613826565b9250506020613abe858286016138e3565b9150509250929050565b600060208284031215613ada57600080fd5b6000613ae884828501613865565b91505092915050565b600060208284031215613b0357600080fd5b6000613b118482850161387a565b91505092915050565b600060208284031215613b2c57600080fd5b600082013567ffffffffffffffff811115613b4657600080fd5b613b52848285016138b9565b91505092915050565b600060208284031215613b6d57600080fd5b6000613b7b848285016138e3565b91505092915050565b6000613b908383614187565b60208301905092915050565b613ba5816149b1565b82525050565b613bb48161492b565b82525050565b6000613bc58261479f565b613bcf81856147cd565b9350613bda8361477a565b8060005b83811015613c0b578151613bf28882613b84565b9750613bfd836147c0565b925050600181019050613bde565b5085935050505092915050565b613c218161494f565b82525050565b6000613c32826147aa565b613c3c81856147de565b9350613c4c8185602086016149f6565b613c5581614bc2565b840191505092915050565b6000613c6b826147b5565b613c7581856147fa565b9350613c858185602086016149f6565b613c8e81614bc2565b840191505092915050565b6000613ca4826147b5565b613cae818561480b565b9350613cbe8185602086016149f6565b80840191505092915050565b60008154613cd781614a29565b613ce181866147fa565b94506001821660008114613cfc5760018114613d0e57613d41565b60ff1983168652602086019350613d41565b613d178561478a565b60005b83811015613d3957815481890152600182019150602081019050613d1a565b808801955050505b50505092915050565b6000613d57600b836147fa565b9150613d6282614bd3565b602082019050919050565b6000613d7a602b836147fa565b9150613d8582614bfc565b604082019050919050565b6000613d9d6032836147fa565b9150613da882614c4b565b604082019050919050565b6000613dc06026836147fa565b9150613dcb82614c9a565b604082019050919050565b6000613de3601c836147fa565b9150613dee82614ce9565b602082019050919050565b6000613e06602f836147fa565b9150613e1182614d12565b604082019050919050565b6000613e296026836147fa565b9150613e3482614d61565b604082019050919050565b6000613e4c6024836147fa565b9150613e5782614db0565b604082019050919050565b6000613e6f6019836147fa565b9150613e7a82614dff565b602082019050919050565b6000613e92603a836147fa565b9150613e9d82614e28565b604082019050919050565b6000613eb5601d836147fa565b9150613ec082614e77565b602082019050919050565b6000613ed8602c836147fa565b9150613ee382614ea0565b604082019050919050565b6000613efb602b836147fa565b9150613f0682614eef565b604082019050919050565b6000613f1e601d836147fa565b9150613f2982614f3e565b602082019050919050565b6000613f416038836147fa565b9150613f4c82614f67565b604082019050919050565b6000613f64602a836147fa565b9150613f6f82614fb6565b604082019050919050565b6000613f876029836147fa565b9150613f9282615005565b604082019050919050565b6000613faa601a836147fa565b9150613fb582615054565b602082019050919050565b6000613fcd600a836147fa565b9150613fd88261507d565b602082019050919050565b6000613ff06020836147fa565b9150613ffb826150a6565b602082019050919050565b6000614013602c836147fa565b915061401e826150cf565b604082019050919050565b60006140366020836147fa565b91506140418261511e565b602082019050919050565b60006140596029836147fa565b915061406482615147565b604082019050919050565b600061407c602f836147fa565b915061408782615196565b604082019050919050565b600061409f6021836147fa565b91506140aa826151e5565b604082019050919050565b60006140c26019836147fa565b91506140cd82615234565b602082019050919050565b60006140e56016836147fa565b91506140f08261525d565b602082019050919050565b60006141086020836147fa565b915061411382615286565b602082019050919050565b600061412b6000836147ef565b9150614136826152af565b600082019050919050565b600061414e6031836147fa565b9150614159826152b2565b604082019050919050565b6000614171602c836147fa565b915061417c82615301565b604082019050919050565b614190816149a7565b82525050565b61419f816149a7565b82525050565b60006141b18285613c99565b91506141bd8284613c99565b91508190509392505050565b60006141d48261411e565b9150819050919050565b60006020820190506141f36000830184613bab565b92915050565b600060408201905061420e6000830185613b9c565b61421b6020830184614196565b9392505050565b60006080820190506142376000830187613bab565b6142446020830186613bab565b6142516040830185614196565b81810360608301526142638184613c27565b905095945050505050565b60006040820190506142836000830185613bab565b6142906020830184614196565b9392505050565b600060208201905081810360008301526142b18184613bba565b905092915050565b60006020820190506142ce6000830184613c18565b92915050565b600060208201905081810360008301526142ee8184613c60565b905092915050565b600060208201905081810360008301526143108184613cca565b905092915050565b6000602082019050818103600083015261433181613d4a565b9050919050565b6000602082019050818103600083015261435181613d6d565b9050919050565b6000602082019050818103600083015261437181613d90565b9050919050565b6000602082019050818103600083015261439181613db3565b9050919050565b600060208201905081810360008301526143b181613dd6565b9050919050565b600060208201905081810360008301526143d181613df9565b9050919050565b600060208201905081810360008301526143f181613e1c565b9050919050565b6000602082019050818103600083015261441181613e3f565b9050919050565b6000602082019050818103600083015261443181613e62565b9050919050565b6000602082019050818103600083015261445181613e85565b9050919050565b6000602082019050818103600083015261447181613ea8565b9050919050565b6000602082019050818103600083015261449181613ecb565b9050919050565b600060208201905081810360008301526144b181613eee565b9050919050565b600060208201905081810360008301526144d181613f11565b9050919050565b600060208201905081810360008301526144f181613f34565b9050919050565b6000602082019050818103600083015261451181613f57565b9050919050565b6000602082019050818103600083015261453181613f7a565b9050919050565b6000602082019050818103600083015261455181613f9d565b9050919050565b6000602082019050818103600083015261457181613fc0565b9050919050565b6000602082019050818103600083015261459181613fe3565b9050919050565b600060208201905081810360008301526145b181614006565b9050919050565b600060208201905081810360008301526145d181614029565b9050919050565b600060208201905081810360008301526145f18161404c565b9050919050565b600060208201905081810360008301526146118161406f565b9050919050565b6000602082019050818103600083015261463181614092565b9050919050565b60006020820190508181036000830152614651816140b5565b9050919050565b60006020820190508181036000830152614671816140d8565b9050919050565b60006020820190508181036000830152614691816140fb565b9050919050565b600060208201905081810360008301526146b181614141565b9050919050565b600060208201905081810360008301526146d181614164565b9050919050565b60006020820190506146ed6000830184614196565b92915050565b60006146fd61470e565b90506147098282614a5b565b919050565b6000604051905090565b600067ffffffffffffffff82111561473357614732614b93565b5b61473c82614bc2565b9050602081019050919050565b600067ffffffffffffffff82111561476457614763614b93565b5b61476d82614bc2565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614821826149a7565b915061482c836149a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486157614860614b06565b5b828201905092915050565b6000614877826149a7565b9150614882836149a7565b92508261489257614891614b35565b5b828204905092915050565b60006148a8826149a7565b91506148b3836149a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ec576148eb614b06565b5b828202905092915050565b6000614902826149a7565b915061490d836149a7565b9250828210156149205761491f614b06565b5b828203905092915050565b600061493682614987565b9050919050565b600061494882614987565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149bc826149c3565b9050919050565b60006149ce826149d5565b9050919050565b60006149e082614987565b9050919050565b82818337600083830152505050565b60005b83811015614a145780820151818401526020810190506149f9565b83811115614a23576000848401525b50505050565b60006002820490506001821680614a4157607f821691505b60208210811415614a5557614a54614b64565b5b50919050565b614a6482614bc2565b810181811067ffffffffffffffff82111715614a8357614a82614b93565b5b80604052505050565b6000614a97826149a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aca57614ac9614b06565b5b600182019050919050565b6000614ae0826149a7565b9150614aeb836149a7565b925082614afb57614afa614b35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752063616e206d696e742061206d6178696d756d206f66203520506f6f7360008201527f20706572207472616e736174696f6e0000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20506f6f20737570706c79000000000000600082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6153598161492b565b811461536457600080fd5b50565b6153708161493d565b811461537b57600080fd5b50565b6153878161494f565b811461539257600080fd5b50565b61539e8161495b565b81146153a957600080fd5b50565b6153b5816149a7565b81146153c057600080fd5b5056fea264697066735822122005ec632a4ae41a44b691a0a1dc350d34b1a1f8d5148c2af64c6f7a9baf66661b64736f6c6343000804003368747470733a2f2f697066732e696f2f697066732f516d526b7a545a6f45523568785a567478743854776148583276475644746f6338776a4767335379664b796238702f

Deployed Bytecode

0x6080604052600436106102765760003560e01c80637d17fcbe1161014f578063b88d4fde116100c1578063d9b137b21161007a578063d9b137b2146109a2578063e33b7de3146109df578063e36d649814610a0a578063e985e9c514610a35578063e986655014610a72578063f2fde38b14610a89576102bd565b8063b88d4fde14610892578063bf4702fc146108bb578063c87b56dd146108d2578063cb774d471461090f578063ce7c2ac21461093a578063cfc86f7b14610977576102bd565b80639852595c116101135780639852595c1461079157806398d5fdca146107ce5780639c3e72bd146107f9578063a0712d6814610824578063a22cb46514610840578063b09904b514610869576102bd565b80637d17fcbe146106be5780638b83209b146106d55780638da5cb5b1461071257806391b7f5ed1461073d57806395d89b4114610766576102bd565b806332cb6b0c116101e85780634f6ccce7116101ac5780634f6ccce71461059c5780634fce1de3146105d957806355f804b3146106045780636352211e1461062d57806370a082311461066a578063715018a6146106a7576102bd565b806332cb6b0c146104c957806334918dfd146104f45780633a98ef391461050b57806342842e0e14610536578063438b63001461055f576102bd565b806314a760281161023a57806314a76028146103b957806316c61ccc146103e457806318160ddd1461040f578063191655871461043a57806323b872dd146104635780632f745c591461048c576102bd565b806301ffc9a7146102c257806306fdde03146102ff578063081812fc1461032a578063095ea7b3146103675780631096952314610390576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610ab2565b346040516102b392919061426e565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613ac8565b610aba565b6040516102f691906142b9565b60405180910390f35b34801561030b57600080fd5b50610314610b34565b60405161032191906142d4565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613b5b565b610bc6565b60405161035e91906141de565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613a8c565b610c4b565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613b1a565b610d63565b005b3480156103c557600080fd5b506103ce610df9565b6040516103db91906142d4565b60405180910390f35b3480156103f057600080fd5b506103f9610e87565b60405161040691906142b9565b60405180910390f35b34801561041b57600080fd5b50610424610e9a565b60405161043191906146d8565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613921565b610ea7565b005b34801561046f57600080fd5b5061048a60048036038101906104859190613986565b61110f565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613a8c565b61116f565b6040516104c091906146d8565b60405180910390f35b3480156104d557600080fd5b506104de611214565b6040516104eb91906146d8565b60405180910390f35b34801561050057600080fd5b5061050961121a565b005b34801561051757600080fd5b506105206112c2565b60405161052d91906146d8565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613986565b6112cc565b005b34801561056b57600080fd5b50610586600480360381019061058191906138f8565b6112ec565b6040516105939190614297565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190613b5b565b6113e6565b6040516105d091906146d8565b60405180910390f35b3480156105e557600080fd5b506105ee61147d565b6040516105fb91906146d8565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613b1a565b611483565b005b34801561063957600080fd5b50610654600480360381019061064f9190613b5b565b611519565b60405161066191906141de565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906138f8565b6115cb565b60405161069e91906146d8565b60405180910390f35b3480156106b357600080fd5b506106bc611683565b005b3480156106ca57600080fd5b506106d361170b565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613b5b565b6117d5565b60405161070991906141de565b60405180910390f35b34801561071e57600080fd5b50610727611843565b60405161073491906141de565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613b5b565b61186d565b005b34801561077257600080fd5b5061077b6118f3565b60405161078891906142d4565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b391906138f8565b611985565b6040516107c591906146d8565b60405180910390f35b3480156107da57600080fd5b506107e36119ce565b6040516107f091906146d8565b60405180910390f35b34801561080557600080fd5b5061080e6119d8565b60405161081b91906142d4565b60405180910390f35b61083e60048036038101906108399190613b5b565b611a66565b005b34801561084c57600080fd5b5061086760048036038101906108629190613a50565b611c06565b005b34801561087557600080fd5b50610890600480360381019061088b9190613b1a565b611d87565b005b34801561089e57600080fd5b506108b960048036038101906108b491906139d5565b611e73565b005b3480156108c757600080fd5b506108d0611ed5565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613b5b565b611fa6565b60405161090691906142d4565b60405180910390f35b34801561091b57600080fd5b5061092461204d565b60405161093191906146d8565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c91906138f8565b612053565b60405161096e91906146d8565b60405180910390f35b34801561098357600080fd5b5061098c61209c565b60405161099991906142d4565b60405180910390f35b3480156109ae57600080fd5b506109c960048036038101906109c49190613b5b565b61212a565b6040516109d691906142d4565b60405180910390f35b3480156109eb57600080fd5b506109f4612207565b604051610a0191906146d8565b60405180910390f35b348015610a1657600080fd5b50610a1f612211565b604051610a2c91906146d8565b60405180910390f35b348015610a4157600080fd5b50610a5c6004803603810190610a57919061394a565b612217565b604051610a6991906142b9565b60405180910390f35b348015610a7e57600080fd5b50610a876122ab565b005b348015610a9557600080fd5b50610ab06004803603810190610aab91906138f8565b61238d565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2d5750610b2c82612485565b5b9050919050565b606060008054610b4390614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614a29565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd182612567565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614598565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5682611519565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614618565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce6610ab2565b73ffffffffffffffffffffffffffffffffffffffff161480610d155750610d1481610d0f610ab2565b612217565b5b610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906144d8565b60405180910390fd5b610d5e83836125d3565b505050565b610d6b610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610d89611843565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906145b8565b60405180910390fd5b8060119080519060200190610df5929190613707565b5050565b60118054610e0690614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3290614a29565b8015610e7f5780601f10610e5457610100808354040283529160200191610e7f565b820191906000526020600020905b815481529060010190602001808311610e6257829003601f168201915b505050505081565b601760009054906101000a900460ff1681565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906143d8565b60405180910390fd5b6000600c5447610f399190614816565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610fcb919061489d565b610fd5919061486c565b610fdf91906148f7565b90506000811415611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90614498565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110709190614816565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546110c19190614816565b600c819055506110d1838261268c565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111029291906141f9565b60405180910390a1505050565b61112061111a610ab2565b82612780565b61115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690614698565b60405180910390fd5b61116a83838361285e565b505050565b600061117a836115cb565b82106111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290614338565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60165481565b611222610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611240611843565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906145b8565b60405180910390fd5b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6000600b54905090565b6112e783838360405180602001604052806000815250611e73565b505050565b606060006112f9836115cb565b905060008167ffffffffffffffff81111561133d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561136b5781602001602082028036833780820191505090505b50905060005b828110156113db57611383858261116f565b8282815181106113bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806113d390614a8c565b915050611371565b508092505050919050565b60006113f0610e9a565b8210611431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611428906146b8565b60405180910390fd5b6008828154811061146b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60155481565b61148b610ab2565b73ffffffffffffffffffffffffffffffffffffffff166114a9611843565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906145b8565b60405180910390fd5b8060109080519060200190611515929190613707565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614518565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906144f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b610ab2565b73ffffffffffffffffffffffffffffffffffffffff166116a9611843565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f6906145b8565b60405180910390fd5b6117096000612aba565b565b611713610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611731611843565b73ffffffffffffffffffffffffffffffffffffffff1614611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906145b8565b60405180910390fd5b6000601354146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c3906144b8565b60405180910390fd5b43601281905550565b6000600f8281548110611811577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611875610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611893611843565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906145b8565b60405180910390fd5b8060148190555050565b60606001805461190290614a29565b80601f016020809104026020016040519081016040528092919081815260200182805461192e90614a29565b801561197b5780601f106119505761010080835404028352916020019161197b565b820191906000526020600020905b81548152906001019060200180831161195e57829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601454905090565b601880546119e590614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1190614a29565b8015611a5e5780601f10611a3357610100808354040283529160200191611a5e565b820191906000526020600020905b815481529060010190602001808311611a4157829003601f168201915b505050505081565b6000611a70610e9a565b9050601760009054906101000a900460ff1615611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614318565b60405180910390fd5b601554821115611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906143b8565b60405180910390fd5b6016548282611b169190614816565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614538565b60405180910390fd5b81601454611b65919061489d565b341015611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614638565b60405180910390fd5b60005b82811015611bda57611bc7338284611bc29190614816565b612b80565b8080611bd290614a8c565b915050611baa565b506000601254148015611bf55750601654611bf3610e9a565b145b15611c0257436012819055505b5050565b611c0e610ab2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7390614418565b60405180910390fd5b8060056000611c89610ab2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d36610ab2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d7b91906142b9565b60405180910390a35050565b611d8f610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611dad611843565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906145b8565b60405180910390fd5b60001515601960009054906101000a900460ff16151514611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614658565b60405180910390fd5b8060189080519060200190611e6f929190613707565b5050565b611e84611e7e610ab2565b83612780565b611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614698565b60405180910390fd5b611ecf84848484612b9e565b50505050565b611edd610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611efb611843565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906145b8565b60405180910390fd5b6001601960006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06018604051611f9c91906142f6565b60405180910390a1565b6060611fb182612567565b611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe7906145f8565b60405180910390fd5b6000611ffa612bfa565b9050600081511161201a5760405180602001604052806000815250612045565b8061202484612c8c565b6040516020016120359291906141a5565b6040516020818303038152906040525b915050919050565b60135481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601080546120a990614a29565b80601f01602080910402602001604051908101604052809291908181526020018280546120d590614a29565b80156121225780601f106120f757610100808354040283529160200191612122565b820191906000526020600020905b81548152906001019060200180831161210557829003601f168201915b505050505081565b6060612134610e9a565b8210612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90614558565b60405180910390fd5b6018805461218290614a29565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90614a29565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b50505050509050919050565b6000600c54905090565b60125481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601354146122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906144b8565b60405180910390fd5b60006012541415612336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d90614678565b60405180910390fd5b6016546012544060001c61234a9190614ad5565b60138190555060ff6012544361236091906148f7565b111561238b5760165460014361237691906148f7565b4060001c6123849190614ad5565b6013819055505b565b612395610ab2565b73ffffffffffffffffffffffffffffffffffffffff166123b3611843565b73ffffffffffffffffffffffffffffffffffffffff1614612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906145b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614378565b60405180910390fd5b61248281612aba565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061255057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612560575061255f82612e39565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661264683611519565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614458565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126f5906141c9565b60006040518083038185875af1925050503d8060008114612732576040519150601f19603f3d011682016040523d82523d6000602084013e612737565b606091505b505090508061277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614438565b60405180910390fd5b505050565b600061278b82612567565b6127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190614478565b60405180910390fd5b60006127d583611519565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061284457508373ffffffffffffffffffffffffffffffffffffffff1661282c84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061285557506128548185612217565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661287e82611519565b73ffffffffffffffffffffffffffffffffffffffff16146128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906145d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b906143f8565b60405180910390fd5b61294f838383612ea3565b61295a6000826125d3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129aa91906148f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a019190614816565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b9a828260405180602001604052806000815250612fb7565b5050565b612ba984848461285e565b612bb584848484613012565b612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90614358565b60405180910390fd5b50505050565b606060108054612c0990614a29565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3590614a29565b8015612c825780601f10612c5757610100808354040283529160200191612c82565b820191906000526020600020905b815481529060010190602001808311612c6557829003601f168201915b5050505050905090565b60606000821415612cd4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e34565b600082905060005b60008214612d06578080612cef90614a8c565b915050600a82612cff919061486c565b9150612cdc565b60008167ffffffffffffffff811115612d48577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d7a5781602001600182028036833780820191505090505b5090505b60008514612e2d57600182612d9391906148f7565b9150600a85612da29190614ad5565b6030612dae9190614816565b60f81b818381518110612dea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e26919061486c565b9450612d7e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612eae8383836131a9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ef157612eec816131ae565b612f30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f2f57612f2e83826131f7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7357612f6e81613364565b612fb2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fb157612fb082826134a7565b5b5b505050565b612fc18383613526565b612fce6000848484613012565b61300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490614358565b60405180910390fd5b505050565b60006130338473ffffffffffffffffffffffffffffffffffffffff166136f4565b1561319c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261305c610ab2565b8786866040518563ffffffff1660e01b815260040161307e9493929190614222565b602060405180830381600087803b15801561309857600080fd5b505af19250505080156130c957506040513d601f19601f820116820180604052508101906130c69190613af1565b60015b61314c573d80600081146130f9576040519150601f19603f3d011682016040523d82523d6000602084013e6130fe565b606091505b50600081511415613144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313b90614358565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613204846115cb565b61320e91906148f7565b90506000600760008481526020019081526020016000205490508181146132f3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061337891906148f7565b90506000600960008481526020019081526020016000205490506000600883815481106133ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613416577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134b2836115cb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358d90614578565b60405180910390fd5b61359f81612567565b156135df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690614398565b60405180910390fd5b6135eb60008383612ea3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461363b9190614816565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461371390614a29565b90600052602060002090601f016020900481019282613735576000855561377c565b82601f1061374e57805160ff191683800117855561377c565b8280016001018555821561377c579182015b8281111561377b578251825591602001919060010190613760565b5b509050613789919061378d565b5090565b5b808211156137a657600081600090555060010161378e565b5090565b60006137bd6137b884614718565b6146f3565b9050828152602081018484840111156137d557600080fd5b6137e08482856149e7565b509392505050565b60006137fb6137f684614749565b6146f3565b90508281526020810184848401111561381357600080fd5b61381e8482856149e7565b509392505050565b60008135905061383581615350565b92915050565b60008135905061384a81615367565b92915050565b60008135905061385f8161537e565b92915050565b60008135905061387481615395565b92915050565b60008151905061388981615395565b92915050565b600082601f8301126138a057600080fd5b81356138b08482602086016137aa565b91505092915050565b600082601f8301126138ca57600080fd5b81356138da8482602086016137e8565b91505092915050565b6000813590506138f2816153ac565b92915050565b60006020828403121561390a57600080fd5b600061391884828501613826565b91505092915050565b60006020828403121561393357600080fd5b60006139418482850161383b565b91505092915050565b6000806040838503121561395d57600080fd5b600061396b85828601613826565b925050602061397c85828601613826565b9150509250929050565b60008060006060848603121561399b57600080fd5b60006139a986828701613826565b93505060206139ba86828701613826565b92505060406139cb868287016138e3565b9150509250925092565b600080600080608085870312156139eb57600080fd5b60006139f987828801613826565b9450506020613a0a87828801613826565b9350506040613a1b878288016138e3565b925050606085013567ffffffffffffffff811115613a3857600080fd5b613a448782880161388f565b91505092959194509250565b60008060408385031215613a6357600080fd5b6000613a7185828601613826565b9250506020613a8285828601613850565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad85828601613826565b9250506020613abe858286016138e3565b9150509250929050565b600060208284031215613ada57600080fd5b6000613ae884828501613865565b91505092915050565b600060208284031215613b0357600080fd5b6000613b118482850161387a565b91505092915050565b600060208284031215613b2c57600080fd5b600082013567ffffffffffffffff811115613b4657600080fd5b613b52848285016138b9565b91505092915050565b600060208284031215613b6d57600080fd5b6000613b7b848285016138e3565b91505092915050565b6000613b908383614187565b60208301905092915050565b613ba5816149b1565b82525050565b613bb48161492b565b82525050565b6000613bc58261479f565b613bcf81856147cd565b9350613bda8361477a565b8060005b83811015613c0b578151613bf28882613b84565b9750613bfd836147c0565b925050600181019050613bde565b5085935050505092915050565b613c218161494f565b82525050565b6000613c32826147aa565b613c3c81856147de565b9350613c4c8185602086016149f6565b613c5581614bc2565b840191505092915050565b6000613c6b826147b5565b613c7581856147fa565b9350613c858185602086016149f6565b613c8e81614bc2565b840191505092915050565b6000613ca4826147b5565b613cae818561480b565b9350613cbe8185602086016149f6565b80840191505092915050565b60008154613cd781614a29565b613ce181866147fa565b94506001821660008114613cfc5760018114613d0e57613d41565b60ff1983168652602086019350613d41565b613d178561478a565b60005b83811015613d3957815481890152600182019150602081019050613d1a565b808801955050505b50505092915050565b6000613d57600b836147fa565b9150613d6282614bd3565b602082019050919050565b6000613d7a602b836147fa565b9150613d8582614bfc565b604082019050919050565b6000613d9d6032836147fa565b9150613da882614c4b565b604082019050919050565b6000613dc06026836147fa565b9150613dcb82614c9a565b604082019050919050565b6000613de3601c836147fa565b9150613dee82614ce9565b602082019050919050565b6000613e06602f836147fa565b9150613e1182614d12565b604082019050919050565b6000613e296026836147fa565b9150613e3482614d61565b604082019050919050565b6000613e4c6024836147fa565b9150613e5782614db0565b604082019050919050565b6000613e6f6019836147fa565b9150613e7a82614dff565b602082019050919050565b6000613e92603a836147fa565b9150613e9d82614e28565b604082019050919050565b6000613eb5601d836147fa565b9150613ec082614e77565b602082019050919050565b6000613ed8602c836147fa565b9150613ee382614ea0565b604082019050919050565b6000613efb602b836147fa565b9150613f0682614eef565b604082019050919050565b6000613f1e601d836147fa565b9150613f2982614f3e565b602082019050919050565b6000613f416038836147fa565b9150613f4c82614f67565b604082019050919050565b6000613f64602a836147fa565b9150613f6f82614fb6565b604082019050919050565b6000613f876029836147fa565b9150613f9282615005565b604082019050919050565b6000613faa601a836147fa565b9150613fb582615054565b602082019050919050565b6000613fcd600a836147fa565b9150613fd88261507d565b602082019050919050565b6000613ff06020836147fa565b9150613ffb826150a6565b602082019050919050565b6000614013602c836147fa565b915061401e826150cf565b604082019050919050565b60006140366020836147fa565b91506140418261511e565b602082019050919050565b60006140596029836147fa565b915061406482615147565b604082019050919050565b600061407c602f836147fa565b915061408782615196565b604082019050919050565b600061409f6021836147fa565b91506140aa826151e5565b604082019050919050565b60006140c26019836147fa565b91506140cd82615234565b602082019050919050565b60006140e56016836147fa565b91506140f08261525d565b602082019050919050565b60006141086020836147fa565b915061411382615286565b602082019050919050565b600061412b6000836147ef565b9150614136826152af565b600082019050919050565b600061414e6031836147fa565b9150614159826152b2565b604082019050919050565b6000614171602c836147fa565b915061417c82615301565b604082019050919050565b614190816149a7565b82525050565b61419f816149a7565b82525050565b60006141b18285613c99565b91506141bd8284613c99565b91508190509392505050565b60006141d48261411e565b9150819050919050565b60006020820190506141f36000830184613bab565b92915050565b600060408201905061420e6000830185613b9c565b61421b6020830184614196565b9392505050565b60006080820190506142376000830187613bab565b6142446020830186613bab565b6142516040830185614196565b81810360608301526142638184613c27565b905095945050505050565b60006040820190506142836000830185613bab565b6142906020830184614196565b9392505050565b600060208201905081810360008301526142b18184613bba565b905092915050565b60006020820190506142ce6000830184613c18565b92915050565b600060208201905081810360008301526142ee8184613c60565b905092915050565b600060208201905081810360008301526143108184613cca565b905092915050565b6000602082019050818103600083015261433181613d4a565b9050919050565b6000602082019050818103600083015261435181613d6d565b9050919050565b6000602082019050818103600083015261437181613d90565b9050919050565b6000602082019050818103600083015261439181613db3565b9050919050565b600060208201905081810360008301526143b181613dd6565b9050919050565b600060208201905081810360008301526143d181613df9565b9050919050565b600060208201905081810360008301526143f181613e1c565b9050919050565b6000602082019050818103600083015261441181613e3f565b9050919050565b6000602082019050818103600083015261443181613e62565b9050919050565b6000602082019050818103600083015261445181613e85565b9050919050565b6000602082019050818103600083015261447181613ea8565b9050919050565b6000602082019050818103600083015261449181613ecb565b9050919050565b600060208201905081810360008301526144b181613eee565b9050919050565b600060208201905081810360008301526144d181613f11565b9050919050565b600060208201905081810360008301526144f181613f34565b9050919050565b6000602082019050818103600083015261451181613f57565b9050919050565b6000602082019050818103600083015261453181613f7a565b9050919050565b6000602082019050818103600083015261455181613f9d565b9050919050565b6000602082019050818103600083015261457181613fc0565b9050919050565b6000602082019050818103600083015261459181613fe3565b9050919050565b600060208201905081810360008301526145b181614006565b9050919050565b600060208201905081810360008301526145d181614029565b9050919050565b600060208201905081810360008301526145f18161404c565b9050919050565b600060208201905081810360008301526146118161406f565b9050919050565b6000602082019050818103600083015261463181614092565b9050919050565b60006020820190508181036000830152614651816140b5565b9050919050565b60006020820190508181036000830152614671816140d8565b9050919050565b60006020820190508181036000830152614691816140fb565b9050919050565b600060208201905081810360008301526146b181614141565b9050919050565b600060208201905081810360008301526146d181614164565b9050919050565b60006020820190506146ed6000830184614196565b92915050565b60006146fd61470e565b90506147098282614a5b565b919050565b6000604051905090565b600067ffffffffffffffff82111561473357614732614b93565b5b61473c82614bc2565b9050602081019050919050565b600067ffffffffffffffff82111561476457614763614b93565b5b61476d82614bc2565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614821826149a7565b915061482c836149a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486157614860614b06565b5b828201905092915050565b6000614877826149a7565b9150614882836149a7565b92508261489257614891614b35565b5b828204905092915050565b60006148a8826149a7565b91506148b3836149a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ec576148eb614b06565b5b828202905092915050565b6000614902826149a7565b915061490d836149a7565b9250828210156149205761491f614b06565b5b828203905092915050565b600061493682614987565b9050919050565b600061494882614987565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149bc826149c3565b9050919050565b60006149ce826149d5565b9050919050565b60006149e082614987565b9050919050565b82818337600083830152505050565b60005b83811015614a145780820151818401526020810190506149f9565b83811115614a23576000848401525b50505050565b60006002820490506001821680614a4157607f821691505b60208210811415614a5557614a54614b64565b5b50919050565b614a6482614bc2565b810181811067ffffffffffffffff82111715614a8357614a82614b93565b5b80604052505050565b6000614a97826149a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aca57614ac9614b06565b5b600182019050919050565b6000614ae0826149a7565b9150614aeb836149a7565b925082614afb57614afa614b35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752063616e206d696e742061206d6178696d756d206f66203520506f6f7360008201527f20706572207472616e736174696f6e0000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20506f6f20737570706c79000000000000600082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6153598161492b565b811461536457600080fd5b50565b6153708161493d565b811461537b57600080fd5b50565b6153878161494f565b811461539257600080fd5b50565b61539e8161495b565b81146153a957600080fd5b50565b6153b5816149a7565b81146153c057600080fd5b5056fea264697066735822122005ec632a4ae41a44b691a0a1dc350d34b1a1f8d5148c2af64c6f7a9baf66661b64736f6c63430008040033

Deployed Bytecode Sourcemap

55263:4737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52702:40;52718:12;:10;:12::i;:::-;52732:9;52702:40;;;;;;;:::i;:::-;;;;;;;;55263:4737;;;;;34644:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23088:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57960:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55480:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55745:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35284:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53908:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23978:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34952:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55704:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57873:79;;;;;;;;;;;;;:::i;:::-;;52833:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24388:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58705:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35474:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55649:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57674:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21223:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42447:94;;;;;;;;;;;;;:::i;:::-;;59805:192;;;;;;;;;;;;;:::i;:::-;;53608:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41796:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57453:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21698:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53408:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57784:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55780:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56505:893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23381:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58523:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24644:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58359:125;;;;;;;;;;;;;:::i;:::-;;21873:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55568:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53204:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55371:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58135:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53018:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55526:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59123:545;;;;;;;;;;;;;:::i;:::-;;42696:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15986:98;16039:7;16066:10;16059:17;;15986:98;:::o;34644:224::-;34746:4;34785:35;34770:50;;;:11;:50;;;;:90;;;;34824:36;34848:11;34824:23;:36::i;:::-;34770:90;34763:97;;34644:224;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;23088:221::-;23164:7;23192:16;23200:7;23192;:16::i;:::-;23184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23277:15;:24;23293:7;23277:24;;;;;;;;;;;;;;;;;;;;;23270:31;;23088:221;;;:::o;22611:411::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;22750:11;;:2;:11;;;;22742:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22850:5;22834:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22859:37;22876:5;22883:12;:10;:12::i;:::-;22859:16;:37::i;:::-;22834:62;22812:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22993:21;23002:2;23006:7;22993:8;:21::i;:::-;22611:411;;;:::o;57960:124::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58062:14:::1;58045;:31;;;;;;;;;;;;:::i;:::-;;57960:124:::0;:::o;55480:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55745:26::-;;;;;;;;;;;;;:::o;35284:113::-;35345:7;35372:10;:17;;;;35365:24;;35284:113;:::o;53908:613::-;54003:1;53984:7;:16;53992:7;53984:16;;;;;;;;;;;;;;;;:20;53976:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:21;54108:14;;54084:21;:38;;;;:::i;:::-;54060:62;;54133:15;54203:9;:18;54213:7;54203:18;;;;;;;;;;;;;;;;54188:12;;54168:7;:16;54176:7;54168:16;;;;;;;;;;;;;;;;54152:13;:32;;;;:::i;:::-;54151:49;;;;:::i;:::-;:70;;;;:::i;:::-;54133:88;;54253:1;54242:7;:12;;54234:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54357:7;54336:9;:18;54346:7;54336:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;54315:9;:18;54325:7;54315:18;;;;;;;;;;;;;;;:49;;;;54409:7;54392:14;;:24;;;;:::i;:::-;54375:14;:41;;;;54429:35;54447:7;54456;54429:17;:35::i;:::-;54480:33;54496:7;54505;54480:33;;;;;;;:::i;:::-;;;;;;;;53908:613;;;:::o;23978:339::-;24173:41;24192:12;:10;:12::i;:::-;24206:7;24173:18;:41::i;:::-;24165:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24281:28;24291:4;24297:2;24301:7;24281:9;:28::i;:::-;23978:339;;;:::o;34952:256::-;35049:7;35085:23;35102:5;35085:16;:23::i;:::-;35077:5;:31;35069:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35174:12;:19;35187:5;35174:19;;;;;;;;;;;;;;;:26;35194:5;35174:26;;;;;;;;;;;;35167:33;;34952:256;;;;:::o;55704:32::-;;;;:::o;57873:79::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57937:7:::1;;;;;;;;;;;57936:8;57926:7;;:18;;;;;;;;;;;;;;;;;;57873:79::o:0;52833:91::-;52877:7;52904:12;;52897:19;;52833:91;:::o;24388:185::-;24526:39;24543:4;24549:2;24553:7;24526:39;;;;;;;;;;;;:16;:39::i;:::-;24388:185;;;:::o;58705:342::-;58764:16;58793:18;58814:17;58824:6;58814:9;:17::i;:::-;58793:38;;58844:25;58886:10;58872:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58844:53;;58912:9;58908:106;58927:10;58923:1;:14;58908:106;;;58972:30;58992:6;59000:1;58972:19;:30::i;:::-;58958:8;58967:1;58958:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;58939:3;;;;;:::i;:::-;;;;58908:106;;;;59031:8;59024:15;;;;58705:342;;;:::o;35474:233::-;35549:7;35585:30;:28;:30::i;:::-;35577:5;:38;35569:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35682:10;35693:5;35682:17;;;;;;;;;;;;;;;;;;;;;;;;35675:24;;35474:233;;;:::o;55649:46::-;;;;:::o;57674:102::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57761:7:::1;57745:13;:23;;;;;;;;;;;;:::i;:::-;;57674:102:::0;:::o;21223:239::-;21295:7;21315:13;21331:7;:16;21339:7;21331:16;;;;;;;;;;;;;;;;;;;;;21315:32;;21383:1;21366:19;;:5;:19;;;;21358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:5;21442:12;;;21223:239;;;:::o;20953:208::-;21025:7;21070:1;21053:19;;:5;:19;;;;21045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:9;:16;21147:5;21137:16;;;;;;;;;;;;;;;;21130:23;;20953:208;;;:::o;42447:94::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42512:21:::1;42530:1;42512:9;:21::i;:::-;42447:94::o:0;59805:192::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59900:1:::1;59883:13;;:18;59875:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59977:12;59956:18;:33;;;;59805:192::o:0;53608:100::-;53659:7;53686;53694:5;53686:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53679:21;;53608:100;;;:::o;41796:87::-;41842:7;41869:6;;;;;;;;;;;41862:13;;41796:87;:::o;57453:91::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57527:9:::1;57518:6;:18;;;;57453:91:::0;:::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21698:104;:::o;53408:109::-;53464:7;53491:9;:18;53501:7;53491:18;;;;;;;;;;;;;;;;53484:25;;53408:109;;;:::o;57784:81::-;57825:7;57851:6;;57844:13;;57784:81;:::o;55780:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56505:893::-;56558:14;56575:13;:11;:13::i;:::-;56558:30;;56609:7;;;;;;;;;;;56608:8;56599:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;56685:26;;56678:3;:33;;56669:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;56800:10;;56793:3;56784:6;:12;;;;:::i;:::-;:26;;56775:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56891:3;56882:6;;:12;;;;:::i;:::-;56869:9;:25;;56860:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56950:9;56946:90;56965:3;56961:1;:7;56946:90;;;56989:35;57000:10;57021:1;57012:6;:10;;;;:::i;:::-;56989:9;:35::i;:::-;56970:3;;;;;:::i;:::-;;;;56946:90;;;;57294:1;57272:18;;:23;:56;;;;;57317:10;;57300:13;:11;:13::i;:::-;:27;57272:56;57268:122;;;57366:12;57345:18;:33;;;;57268:122;56505:893;;:::o;23381:295::-;23496:12;:10;:12::i;:::-;23484:24;;:8;:24;;;;23476:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23596:8;23551:18;:32;23570:12;:10;:12::i;:::-;23551:32;;;;;;;;;;;;;;;:42;23584:8;23551:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23649:8;23620:48;;23635:12;:10;:12::i;:::-;23620:48;;;23659:8;23620:48;;;;;;:::i;:::-;;;;;;;;23381:295;;:::o;58523:174::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58623:5:::1;58606:22;;:13;;;;;;;;;;;:22;;;58598:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58681:8;58666:12;:23;;;;;;;;;;;;:::i;:::-;;58523:174:::0;:::o;24644:328::-;24819:41;24838:12;:10;:12::i;:::-;24852:7;24819:18;:41::i;:::-;24811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24925:39;24939:4;24945:2;24949:7;24958:5;24925:13;:39::i;:::-;24644:328;;;;:::o;58359:125::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58427:4:::1;58410:13;;:21;;;;;;;;;;;;;;;;;;58447:29;58463:12;58447:29;;;;;;:::i;:::-;;;;;;;;58359:125::o:0;21873:334::-;21946:13;21980:16;21988:7;21980;:16::i;:::-;21972:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22061:21;22085:10;:8;:10::i;:::-;22061:34;;22137:1;22119:7;22113:21;:25;:86;;;;;;;;;;;;;;;;;22165:7;22174:18;:7;:16;:18::i;:::-;22148:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22113:86;22106:93;;;21873:334;;;:::o;55568:28::-;;;;:::o;53204:105::-;53258:7;53285;:16;53293:7;53285:16;;;;;;;;;;;;;;;;53278:23;;53204:105;;;:::o;55371:100::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58135:158::-;58187:13;58227;:11;:13::i;:::-;58221:3;:19;58213:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;58273:12;58266:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58135:158;;;:::o;53018:95::-;53064:7;53091:14;;53084:21;;53018:95;:::o;55526:33::-;;;;:::o;23747:164::-;23844:4;23868:18;:25;23887:5;23868:25;;;;;;;;;;;;;;;:35;23894:8;23868:35;;;;;;;;;;;;;;;;;;;;;;;;;23861:42;;23747:164;;;;:::o;59123:545::-;59194:1;59177:13;;:18;59169:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59270:1;59248:18;;:23;;59240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59383:10;;59360:18;;59350:29;59345:35;;:48;;;;:::i;:::-;59329:13;:64;;;;59567:3;59545:18;;59530:12;:33;;;;:::i;:::-;59529:41;59525:136;;;59639:10;;59633:1;59618:12;:16;;;;:::i;:::-;59608:27;59603:33;;:46;;;;:::i;:::-;59587:13;:62;;;;59525:136;59123:545::o;42696:192::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42805:1:::1;42785:22;;:8;:22;;;;42777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42861:19;42871:8;42861:9;:19::i;:::-;42696:192:::0;:::o;20584:305::-;20686:4;20738:25;20723:40;;;:11;:40;;;;:105;;;;20795:33;20780:48;;;:11;:48;;;;20723:105;:158;;;;20845:36;20869:11;20845:23;:36::i;:::-;20723:158;20703:178;;20584:305;;;:::o;26482:127::-;26547:4;26599:1;26571:30;;:7;:16;26579:7;26571:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26564:37;;26482:127;;;:::o;30464:174::-;30566:2;30539:15;:24;30555:7;30539:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30622:7;30618:2;30584:46;;30593:23;30608:7;30593:14;:23::i;:::-;30584:46;;;;;;;;;;;;30464:174;;:::o;9562:317::-;9677:6;9652:21;:31;;9644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9731:12;9749:9;:14;;9771:6;9749:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9730:52;;;9801:7;9793:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9562:317;;;:::o;26776:348::-;26869:4;26894:16;26902:7;26894;:16::i;:::-;26886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26970:13;26986:23;27001:7;26986:14;:23::i;:::-;26970:39;;27039:5;27028:16;;:7;:16;;;:51;;;;27072:7;27048:31;;:20;27060:7;27048:11;:20::i;:::-;:31;;;27028:51;:87;;;;27083:32;27100:5;27107:7;27083:16;:32::i;:::-;27028:87;27020:96;;;26776:348;;;;:::o;29768:578::-;29927:4;29900:31;;:23;29915:7;29900:14;:23::i;:::-;:31;;;29892:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30010:1;29996:16;;:2;:16;;;;29988:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30066:39;30087:4;30093:2;30097:7;30066:20;:39::i;:::-;30170:29;30187:1;30191:7;30170:8;:29::i;:::-;30231:1;30212:9;:15;30222:4;30212:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30260:1;30243:9;:13;30253:2;30243:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30291:2;30272:7;:16;30280:7;30272:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30330:7;30326:2;30311:27;;30320:4;30311:27;;;;;;;;;;;;29768:578;;;:::o;42896:173::-;42952:16;42971:6;;;;;;;;;;;42952:25;;42997:8;42988:6;;:17;;;;;;;;;;;;;;;;;;43052:8;43021:40;;43042:8;43021:40;;;;;;;;;;;;42896:173;;:::o;27466:110::-;27542:26;27552:2;27556:7;27542:26;;;;;;;;;;;;:9;:26::i;:::-;27466:110;;:::o;25854:315::-;26011:28;26021:4;26027:2;26031:7;26011:9;:28::i;:::-;26058:48;26081:4;26087:2;26091:7;26100:5;26058:22;:48::i;:::-;26050:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25854:315;;;;:::o;57552:114::-;57612:13;57645;57638:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57552:114;:::o;16519:723::-;16575:13;16805:1;16796:5;:10;16792:53;;;16823:10;;;;;;;;;;;;;;;;;;;;;16792:53;16855:12;16870:5;16855:20;;16886:14;16911:78;16926:1;16918:4;:9;16911:78;;16944:8;;;;;:::i;:::-;;;;16975:2;16967:10;;;;;:::i;:::-;;;16911:78;;;16999:19;17031:6;17021:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16999:39;;17049:154;17065:1;17056:5;:10;17049:154;;17093:1;17083:11;;;;;:::i;:::-;;;17160:2;17152:5;:10;;;;:::i;:::-;17139:2;:24;;;;:::i;:::-;17126:39;;17109:6;17116;17109:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17189:2;17180:11;;;;;:::i;:::-;;;17049:154;;;17227:6;17213:21;;;;;16519:723;;;;:::o;19082:157::-;19167:4;19206:25;19191:40;;;:11;:40;;;;19184:47;;19082:157;;;:::o;36320:589::-;36464:45;36491:4;36497:2;36501:7;36464:26;:45::i;:::-;36542:1;36526:18;;:4;:18;;;36522:187;;;36561:40;36593:7;36561:31;:40::i;:::-;36522:187;;;36631:2;36623:10;;:4;:10;;;36619:90;;36650:47;36683:4;36689:7;36650:32;:47::i;:::-;36619:90;36522:187;36737:1;36723:16;;:2;:16;;;36719:183;;;36756:45;36793:7;36756:36;:45::i;:::-;36719:183;;;36829:4;36823:10;;:2;:10;;;36819:83;;36850:40;36878:2;36882:7;36850:27;:40::i;:::-;36819:83;36719:183;36320:589;;;:::o;27803:321::-;27933:18;27939:2;27943:7;27933:5;:18::i;:::-;27984:54;28015:1;28019:2;28023:7;28032:5;27984:22;:54::i;:::-;27962:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27803:321;;;:::o;31203:803::-;31358:4;31379:15;:2;:13;;;:15::i;:::-;31375:624;;;31431:2;31415:36;;;31452:12;:10;:12::i;:::-;31466:4;31472:7;31481:5;31415:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31411:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31678:1;31661:6;:13;:18;31657:272;;;31704:60;;;;;;;;;;:::i;:::-;;;;;;;;31657:272;31879:6;31873:13;31864:6;31860:2;31856:15;31849:38;31411:533;31548:45;;;31538:55;;;:6;:55;;;;31531:62;;;;;31375:624;31983:4;31976:11;;31203:803;;;;;;;:::o;32578:126::-;;;;:::o;37632:164::-;37736:10;:17;;;;37709:15;:24;37725:7;37709:24;;;;;;;;;;;:44;;;;37764:10;37780:7;37764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37632:164;:::o;38423:988::-;38689:22;38739:1;38714:22;38731:4;38714:16;:22::i;:::-;:26;;;;:::i;:::-;38689:51;;38751:18;38772:17;:26;38790:7;38772:26;;;;;;;;;;;;38751:47;;38919:14;38905:10;:28;38901:328;;38950:19;38972:12;:18;38985:4;38972:18;;;;;;;;;;;;;;;:34;38991:14;38972:34;;;;;;;;;;;;38950:56;;39056:11;39023:12;:18;39036:4;39023:18;;;;;;;;;;;;;;;:30;39042:10;39023:30;;;;;;;;;;;:44;;;;39173:10;39140:17;:30;39158:11;39140:30;;;;;;;;;;;:43;;;;38901:328;;39325:17;:26;39343:7;39325:26;;;;;;;;;;;39318:33;;;39369:12;:18;39382:4;39369:18;;;;;;;;;;;;;;;:34;39388:14;39369:34;;;;;;;;;;;39362:41;;;38423:988;;;;:::o;39706:1079::-;39959:22;40004:1;39984:10;:17;;;;:21;;;;:::i;:::-;39959:46;;40016:18;40037:15;:24;40053:7;40037:24;;;;;;;;;;;;40016:45;;40388:19;40410:10;40421:14;40410:26;;;;;;;;;;;;;;;;;;;;;;;;40388:48;;40474:11;40449:10;40460;40449:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40585:10;40554:15;:28;40570:11;40554:28;;;;;;;;;;;:41;;;;40726:15;:24;40742:7;40726:24;;;;;;;;;;;40719:31;;;40761:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39706:1079;;;;:::o;37210:221::-;37295:14;37312:20;37329:2;37312:16;:20::i;:::-;37295:37;;37370:7;37343:12;:16;37356:2;37343:16;;;;;;;;;;;;;;;:24;37360:6;37343:24;;;;;;;;;;;:34;;;;37417:6;37388:17;:26;37406:7;37388:26;;;;;;;;;;;:35;;;;37210:221;;;:::o;28460:382::-;28554:1;28540:16;;:2;:16;;;;28532:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28613:16;28621:7;28613;:16::i;:::-;28612:17;28604:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28675:45;28704:1;28708:2;28712:7;28675:20;:45::i;:::-;28750:1;28733:9;:13;28743:2;28733:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28781:2;28762:7;:16;28770:7;28762:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28826:7;28822:2;28801:33;;28818:1;28801:33;;;;;;;;;;;;28460:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:155::-;906:5;944:6;931:20;922:29;;960:41;995:5;960:41;:::i;:::-;912:95;;;;:::o;1013:133::-;1056:5;1094:6;1081:20;1072:29;;1110:30;1134:5;1110:30;:::i;:::-;1062:84;;;;:::o;1152:137::-;1197:5;1235:6;1222:20;1213:29;;1251:32;1277:5;1251:32;:::i;:::-;1203:86;;;;:::o;1295:141::-;1351:5;1382:6;1376:13;1367:22;;1398:32;1424:5;1398:32;:::i;:::-;1357:79;;;;:::o;1455:271::-;1510:5;1559:3;1552:4;1544:6;1540:17;1536:27;1526:2;;1577:1;1574;1567:12;1526:2;1617:6;1604:20;1642:78;1716:3;1708:6;1701:4;1693:6;1689:17;1642:78;:::i;:::-;1633:87;;1516:210;;;;;:::o;1746:273::-;1802:5;1851:3;1844:4;1836:6;1832:17;1828:27;1818:2;;1869:1;1866;1859:12;1818:2;1909:6;1896:20;1934:79;2009:3;2001:6;1994:4;1986:6;1982:17;1934:79;:::i;:::-;1925:88;;1808:211;;;;;:::o;2025:139::-;2071:5;2109:6;2096:20;2087:29;;2125:33;2152:5;2125:33;:::i;:::-;2077:87;;;;:::o;2170:262::-;2229:6;2278:2;2266:9;2257:7;2253:23;2249:32;2246:2;;;2294:1;2291;2284:12;2246:2;2337:1;2362:53;2407:7;2398:6;2387:9;2383:22;2362:53;:::i;:::-;2352:63;;2308:117;2236:196;;;;:::o;2438:278::-;2505:6;2554:2;2542:9;2533:7;2529:23;2525:32;2522:2;;;2570:1;2567;2560:12;2522:2;2613:1;2638:61;2691:7;2682:6;2671:9;2667:22;2638:61;:::i;:::-;2628:71;;2584:125;2512:204;;;;:::o;2722:407::-;2790:6;2798;2847:2;2835:9;2826:7;2822:23;2818:32;2815:2;;;2863:1;2860;2853:12;2815:2;2906:1;2931:53;2976:7;2967:6;2956:9;2952:22;2931:53;:::i;:::-;2921:63;;2877:117;3033:2;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3004:118;2805:324;;;;;:::o;3135:552::-;3212:6;3220;3228;3277:2;3265:9;3256:7;3252:23;3248:32;3245:2;;;3293:1;3290;3283:12;3245:2;3336:1;3361:53;3406:7;3397:6;3386:9;3382:22;3361:53;:::i;:::-;3351:63;;3307:117;3463:2;3489:53;3534:7;3525:6;3514:9;3510:22;3489:53;:::i;:::-;3479:63;;3434:118;3591:2;3617:53;3662:7;3653:6;3642:9;3638:22;3617:53;:::i;:::-;3607:63;;3562:118;3235:452;;;;;:::o;3693:809::-;3788:6;3796;3804;3812;3861:3;3849:9;3840:7;3836:23;3832:33;3829:2;;;3878:1;3875;3868:12;3829:2;3921:1;3946:53;3991:7;3982:6;3971:9;3967:22;3946:53;:::i;:::-;3936:63;;3892:117;4048:2;4074:53;4119:7;4110:6;4099:9;4095:22;4074:53;:::i;:::-;4064:63;;4019:118;4176:2;4202:53;4247:7;4238:6;4227:9;4223:22;4202:53;:::i;:::-;4192:63;;4147:118;4332:2;4321:9;4317:18;4304:32;4363:18;4355:6;4352:30;4349:2;;;4395:1;4392;4385:12;4349:2;4423:62;4477:7;4468:6;4457:9;4453:22;4423:62;:::i;:::-;4413:72;;4275:220;3819:683;;;;;;;:::o;4508:401::-;4573:6;4581;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;4646:1;4643;4636:12;4598:2;4689:1;4714:53;4759:7;4750:6;4739:9;4735:22;4714:53;:::i;:::-;4704:63;;4660:117;4816:2;4842:50;4884:7;4875:6;4864:9;4860:22;4842:50;:::i;:::-;4832:60;;4787:115;4588:321;;;;;:::o;4915:407::-;4983:6;4991;5040:2;5028:9;5019:7;5015:23;5011:32;5008:2;;;5056:1;5053;5046:12;5008:2;5099:1;5124:53;5169:7;5160:6;5149:9;5145:22;5124:53;:::i;:::-;5114:63;;5070:117;5226:2;5252:53;5297:7;5288:6;5277:9;5273:22;5252:53;:::i;:::-;5242:63;;5197:118;4998:324;;;;;:::o;5328:260::-;5386:6;5435:2;5423:9;5414:7;5410:23;5406:32;5403:2;;;5451:1;5448;5441:12;5403:2;5494:1;5519:52;5563:7;5554:6;5543:9;5539:22;5519:52;:::i;:::-;5509:62;;5465:116;5393:195;;;;:::o;5594:282::-;5663:6;5712:2;5700:9;5691:7;5687:23;5683:32;5680:2;;;5728:1;5725;5718:12;5680:2;5771:1;5796:63;5851:7;5842:6;5831:9;5827:22;5796:63;:::i;:::-;5786:73;;5742:127;5670:206;;;;:::o;5882:375::-;5951:6;6000:2;5988:9;5979:7;5975:23;5971:32;5968:2;;;6016:1;6013;6006:12;5968:2;6087:1;6076:9;6072:17;6059:31;6117:18;6109:6;6106:30;6103:2;;;6149:1;6146;6139:12;6103:2;6177:63;6232:7;6223:6;6212:9;6208:22;6177:63;:::i;:::-;6167:73;;6030:220;5958:299;;;;:::o;6263:262::-;6322:6;6371:2;6359:9;6350:7;6346:23;6342:32;6339:2;;;6387:1;6384;6377:12;6339:2;6430:1;6455:53;6500:7;6491:6;6480:9;6476:22;6455:53;:::i;:::-;6445:63;;6401:117;6329:196;;;;:::o;6531:179::-;6600:10;6621:46;6663:3;6655:6;6621:46;:::i;:::-;6699:4;6694:3;6690:14;6676:28;;6611:99;;;;:::o;6716:147::-;6811:45;6850:5;6811:45;:::i;:::-;6806:3;6799:58;6789:74;;:::o;6869:118::-;6956:24;6974:5;6956:24;:::i;:::-;6951:3;6944:37;6934:53;;:::o;7023:732::-;7142:3;7171:54;7219:5;7171:54;:::i;:::-;7241:86;7320:6;7315:3;7241:86;:::i;:::-;7234:93;;7351:56;7401:5;7351:56;:::i;:::-;7430:7;7461:1;7446:284;7471:6;7468:1;7465:13;7446:284;;;7547:6;7541:13;7574:63;7633:3;7618:13;7574:63;:::i;:::-;7567:70;;7660:60;7713:6;7660:60;:::i;:::-;7650:70;;7506:224;7493:1;7490;7486:9;7481:14;;7446:284;;;7450:14;7746:3;7739:10;;7147:608;;;;;;;:::o;7761:109::-;7842:21;7857:5;7842:21;:::i;:::-;7837:3;7830:34;7820:50;;:::o;7876:360::-;7962:3;7990:38;8022:5;7990:38;:::i;:::-;8044:70;8107:6;8102:3;8044:70;:::i;:::-;8037:77;;8123:52;8168:6;8163:3;8156:4;8149:5;8145:16;8123:52;:::i;:::-;8200:29;8222:6;8200:29;:::i;:::-;8195:3;8191:39;8184:46;;7966:270;;;;;:::o;8242:364::-;8330:3;8358:39;8391:5;8358:39;:::i;:::-;8413:71;8477:6;8472:3;8413:71;:::i;:::-;8406:78;;8493:52;8538:6;8533:3;8526:4;8519:5;8515:16;8493:52;:::i;:::-;8570:29;8592:6;8570:29;:::i;:::-;8565:3;8561:39;8554:46;;8334:272;;;;;:::o;8612:377::-;8718:3;8746:39;8779:5;8746:39;:::i;:::-;8801:89;8883:6;8878:3;8801:89;:::i;:::-;8794:96;;8899:52;8944:6;8939:3;8932:4;8925:5;8921:16;8899:52;:::i;:::-;8976:6;8971:3;8967:16;8960:23;;8722:267;;;;;:::o;9019:802::-;9104:3;9141:5;9135:12;9170:36;9196:9;9170:36;:::i;:::-;9222:71;9286:6;9281:3;9222:71;:::i;:::-;9215:78;;9324:1;9313:9;9309:17;9340:1;9335:135;;;;9484:1;9479:336;;;;9302:513;;9335:135;9419:4;9415:9;9404;9400:25;9395:3;9388:38;9455:4;9450:3;9446:14;9439:21;;9335:135;;9479:336;9546:38;9578:5;9546:38;:::i;:::-;9606:1;9620:154;9634:6;9631:1;9628:13;9620:154;;;9708:7;9702:14;9698:1;9693:3;9689:11;9682:35;9758:1;9749:7;9745:15;9734:26;;9656:4;9653:1;9649:12;9644:17;;9620:154;;;9803:1;9798:3;9794:11;9787:18;;9486:329;;9302:513;;9108:713;;;;;;:::o;9827:366::-;9969:3;9990:67;10054:2;10049:3;9990:67;:::i;:::-;9983:74;;10066:93;10155:3;10066:93;:::i;:::-;10184:2;10179:3;10175:12;10168:19;;9973:220;;;:::o;10199:366::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10345:220;;;:::o;10571:366::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10717:220;;;:::o;10943:366::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;11089:220;;;:::o;11315:366::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11461:220;;;:::o;11687:366::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11833:220;;;:::o;12059:366::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12205:220;;;:::o;12431:366::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12577:220;;;:::o;12803:366::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12949:220;;;:::o;13175:366::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13321:220;;;:::o;13547:366::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13693:220;;;:::o;13919:366::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;14065:220;;;:::o;14291:366::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14437:220;;;:::o;14663:366::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14809:220;;;:::o;15035:366::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15181:220;;;:::o;15407:366::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15553:220;;;:::o;15779:366::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15925:220;;;:::o;16151:366::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16297:220;;;:::o;16523:366::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16669:220;;;:::o;16895:366::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;17041:220;;;:::o;17267:366::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17413:220;;;:::o;17639:366::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17785:220;;;:::o;18011:366::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18157:220;;;:::o;18383:366::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18529:220;;;:::o;18755:366::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18901:220;;;:::o;19127:366::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19273:220;;;:::o;19499:366::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19645:220;;;:::o;19871:366::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;20017:220;;;:::o;20243:398::-;20402:3;20423:83;20504:1;20499:3;20423:83;:::i;:::-;20416:90;;20515:93;20604:3;20515:93;:::i;:::-;20633:1;20628:3;20624:11;20617:18;;20406:235;;;:::o;20647:366::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20793:220;;;:::o;21019:366::-;21161:3;21182:67;21246:2;21241:3;21182:67;:::i;:::-;21175:74;;21258:93;21347:3;21258:93;:::i;:::-;21376:2;21371:3;21367:12;21360:19;;21165:220;;;:::o;21391:108::-;21468:24;21486:5;21468:24;:::i;:::-;21463:3;21456:37;21446:53;;:::o;21505:118::-;21592:24;21610:5;21592:24;:::i;:::-;21587:3;21580:37;21570:53;;:::o;21629:435::-;21809:3;21831:95;21922:3;21913:6;21831:95;:::i;:::-;21824:102;;21943:95;22034:3;22025:6;21943:95;:::i;:::-;21936:102;;22055:3;22048:10;;21813:251;;;;;:::o;22070:379::-;22254:3;22276:147;22419:3;22276:147;:::i;:::-;22269:154;;22440:3;22433:10;;22258:191;;;:::o;22455:222::-;22548:4;22586:2;22575:9;22571:18;22563:26;;22599:71;22667:1;22656:9;22652:17;22643:6;22599:71;:::i;:::-;22553:124;;;;:::o;22683:348::-;22812:4;22850:2;22839:9;22835:18;22827:26;;22863:79;22939:1;22928:9;22924:17;22915:6;22863:79;:::i;:::-;22952:72;23020:2;23009:9;23005:18;22996:6;22952:72;:::i;:::-;22817:214;;;;;:::o;23037:640::-;23232:4;23270:3;23259:9;23255:19;23247:27;;23284:71;23352:1;23341:9;23337:17;23328:6;23284:71;:::i;:::-;23365:72;23433:2;23422:9;23418:18;23409:6;23365:72;:::i;:::-;23447;23515:2;23504:9;23500:18;23491:6;23447:72;:::i;:::-;23566:9;23560:4;23556:20;23551:2;23540:9;23536:18;23529:48;23594:76;23665:4;23656:6;23594:76;:::i;:::-;23586:84;;23237:440;;;;;;;:::o;23683:332::-;23804:4;23842:2;23831:9;23827:18;23819:26;;23855:71;23923:1;23912:9;23908:17;23899:6;23855:71;:::i;:::-;23936:72;24004:2;23993:9;23989:18;23980:6;23936:72;:::i;:::-;23809:206;;;;;:::o;24021:373::-;24164:4;24202:2;24191:9;24187:18;24179:26;;24251:9;24245:4;24241:20;24237:1;24226:9;24222:17;24215:47;24279:108;24382:4;24373:6;24279:108;:::i;:::-;24271:116;;24169:225;;;;:::o;24400:210::-;24487:4;24525:2;24514:9;24510:18;24502:26;;24538:65;24600:1;24589:9;24585:17;24576:6;24538:65;:::i;:::-;24492:118;;;;:::o;24616:313::-;24729:4;24767:2;24756:9;24752:18;24744:26;;24816:9;24810:4;24806:20;24802:1;24791:9;24787:17;24780:47;24844:78;24917:4;24908:6;24844:78;:::i;:::-;24836:86;;24734:195;;;;:::o;24935:307::-;25045:4;25083:2;25072:9;25068:18;25060:26;;25132:9;25126:4;25122:20;25118:1;25107:9;25103:17;25096:47;25160:75;25230:4;25221:6;25160:75;:::i;:::-;25152:83;;25050:192;;;;:::o;25248:419::-;25414:4;25452:2;25441:9;25437:18;25429:26;;25501:9;25495:4;25491:20;25487:1;25476:9;25472:17;25465:47;25529:131;25655:4;25529:131;:::i;:::-;25521:139;;25419:248;;;:::o;25673:419::-;25839:4;25877:2;25866:9;25862:18;25854:26;;25926:9;25920:4;25916:20;25912:1;25901:9;25897:17;25890:47;25954:131;26080:4;25954:131;:::i;:::-;25946:139;;25844:248;;;:::o;26098:419::-;26264:4;26302:2;26291:9;26287:18;26279:26;;26351:9;26345:4;26341:20;26337:1;26326:9;26322:17;26315:47;26379:131;26505:4;26379:131;:::i;:::-;26371:139;;26269:248;;;:::o;26523:419::-;26689:4;26727:2;26716:9;26712:18;26704:26;;26776:9;26770:4;26766:20;26762:1;26751:9;26747:17;26740:47;26804:131;26930:4;26804:131;:::i;:::-;26796:139;;26694:248;;;:::o;26948:419::-;27114:4;27152:2;27141:9;27137:18;27129:26;;27201:9;27195:4;27191:20;27187:1;27176:9;27172:17;27165:47;27229:131;27355:4;27229:131;:::i;:::-;27221:139;;27119:248;;;:::o;27373:419::-;27539:4;27577:2;27566:9;27562:18;27554:26;;27626:9;27620:4;27616:20;27612:1;27601:9;27597:17;27590:47;27654:131;27780:4;27654:131;:::i;:::-;27646:139;;27544:248;;;:::o;27798:419::-;27964:4;28002:2;27991:9;27987:18;27979:26;;28051:9;28045:4;28041:20;28037:1;28026:9;28022:17;28015:47;28079:131;28205:4;28079:131;:::i;:::-;28071:139;;27969:248;;;:::o;28223:419::-;28389:4;28427:2;28416:9;28412:18;28404:26;;28476:9;28470:4;28466:20;28462:1;28451:9;28447:17;28440:47;28504:131;28630:4;28504:131;:::i;:::-;28496:139;;28394:248;;;:::o;28648:419::-;28814:4;28852:2;28841:9;28837:18;28829:26;;28901:9;28895:4;28891:20;28887:1;28876:9;28872:17;28865:47;28929:131;29055:4;28929:131;:::i;:::-;28921:139;;28819:248;;;:::o;29073:419::-;29239:4;29277:2;29266:9;29262:18;29254:26;;29326:9;29320:4;29316:20;29312:1;29301:9;29297:17;29290:47;29354:131;29480:4;29354:131;:::i;:::-;29346:139;;29244:248;;;:::o;29498:419::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29669:248;;;:::o;29923:419::-;30089:4;30127:2;30116:9;30112:18;30104:26;;30176:9;30170:4;30166:20;30162:1;30151:9;30147:17;30140:47;30204:131;30330:4;30204:131;:::i;:::-;30196:139;;30094:248;;;:::o;30348:419::-;30514:4;30552:2;30541:9;30537:18;30529:26;;30601:9;30595:4;30591:20;30587:1;30576:9;30572:17;30565:47;30629:131;30755:4;30629:131;:::i;:::-;30621:139;;30519:248;;;:::o;30773:419::-;30939:4;30977:2;30966:9;30962:18;30954:26;;31026:9;31020:4;31016:20;31012:1;31001:9;30997:17;30990:47;31054:131;31180:4;31054:131;:::i;:::-;31046:139;;30944:248;;;:::o;31198:419::-;31364:4;31402:2;31391:9;31387:18;31379:26;;31451:9;31445:4;31441:20;31437:1;31426:9;31422:17;31415:47;31479:131;31605:4;31479:131;:::i;:::-;31471:139;;31369:248;;;:::o;31623:419::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31876:9;31870:4;31866:20;31862:1;31851:9;31847:17;31840:47;31904:131;32030:4;31904:131;:::i;:::-;31896:139;;31794:248;;;:::o;32048:419::-;32214:4;32252:2;32241:9;32237:18;32229:26;;32301:9;32295:4;32291:20;32287:1;32276:9;32272:17;32265:47;32329:131;32455:4;32329:131;:::i;:::-;32321:139;;32219:248;;;:::o;32473:419::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32644:248;;;:::o;32898:419::-;33064:4;33102:2;33091:9;33087:18;33079:26;;33151:9;33145:4;33141:20;33137:1;33126:9;33122:17;33115:47;33179:131;33305:4;33179:131;:::i;:::-;33171:139;;33069:248;;;:::o;33323:419::-;33489:4;33527:2;33516:9;33512:18;33504:26;;33576:9;33570:4;33566:20;33562:1;33551:9;33547:17;33540:47;33604:131;33730:4;33604:131;:::i;:::-;33596:139;;33494:248;;;:::o;33748:419::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33919:248;;;:::o;34173:419::-;34339:4;34377:2;34366:9;34362:18;34354:26;;34426:9;34420:4;34416:20;34412:1;34401:9;34397:17;34390:47;34454:131;34580:4;34454:131;:::i;:::-;34446:139;;34344:248;;;:::o;34598:419::-;34764:4;34802:2;34791:9;34787:18;34779:26;;34851:9;34845:4;34841:20;34837:1;34826:9;34822:17;34815:47;34879:131;35005:4;34879:131;:::i;:::-;34871:139;;34769:248;;;:::o;35023:419::-;35189:4;35227:2;35216:9;35212:18;35204:26;;35276:9;35270:4;35266:20;35262:1;35251:9;35247:17;35240:47;35304:131;35430:4;35304:131;:::i;:::-;35296:139;;35194:248;;;:::o;35448:419::-;35614:4;35652:2;35641:9;35637:18;35629:26;;35701:9;35695:4;35691:20;35687:1;35676:9;35672:17;35665:47;35729:131;35855:4;35729:131;:::i;:::-;35721:139;;35619:248;;;:::o;35873:419::-;36039:4;36077:2;36066:9;36062:18;36054:26;;36126:9;36120:4;36116:20;36112:1;36101:9;36097:17;36090:47;36154:131;36280:4;36154:131;:::i;:::-;36146:139;;36044:248;;;:::o;36298:419::-;36464:4;36502:2;36491:9;36487:18;36479:26;;36551:9;36545:4;36541:20;36537:1;36526:9;36522:17;36515:47;36579:131;36705:4;36579:131;:::i;:::-;36571:139;;36469:248;;;:::o;36723:419::-;36889:4;36927:2;36916:9;36912:18;36904:26;;36976:9;36970:4;36966:20;36962:1;36951:9;36947:17;36940:47;37004:131;37130:4;37004:131;:::i;:::-;36996:139;;36894:248;;;:::o;37148:419::-;37314:4;37352:2;37341:9;37337:18;37329:26;;37401:9;37395:4;37391:20;37387:1;37376:9;37372:17;37365:47;37429:131;37555:4;37429:131;:::i;:::-;37421:139;;37319:248;;;:::o;37573:419::-;37739:4;37777:2;37766:9;37762:18;37754:26;;37826:9;37820:4;37816:20;37812:1;37801:9;37797:17;37790:47;37854:131;37980:4;37854:131;:::i;:::-;37846:139;;37744:248;;;:::o;37998:222::-;38091:4;38129:2;38118:9;38114:18;38106:26;;38142:71;38210:1;38199:9;38195:17;38186:6;38142:71;:::i;:::-;38096:124;;;;:::o;38226:129::-;38260:6;38287:20;;:::i;:::-;38277:30;;38316:33;38344:4;38336:6;38316:33;:::i;:::-;38267:88;;;:::o;38361:75::-;38394:6;38427:2;38421:9;38411:19;;38401:35;:::o;38442:307::-;38503:4;38593:18;38585:6;38582:30;38579:2;;;38615:18;;:::i;:::-;38579:2;38653:29;38675:6;38653:29;:::i;:::-;38645:37;;38737:4;38731;38727:15;38719:23;;38508:241;;;:::o;38755:308::-;38817:4;38907:18;38899:6;38896:30;38893:2;;;38929:18;;:::i;:::-;38893:2;38967:29;38989:6;38967:29;:::i;:::-;38959:37;;39051:4;39045;39041:15;39033:23;;38822:241;;;:::o;39069:132::-;39136:4;39159:3;39151:11;;39189:4;39184:3;39180:14;39172:22;;39141:60;;;:::o;39207:141::-;39256:4;39279:3;39271:11;;39302:3;39299:1;39292:14;39336:4;39333:1;39323:18;39315:26;;39261:87;;;:::o;39354:114::-;39421:6;39455:5;39449:12;39439:22;;39428:40;;;:::o;39474:98::-;39525:6;39559:5;39553:12;39543:22;;39532:40;;;:::o;39578:99::-;39630:6;39664:5;39658:12;39648:22;;39637:40;;;:::o;39683:113::-;39753:4;39785;39780:3;39776:14;39768:22;;39758:38;;;:::o;39802:184::-;39901:11;39935:6;39930:3;39923:19;39975:4;39970:3;39966:14;39951:29;;39913:73;;;;:::o;39992:168::-;40075:11;40109:6;40104:3;40097:19;40149:4;40144:3;40140:14;40125:29;;40087:73;;;;:::o;40166:147::-;40267:11;40304:3;40289:18;;40279:34;;;;:::o;40319:169::-;40403:11;40437:6;40432:3;40425:19;40477:4;40472:3;40468:14;40453:29;;40415:73;;;;:::o;40494:148::-;40596:11;40633:3;40618:18;;40608:34;;;;:::o;40648:305::-;40688:3;40707:20;40725:1;40707:20;:::i;:::-;40702:25;;40741:20;40759:1;40741:20;:::i;:::-;40736:25;;40895:1;40827:66;40823:74;40820:1;40817:81;40814:2;;;40901:18;;:::i;:::-;40814:2;40945:1;40942;40938:9;40931:16;;40692:261;;;;:::o;40959:185::-;40999:1;41016:20;41034:1;41016:20;:::i;:::-;41011:25;;41050:20;41068:1;41050:20;:::i;:::-;41045:25;;41089:1;41079:2;;41094:18;;:::i;:::-;41079:2;41136:1;41133;41129:9;41124:14;;41001:143;;;;:::o;41150:348::-;41190:7;41213:20;41231:1;41213:20;:::i;:::-;41208:25;;41247:20;41265:1;41247:20;:::i;:::-;41242:25;;41435:1;41367:66;41363:74;41360:1;41357:81;41352:1;41345:9;41338:17;41334:105;41331:2;;;41442:18;;:::i;:::-;41331:2;41490:1;41487;41483:9;41472:20;;41198:300;;;;:::o;41504:191::-;41544:4;41564:20;41582:1;41564:20;:::i;:::-;41559:25;;41598:20;41616:1;41598:20;:::i;:::-;41593:25;;41637:1;41634;41631:8;41628:2;;;41642:18;;:::i;:::-;41628:2;41687:1;41684;41680:9;41672:17;;41549:146;;;;:::o;41701:96::-;41738:7;41767:24;41785:5;41767:24;:::i;:::-;41756:35;;41746:51;;;:::o;41803:104::-;41848:7;41877:24;41895:5;41877:24;:::i;:::-;41866:35;;41856:51;;;:::o;41913:90::-;41947:7;41990:5;41983:13;41976:21;41965:32;;41955:48;;;:::o;42009:149::-;42045:7;42085:66;42078:5;42074:78;42063:89;;42053:105;;;:::o;42164:126::-;42201:7;42241:42;42234:5;42230:54;42219:65;;42209:81;;;:::o;42296:77::-;42333:7;42362:5;42351:16;;42341:32;;;:::o;42379:134::-;42437:9;42470:37;42501:5;42470:37;:::i;:::-;42457:50;;42447:66;;;:::o;42519:126::-;42569:9;42602:37;42633:5;42602:37;:::i;:::-;42589:50;;42579:66;;;:::o;42651:113::-;42701:9;42734:24;42752:5;42734:24;:::i;:::-;42721:37;;42711:53;;;:::o;42770:154::-;42854:6;42849:3;42844;42831:30;42916:1;42907:6;42902:3;42898:16;42891:27;42821:103;;;:::o;42930:307::-;42998:1;43008:113;43022:6;43019:1;43016:13;43008:113;;;43107:1;43102:3;43098:11;43092:18;43088:1;43083:3;43079:11;43072:39;43044:2;43041:1;43037:10;43032:15;;43008:113;;;43139:6;43136:1;43133:13;43130:2;;;43219:1;43210:6;43205:3;43201:16;43194:27;43130:2;42979:258;;;;:::o;43243:320::-;43287:6;43324:1;43318:4;43314:12;43304:22;;43371:1;43365:4;43361:12;43392:18;43382:2;;43448:4;43440:6;43436:17;43426:27;;43382:2;43510;43502:6;43499:14;43479:18;43476:38;43473:2;;;43529:18;;:::i;:::-;43473:2;43294:269;;;;:::o;43569:281::-;43652:27;43674:4;43652:27;:::i;:::-;43644:6;43640:40;43782:6;43770:10;43767:22;43746:18;43734:10;43731:34;43728:62;43725:2;;;43793:18;;:::i;:::-;43725:2;43833:10;43829:2;43822:22;43612:238;;;:::o;43856:233::-;43895:3;43918:24;43936:5;43918:24;:::i;:::-;43909:33;;43964:66;43957:5;43954:77;43951:2;;;44034:18;;:::i;:::-;43951:2;44081:1;44074:5;44070:13;44063:20;;43899:190;;;:::o;44095:176::-;44127:1;44144:20;44162:1;44144:20;:::i;:::-;44139:25;;44178:20;44196:1;44178:20;:::i;:::-;44173:25;;44217:1;44207:2;;44222:18;;:::i;:::-;44207:2;44263:1;44260;44256:9;44251:14;;44129:142;;;;:::o;44277:180::-;44325:77;44322:1;44315:88;44422:4;44419:1;44412:15;44446:4;44443:1;44436:15;44463:180;44511:77;44508:1;44501:88;44608:4;44605:1;44598:15;44632:4;44629:1;44622:15;44649:180;44697:77;44694:1;44687:88;44794:4;44791:1;44784:15;44818:4;44815:1;44808:15;44835:180;44883:77;44880:1;44873:88;44980:4;44977:1;44970:15;45004:4;45001:1;44994:15;45021:102;45062:6;45113:2;45109:7;45104:2;45097:5;45093:14;45089:28;45079:38;;45069:54;;;:::o;45129:161::-;45269:13;45265:1;45257:6;45253:14;45246:37;45235:55;:::o;45296:230::-;45436:34;45432:1;45424:6;45420:14;45413:58;45505:13;45500:2;45492:6;45488:15;45481:38;45402:124;:::o;45532:237::-;45672:34;45668:1;45660:6;45656:14;45649:58;45741:20;45736:2;45728:6;45724:15;45717:45;45638:131;:::o;45775:225::-;45915:34;45911:1;45903:6;45899:14;45892:58;45984:8;45979:2;45971:6;45967:15;45960:33;45881:119;:::o;46006:178::-;46146:30;46142:1;46134:6;46130:14;46123:54;46112:72;:::o;46190:234::-;46330:34;46326:1;46318:6;46314:14;46307:58;46399:17;46394:2;46386:6;46382:15;46375:42;46296:128;:::o;46430:225::-;46570:34;46566:1;46558:6;46554:14;46547:58;46639:8;46634:2;46626:6;46622:15;46615:33;46536:119;:::o;46661:223::-;46801:34;46797:1;46789:6;46785:14;46778:58;46870:6;46865:2;46857:6;46853:15;46846:31;46767:117;:::o;46890:175::-;47030:27;47026:1;47018:6;47014:14;47007:51;46996:69;:::o;47071:245::-;47211:34;47207:1;47199:6;47195:14;47188:58;47280:28;47275:2;47267:6;47263:15;47256:53;47177:139;:::o;47322:179::-;47462:31;47458:1;47450:6;47446:14;47439:55;47428:73;:::o;47507:231::-;47647:34;47643:1;47635:6;47631:14;47624:58;47716:14;47711:2;47703:6;47699:15;47692:39;47613:125;:::o;47744:230::-;47884:34;47880:1;47872:6;47868:14;47861:58;47953:13;47948:2;47940:6;47936:15;47929:38;47850:124;:::o;47980:179::-;48120:31;48116:1;48108:6;48104:14;48097:55;48086:73;:::o;48165:243::-;48305:34;48301:1;48293:6;48289:14;48282:58;48374:26;48369:2;48361:6;48357:15;48350:51;48271:137;:::o;48414:229::-;48554:34;48550:1;48542:6;48538:14;48531:58;48623:12;48618:2;48610:6;48606:15;48599:37;48520:123;:::o;48649:228::-;48789:34;48785:1;48777:6;48773:14;48766:58;48858:11;48853:2;48845:6;48841:15;48834:36;48755:122;:::o;48883:176::-;49023:28;49019:1;49011:6;49007:14;49000:52;48989:70;:::o;49065:160::-;49205:12;49201:1;49193:6;49189:14;49182:36;49171:54;:::o;49231:182::-;49371:34;49367:1;49359:6;49355:14;49348:58;49337:76;:::o;49419:231::-;49559:34;49555:1;49547:6;49543:14;49536:58;49628:14;49623:2;49615:6;49611:15;49604:39;49525:125;:::o;49656:182::-;49796:34;49792:1;49784:6;49780:14;49773:58;49762:76;:::o;49844:228::-;49984:34;49980:1;49972:6;49968:14;49961:58;50053:11;50048:2;50040:6;50036:15;50029:36;49950:122;:::o;50078:234::-;50218:34;50214:1;50206:6;50202:14;50195:58;50287:17;50282:2;50274:6;50270:15;50263:42;50184:128;:::o;50318:220::-;50458:34;50454:1;50446:6;50442:14;50435:58;50527:3;50522:2;50514:6;50510:15;50503:28;50424:114;:::o;50544:175::-;50684:27;50680:1;50672:6;50668:14;50661:51;50650:69;:::o;50725:172::-;50865:24;50861:1;50853:6;50849:14;50842:48;50831:66;:::o;50903:182::-;51043:34;51039:1;51031:6;51027:14;51020:58;51009:76;:::o;51091:114::-;51197:8;:::o;51211:236::-;51351:34;51347:1;51339:6;51335:14;51328:58;51420:19;51415:2;51407:6;51403:15;51396:44;51317:130;:::o;51453:231::-;51593:34;51589:1;51581:6;51577:14;51570:58;51662:14;51657:2;51649:6;51645:15;51638:39;51559:125;:::o;51690:122::-;51763:24;51781:5;51763:24;:::i;:::-;51756:5;51753:35;51743:2;;51802:1;51799;51792:12;51743:2;51733:79;:::o;51818:138::-;51899:32;51925:5;51899:32;:::i;:::-;51892:5;51889:43;51879:2;;51946:1;51943;51936:12;51879:2;51869:87;:::o;51962:116::-;52032:21;52047:5;52032:21;:::i;:::-;52025:5;52022:32;52012:2;;52068:1;52065;52058:12;52012:2;52002:76;:::o;52084:120::-;52156:23;52173:5;52156:23;:::i;:::-;52149:5;52146:34;52136:2;;52194:1;52191;52184:12;52136:2;52126:78;:::o;52210:122::-;52283:24;52301:5;52283:24;:::i;:::-;52276:5;52273:35;52263:2;;52322:1;52319;52312:12;52263:2;52253:79;:::o

Swarm Source

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