ETH Price: $3,399.63 (+2.52%)

Token

Ponzi Panthers (PONZI)
 

Overview

Max Total Supply

4,954 PONZI

Holders

2,437

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
alphaflyers-jealous.eth
Balance
2 PONZI
0x76ae7078d5b9f62f674ad0ebf1413d4df8e73b87
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:
PonziPanthers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-20
*/

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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


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

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/Context.sol


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

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/access/Ownable.sol


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

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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


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


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

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/utils/introspection/IERC165.sol


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

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/utils/introspection/ERC165.sol


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

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/IERC721.sol


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

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/extensions/IERC721Enumerable.sol


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

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/IERC721Metadata.sol


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

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/token/ERC721/ERC721.sol


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

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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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: contracts/PonziPanthers.sol


pragma solidity ^0.8.4;

contract PonziPanthers is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    uint256 public maxSupply = 4949;
    uint256 public giftMax = 5;
    uint256 public wlMax = 5;
    uint256 public totalNFT;
    uint256 public totalMint;

    string public baseURI;
    string public notRevealedUri;
    string public baseExtension = ".json";

    bool public isBurnEnabled = false;
    bool public paused = false;
    bool public revealed = false;
    bool public wlOpen = false;
    bool public gnOpen = false;

    mapping(address => uint256) public _whitelistClaimed;

    uint256 _price = 80000000000000000; //0.08 ETH
    uint256 _wlprice = 55000000000000000; //0.055 ETH

    bytes32 public whitelistRoot;

    Counters.Counter private _tokenIds;

    constructor() ERC721("Ponzi Panthers", "PONZI") {}

    function changePauseState() public onlyOwner {
        paused = !paused;
    }

    function changeWhitelistState() public onlyOwner {
        wlOpen = !wlOpen;
    }

    function changeGeneralState() public onlyOwner {
        gnOpen = !gnOpen;
    }

    function setBaseURI(string calldata _tokenBaseURI) external onlyOwner {
        baseURI = _tokenBaseURI;
    }

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

    function reveal() public onlyOwner {
        revealed = true;
    }

    function setIsBurnEnabled(bool _isBurnEnabled) external onlyOwner {
        isBurnEnabled = _isBurnEnabled;
    }

    function giftMint(address[] calldata _addresses) external onlyOwner {
        require(totalNFT + _addresses.length <= maxSupply, "Ponzi Panthers: max total supply exceeded");

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _addresses.length; ind++) {
            require(_addresses[ind] != address(0), "Ponzi Panthers: recepient is the null address");
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(_addresses[ind], _newItemId);
            totalNFT = totalNFT + 1;
        }
    }

    function whitelistMint(uint256 _amount, bytes32[] memory proof) external payable {
        require(wlOpen, "WL mint is not open!");
        require(!paused, "Contract is paused!");
        require(_amount <= wlMax, "Mint amount is invalid!");
        require(_whitelistClaimed[msg.sender] + _amount <= wlMax, "Already claimed the WL limit!");

        require(verify(msg.sender, proof), "You are not selected for the WL!");
        require(totalMint + _amount <= maxSupply - giftMax, "Max supply exceeded!");
        require(_wlprice * _amount <= msg.value, "ETH value sent is incorrect!");

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            _whitelistClaimed[msg.sender] = _whitelistClaimed[msg.sender] + 1;
            totalNFT = totalNFT + 1;
            totalMint = totalMint + 1;
        }
    }

    function publicMint(uint256 _amount) external payable {
        require(gnOpen, "General mint is not open!");
        require(!paused, "Contract is paused!");

        require(_amount > 0, "Zero amount!");
        require(totalMint + _amount <= maxSupply - giftMax, "Max supply exceeded!");
        require(_price * _amount <= msg.value, "ETH value sent is incorrect!");

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            totalNFT = totalNFT + 1;
            totalMint = totalMint + 1;
        }
    }

    function reservePanthers() external onlyOwner {
      uint i;
      for (i = 1; i <= 49; i++) {
        _tokenIds.increment();
        _safeMint(msg.sender, i);
        totalNFT = totalNFT + 1;
        totalMint = totalMint + 1;
      }
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function changeTotalSupply(uint256 _newSupply) public onlyOwner {
        maxSupply = _newSupply;
    }

    function changeWhitelistRoot(bytes32 _whitelistRoot) public onlyOwner {
        whitelistRoot = _whitelistRoot;
    }

    function burn(uint256 tokenId) external {
        require(isBurnEnabled, "Burning disabled!");
        require(_isApprovedOrOwner(msg.sender, tokenId), "Burn caller is not owner nor approved!");
        _burn(tokenId);
        totalNFT = totalNFT - 1;
    }

    function verify(address account, bytes32[] memory proof) internal view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(account));
        return MerkleProof.verify(proof, whitelistRoot, leaf);
    }
}

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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeGeneralState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"changeTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"}],"name":"changeWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeWhitelistState","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":"giftMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gnOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservePanthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setIsBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFT","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":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052611355600b556005600c556005600d556040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506012908051906020019062000061929190620002a2565b506000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506000601360026101000a81548160ff0219169083151502179055506000601360036101000a81548160ff0219169083151502179055506000601360046101000a81548160ff02191690831515021790555067011c37937e08000060155566c3663566a580006016553480156200010d57600080fd5b506040518060400160405280600e81526020017f506f6e7a692050616e74686572730000000000000000000000000000000000008152506040518060400160405280600581526020017f504f4e5a49000000000000000000000000000000000000000000000000000000815250816000908051906020019062000192929190620002a2565b508060019080519060200190620001ab929190620002a2565b505050620001ce620001c2620001d460201b60201c565b620001dc60201b60201c565b620003b7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b09062000352565b90600052602060002090601f016020900481019282620002d4576000855562000320565b82601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b5b808211156200034e57600081600090555060010162000334565b5090565b600060028204905060018216806200036b57607f821691505b6020821081141562000382576200038162000388565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615a7e80620003c76000396000f3fe6080604052600436106102925760003560e01c80635c975abb1161015a578063a475b5dd116100c1578063d2cab0561161007a578063d2cab056146109ac578063d39a1eae146109c8578063d5abeb01146109df578063e985e9c514610a0a578063f2c4ce1e14610a47578063f2fde38b14610a7057610292565b8063a475b5dd146108b2578063a5fd7bec146108c9578063b88d4fde146108f2578063c66828621461091b578063c6a7cbc914610946578063c87b56dd1461096f57610292565b8063715018a611610113578063715018a6146107b4578063851a7708146107cb5780638b9defa1146108085780638da5cb5b1461083357806395d89b411461085e578063a22cb4651461088957610292565b80635c975abb146106a45780636352211e146106cf5780636c0360eb1461070c5780636c4c778e146107375780636e0e5b191461074e57806370a082311461077757610292565b80632a22b91a116101fe57806346e79ffc116101b757806346e79ffc146105a85780634f6ccce7146105bf57806351830227146105fc57806352e973261461062757806355f804b31461065057806359a7715a1461067957610292565b80632a22b91a146104a75780632db11544146104d25780632f745c59146104ee578063386bfc981461052b57806342842e0e1461055657806342966c681461057f57610292565b8063095ea7b311610250578063095ea7b3146103bd5780630e624634146103e657806318160ddd146103fd5780631a904acb1461042857806323b872dd14610453578063295b69861461047c57610292565b80624563791461029757806301ffc9a7146102c257806306fdde03146102ff57806307ebec271461032a578063081812fc14610355578063081c8c4414610392575b600080fd5b3480156102a357600080fd5b506102ac610a99565b6040516102b99190614cd3565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e4919061404c565b610a9f565b6040516102f6919061489b565b60405180910390f35b34801561030b57600080fd5b50610314610b19565b60405161032191906148d1565b60405180910390f35b34801561033657600080fd5b5061033f610bab565b60405161034c919061489b565b60405180910390f35b34801561036157600080fd5b5061037c6004803603810190610377919061413c565b610bbe565b6040516103899190614834565b60405180910390f35b34801561039e57600080fd5b506103a7610c43565b6040516103b491906148d1565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613f65565b610cd1565b005b3480156103f257600080fd5b506103fb610de9565b005b34801561040957600080fd5b50610412610e91565b60405161041f9190614cd3565b60405180910390f35b34801561043457600080fd5b5061043d610e9e565b60405161044a919061489b565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613e4f565b610eb1565b005b34801561048857600080fd5b50610491610f11565b60405161049e9190614cd3565b60405180910390f35b3480156104b357600080fd5b506104bc610f17565b6040516104c9919061489b565b60405180910390f35b6104ec60048036038101906104e7919061413c565b610f2a565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613f65565b61112d565b6040516105229190614cd3565b60405180910390f35b34801561053757600080fd5b506105406111d2565b60405161054d91906148b6565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613e4f565b6111d8565b005b34801561058b57600080fd5b506105a660048036038101906105a1919061413c565b6111f8565b005b3480156105b457600080fd5b506105bd6112b1565b005b3480156105cb57600080fd5b506105e660048036038101906105e1919061413c565b611359565b6040516105f39190614cd3565b60405180910390f35b34801561060857600080fd5b506106116113ca565b60405161061e919061489b565b60405180910390f35b34801561063357600080fd5b5061064e6004803603810190610649919061413c565b6113dd565b005b34801561065c57600080fd5b50610677600480360381019061067291906140a6565b611463565b005b34801561068557600080fd5b5061068e6114f5565b60405161069b9190614cd3565b60405180910390f35b3480156106b057600080fd5b506106b96114fb565b6040516106c6919061489b565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f1919061413c565b61150e565b6040516107039190614834565b60405180910390f35b34801561071857600080fd5b506107216115c0565b60405161072e91906148d1565b60405180910390f35b34801561074357600080fd5b5061074c61164e565b005b34801561075a57600080fd5b5061077560048036038101906107709190613ff2565b6116f6565b005b34801561078357600080fd5b5061079e60048036038101906107999190613de2565b61178f565b6040516107ab9190614cd3565b60405180910390f35b3480156107c057600080fd5b506107c9611847565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613de2565b6118cf565b6040516107ff9190614cd3565b60405180910390f35b34801561081457600080fd5b5061081d6118e7565b60405161082a9190614cd3565b60405180910390f35b34801561083f57600080fd5b506108486118ed565b6040516108559190614834565b60405180910390f35b34801561086a57600080fd5b50610873611917565b60405161088091906148d1565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613f25565b6119a9565b005b3480156108be57600080fd5b506108c76119bf565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613fa5565b611a58565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613ea2565b611c48565b005b34801561092757600080fd5b50610930611caa565b60405161093d91906148d1565b60405180910390f35b34801561095257600080fd5b5061096d6004803603810190610968919061401f565b611d38565b005b34801561097b57600080fd5b506109966004803603810190610991919061413c565b611dbe565b6040516109a391906148d1565b60405180910390f35b6109c660048036038101906109c19190614169565b611f17565b005b3480156109d457600080fd5b506109dd612284565b005b3480156109eb57600080fd5b506109f4612363565b604051610a019190614cd3565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613e0f565b612369565b604051610a3e919061489b565b60405180910390f35b348015610a5357600080fd5b50610a6e6004803603810190610a6991906140f3565b6123fd565b005b348015610a7c57600080fd5b50610a976004803603810190610a929190613de2565b612493565b005b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b125750610b118261258b565b5b9050919050565b606060008054610b2890614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490614fce565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b601360009054906101000a900460ff1681565b6000610bc98261266d565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614b13565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610c5090614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90614fce565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b505050505081565b6000610cdc8261150e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490614b93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6126d9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956126d9565b612369565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614a73565b60405180910390fd5b610de483836126e1565b505050565b610df16126d9565b73ffffffffffffffffffffffffffffffffffffffff16610e0f6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614b33565b60405180910390fd5b601360039054906101000a900460ff1615601360036101000a81548160ff021916908315150217905550565b6000600880549050905090565b601360039054906101000a900460ff1681565b610ec2610ebc6126d9565b8261279a565b610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890614c13565b60405180910390fd5b610f0c838383612878565b505050565b600c5481565b601360049054906101000a900460ff1681565b601360049054906101000a900460ff16610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f70906148f3565b60405180910390fd5b601360019054906101000a900460ff1615610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc0906149d3565b60405180910390fd5b6000811161100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390614cb3565b60405180910390fd5b600c54600b5461101c9190614eda565b81600f5461102a9190614df9565b111561106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290614bd3565b60405180910390fd5b348160155461107a9190614e80565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290614bf3565b60405180910390fd5b600080600090505b82811015611128576110d56018612ad4565b6110df6018612aea565b91506110eb3383612af8565b6001600e546110fa9190614df9565b600e819055506001600f5461110f9190614df9565b600f81905550808061112090615031565b9150506110c3565b505050565b60006111388361178f565b8210611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614913565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60175481565b6111f383838360405180602001604052806000815250611c48565b505050565b601360009054906101000a900460ff16611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614ad3565b60405180910390fd5b611251338261279a565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614c73565b60405180910390fd5b61129981612b16565b6001600e546112a89190614eda565b600e8190555050565b6112b96126d9565b73ffffffffffffffffffffffffffffffffffffffff166112d76118ed565b73ffffffffffffffffffffffffffffffffffffffff161461132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490614b33565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b6000611363610e91565b82106113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614c33565b60405180910390fd5b600882815481106113b8576113b7615195565b5b90600052602060002001549050919050565b601360029054906101000a900460ff1681565b6113e56126d9565b73ffffffffffffffffffffffffffffffffffffffff166114036118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614b33565b60405180910390fd5b80600b8190555050565b61146b6126d9565b73ffffffffffffffffffffffffffffffffffffffff166114896118ed565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d690614b33565b60405180910390fd5b8181601091906114f0929190613a11565b505050565b600f5481565b601360019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614ab3565b60405180910390fd5b80915050919050565b601080546115cd90614fce565b80601f01602080910402602001604051908101604052809291908181526020018280546115f990614fce565b80156116465780601f1061161b57610100808354040283529160200191611646565b820191906000526020600020905b81548152906001019060200180831161162957829003601f168201915b505050505081565b6116566126d9565b73ffffffffffffffffffffffffffffffffffffffff166116746118ed565b73ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190614b33565b60405180910390fd5b601360049054906101000a900460ff1615601360046101000a81548160ff021916908315150217905550565b6116fe6126d9565b73ffffffffffffffffffffffffffffffffffffffff1661171c6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614b33565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614a93565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61184f6126d9565b73ffffffffffffffffffffffffffffffffffffffff1661186d6118ed565b73ffffffffffffffffffffffffffffffffffffffff16146118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba90614b33565b60405180910390fd5b6118cd6000612c27565b565b60146020528060005260406000206000915090505481565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461192690614fce565b80601f016020809104026020016040519081016040528092919081815260200182805461195290614fce565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b5050505050905090565b6119bb6119b46126d9565b8383612ced565b5050565b6119c76126d9565b73ffffffffffffffffffffffffffffffffffffffff166119e56118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614b33565b60405180910390fd5b6001601360026101000a81548160ff021916908315150217905550565b611a606126d9565b73ffffffffffffffffffffffffffffffffffffffff16611a7e6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614b33565b60405180910390fd5b600b5482829050600e54611ae89190614df9565b1115611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c93565b60405180910390fd5b600080600090505b83839050811015611c4257600073ffffffffffffffffffffffffffffffffffffffff16848483818110611b6757611b66615195565b5b9050602002016020810190611b7c9190613de2565b73ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca906149b3565b60405180910390fd5b611bdd6018612ad4565b611be76018612aea565b9150611c1a848483818110611bff57611bfe615195565b5b9050602002016020810190611c149190613de2565b83612af8565b6001600e54611c299190614df9565b600e819055508080611c3a90615031565b915050611b31565b50505050565b611c59611c536126d9565b8361279a565b611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614c13565b60405180910390fd5b611ca484848484612e5a565b50505050565b60128054611cb790614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce390614fce565b8015611d305780601f10611d0557610100808354040283529160200191611d30565b820191906000526020600020905b815481529060010190602001808311611d1357829003601f168201915b505050505081565b611d406126d9565b73ffffffffffffffffffffffffffffffffffffffff16611d5e6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614b33565b60405180910390fd5b8060178190555050565b6060611dc98261266d565b611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90614b73565b60405180910390fd5b60001515601360029054906101000a900460ff1615151415611eb65760118054611e3190614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5d90614fce565b8015611eaa5780601f10611e7f57610100808354040283529160200191611eaa565b820191906000526020600020905b815481529060010190602001808311611e8d57829003601f168201915b50505050509050611f12565b6000611ec0612eb6565b90506000815111611ee05760405180602001604052806000815250611f0e565b80611eea84612f48565b6012604051602001611efe939291906147f8565b6040516020818303038152906040525b9150505b919050565b601360039054906101000a900460ff16611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90614bb3565b60405180910390fd5b601360019054906101000a900460ff1615611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad906149d3565b60405180910390fd5b600d54821115611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614973565b60405180910390fd5b600d5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120499190614df9565b111561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190614a53565b60405180910390fd5b61209433826130a9565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614c53565b60405180910390fd5b600c54600b546120e39190614eda565b82600f546120f19190614df9565b1115612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990614bd3565b60405180910390fd5b34826016546121419190614e80565b1115612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990614bf3565b60405180910390fd5b600080600090505b8381101561227e5761219c6018612ad4565b6121a66018612aea565b91506121b23383612af8565b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121fe9190614df9565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600e546122509190614df9565b600e819055506001600f546122659190614df9565b600f81905550808061227690615031565b91505061218a565b50505050565b61228c6126d9565b73ffffffffffffffffffffffffffffffffffffffff166122aa6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614b33565b60405180910390fd5b6000600190505b60318111612360576123196018612ad4565b6123233382612af8565b6001600e546123329190614df9565b600e819055506001600f546123479190614df9565b600f81905550808061235890615031565b915050612307565b50565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124056126d9565b73ffffffffffffffffffffffffffffffffffffffff166124236118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614b33565b60405180910390fd5b806011908051906020019061248f929190613a97565b5050565b61249b6126d9565b73ffffffffffffffffffffffffffffffffffffffff166124b96118ed565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614b33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690614953565b60405180910390fd5b61258881612c27565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061265657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126665750612665826130eb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127548361150e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127a58261266d565b6127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90614a33565b60405180910390fd5b60006127ef8361150e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061285e57508373ffffffffffffffffffffffffffffffffffffffff1661284684610bbe565b73ffffffffffffffffffffffffffffffffffffffff16145b8061286f575061286e8185612369565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128988261150e565b73ffffffffffffffffffffffffffffffffffffffff16146128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590614b53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612955906149f3565b60405180910390fd5b612969838383613155565b6129746000826126e1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c49190614eda565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1b9190614df9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612b12828260405180602001604052806000815250613269565b5050565b6000612b218261150e565b9050612b2f81600084613155565b612b3a6000836126e1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b8a9190614eda565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5390614a13565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4d919061489b565b60405180910390a3505050565b612e65848484612878565b612e71848484846132c4565b612eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea790614933565b60405180910390fd5b50505050565b606060108054612ec590614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef190614fce565b8015612f3e5780601f10612f1357610100808354040283529160200191612f3e565b820191906000526020600020905b815481529060010190602001808311612f2157829003601f168201915b5050505050905090565b60606000821415612f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130a4565b600082905060005b60008214612fc2578080612fab90615031565b915050600a82612fbb9190614e4f565b9150612f98565b60008167ffffffffffffffff811115612fde57612fdd6151c4565b5b6040519080825280601f01601f1916602001820160405280156130105781602001600182028036833780820191505090505b5090505b6000851461309d576001826130299190614eda565b9150600a8561303891906150a8565b60306130449190614df9565b60f81b81838151811061305a57613059615195565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130969190614e4f565b9450613014565b8093505050505b919050565b600080836040516020016130bd91906147b1565b6040516020818303038152906040528051906020012090506130e2836017548361345b565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613160838383613472565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131a35761319e81613477565b6131e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131e1576131e083826134c0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613225576132208161362d565b613264565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132635761326282826136fe565b5b5b505050565b613273838361377d565b61328060008484846132c4565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b690614933565b60405180910390fd5b505050565b60006132e58473ffffffffffffffffffffffffffffffffffffffff1661394b565b1561344e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261330e6126d9565b8786866040518563ffffffff1660e01b8152600401613330949392919061484f565b602060405180830381600087803b15801561334a57600080fd5b505af192505050801561337b57506040513d601f19601f820116820180604052508101906133789190614079565b60015b6133fe573d80600081146133ab576040519150601f19603f3d011682016040523d82523d6000602084013e6133b0565b606091505b506000815114156133f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ed90614933565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613453565b600190505b949350505050565b600082613468858461395e565b1490509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134cd8461178f565b6134d79190614eda565b90506000600760008481526020019081526020016000205490508181146135bc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136419190614eda565b905060006009600084815260200190815260200160002054905060006008838154811061367157613670615195565b5b90600052602060002001549050806008838154811061369357613692615195565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136e2576136e1615166565b5b6001900381819060005260206000200160009055905550505050565b60006137098361178f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e490614af3565b60405180910390fd5b6137f68161266d565b15613836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382d90614993565b60405180910390fd5b61384260008383613155565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138929190614df9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60008082905060005b8451811015613a0657600085828151811061398557613984615195565b5b602002602001015190508083116139c65782816040516020016139a99291906147cc565b6040516020818303038152906040528051906020012092506139f2565b80836040516020016139d99291906147cc565b6040516020818303038152906040528051906020012092505b5080806139fe90615031565b915050613967565b508091505092915050565b828054613a1d90614fce565b90600052602060002090601f016020900481019282613a3f5760008555613a86565b82601f10613a5857803560ff1916838001178555613a86565b82800160010185558215613a86579182015b82811115613a85578235825591602001919060010190613a6a565b5b509050613a939190613b1d565b5090565b828054613aa390614fce565b90600052602060002090601f016020900481019282613ac55760008555613b0c565b82601f10613ade57805160ff1916838001178555613b0c565b82800160010185558215613b0c579182015b82811115613b0b578251825591602001919060010190613af0565b5b509050613b199190613b1d565b5090565b5b80821115613b36576000816000905550600101613b1e565b5090565b6000613b4d613b4884614d13565b614cee565b90508083825260208201905082856020860282011115613b7057613b6f6151fd565b5b60005b85811015613ba05781613b868882613cdc565b845260208401935060208301925050600181019050613b73565b5050509392505050565b6000613bbd613bb884614d3f565b614cee565b905082815260208101848484011115613bd957613bd8615202565b5b613be4848285614f8c565b509392505050565b6000613bff613bfa84614d70565b614cee565b905082815260208101848484011115613c1b57613c1a615202565b5b613c26848285614f8c565b509392505050565b600081359050613c3d816159d5565b92915050565b60008083601f840112613c5957613c586151f8565b5b8235905067ffffffffffffffff811115613c7657613c756151f3565b5b602083019150836020820283011115613c9257613c916151fd565b5b9250929050565b600082601f830112613cae57613cad6151f8565b5b8135613cbe848260208601613b3a565b91505092915050565b600081359050613cd6816159ec565b92915050565b600081359050613ceb81615a03565b92915050565b600081359050613d0081615a1a565b92915050565b600081519050613d1581615a1a565b92915050565b600082601f830112613d3057613d2f6151f8565b5b8135613d40848260208601613baa565b91505092915050565b60008083601f840112613d5f57613d5e6151f8565b5b8235905067ffffffffffffffff811115613d7c57613d7b6151f3565b5b602083019150836001820283011115613d9857613d976151fd565b5b9250929050565b600082601f830112613db457613db36151f8565b5b8135613dc4848260208601613bec565b91505092915050565b600081359050613ddc81615a31565b92915050565b600060208284031215613df857613df761520c565b5b6000613e0684828501613c2e565b91505092915050565b60008060408385031215613e2657613e2561520c565b5b6000613e3485828601613c2e565b9250506020613e4585828601613c2e565b9150509250929050565b600080600060608486031215613e6857613e6761520c565b5b6000613e7686828701613c2e565b9350506020613e8786828701613c2e565b9250506040613e9886828701613dcd565b9150509250925092565b60008060008060808587031215613ebc57613ebb61520c565b5b6000613eca87828801613c2e565b9450506020613edb87828801613c2e565b9350506040613eec87828801613dcd565b925050606085013567ffffffffffffffff811115613f0d57613f0c615207565b5b613f1987828801613d1b565b91505092959194509250565b60008060408385031215613f3c57613f3b61520c565b5b6000613f4a85828601613c2e565b9250506020613f5b85828601613cc7565b9150509250929050565b60008060408385031215613f7c57613f7b61520c565b5b6000613f8a85828601613c2e565b9250506020613f9b85828601613dcd565b9150509250929050565b60008060208385031215613fbc57613fbb61520c565b5b600083013567ffffffffffffffff811115613fda57613fd9615207565b5b613fe685828601613c43565b92509250509250929050565b6000602082840312156140085761400761520c565b5b600061401684828501613cc7565b91505092915050565b6000602082840312156140355761403461520c565b5b600061404384828501613cdc565b91505092915050565b6000602082840312156140625761406161520c565b5b600061407084828501613cf1565b91505092915050565b60006020828403121561408f5761408e61520c565b5b600061409d84828501613d06565b91505092915050565b600080602083850312156140bd576140bc61520c565b5b600083013567ffffffffffffffff8111156140db576140da615207565b5b6140e785828601613d49565b92509250509250929050565b6000602082840312156141095761410861520c565b5b600082013567ffffffffffffffff81111561412757614126615207565b5b61413384828501613d9f565b91505092915050565b6000602082840312156141525761415161520c565b5b600061416084828501613dcd565b91505092915050565b600080604083850312156141805761417f61520c565b5b600061418e85828601613dcd565b925050602083013567ffffffffffffffff8111156141af576141ae615207565b5b6141bb85828601613c99565b9150509250929050565b6141ce81614f0e565b82525050565b6141e56141e082614f0e565b61507a565b82525050565b6141f481614f20565b82525050565b61420381614f2c565b82525050565b61421a61421582614f2c565b61508c565b82525050565b600061422b82614db6565b6142358185614dcc565b9350614245818560208601614f9b565b61424e81615211565b840191505092915050565b600061426482614dc1565b61426e8185614ddd565b935061427e818560208601614f9b565b61428781615211565b840191505092915050565b600061429d82614dc1565b6142a78185614dee565b93506142b7818560208601614f9b565b80840191505092915050565b600081546142d081614fce565b6142da8186614dee565b945060018216600081146142f5576001811461430657614339565b60ff19831686528186019350614339565b61430f85614da1565b60005b8381101561433157815481890152600182019150602081019050614312565b838801955050505b50505092915050565b600061434f601983614ddd565b915061435a8261522f565b602082019050919050565b6000614372602b83614ddd565b915061437d82615258565b604082019050919050565b6000614395603283614ddd565b91506143a0826152a7565b604082019050919050565b60006143b8602683614ddd565b91506143c3826152f6565b604082019050919050565b60006143db601783614ddd565b91506143e682615345565b602082019050919050565b60006143fe601c83614ddd565b91506144098261536e565b602082019050919050565b6000614421602d83614ddd565b915061442c82615397565b604082019050919050565b6000614444601383614ddd565b915061444f826153e6565b602082019050919050565b6000614467602483614ddd565b91506144728261540f565b604082019050919050565b600061448a601983614ddd565b91506144958261545e565b602082019050919050565b60006144ad602c83614ddd565b91506144b882615487565b604082019050919050565b60006144d0601d83614ddd565b91506144db826154d6565b602082019050919050565b60006144f3603883614ddd565b91506144fe826154ff565b604082019050919050565b6000614516602a83614ddd565b91506145218261554e565b604082019050919050565b6000614539602983614ddd565b91506145448261559d565b604082019050919050565b600061455c601183614ddd565b9150614567826155ec565b602082019050919050565b600061457f602083614ddd565b915061458a82615615565b602082019050919050565b60006145a2602c83614ddd565b91506145ad8261563e565b604082019050919050565b60006145c5602083614ddd565b91506145d08261568d565b602082019050919050565b60006145e8602983614ddd565b91506145f3826156b6565b604082019050919050565b600061460b602f83614ddd565b915061461682615705565b604082019050919050565b600061462e602183614ddd565b915061463982615754565b604082019050919050565b6000614651601483614ddd565b915061465c826157a3565b602082019050919050565b6000614674601483614ddd565b915061467f826157cc565b602082019050919050565b6000614697601c83614ddd565b91506146a2826157f5565b602082019050919050565b60006146ba603183614ddd565b91506146c58261581e565b604082019050919050565b60006146dd602c83614ddd565b91506146e88261586d565b604082019050919050565b6000614700602083614ddd565b915061470b826158bc565b602082019050919050565b6000614723602683614ddd565b915061472e826158e5565b604082019050919050565b6000614746602983614ddd565b915061475182615934565b604082019050919050565b6000614769600183614dee565b915061477482615983565b600182019050919050565b600061478c600c83614ddd565b9150614797826159ac565b602082019050919050565b6147ab81614f82565b82525050565b60006147bd82846141d4565b60148201915081905092915050565b60006147d88285614209565b6020820191506147e88284614209565b6020820191508190509392505050565b60006148048286614292565b915061480f8261475c565b915061481b8285614292565b915061482782846142c3565b9150819050949350505050565b600060208201905061484960008301846141c5565b92915050565b600060808201905061486460008301876141c5565b61487160208301866141c5565b61487e60408301856147a2565b81810360608301526148908184614220565b905095945050505050565b60006020820190506148b060008301846141eb565b92915050565b60006020820190506148cb60008301846141fa565b92915050565b600060208201905081810360008301526148eb8184614259565b905092915050565b6000602082019050818103600083015261490c81614342565b9050919050565b6000602082019050818103600083015261492c81614365565b9050919050565b6000602082019050818103600083015261494c81614388565b9050919050565b6000602082019050818103600083015261496c816143ab565b9050919050565b6000602082019050818103600083015261498c816143ce565b9050919050565b600060208201905081810360008301526149ac816143f1565b9050919050565b600060208201905081810360008301526149cc81614414565b9050919050565b600060208201905081810360008301526149ec81614437565b9050919050565b60006020820190508181036000830152614a0c8161445a565b9050919050565b60006020820190508181036000830152614a2c8161447d565b9050919050565b60006020820190508181036000830152614a4c816144a0565b9050919050565b60006020820190508181036000830152614a6c816144c3565b9050919050565b60006020820190508181036000830152614a8c816144e6565b9050919050565b60006020820190508181036000830152614aac81614509565b9050919050565b60006020820190508181036000830152614acc8161452c565b9050919050565b60006020820190508181036000830152614aec8161454f565b9050919050565b60006020820190508181036000830152614b0c81614572565b9050919050565b60006020820190508181036000830152614b2c81614595565b9050919050565b60006020820190508181036000830152614b4c816145b8565b9050919050565b60006020820190508181036000830152614b6c816145db565b9050919050565b60006020820190508181036000830152614b8c816145fe565b9050919050565b60006020820190508181036000830152614bac81614621565b9050919050565b60006020820190508181036000830152614bcc81614644565b9050919050565b60006020820190508181036000830152614bec81614667565b9050919050565b60006020820190508181036000830152614c0c8161468a565b9050919050565b60006020820190508181036000830152614c2c816146ad565b9050919050565b60006020820190508181036000830152614c4c816146d0565b9050919050565b60006020820190508181036000830152614c6c816146f3565b9050919050565b60006020820190508181036000830152614c8c81614716565b9050919050565b60006020820190508181036000830152614cac81614739565b9050919050565b60006020820190508181036000830152614ccc8161477f565b9050919050565b6000602082019050614ce860008301846147a2565b92915050565b6000614cf8614d09565b9050614d048282615000565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2e57614d2d6151c4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5a57614d596151c4565b5b614d6382615211565b9050602081019050919050565b600067ffffffffffffffff821115614d8b57614d8a6151c4565b5b614d9482615211565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e0482614f82565b9150614e0f83614f82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4457614e436150d9565b5b828201905092915050565b6000614e5a82614f82565b9150614e6583614f82565b925082614e7557614e74615108565b5b828204905092915050565b6000614e8b82614f82565b9150614e9683614f82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ecf57614ece6150d9565b5b828202905092915050565b6000614ee582614f82565b9150614ef083614f82565b925082821015614f0357614f026150d9565b5b828203905092915050565b6000614f1982614f62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fb9578082015181840152602081019050614f9e565b83811115614fc8576000848401525b50505050565b60006002820490506001821680614fe657607f821691505b60208210811415614ffa57614ff9615137565b5b50919050565b61500982615211565b810181811067ffffffffffffffff82111715615028576150276151c4565b5b80604052505050565b600061503c82614f82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506f5761506e6150d9565b5b600182019050919050565b600061508582615096565b9050919050565b6000819050919050565b60006150a182615222565b9050919050565b60006150b382614f82565b91506150be83614f82565b9250826150ce576150cd615108565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f47656e6572616c206d696e74206973206e6f74206f70656e2100000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e7420697320696e76616c696421000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f506f6e7a692050616e74686572733a20726563657069656e742069732074686560008201527f206e756c6c206164647265737300000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365642100000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f416c726561647920636c61696d65642074686520574c206c696d697421000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4275726e696e672064697361626c656421000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f574c206d696e74206973206e6f74206f70656e21000000000000000000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4554482076616c75652073656e7420697320696e636f72726563742100000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f742073656c656374656420666f722074686520574c21600082015250565b7f4275726e2063616c6c6572206973206e6f74206f776e6572206e6f722061707060008201527f726f766564210000000000000000000000000000000000000000000000000000602082015250565b7f506f6e7a692050616e74686572733a206d617820746f74616c20737570706c7960008201527f2065786365656465640000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f5a65726f20616d6f756e74210000000000000000000000000000000000000000600082015250565b6159de81614f0e565b81146159e957600080fd5b50565b6159f581614f20565b8114615a0057600080fd5b50565b615a0c81614f2c565b8114615a1757600080fd5b50565b615a2381614f36565b8114615a2e57600080fd5b50565b615a3a81614f82565b8114615a4557600080fd5b5056fea26469706673582212201ac11ceb93b940c868c4d77d8c12e1f271ad7c5f0d11319c5a46ceed4287a90964736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102925760003560e01c80635c975abb1161015a578063a475b5dd116100c1578063d2cab0561161007a578063d2cab056146109ac578063d39a1eae146109c8578063d5abeb01146109df578063e985e9c514610a0a578063f2c4ce1e14610a47578063f2fde38b14610a7057610292565b8063a475b5dd146108b2578063a5fd7bec146108c9578063b88d4fde146108f2578063c66828621461091b578063c6a7cbc914610946578063c87b56dd1461096f57610292565b8063715018a611610113578063715018a6146107b4578063851a7708146107cb5780638b9defa1146108085780638da5cb5b1461083357806395d89b411461085e578063a22cb4651461088957610292565b80635c975abb146106a45780636352211e146106cf5780636c0360eb1461070c5780636c4c778e146107375780636e0e5b191461074e57806370a082311461077757610292565b80632a22b91a116101fe57806346e79ffc116101b757806346e79ffc146105a85780634f6ccce7146105bf57806351830227146105fc57806352e973261461062757806355f804b31461065057806359a7715a1461067957610292565b80632a22b91a146104a75780632db11544146104d25780632f745c59146104ee578063386bfc981461052b57806342842e0e1461055657806342966c681461057f57610292565b8063095ea7b311610250578063095ea7b3146103bd5780630e624634146103e657806318160ddd146103fd5780631a904acb1461042857806323b872dd14610453578063295b69861461047c57610292565b80624563791461029757806301ffc9a7146102c257806306fdde03146102ff57806307ebec271461032a578063081812fc14610355578063081c8c4414610392575b600080fd5b3480156102a357600080fd5b506102ac610a99565b6040516102b99190614cd3565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e4919061404c565b610a9f565b6040516102f6919061489b565b60405180910390f35b34801561030b57600080fd5b50610314610b19565b60405161032191906148d1565b60405180910390f35b34801561033657600080fd5b5061033f610bab565b60405161034c919061489b565b60405180910390f35b34801561036157600080fd5b5061037c6004803603810190610377919061413c565b610bbe565b6040516103899190614834565b60405180910390f35b34801561039e57600080fd5b506103a7610c43565b6040516103b491906148d1565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613f65565b610cd1565b005b3480156103f257600080fd5b506103fb610de9565b005b34801561040957600080fd5b50610412610e91565b60405161041f9190614cd3565b60405180910390f35b34801561043457600080fd5b5061043d610e9e565b60405161044a919061489b565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613e4f565b610eb1565b005b34801561048857600080fd5b50610491610f11565b60405161049e9190614cd3565b60405180910390f35b3480156104b357600080fd5b506104bc610f17565b6040516104c9919061489b565b60405180910390f35b6104ec60048036038101906104e7919061413c565b610f2a565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613f65565b61112d565b6040516105229190614cd3565b60405180910390f35b34801561053757600080fd5b506105406111d2565b60405161054d91906148b6565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613e4f565b6111d8565b005b34801561058b57600080fd5b506105a660048036038101906105a1919061413c565b6111f8565b005b3480156105b457600080fd5b506105bd6112b1565b005b3480156105cb57600080fd5b506105e660048036038101906105e1919061413c565b611359565b6040516105f39190614cd3565b60405180910390f35b34801561060857600080fd5b506106116113ca565b60405161061e919061489b565b60405180910390f35b34801561063357600080fd5b5061064e6004803603810190610649919061413c565b6113dd565b005b34801561065c57600080fd5b50610677600480360381019061067291906140a6565b611463565b005b34801561068557600080fd5b5061068e6114f5565b60405161069b9190614cd3565b60405180910390f35b3480156106b057600080fd5b506106b96114fb565b6040516106c6919061489b565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f1919061413c565b61150e565b6040516107039190614834565b60405180910390f35b34801561071857600080fd5b506107216115c0565b60405161072e91906148d1565b60405180910390f35b34801561074357600080fd5b5061074c61164e565b005b34801561075a57600080fd5b5061077560048036038101906107709190613ff2565b6116f6565b005b34801561078357600080fd5b5061079e60048036038101906107999190613de2565b61178f565b6040516107ab9190614cd3565b60405180910390f35b3480156107c057600080fd5b506107c9611847565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613de2565b6118cf565b6040516107ff9190614cd3565b60405180910390f35b34801561081457600080fd5b5061081d6118e7565b60405161082a9190614cd3565b60405180910390f35b34801561083f57600080fd5b506108486118ed565b6040516108559190614834565b60405180910390f35b34801561086a57600080fd5b50610873611917565b60405161088091906148d1565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613f25565b6119a9565b005b3480156108be57600080fd5b506108c76119bf565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613fa5565b611a58565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613ea2565b611c48565b005b34801561092757600080fd5b50610930611caa565b60405161093d91906148d1565b60405180910390f35b34801561095257600080fd5b5061096d6004803603810190610968919061401f565b611d38565b005b34801561097b57600080fd5b506109966004803603810190610991919061413c565b611dbe565b6040516109a391906148d1565b60405180910390f35b6109c660048036038101906109c19190614169565b611f17565b005b3480156109d457600080fd5b506109dd612284565b005b3480156109eb57600080fd5b506109f4612363565b604051610a019190614cd3565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613e0f565b612369565b604051610a3e919061489b565b60405180910390f35b348015610a5357600080fd5b50610a6e6004803603810190610a6991906140f3565b6123fd565b005b348015610a7c57600080fd5b50610a976004803603810190610a929190613de2565b612493565b005b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b125750610b118261258b565b5b9050919050565b606060008054610b2890614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490614fce565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b601360009054906101000a900460ff1681565b6000610bc98261266d565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614b13565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610c5090614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90614fce565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b505050505081565b6000610cdc8261150e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490614b93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6126d9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956126d9565b612369565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614a73565b60405180910390fd5b610de483836126e1565b505050565b610df16126d9565b73ffffffffffffffffffffffffffffffffffffffff16610e0f6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90614b33565b60405180910390fd5b601360039054906101000a900460ff1615601360036101000a81548160ff021916908315150217905550565b6000600880549050905090565b601360039054906101000a900460ff1681565b610ec2610ebc6126d9565b8261279a565b610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890614c13565b60405180910390fd5b610f0c838383612878565b505050565b600c5481565b601360049054906101000a900460ff1681565b601360049054906101000a900460ff16610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f70906148f3565b60405180910390fd5b601360019054906101000a900460ff1615610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc0906149d3565b60405180910390fd5b6000811161100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390614cb3565b60405180910390fd5b600c54600b5461101c9190614eda565b81600f5461102a9190614df9565b111561106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290614bd3565b60405180910390fd5b348160155461107a9190614e80565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290614bf3565b60405180910390fd5b600080600090505b82811015611128576110d56018612ad4565b6110df6018612aea565b91506110eb3383612af8565b6001600e546110fa9190614df9565b600e819055506001600f5461110f9190614df9565b600f81905550808061112090615031565b9150506110c3565b505050565b60006111388361178f565b8210611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614913565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60175481565b6111f383838360405180602001604052806000815250611c48565b505050565b601360009054906101000a900460ff16611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614ad3565b60405180910390fd5b611251338261279a565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614c73565b60405180910390fd5b61129981612b16565b6001600e546112a89190614eda565b600e8190555050565b6112b96126d9565b73ffffffffffffffffffffffffffffffffffffffff166112d76118ed565b73ffffffffffffffffffffffffffffffffffffffff161461132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490614b33565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b6000611363610e91565b82106113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614c33565b60405180910390fd5b600882815481106113b8576113b7615195565b5b90600052602060002001549050919050565b601360029054906101000a900460ff1681565b6113e56126d9565b73ffffffffffffffffffffffffffffffffffffffff166114036118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614b33565b60405180910390fd5b80600b8190555050565b61146b6126d9565b73ffffffffffffffffffffffffffffffffffffffff166114896118ed565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d690614b33565b60405180910390fd5b8181601091906114f0929190613a11565b505050565b600f5481565b601360019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614ab3565b60405180910390fd5b80915050919050565b601080546115cd90614fce565b80601f01602080910402602001604051908101604052809291908181526020018280546115f990614fce565b80156116465780601f1061161b57610100808354040283529160200191611646565b820191906000526020600020905b81548152906001019060200180831161162957829003601f168201915b505050505081565b6116566126d9565b73ffffffffffffffffffffffffffffffffffffffff166116746118ed565b73ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190614b33565b60405180910390fd5b601360049054906101000a900460ff1615601360046101000a81548160ff021916908315150217905550565b6116fe6126d9565b73ffffffffffffffffffffffffffffffffffffffff1661171c6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614b33565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614a93565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61184f6126d9565b73ffffffffffffffffffffffffffffffffffffffff1661186d6118ed565b73ffffffffffffffffffffffffffffffffffffffff16146118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba90614b33565b60405180910390fd5b6118cd6000612c27565b565b60146020528060005260406000206000915090505481565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461192690614fce565b80601f016020809104026020016040519081016040528092919081815260200182805461195290614fce565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b5050505050905090565b6119bb6119b46126d9565b8383612ced565b5050565b6119c76126d9565b73ffffffffffffffffffffffffffffffffffffffff166119e56118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614b33565b60405180910390fd5b6001601360026101000a81548160ff021916908315150217905550565b611a606126d9565b73ffffffffffffffffffffffffffffffffffffffff16611a7e6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614b33565b60405180910390fd5b600b5482829050600e54611ae89190614df9565b1115611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c93565b60405180910390fd5b600080600090505b83839050811015611c4257600073ffffffffffffffffffffffffffffffffffffffff16848483818110611b6757611b66615195565b5b9050602002016020810190611b7c9190613de2565b73ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca906149b3565b60405180910390fd5b611bdd6018612ad4565b611be76018612aea565b9150611c1a848483818110611bff57611bfe615195565b5b9050602002016020810190611c149190613de2565b83612af8565b6001600e54611c299190614df9565b600e819055508080611c3a90615031565b915050611b31565b50505050565b611c59611c536126d9565b8361279a565b611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90614c13565b60405180910390fd5b611ca484848484612e5a565b50505050565b60128054611cb790614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce390614fce565b8015611d305780601f10611d0557610100808354040283529160200191611d30565b820191906000526020600020905b815481529060010190602001808311611d1357829003601f168201915b505050505081565b611d406126d9565b73ffffffffffffffffffffffffffffffffffffffff16611d5e6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614b33565b60405180910390fd5b8060178190555050565b6060611dc98261266d565b611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90614b73565b60405180910390fd5b60001515601360029054906101000a900460ff1615151415611eb65760118054611e3190614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5d90614fce565b8015611eaa5780601f10611e7f57610100808354040283529160200191611eaa565b820191906000526020600020905b815481529060010190602001808311611e8d57829003601f168201915b50505050509050611f12565b6000611ec0612eb6565b90506000815111611ee05760405180602001604052806000815250611f0e565b80611eea84612f48565b6012604051602001611efe939291906147f8565b6040516020818303038152906040525b9150505b919050565b601360039054906101000a900460ff16611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90614bb3565b60405180910390fd5b601360019054906101000a900460ff1615611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad906149d3565b60405180910390fd5b600d54821115611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614973565b60405180910390fd5b600d5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120499190614df9565b111561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190614a53565b60405180910390fd5b61209433826130a9565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614c53565b60405180910390fd5b600c54600b546120e39190614eda565b82600f546120f19190614df9565b1115612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990614bd3565b60405180910390fd5b34826016546121419190614e80565b1115612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990614bf3565b60405180910390fd5b600080600090505b8381101561227e5761219c6018612ad4565b6121a66018612aea565b91506121b23383612af8565b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121fe9190614df9565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600e546122509190614df9565b600e819055506001600f546122659190614df9565b600f81905550808061227690615031565b91505061218a565b50505050565b61228c6126d9565b73ffffffffffffffffffffffffffffffffffffffff166122aa6118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614b33565b60405180910390fd5b6000600190505b60318111612360576123196018612ad4565b6123233382612af8565b6001600e546123329190614df9565b600e819055506001600f546123479190614df9565b600f81905550808061235890615031565b915050612307565b50565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124056126d9565b73ffffffffffffffffffffffffffffffffffffffff166124236118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614b33565b60405180910390fd5b806011908051906020019061248f929190613a97565b5050565b61249b6126d9565b73ffffffffffffffffffffffffffffffffffffffff166124b96118ed565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614b33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690614953565b60405180910390fd5b61258881612c27565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061265657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126665750612665826130eb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127548361150e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127a58261266d565b6127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90614a33565b60405180910390fd5b60006127ef8361150e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061285e57508373ffffffffffffffffffffffffffffffffffffffff1661284684610bbe565b73ffffffffffffffffffffffffffffffffffffffff16145b8061286f575061286e8185612369565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128988261150e565b73ffffffffffffffffffffffffffffffffffffffff16146128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590614b53565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612955906149f3565b60405180910390fd5b612969838383613155565b6129746000826126e1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c49190614eda565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1b9190614df9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612b12828260405180602001604052806000815250613269565b5050565b6000612b218261150e565b9050612b2f81600084613155565b612b3a6000836126e1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b8a9190614eda565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5390614a13565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4d919061489b565b60405180910390a3505050565b612e65848484612878565b612e71848484846132c4565b612eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea790614933565b60405180910390fd5b50505050565b606060108054612ec590614fce565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef190614fce565b8015612f3e5780601f10612f1357610100808354040283529160200191612f3e565b820191906000526020600020905b815481529060010190602001808311612f2157829003601f168201915b5050505050905090565b60606000821415612f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130a4565b600082905060005b60008214612fc2578080612fab90615031565b915050600a82612fbb9190614e4f565b9150612f98565b60008167ffffffffffffffff811115612fde57612fdd6151c4565b5b6040519080825280601f01601f1916602001820160405280156130105781602001600182028036833780820191505090505b5090505b6000851461309d576001826130299190614eda565b9150600a8561303891906150a8565b60306130449190614df9565b60f81b81838151811061305a57613059615195565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130969190614e4f565b9450613014565b8093505050505b919050565b600080836040516020016130bd91906147b1565b6040516020818303038152906040528051906020012090506130e2836017548361345b565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613160838383613472565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131a35761319e81613477565b6131e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131e1576131e083826134c0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613225576132208161362d565b613264565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132635761326282826136fe565b5b5b505050565b613273838361377d565b61328060008484846132c4565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b690614933565b60405180910390fd5b505050565b60006132e58473ffffffffffffffffffffffffffffffffffffffff1661394b565b1561344e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261330e6126d9565b8786866040518563ffffffff1660e01b8152600401613330949392919061484f565b602060405180830381600087803b15801561334a57600080fd5b505af192505050801561337b57506040513d601f19601f820116820180604052508101906133789190614079565b60015b6133fe573d80600081146133ab576040519150601f19603f3d011682016040523d82523d6000602084013e6133b0565b606091505b506000815114156133f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ed90614933565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613453565b600190505b949350505050565b600082613468858461395e565b1490509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134cd8461178f565b6134d79190614eda565b90506000600760008481526020019081526020016000205490508181146135bc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136419190614eda565b905060006009600084815260200190815260200160002054905060006008838154811061367157613670615195565b5b90600052602060002001549050806008838154811061369357613692615195565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136e2576136e1615166565b5b6001900381819060005260206000200160009055905550505050565b60006137098361178f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e490614af3565b60405180910390fd5b6137f68161266d565b15613836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382d90614993565b60405180910390fd5b61384260008383613155565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138929190614df9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60008082905060005b8451811015613a0657600085828151811061398557613984615195565b5b602002602001015190508083116139c65782816040516020016139a99291906147cc565b6040516020818303038152906040528051906020012092506139f2565b80836040516020016139d99291906147cc565b6040516020818303038152906040528051906020012092505b5080806139fe90615031565b915050613967565b508091505092915050565b828054613a1d90614fce565b90600052602060002090601f016020900481019282613a3f5760008555613a86565b82601f10613a5857803560ff1916838001178555613a86565b82800160010185558215613a86579182015b82811115613a85578235825591602001919060010190613a6a565b5b509050613a939190613b1d565b5090565b828054613aa390614fce565b90600052602060002090601f016020900481019282613ac55760008555613b0c565b82601f10613ade57805160ff1916838001178555613b0c565b82800160010185558215613b0c579182015b82811115613b0b578251825591602001919060010190613af0565b5b509050613b199190613b1d565b5090565b5b80821115613b36576000816000905550600101613b1e565b5090565b6000613b4d613b4884614d13565b614cee565b90508083825260208201905082856020860282011115613b7057613b6f6151fd565b5b60005b85811015613ba05781613b868882613cdc565b845260208401935060208301925050600181019050613b73565b5050509392505050565b6000613bbd613bb884614d3f565b614cee565b905082815260208101848484011115613bd957613bd8615202565b5b613be4848285614f8c565b509392505050565b6000613bff613bfa84614d70565b614cee565b905082815260208101848484011115613c1b57613c1a615202565b5b613c26848285614f8c565b509392505050565b600081359050613c3d816159d5565b92915050565b60008083601f840112613c5957613c586151f8565b5b8235905067ffffffffffffffff811115613c7657613c756151f3565b5b602083019150836020820283011115613c9257613c916151fd565b5b9250929050565b600082601f830112613cae57613cad6151f8565b5b8135613cbe848260208601613b3a565b91505092915050565b600081359050613cd6816159ec565b92915050565b600081359050613ceb81615a03565b92915050565b600081359050613d0081615a1a565b92915050565b600081519050613d1581615a1a565b92915050565b600082601f830112613d3057613d2f6151f8565b5b8135613d40848260208601613baa565b91505092915050565b60008083601f840112613d5f57613d5e6151f8565b5b8235905067ffffffffffffffff811115613d7c57613d7b6151f3565b5b602083019150836001820283011115613d9857613d976151fd565b5b9250929050565b600082601f830112613db457613db36151f8565b5b8135613dc4848260208601613bec565b91505092915050565b600081359050613ddc81615a31565b92915050565b600060208284031215613df857613df761520c565b5b6000613e0684828501613c2e565b91505092915050565b60008060408385031215613e2657613e2561520c565b5b6000613e3485828601613c2e565b9250506020613e4585828601613c2e565b9150509250929050565b600080600060608486031215613e6857613e6761520c565b5b6000613e7686828701613c2e565b9350506020613e8786828701613c2e565b9250506040613e9886828701613dcd565b9150509250925092565b60008060008060808587031215613ebc57613ebb61520c565b5b6000613eca87828801613c2e565b9450506020613edb87828801613c2e565b9350506040613eec87828801613dcd565b925050606085013567ffffffffffffffff811115613f0d57613f0c615207565b5b613f1987828801613d1b565b91505092959194509250565b60008060408385031215613f3c57613f3b61520c565b5b6000613f4a85828601613c2e565b9250506020613f5b85828601613cc7565b9150509250929050565b60008060408385031215613f7c57613f7b61520c565b5b6000613f8a85828601613c2e565b9250506020613f9b85828601613dcd565b9150509250929050565b60008060208385031215613fbc57613fbb61520c565b5b600083013567ffffffffffffffff811115613fda57613fd9615207565b5b613fe685828601613c43565b92509250509250929050565b6000602082840312156140085761400761520c565b5b600061401684828501613cc7565b91505092915050565b6000602082840312156140355761403461520c565b5b600061404384828501613cdc565b91505092915050565b6000602082840312156140625761406161520c565b5b600061407084828501613cf1565b91505092915050565b60006020828403121561408f5761408e61520c565b5b600061409d84828501613d06565b91505092915050565b600080602083850312156140bd576140bc61520c565b5b600083013567ffffffffffffffff8111156140db576140da615207565b5b6140e785828601613d49565b92509250509250929050565b6000602082840312156141095761410861520c565b5b600082013567ffffffffffffffff81111561412757614126615207565b5b61413384828501613d9f565b91505092915050565b6000602082840312156141525761415161520c565b5b600061416084828501613dcd565b91505092915050565b600080604083850312156141805761417f61520c565b5b600061418e85828601613dcd565b925050602083013567ffffffffffffffff8111156141af576141ae615207565b5b6141bb85828601613c99565b9150509250929050565b6141ce81614f0e565b82525050565b6141e56141e082614f0e565b61507a565b82525050565b6141f481614f20565b82525050565b61420381614f2c565b82525050565b61421a61421582614f2c565b61508c565b82525050565b600061422b82614db6565b6142358185614dcc565b9350614245818560208601614f9b565b61424e81615211565b840191505092915050565b600061426482614dc1565b61426e8185614ddd565b935061427e818560208601614f9b565b61428781615211565b840191505092915050565b600061429d82614dc1565b6142a78185614dee565b93506142b7818560208601614f9b565b80840191505092915050565b600081546142d081614fce565b6142da8186614dee565b945060018216600081146142f5576001811461430657614339565b60ff19831686528186019350614339565b61430f85614da1565b60005b8381101561433157815481890152600182019150602081019050614312565b838801955050505b50505092915050565b600061434f601983614ddd565b915061435a8261522f565b602082019050919050565b6000614372602b83614ddd565b915061437d82615258565b604082019050919050565b6000614395603283614ddd565b91506143a0826152a7565b604082019050919050565b60006143b8602683614ddd565b91506143c3826152f6565b604082019050919050565b60006143db601783614ddd565b91506143e682615345565b602082019050919050565b60006143fe601c83614ddd565b91506144098261536e565b602082019050919050565b6000614421602d83614ddd565b915061442c82615397565b604082019050919050565b6000614444601383614ddd565b915061444f826153e6565b602082019050919050565b6000614467602483614ddd565b91506144728261540f565b604082019050919050565b600061448a601983614ddd565b91506144958261545e565b602082019050919050565b60006144ad602c83614ddd565b91506144b882615487565b604082019050919050565b60006144d0601d83614ddd565b91506144db826154d6565b602082019050919050565b60006144f3603883614ddd565b91506144fe826154ff565b604082019050919050565b6000614516602a83614ddd565b91506145218261554e565b604082019050919050565b6000614539602983614ddd565b91506145448261559d565b604082019050919050565b600061455c601183614ddd565b9150614567826155ec565b602082019050919050565b600061457f602083614ddd565b915061458a82615615565b602082019050919050565b60006145a2602c83614ddd565b91506145ad8261563e565b604082019050919050565b60006145c5602083614ddd565b91506145d08261568d565b602082019050919050565b60006145e8602983614ddd565b91506145f3826156b6565b604082019050919050565b600061460b602f83614ddd565b915061461682615705565b604082019050919050565b600061462e602183614ddd565b915061463982615754565b604082019050919050565b6000614651601483614ddd565b915061465c826157a3565b602082019050919050565b6000614674601483614ddd565b915061467f826157cc565b602082019050919050565b6000614697601c83614ddd565b91506146a2826157f5565b602082019050919050565b60006146ba603183614ddd565b91506146c58261581e565b604082019050919050565b60006146dd602c83614ddd565b91506146e88261586d565b604082019050919050565b6000614700602083614ddd565b915061470b826158bc565b602082019050919050565b6000614723602683614ddd565b915061472e826158e5565b604082019050919050565b6000614746602983614ddd565b915061475182615934565b604082019050919050565b6000614769600183614dee565b915061477482615983565b600182019050919050565b600061478c600c83614ddd565b9150614797826159ac565b602082019050919050565b6147ab81614f82565b82525050565b60006147bd82846141d4565b60148201915081905092915050565b60006147d88285614209565b6020820191506147e88284614209565b6020820191508190509392505050565b60006148048286614292565b915061480f8261475c565b915061481b8285614292565b915061482782846142c3565b9150819050949350505050565b600060208201905061484960008301846141c5565b92915050565b600060808201905061486460008301876141c5565b61487160208301866141c5565b61487e60408301856147a2565b81810360608301526148908184614220565b905095945050505050565b60006020820190506148b060008301846141eb565b92915050565b60006020820190506148cb60008301846141fa565b92915050565b600060208201905081810360008301526148eb8184614259565b905092915050565b6000602082019050818103600083015261490c81614342565b9050919050565b6000602082019050818103600083015261492c81614365565b9050919050565b6000602082019050818103600083015261494c81614388565b9050919050565b6000602082019050818103600083015261496c816143ab565b9050919050565b6000602082019050818103600083015261498c816143ce565b9050919050565b600060208201905081810360008301526149ac816143f1565b9050919050565b600060208201905081810360008301526149cc81614414565b9050919050565b600060208201905081810360008301526149ec81614437565b9050919050565b60006020820190508181036000830152614a0c8161445a565b9050919050565b60006020820190508181036000830152614a2c8161447d565b9050919050565b60006020820190508181036000830152614a4c816144a0565b9050919050565b60006020820190508181036000830152614a6c816144c3565b9050919050565b60006020820190508181036000830152614a8c816144e6565b9050919050565b60006020820190508181036000830152614aac81614509565b9050919050565b60006020820190508181036000830152614acc8161452c565b9050919050565b60006020820190508181036000830152614aec8161454f565b9050919050565b60006020820190508181036000830152614b0c81614572565b9050919050565b60006020820190508181036000830152614b2c81614595565b9050919050565b60006020820190508181036000830152614b4c816145b8565b9050919050565b60006020820190508181036000830152614b6c816145db565b9050919050565b60006020820190508181036000830152614b8c816145fe565b9050919050565b60006020820190508181036000830152614bac81614621565b9050919050565b60006020820190508181036000830152614bcc81614644565b9050919050565b60006020820190508181036000830152614bec81614667565b9050919050565b60006020820190508181036000830152614c0c8161468a565b9050919050565b60006020820190508181036000830152614c2c816146ad565b9050919050565b60006020820190508181036000830152614c4c816146d0565b9050919050565b60006020820190508181036000830152614c6c816146f3565b9050919050565b60006020820190508181036000830152614c8c81614716565b9050919050565b60006020820190508181036000830152614cac81614739565b9050919050565b60006020820190508181036000830152614ccc8161477f565b9050919050565b6000602082019050614ce860008301846147a2565b92915050565b6000614cf8614d09565b9050614d048282615000565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2e57614d2d6151c4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5a57614d596151c4565b5b614d6382615211565b9050602081019050919050565b600067ffffffffffffffff821115614d8b57614d8a6151c4565b5b614d9482615211565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e0482614f82565b9150614e0f83614f82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4457614e436150d9565b5b828201905092915050565b6000614e5a82614f82565b9150614e6583614f82565b925082614e7557614e74615108565b5b828204905092915050565b6000614e8b82614f82565b9150614e9683614f82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ecf57614ece6150d9565b5b828202905092915050565b6000614ee582614f82565b9150614ef083614f82565b925082821015614f0357614f026150d9565b5b828203905092915050565b6000614f1982614f62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fb9578082015181840152602081019050614f9e565b83811115614fc8576000848401525b50505050565b60006002820490506001821680614fe657607f821691505b60208210811415614ffa57614ff9615137565b5b50919050565b61500982615211565b810181811067ffffffffffffffff82111715615028576150276151c4565b5b80604052505050565b600061503c82614f82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506f5761506e6150d9565b5b600182019050919050565b600061508582615096565b9050919050565b6000819050919050565b60006150a182615222565b9050919050565b60006150b382614f82565b91506150be83614f82565b9250826150ce576150cd615108565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f47656e6572616c206d696e74206973206e6f74206f70656e2100000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e7420697320696e76616c696421000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f506f6e7a692050616e74686572733a20726563657069656e742069732074686560008201527f206e756c6c206164647265737300000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365642100000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f416c726561647920636c61696d65642074686520574c206c696d697421000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4275726e696e672064697361626c656421000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f574c206d696e74206973206e6f74206f70656e21000000000000000000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4554482076616c75652073656e7420697320696e636f72726563742100000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f742073656c656374656420666f722074686520574c21600082015250565b7f4275726e2063616c6c6572206973206e6f74206f776e6572206e6f722061707060008201527f726f766564210000000000000000000000000000000000000000000000000000602082015250565b7f506f6e7a692050616e74686572733a206d617820746f74616c20737570706c7960008201527f2065786365656465640000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f5a65726f20616d6f756e74210000000000000000000000000000000000000000600082015250565b6159de81614f0e565b81146159e957600080fd5b50565b6159f581614f20565b8114615a0057600080fd5b50565b615a0c81614f2c565b8114615a1757600080fd5b50565b615a2381614f36565b8114615a2e57600080fd5b50565b615a3a81614f82565b8114615a4557600080fd5b5056fea26469706673582212201ac11ceb93b940c868c4d77d8c12e1f271ad7c5f0d11319c5a46ceed4287a90964736f6c63430008070033

Deployed Bytecode Sourcemap

55078:5451:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55315:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48861:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36355:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55487:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37914:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55406:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37437:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56059:84;;;;;;;;;;;;;:::i;:::-;;49501:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55595:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38664:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55251:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55628;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58241:689;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49169:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55833:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39074:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60036:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55971:80;;;;;;;;;;;;;:::i;:::-;;49691:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55560:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59796:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56241:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55345:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55527:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36049:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55378:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56151:82;;;;;;;;;;;;;:::i;:::-;;56546:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35779:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11330:103;;;;;;;;;;;;;:::i;:::-;;55663:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55284:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10679:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36524:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38207:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56469:69;;;;;;;;;;;;;:::i;:::-;;56669:565;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39330:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55441:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59909:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59196:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57242:991;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58938:250;;;;;;;;;;;;;:::i;:::-;;55213:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38433:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59662:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11588:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55315:23;;;;:::o;48861:224::-;48963:4;49002:35;48987:50;;;:11;:50;;;;:90;;;;49041:36;49065:11;49041:23;:36::i;:::-;48987:90;48980:97;;48861:224;;;:::o;36355:100::-;36409:13;36442:5;36435:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36355:100;:::o;55487:33::-;;;;;;;;;;;;;:::o;37914:221::-;37990:7;38018:16;38026:7;38018;:16::i;:::-;38010:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38103:15;:24;38119:7;38103:24;;;;;;;;;;;;;;;;;;;;;38096:31;;37914:221;;;:::o;55406:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37437:411::-;37518:13;37534:23;37549:7;37534:14;:23::i;:::-;37518:39;;37582:5;37576:11;;:2;:11;;;;37568:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37676:5;37660:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37685:37;37702:5;37709:12;:10;:12::i;:::-;37685:16;:37::i;:::-;37660:62;37638:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37819:21;37828:2;37832:7;37819:8;:21::i;:::-;37507:341;37437:411;;:::o;56059:84::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56129:6:::1;;;;;;;;;;;56128:7;56119:6;;:16;;;;;;;;;;;;;;;;;;56059:84::o:0;49501:113::-;49562:7;49589:10;:17;;;;49582:24;;49501:113;:::o;55595:26::-;;;;;;;;;;;;;:::o;38664:339::-;38859:41;38878:12;:10;:12::i;:::-;38892:7;38859:18;:41::i;:::-;38851:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38967:28;38977:4;38983:2;38987:7;38967:9;:28::i;:::-;38664:339;;;:::o;55251:26::-;;;;:::o;55628:::-;;;;;;;;;;;;;:::o;58241:689::-;58314:6;;;;;;;;;;;58306:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58370:6;;;;;;;;;;;58369:7;58361:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;58431:1;58421:7;:11;58413:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58503:7;;58491:9;;:19;;;;:::i;:::-;58480:7;58468:9;;:19;;;;:::i;:::-;:42;;58460:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58574:9;58563:7;58554:6;;:16;;;;:::i;:::-;:29;;58546:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58629:18;58663:11;58677:1;58663:15;;58658:265;58686:7;58680:3;:13;58658:265;;;58717:21;:9;:19;:21::i;:::-;58766:19;:9;:17;:19::i;:::-;58753:32;;58800:33;58810:10;58822;58800:9;:33::i;:::-;58870:1;58859:8;;:12;;;;:::i;:::-;58848:8;:23;;;;58910:1;58898:9;;:13;;;;:::i;:::-;58886:9;:25;;;;58695:5;;;;;:::i;:::-;;;;58658:265;;;;58295:635;58241:689;:::o;49169:256::-;49266:7;49302:23;49319:5;49302:16;:23::i;:::-;49294:5;:31;49286:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49391:12;:19;49404:5;49391:19;;;;;;;;;;;;;;;:26;49411:5;49391:26;;;;;;;;;;;;49384:33;;49169:256;;;;:::o;55833:28::-;;;;:::o;39074:185::-;39212:39;39229:4;39235:2;39239:7;39212:39;;;;;;;;;;;;:16;:39::i;:::-;39074:185;;;:::o;60036:262::-;60095:13;;;;;;;;;;;60087:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60149:39;60168:10;60180:7;60149:18;:39::i;:::-;60141:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;60242:14;60248:7;60242:5;:14::i;:::-;60289:1;60278:8;;:12;;;;:::i;:::-;60267:8;:23;;;;60036:262;:::o;55971:80::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56037:6:::1;;;;;;;;;;;56036:7;56027:6;;:16;;;;;;;;;;;;;;;;;;55971:80::o:0;49691:233::-;49766:7;49802:30;:28;:30::i;:::-;49794:5;:38;49786:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49899:10;49910:5;49899:17;;;;;;;;:::i;:::-;;;;;;;;;;49892:24;;49691:233;;;:::o;55560:28::-;;;;;;;;;;;;;:::o;59796:105::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59883:10:::1;59871:9;:22;;;;59796:105:::0;:::o;56241:112::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56332:13:::1;;56322:7;:23;;;;;;;:::i;:::-;;56241:112:::0;;:::o;55345:24::-;;;;:::o;55527:26::-;;;;;;;;;;;;;:::o;36049:239::-;36121:7;36141:13;36157:7;:16;36165:7;36157:16;;;;;;;;;;;;;;;;;;;;;36141:32;;36209:1;36192:19;;:5;:19;;;;36184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36275:5;36268:12;;;36049:239;;;:::o;55378:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56151:82::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56219:6:::1;;;;;;;;;;;56218:7;56209:6;;:16;;;;;;;;;;;;;;;;;;56151:82::o:0;56546:115::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56639:14:::1;56623:13;;:30;;;;;;;;;;;;;;;;;;56546:115:::0;:::o;35779:208::-;35851:7;35896:1;35879:19;;:5;:19;;;;35871:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35963:9;:16;35973:5;35963:16;;;;;;;;;;;;;;;;35956:23;;35779:208;;;:::o;11330:103::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11395:30:::1;11422:1;11395:18;:30::i;:::-;11330:103::o:0;55663:52::-;;;;;;;;;;;;;;;;;:::o;55284:24::-;;;;:::o;10679:87::-;10725:7;10752:6;;;;;;;;;;;10745:13;;10679:87;:::o;36524:104::-;36580:13;36613:7;36606:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36524:104;:::o;38207:155::-;38302:52;38321:12;:10;:12::i;:::-;38335:8;38345;38302:18;:52::i;:::-;38207:155;;:::o;56469:69::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56526:4:::1;56515:8;;:15;;;;;;;;;;;;;;;;;;56469:69::o:0;56669:565::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56788:9:::1;;56767:10;;:17;;56756:8;;:28;;;;:::i;:::-;:41;;56748:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;56856:18;56890:11:::0;56904:1:::1;56890:15;;56885:342;56913:10;;:17;;56907:3;:23;56885:342;;;56989:1;56962:29;;:10;;56973:3;56962:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:29;;;;56954:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57056:21;:9;:19;:21::i;:::-;57105:19;:9;:17;:19::i;:::-;57092:32;;57139:38;57149:10;;57160:3;57149:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57166:10;57139:9;:38::i;:::-;57214:1;57203:8;;:12;;;;:::i;:::-;57192:8;:23;;;;56932:5;;;;;:::i;:::-;;;;56885:342;;;;56737:497;56669:565:::0;;:::o;39330:328::-;39505:41;39524:12;:10;:12::i;:::-;39538:7;39505:18;:41::i;:::-;39497:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39611:39;39625:4;39631:2;39635:7;39644:5;39611:13;:39::i;:::-;39330:328;;;;:::o;55441:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59909:119::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60006:14:::1;59990:13;:30;;;;59909:119:::0;:::o;59196:458::-;59269:13;59303:16;59311:7;59303;:16::i;:::-;59295:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59400:5;59388:17;;:8;;;;;;;;;;;:17;;;59384:71;;;59429:14;59422:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59384:71;59467:28;59498:10;:8;:10::i;:::-;59467:41;;59557:1;59532:14;59526:28;:32;:120;;;;;;;;;;;;;;;;;59585:14;59606:18;:7;:16;:18::i;:::-;59626:13;59568:72;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59526:120;59519:127;;;59196:458;;;;:::o;57242:991::-;57342:6;;;;;;;;;;;57334:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57393:6;;;;;;;;;;;57392:7;57384:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57453:5;;57442:7;:16;;57434:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57548:5;;57537:7;57505:17;:29;57523:10;57505:29;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:48;;57497:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;57608:25;57615:10;57627:5;57608:6;:25::i;:::-;57600:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57724:7;;57712:9;;:19;;;;:::i;:::-;57701:7;57689:9;;:19;;;;:::i;:::-;:42;;57681:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57797:9;57786:7;57775:8;;:18;;;;:::i;:::-;:31;;57767:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57852:18;57886:11;57900:1;57886:15;;57881:345;57909:7;57903:3;:13;57881:345;;;57940:21;:9;:19;:21::i;:::-;57989:19;:9;:17;:19::i;:::-;57976:32;;58023:33;58033:10;58045;58023:9;:33::i;:::-;58135:1;58103:17;:29;58121:10;58103:29;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;58071:17;:29;58089:10;58071:29;;;;;;;;;;;;;;;:65;;;;58173:1;58162:8;;:12;;;;:::i;:::-;58151:8;:23;;;;58213:1;58201:9;;:13;;;;:::i;:::-;58189:9;:25;;;;57918:5;;;;;:::i;:::-;;;;57881:345;;;;57323:910;57242:991;;:::o;58938:250::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58993:6:::1;59017:1;59013:5;;59008:173;59025:2;59020:1;:7;59008:173;;59045:21;:9;:19;:21::i;:::-;59077:24;59087:10;59099:1;59077:9;:24::i;:::-;59134:1;59123:8;;:12;;;;:::i;:::-;59112:8;:23;;;;59170:1;59158:9;;:13;;;;:::i;:::-;59146:9;:25;;;;59029:3;;;;;:::i;:::-;;;;59008:173;;;58984:204;58938:250::o:0;55213:31::-;;;;:::o;38433:164::-;38530:4;38554:18;:25;38573:5;38554:25;;;;;;;;;;;;;;;:35;38580:8;38554:35;;;;;;;;;;;;;;;;;;;;;;;;;38547:42;;38433:164;;;;:::o;59662:126::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59765:15:::1;59748:14;:32;;;;;;;;;;;;:::i;:::-;;59662:126:::0;:::o;11588:201::-;10910:12;:10;:12::i;:::-;10899:23;;:7;:5;:7::i;:::-;:23;;;10891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11697:1:::1;11677:22;;:8;:22;;;;11669:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11753:28;11772:8;11753:18;:28::i;:::-;11588:201:::0;:::o;35410:305::-;35512:4;35564:25;35549:40;;;:11;:40;;;;:105;;;;35621:33;35606:48;;;:11;:48;;;;35549:105;:158;;;;35671:36;35695:11;35671:23;:36::i;:::-;35549:158;35529:178;;35410:305;;;:::o;41168:127::-;41233:4;41285:1;41257:30;;:7;:16;41265:7;41257:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41250:37;;41168:127;;;:::o;9403:98::-;9456:7;9483:10;9476:17;;9403:98;:::o;45150:174::-;45252:2;45225:15;:24;45241:7;45225:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45308:7;45304:2;45270:46;;45279:23;45294:7;45279:14;:23::i;:::-;45270:46;;;;;;;;;;;;45150:174;;:::o;41462:348::-;41555:4;41580:16;41588:7;41580;:16::i;:::-;41572:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41656:13;41672:23;41687:7;41672:14;:23::i;:::-;41656:39;;41725:5;41714:16;;:7;:16;;;:51;;;;41758:7;41734:31;;:20;41746:7;41734:11;:20::i;:::-;:31;;;41714:51;:87;;;;41769:32;41786:5;41793:7;41769:16;:32::i;:::-;41714:87;41706:96;;;41462:348;;;;:::o;44454:578::-;44613:4;44586:31;;:23;44601:7;44586:14;:23::i;:::-;:31;;;44578:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44696:1;44682:16;;:2;:16;;;;44674:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44752:39;44773:4;44779:2;44783:7;44752:20;:39::i;:::-;44856:29;44873:1;44877:7;44856:8;:29::i;:::-;44917:1;44898:9;:15;44908:4;44898:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44946:1;44929:9;:13;44939:2;44929:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44977:2;44958:7;:16;44966:7;44958:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45016:7;45012:2;44997:27;;45006:4;44997:27;;;;;;;;;;;;44454:578;;;:::o;1065:127::-;1172:1;1154:7;:14;;;:19;;;;;;;;;;;1065:127;:::o;943:114::-;1008:7;1035;:14;;;1028:21;;943:114;;;:::o;42152:110::-;42228:26;42238:2;42242:7;42228:26;;;;;;;;;;;;:9;:26::i;:::-;42152:110;;:::o;43757:360::-;43817:13;43833:23;43848:7;43833:14;:23::i;:::-;43817:39;;43869:48;43890:5;43905:1;43909:7;43869:20;:48::i;:::-;43958:29;43975:1;43979:7;43958:8;:29::i;:::-;44020:1;44000:9;:16;44010:5;44000:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;44039:7;:16;44047:7;44039:16;;;;;;;;;;;;44032:23;;;;;;;;;;;44101:7;44097:1;44073:36;;44082:5;44073:36;;;;;;;;;;;;43806:311;43757:360;:::o;11949:191::-;12023:16;12042:6;;;;;;;;;;;12023:25;;12068:8;12059:6;;:17;;;;;;;;;;;;;;;;;;12123:8;12092:40;;12113:8;12092:40;;;;;;;;;;;;12012:128;11949:191;:::o;45466:315::-;45621:8;45612:17;;:5;:17;;;;45604:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45708:8;45670:18;:25;45689:5;45670:25;;;;;;;;;;;;;;;:35;45696:8;45670:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45754:8;45732:41;;45747:5;45732:41;;;45764:8;45732:41;;;;;;:::i;:::-;;;;;;;;45466:315;;;:::o;40540:::-;40697:28;40707:4;40713:2;40717:7;40697:9;:28::i;:::-;40744:48;40767:4;40773:2;40777:7;40786:5;40744:22;:48::i;:::-;40736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:315;;;;:::o;56361:100::-;56413:13;56446:7;56439:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56361:100;:::o;6965:723::-;7021:13;7251:1;7242:5;:10;7238:53;;;7269:10;;;;;;;;;;;;;;;;;;;;;7238:53;7301:12;7316:5;7301:20;;7332:14;7357:78;7372:1;7364:4;:9;7357:78;;7390:8;;;;;:::i;:::-;;;;7421:2;7413:10;;;;;:::i;:::-;;;7357:78;;;7445:19;7477:6;7467:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7445:39;;7495:154;7511:1;7502:5;:10;7495:154;;7539:1;7529:11;;;;;:::i;:::-;;;7606:2;7598:5;:10;;;;:::i;:::-;7585:2;:24;;;;:::i;:::-;7572:39;;7555:6;7562;7555:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7635:2;7626:11;;;;;:::i;:::-;;;7495:154;;;7673:6;7659:21;;;;;6965:723;;;;:::o;60306:220::-;60386:4;60403:12;60445:7;60428:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;60418:36;;;;;;60403:51;;60472:46;60491:5;60498:13;;60513:4;60472:18;:46::i;:::-;60465:53;;;60306:220;;;;:::o;27106:157::-;27191:4;27230:25;27215:40;;;:11;:40;;;;27208:47;;27106:157;;;:::o;50537:589::-;50681:45;50708:4;50714:2;50718:7;50681:26;:45::i;:::-;50759:1;50743:18;;:4;:18;;;50739:187;;;50778:40;50810:7;50778:31;:40::i;:::-;50739:187;;;50848:2;50840:10;;:4;:10;;;50836:90;;50867:47;50900:4;50906:7;50867:32;:47::i;:::-;50836:90;50739:187;50954:1;50940:16;;:2;:16;;;50936:183;;;50973:45;51010:7;50973:36;:45::i;:::-;50936:183;;;51046:4;51040:10;;:2;:10;;;51036:83;;51067:40;51095:2;51099:7;51067:27;:40::i;:::-;51036:83;50936:183;50537:589;;;:::o;42489:321::-;42619:18;42625:2;42629:7;42619:5;:18::i;:::-;42670:54;42701:1;42705:2;42709:7;42718:5;42670:22;:54::i;:::-;42648:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42489:321;;;:::o;46346:799::-;46501:4;46522:15;:2;:13;;;:15::i;:::-;46518:620;;;46574:2;46558:36;;;46595:12;:10;:12::i;:::-;46609:4;46615:7;46624:5;46558:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46554:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46817:1;46800:6;:13;:18;46796:272;;;46843:60;;;;;;;;;;:::i;:::-;;;;;;;;46796:272;47018:6;47012:13;47003:6;46999:2;46995:15;46988:38;46554:529;46691:41;;;46681:51;;;:6;:51;;;;46674:58;;;;;46518:620;47122:4;47115:11;;46346:799;;;;;;;:::o;5340:190::-;5465:4;5518;5489:25;5502:5;5509:4;5489:12;:25::i;:::-;:33;5482:40;;5340:190;;;;;:::o;47717:126::-;;;;:::o;51849:164::-;51953:10;:17;;;;51926:15;:24;51942:7;51926:24;;;;;;;;;;;:44;;;;51981:10;51997:7;51981:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51849:164;:::o;52640:988::-;52906:22;52956:1;52931:22;52948:4;52931:16;:22::i;:::-;:26;;;;:::i;:::-;52906:51;;52968:18;52989:17;:26;53007:7;52989:26;;;;;;;;;;;;52968:47;;53136:14;53122:10;:28;53118:328;;53167:19;53189:12;:18;53202:4;53189:18;;;;;;;;;;;;;;;:34;53208:14;53189:34;;;;;;;;;;;;53167:56;;53273:11;53240:12;:18;53253:4;53240:18;;;;;;;;;;;;;;;:30;53259:10;53240:30;;;;;;;;;;;:44;;;;53390:10;53357:17;:30;53375:11;53357:30;;;;;;;;;;;:43;;;;53152:294;53118:328;53542:17;:26;53560:7;53542:26;;;;;;;;;;;53535:33;;;53586:12;:18;53599:4;53586:18;;;;;;;;;;;;;;;:34;53605:14;53586:34;;;;;;;;;;;53579:41;;;52721:907;;52640:988;;:::o;53923:1079::-;54176:22;54221:1;54201:10;:17;;;;:21;;;;:::i;:::-;54176:46;;54233:18;54254:15;:24;54270:7;54254:24;;;;;;;;;;;;54233:45;;54605:19;54627:10;54638:14;54627:26;;;;;;;;:::i;:::-;;;;;;;;;;54605:48;;54691:11;54666:10;54677;54666:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54802:10;54771:15;:28;54787:11;54771:28;;;;;;;;;;;:41;;;;54943:15;:24;54959:7;54943:24;;;;;;;;;;;54936:31;;;54978:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53994:1008;;;53923:1079;:::o;51427:221::-;51512:14;51529:20;51546:2;51529:16;:20::i;:::-;51512:37;;51587:7;51560:12;:16;51573:2;51560:16;;;;;;;;;;;;;;;:24;51577:6;51560:24;;;;;;;;;;;:34;;;;51634:6;51605:17;:26;51623:7;51605:26;;;;;;;;;;;:35;;;;51501:147;51427:221;;:::o;43146:382::-;43240:1;43226:16;;:2;:16;;;;43218:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43299:16;43307:7;43299;:16::i;:::-;43298:17;43290:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43361:45;43390:1;43394:2;43398:7;43361:20;:45::i;:::-;43436:1;43419:9;:13;43429:2;43419:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43467:2;43448:7;:16;43456:7;43448:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43512:7;43508:2;43487:33;;43504:1;43487:33;;;;;;;;;;;;43146:382;;:::o;12967:387::-;13027:4;13235:12;13302:7;13290:20;13282:28;;13345:1;13338:4;:8;13331:15;;;12967:387;;;:::o;5892:701::-;5975:7;5995:20;6018:4;5995:27;;6038:9;6033:523;6057:5;:12;6053:1;:16;6033:523;;;6091:20;6114:5;6120:1;6114:8;;;;;;;;:::i;:::-;;;;;;;;6091:31;;6157:12;6141;:28;6137:408;;6311:12;6325;6294:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6284:55;;;;;;6269:70;;6137:408;;;6501:12;6515;6484:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6474:55;;;;;;6459:70;;6137:408;6076:480;6071:3;;;;;:::i;:::-;;;;6033:523;;;;6573:12;6566:19;;;5892:701;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:553::-;3718:8;3728:6;3778:3;3771:4;3763:6;3759:17;3755:27;3745:122;;3786:79;;:::i;:::-;3745:122;3899:6;3886:20;3876:30;;3929:18;3921:6;3918:30;3915:117;;;3951:79;;:::i;:::-;3915:117;4065:4;4057:6;4053:17;4041:29;;4119:3;4111:4;4103:6;4099:17;4089:8;4085:32;4082:41;4079:128;;;4126:79;;:::i;:::-;4079:128;3660:553;;;;;:::o;4233:340::-;4289:5;4338:3;4331:4;4323:6;4319:17;4315:27;4305:122;;4346:79;;:::i;:::-;4305:122;4463:6;4450:20;4488:79;4563:3;4555:6;4548:4;4540:6;4536:17;4488:79;:::i;:::-;4479:88;;4295:278;4233:340;;;;:::o;4579:139::-;4625:5;4663:6;4650:20;4641:29;;4679:33;4706:5;4679:33;:::i;:::-;4579:139;;;;:::o;4724:329::-;4783:6;4832:2;4820:9;4811:7;4807:23;4803:32;4800:119;;;4838:79;;:::i;:::-;4800:119;4958:1;4983:53;5028:7;5019:6;5008:9;5004:22;4983:53;:::i;:::-;4973:63;;4929:117;4724:329;;;;:::o;5059:474::-;5127:6;5135;5184:2;5172:9;5163:7;5159:23;5155:32;5152:119;;;5190:79;;:::i;:::-;5152:119;5310:1;5335:53;5380:7;5371:6;5360:9;5356:22;5335:53;:::i;:::-;5325:63;;5281:117;5437:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5408:118;5059:474;;;;;:::o;5539:619::-;5616:6;5624;5632;5681:2;5669:9;5660:7;5656:23;5652:32;5649:119;;;5687:79;;:::i;:::-;5649:119;5807:1;5832:53;5877:7;5868:6;5857:9;5853:22;5832:53;:::i;:::-;5822:63;;5778:117;5934:2;5960:53;6005:7;5996:6;5985:9;5981:22;5960:53;:::i;:::-;5950:63;;5905:118;6062:2;6088:53;6133:7;6124:6;6113:9;6109:22;6088:53;:::i;:::-;6078:63;;6033:118;5539:619;;;;;:::o;6164:943::-;6259:6;6267;6275;6283;6332:3;6320:9;6311:7;6307:23;6303:33;6300:120;;;6339:79;;:::i;:::-;6300:120;6459:1;6484:53;6529:7;6520:6;6509:9;6505:22;6484:53;:::i;:::-;6474:63;;6430:117;6586:2;6612:53;6657:7;6648:6;6637:9;6633:22;6612:53;:::i;:::-;6602:63;;6557:118;6714:2;6740:53;6785:7;6776:6;6765:9;6761:22;6740:53;:::i;:::-;6730:63;;6685:118;6870:2;6859:9;6855:18;6842:32;6901:18;6893:6;6890:30;6887:117;;;6923:79;;:::i;:::-;6887:117;7028:62;7082:7;7073:6;7062:9;7058:22;7028:62;:::i;:::-;7018:72;;6813:287;6164:943;;;;;;;:::o;7113:468::-;7178:6;7186;7235:2;7223:9;7214:7;7210:23;7206:32;7203:119;;;7241:79;;:::i;:::-;7203:119;7361:1;7386:53;7431:7;7422:6;7411:9;7407:22;7386:53;:::i;:::-;7376:63;;7332:117;7488:2;7514:50;7556:7;7547:6;7536:9;7532:22;7514:50;:::i;:::-;7504:60;;7459:115;7113:468;;;;;:::o;7587:474::-;7655:6;7663;7712:2;7700:9;7691:7;7687:23;7683:32;7680:119;;;7718:79;;:::i;:::-;7680:119;7838:1;7863:53;7908:7;7899:6;7888:9;7884:22;7863:53;:::i;:::-;7853:63;;7809:117;7965:2;7991:53;8036:7;8027:6;8016:9;8012:22;7991:53;:::i;:::-;7981:63;;7936:118;7587:474;;;;;:::o;8067:559::-;8153:6;8161;8210:2;8198:9;8189:7;8185:23;8181:32;8178:119;;;8216:79;;:::i;:::-;8178:119;8364:1;8353:9;8349:17;8336:31;8394:18;8386:6;8383:30;8380:117;;;8416:79;;:::i;:::-;8380:117;8529:80;8601:7;8592:6;8581:9;8577:22;8529:80;:::i;:::-;8511:98;;;;8307:312;8067:559;;;;;:::o;8632:323::-;8688:6;8737:2;8725:9;8716:7;8712:23;8708:32;8705:119;;;8743:79;;:::i;:::-;8705:119;8863:1;8888:50;8930:7;8921:6;8910:9;8906:22;8888:50;:::i;:::-;8878:60;;8834:114;8632:323;;;;:::o;8961:329::-;9020:6;9069:2;9057:9;9048:7;9044:23;9040:32;9037:119;;;9075:79;;:::i;:::-;9037:119;9195:1;9220:53;9265:7;9256:6;9245:9;9241:22;9220:53;:::i;:::-;9210:63;;9166:117;8961:329;;;;:::o;9296:327::-;9354:6;9403:2;9391:9;9382:7;9378:23;9374:32;9371:119;;;9409:79;;:::i;:::-;9371:119;9529:1;9554:52;9598:7;9589:6;9578:9;9574:22;9554:52;:::i;:::-;9544:62;;9500:116;9296:327;;;;:::o;9629:349::-;9698:6;9747:2;9735:9;9726:7;9722:23;9718:32;9715:119;;;9753:79;;:::i;:::-;9715:119;9873:1;9898:63;9953:7;9944:6;9933:9;9929:22;9898:63;:::i;:::-;9888:73;;9844:127;9629:349;;;;:::o;9984:529::-;10055:6;10063;10112:2;10100:9;10091:7;10087:23;10083:32;10080:119;;;10118:79;;:::i;:::-;10080:119;10266:1;10255:9;10251:17;10238:31;10296:18;10288:6;10285:30;10282:117;;;10318:79;;:::i;:::-;10282:117;10431:65;10488:7;10479:6;10468:9;10464:22;10431:65;:::i;:::-;10413:83;;;;10209:297;9984:529;;;;;:::o;10519:509::-;10588:6;10637:2;10625:9;10616:7;10612:23;10608:32;10605:119;;;10643:79;;:::i;:::-;10605:119;10791:1;10780:9;10776:17;10763:31;10821:18;10813:6;10810:30;10807:117;;;10843:79;;:::i;:::-;10807:117;10948:63;11003:7;10994:6;10983:9;10979:22;10948:63;:::i;:::-;10938:73;;10734:287;10519:509;;;;:::o;11034:329::-;11093:6;11142:2;11130:9;11121:7;11117:23;11113:32;11110:119;;;11148:79;;:::i;:::-;11110:119;11268:1;11293:53;11338:7;11329:6;11318:9;11314:22;11293:53;:::i;:::-;11283:63;;11239:117;11034:329;;;;:::o;11369:684::-;11462:6;11470;11519:2;11507:9;11498:7;11494:23;11490:32;11487:119;;;11525:79;;:::i;:::-;11487:119;11645:1;11670:53;11715:7;11706:6;11695:9;11691:22;11670:53;:::i;:::-;11660:63;;11616:117;11800:2;11789:9;11785:18;11772:32;11831:18;11823:6;11820:30;11817:117;;;11853:79;;:::i;:::-;11817:117;11958:78;12028:7;12019:6;12008:9;12004:22;11958:78;:::i;:::-;11948:88;;11743:303;11369:684;;;;;:::o;12059:118::-;12146:24;12164:5;12146:24;:::i;:::-;12141:3;12134:37;12059:118;;:::o;12183:157::-;12288:45;12308:24;12326:5;12308:24;:::i;:::-;12288:45;:::i;:::-;12283:3;12276:58;12183:157;;:::o;12346:109::-;12427:21;12442:5;12427:21;:::i;:::-;12422:3;12415:34;12346:109;;:::o;12461:118::-;12548:24;12566:5;12548:24;:::i;:::-;12543:3;12536:37;12461:118;;:::o;12585:157::-;12690:45;12710:24;12728:5;12710:24;:::i;:::-;12690:45;:::i;:::-;12685:3;12678:58;12585:157;;:::o;12748:360::-;12834:3;12862:38;12894:5;12862:38;:::i;:::-;12916:70;12979:6;12974:3;12916:70;:::i;:::-;12909:77;;12995:52;13040:6;13035:3;13028:4;13021:5;13017:16;12995:52;:::i;:::-;13072:29;13094:6;13072:29;:::i;:::-;13067:3;13063:39;13056:46;;12838:270;12748:360;;;;:::o;13114:364::-;13202:3;13230:39;13263:5;13230:39;:::i;:::-;13285:71;13349:6;13344:3;13285:71;:::i;:::-;13278:78;;13365:52;13410:6;13405:3;13398:4;13391:5;13387:16;13365:52;:::i;:::-;13442:29;13464:6;13442:29;:::i;:::-;13437:3;13433:39;13426:46;;13206:272;13114:364;;;;:::o;13484:377::-;13590:3;13618:39;13651:5;13618:39;:::i;:::-;13673:89;13755:6;13750:3;13673:89;:::i;:::-;13666:96;;13771:52;13816:6;13811:3;13804:4;13797:5;13793:16;13771:52;:::i;:::-;13848:6;13843:3;13839:16;13832:23;;13594:267;13484:377;;;;:::o;13891:845::-;13994:3;14031:5;14025:12;14060:36;14086:9;14060:36;:::i;:::-;14112:89;14194:6;14189:3;14112:89;:::i;:::-;14105:96;;14232:1;14221:9;14217:17;14248:1;14243:137;;;;14394:1;14389:341;;;;14210:520;;14243:137;14327:4;14323:9;14312;14308:25;14303:3;14296:38;14363:6;14358:3;14354:16;14347:23;;14243:137;;14389:341;14456:38;14488:5;14456:38;:::i;:::-;14516:1;14530:154;14544:6;14541:1;14538:13;14530:154;;;14618:7;14612:14;14608:1;14603:3;14599:11;14592:35;14668:1;14659:7;14655:15;14644:26;;14566:4;14563:1;14559:12;14554:17;;14530:154;;;14713:6;14708:3;14704:16;14697:23;;14396:334;;14210:520;;13998:738;;13891:845;;;;:::o;14742:366::-;14884:3;14905:67;14969:2;14964:3;14905:67;:::i;:::-;14898:74;;14981:93;15070:3;14981:93;:::i;:::-;15099:2;15094:3;15090:12;15083:19;;14742:366;;;:::o;15114:::-;15256:3;15277:67;15341:2;15336:3;15277:67;:::i;:::-;15270:74;;15353:93;15442:3;15353:93;:::i;:::-;15471:2;15466:3;15462:12;15455:19;;15114:366;;;:::o;15486:::-;15628:3;15649:67;15713:2;15708:3;15649:67;:::i;:::-;15642:74;;15725:93;15814:3;15725:93;:::i;:::-;15843:2;15838:3;15834:12;15827:19;;15486:366;;;:::o;15858:::-;16000:3;16021:67;16085:2;16080:3;16021:67;:::i;:::-;16014:74;;16097:93;16186:3;16097:93;:::i;:::-;16215:2;16210:3;16206:12;16199:19;;15858:366;;;:::o;16230:::-;16372:3;16393:67;16457:2;16452:3;16393:67;:::i;:::-;16386:74;;16469:93;16558:3;16469:93;:::i;:::-;16587:2;16582:3;16578:12;16571:19;;16230:366;;;:::o;16602:::-;16744:3;16765:67;16829:2;16824:3;16765:67;:::i;:::-;16758:74;;16841:93;16930:3;16841:93;:::i;:::-;16959:2;16954:3;16950:12;16943:19;;16602:366;;;:::o;16974:::-;17116:3;17137:67;17201:2;17196:3;17137:67;:::i;:::-;17130:74;;17213:93;17302:3;17213:93;:::i;:::-;17331:2;17326:3;17322:12;17315:19;;16974:366;;;:::o;17346:::-;17488:3;17509:67;17573:2;17568:3;17509:67;:::i;:::-;17502:74;;17585:93;17674:3;17585:93;:::i;:::-;17703:2;17698:3;17694:12;17687:19;;17346:366;;;:::o;17718:::-;17860:3;17881:67;17945:2;17940:3;17881:67;:::i;:::-;17874:74;;17957:93;18046:3;17957:93;:::i;:::-;18075:2;18070:3;18066:12;18059:19;;17718:366;;;:::o;18090:::-;18232:3;18253:67;18317:2;18312:3;18253:67;:::i;:::-;18246:74;;18329:93;18418:3;18329:93;:::i;:::-;18447:2;18442:3;18438:12;18431:19;;18090:366;;;:::o;18462:::-;18604:3;18625:67;18689:2;18684:3;18625:67;:::i;:::-;18618:74;;18701:93;18790:3;18701:93;:::i;:::-;18819:2;18814:3;18810:12;18803:19;;18462:366;;;:::o;18834:::-;18976:3;18997:67;19061:2;19056:3;18997:67;:::i;:::-;18990:74;;19073:93;19162:3;19073:93;:::i;:::-;19191:2;19186:3;19182:12;19175:19;;18834:366;;;:::o;19206:::-;19348:3;19369:67;19433:2;19428:3;19369:67;:::i;:::-;19362:74;;19445:93;19534:3;19445:93;:::i;:::-;19563:2;19558:3;19554:12;19547:19;;19206:366;;;:::o;19578:::-;19720:3;19741:67;19805:2;19800:3;19741:67;:::i;:::-;19734:74;;19817:93;19906:3;19817:93;:::i;:::-;19935:2;19930:3;19926:12;19919:19;;19578:366;;;:::o;19950:::-;20092:3;20113:67;20177:2;20172:3;20113:67;:::i;:::-;20106:74;;20189:93;20278:3;20189:93;:::i;:::-;20307:2;20302:3;20298:12;20291:19;;19950:366;;;:::o;20322:::-;20464:3;20485:67;20549:2;20544:3;20485:67;:::i;:::-;20478:74;;20561:93;20650:3;20561:93;:::i;:::-;20679:2;20674:3;20670:12;20663:19;;20322:366;;;:::o;20694:::-;20836:3;20857:67;20921:2;20916:3;20857:67;:::i;:::-;20850:74;;20933:93;21022:3;20933:93;:::i;:::-;21051:2;21046:3;21042:12;21035:19;;20694:366;;;:::o;21066:::-;21208:3;21229:67;21293:2;21288:3;21229:67;:::i;:::-;21222:74;;21305:93;21394:3;21305:93;:::i;:::-;21423:2;21418:3;21414:12;21407:19;;21066:366;;;:::o;21438:::-;21580:3;21601:67;21665:2;21660:3;21601:67;:::i;:::-;21594:74;;21677:93;21766:3;21677:93;:::i;:::-;21795:2;21790:3;21786:12;21779:19;;21438:366;;;:::o;21810:::-;21952:3;21973:67;22037:2;22032:3;21973:67;:::i;:::-;21966:74;;22049:93;22138:3;22049:93;:::i;:::-;22167:2;22162:3;22158:12;22151:19;;21810:366;;;:::o;22182:::-;22324:3;22345:67;22409:2;22404:3;22345:67;:::i;:::-;22338:74;;22421:93;22510:3;22421:93;:::i;:::-;22539:2;22534:3;22530:12;22523:19;;22182:366;;;:::o;22554:::-;22696:3;22717:67;22781:2;22776:3;22717:67;:::i;:::-;22710:74;;22793:93;22882:3;22793:93;:::i;:::-;22911:2;22906:3;22902:12;22895:19;;22554:366;;;:::o;22926:::-;23068:3;23089:67;23153:2;23148:3;23089:67;:::i;:::-;23082:74;;23165:93;23254:3;23165:93;:::i;:::-;23283:2;23278:3;23274:12;23267:19;;22926:366;;;:::o;23298:::-;23440:3;23461:67;23525:2;23520:3;23461:67;:::i;:::-;23454:74;;23537:93;23626:3;23537:93;:::i;:::-;23655:2;23650:3;23646:12;23639:19;;23298:366;;;:::o;23670:::-;23812:3;23833:67;23897:2;23892:3;23833:67;:::i;:::-;23826:74;;23909:93;23998:3;23909:93;:::i;:::-;24027:2;24022:3;24018:12;24011:19;;23670:366;;;:::o;24042:::-;24184:3;24205:67;24269:2;24264:3;24205:67;:::i;:::-;24198:74;;24281:93;24370:3;24281:93;:::i;:::-;24399:2;24394:3;24390:12;24383:19;;24042:366;;;:::o;24414:::-;24556:3;24577:67;24641:2;24636:3;24577:67;:::i;:::-;24570:74;;24653:93;24742:3;24653:93;:::i;:::-;24771:2;24766:3;24762:12;24755:19;;24414:366;;;:::o;24786:::-;24928:3;24949:67;25013:2;25008:3;24949:67;:::i;:::-;24942:74;;25025:93;25114:3;25025:93;:::i;:::-;25143:2;25138:3;25134:12;25127:19;;24786:366;;;:::o;25158:::-;25300:3;25321:67;25385:2;25380:3;25321:67;:::i;:::-;25314:74;;25397:93;25486:3;25397:93;:::i;:::-;25515:2;25510:3;25506:12;25499:19;;25158:366;;;:::o;25530:::-;25672:3;25693:67;25757:2;25752:3;25693:67;:::i;:::-;25686:74;;25769:93;25858:3;25769:93;:::i;:::-;25887:2;25882:3;25878:12;25871:19;;25530:366;;;:::o;25902:400::-;26062:3;26083:84;26165:1;26160:3;26083:84;:::i;:::-;26076:91;;26176:93;26265:3;26176:93;:::i;:::-;26294:1;26289:3;26285:11;26278:18;;25902:400;;;:::o;26308:366::-;26450:3;26471:67;26535:2;26530:3;26471:67;:::i;:::-;26464:74;;26547:93;26636:3;26547:93;:::i;:::-;26665:2;26660:3;26656:12;26649:19;;26308:366;;;:::o;26680:118::-;26767:24;26785:5;26767:24;:::i;:::-;26762:3;26755:37;26680:118;;:::o;26804:256::-;26916:3;26931:75;27002:3;26993:6;26931:75;:::i;:::-;27031:2;27026:3;27022:12;27015:19;;27051:3;27044:10;;26804:256;;;;:::o;27066:397::-;27206:3;27221:75;27292:3;27283:6;27221:75;:::i;:::-;27321:2;27316:3;27312:12;27305:19;;27334:75;27405:3;27396:6;27334:75;:::i;:::-;27434:2;27429:3;27425:12;27418:19;;27454:3;27447:10;;27066:397;;;;;:::o;27469:855::-;27795:3;27817:95;27908:3;27899:6;27817:95;:::i;:::-;27810:102;;27929:148;28073:3;27929:148;:::i;:::-;27922:155;;28094:95;28185:3;28176:6;28094:95;:::i;:::-;28087:102;;28206:92;28294:3;28285:6;28206:92;:::i;:::-;28199:99;;28315:3;28308:10;;27469:855;;;;;;:::o;28330:222::-;28423:4;28461:2;28450:9;28446:18;28438:26;;28474:71;28542:1;28531:9;28527:17;28518:6;28474:71;:::i;:::-;28330:222;;;;:::o;28558:640::-;28753:4;28791:3;28780:9;28776:19;28768:27;;28805:71;28873:1;28862:9;28858:17;28849:6;28805:71;:::i;:::-;28886:72;28954:2;28943:9;28939:18;28930:6;28886:72;:::i;:::-;28968;29036:2;29025:9;29021:18;29012:6;28968:72;:::i;:::-;29087:9;29081:4;29077:20;29072:2;29061:9;29057:18;29050:48;29115:76;29186:4;29177:6;29115:76;:::i;:::-;29107:84;;28558:640;;;;;;;:::o;29204:210::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29342:65;29404:1;29393:9;29389:17;29380:6;29342:65;:::i;:::-;29204:210;;;;:::o;29420:222::-;29513:4;29551:2;29540:9;29536:18;29528:26;;29564:71;29632:1;29621:9;29617:17;29608:6;29564:71;:::i;:::-;29420:222;;;;:::o;29648:313::-;29761:4;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:78;29949:4;29940:6;29876:78;:::i;:::-;29868:86;;29648:313;;;;:::o;29967:419::-;30133:4;30171:2;30160:9;30156:18;30148:26;;30220:9;30214:4;30210:20;30206:1;30195:9;30191:17;30184:47;30248:131;30374:4;30248:131;:::i;:::-;30240:139;;29967:419;;;:::o;30392:::-;30558:4;30596:2;30585:9;30581:18;30573:26;;30645:9;30639:4;30635:20;30631:1;30620:9;30616:17;30609:47;30673:131;30799:4;30673:131;:::i;:::-;30665:139;;30392:419;;;:::o;30817:::-;30983:4;31021:2;31010:9;31006:18;30998:26;;31070:9;31064:4;31060:20;31056:1;31045:9;31041:17;31034:47;31098:131;31224:4;31098:131;:::i;:::-;31090:139;;30817:419;;;:::o;31242:::-;31408:4;31446:2;31435:9;31431:18;31423:26;;31495:9;31489:4;31485:20;31481:1;31470:9;31466:17;31459:47;31523:131;31649:4;31523:131;:::i;:::-;31515:139;;31242:419;;;:::o;31667:::-;31833:4;31871:2;31860:9;31856:18;31848:26;;31920:9;31914:4;31910:20;31906:1;31895:9;31891:17;31884:47;31948:131;32074:4;31948:131;:::i;:::-;31940:139;;31667:419;;;:::o;32092:::-;32258:4;32296:2;32285:9;32281:18;32273:26;;32345:9;32339:4;32335:20;32331:1;32320:9;32316:17;32309:47;32373:131;32499:4;32373:131;:::i;:::-;32365:139;;32092:419;;;:::o;32517:::-;32683:4;32721:2;32710:9;32706:18;32698:26;;32770:9;32764:4;32760:20;32756:1;32745:9;32741:17;32734:47;32798:131;32924:4;32798:131;:::i;:::-;32790:139;;32517:419;;;:::o;32942:::-;33108:4;33146:2;33135:9;33131:18;33123:26;;33195:9;33189:4;33185:20;33181:1;33170:9;33166:17;33159:47;33223:131;33349:4;33223:131;:::i;:::-;33215:139;;32942:419;;;:::o;33367:::-;33533:4;33571:2;33560:9;33556:18;33548:26;;33620:9;33614:4;33610:20;33606:1;33595:9;33591:17;33584:47;33648:131;33774:4;33648:131;:::i;:::-;33640:139;;33367:419;;;:::o;33792:::-;33958:4;33996:2;33985:9;33981:18;33973:26;;34045:9;34039:4;34035:20;34031:1;34020:9;34016:17;34009:47;34073:131;34199:4;34073:131;:::i;:::-;34065:139;;33792:419;;;:::o;34217:::-;34383:4;34421:2;34410:9;34406:18;34398:26;;34470:9;34464:4;34460:20;34456:1;34445:9;34441:17;34434:47;34498:131;34624:4;34498:131;:::i;:::-;34490:139;;34217:419;;;:::o;34642:::-;34808:4;34846:2;34835:9;34831:18;34823:26;;34895:9;34889:4;34885:20;34881:1;34870:9;34866:17;34859:47;34923:131;35049:4;34923:131;:::i;:::-;34915:139;;34642:419;;;:::o;35067:::-;35233:4;35271:2;35260:9;35256:18;35248:26;;35320:9;35314:4;35310:20;35306:1;35295:9;35291:17;35284:47;35348:131;35474:4;35348:131;:::i;:::-;35340:139;;35067:419;;;:::o;35492:::-;35658:4;35696:2;35685:9;35681:18;35673:26;;35745:9;35739:4;35735:20;35731:1;35720:9;35716:17;35709:47;35773:131;35899:4;35773:131;:::i;:::-;35765:139;;35492:419;;;:::o;35917:::-;36083:4;36121:2;36110:9;36106:18;36098:26;;36170:9;36164:4;36160:20;36156:1;36145:9;36141:17;36134:47;36198:131;36324:4;36198:131;:::i;:::-;36190:139;;35917:419;;;:::o;36342:::-;36508:4;36546:2;36535:9;36531:18;36523:26;;36595:9;36589:4;36585:20;36581:1;36570:9;36566:17;36559:47;36623:131;36749:4;36623:131;:::i;:::-;36615:139;;36342:419;;;:::o;36767:::-;36933:4;36971:2;36960:9;36956:18;36948:26;;37020:9;37014:4;37010:20;37006:1;36995:9;36991:17;36984:47;37048:131;37174:4;37048:131;:::i;:::-;37040:139;;36767:419;;;:::o;37192:::-;37358:4;37396:2;37385:9;37381:18;37373:26;;37445:9;37439:4;37435:20;37431:1;37420:9;37416:17;37409:47;37473:131;37599:4;37473:131;:::i;:::-;37465:139;;37192:419;;;:::o;37617:::-;37783:4;37821:2;37810:9;37806:18;37798:26;;37870:9;37864:4;37860:20;37856:1;37845:9;37841:17;37834:47;37898:131;38024:4;37898:131;:::i;:::-;37890:139;;37617:419;;;:::o;38042:::-;38208:4;38246:2;38235:9;38231:18;38223:26;;38295:9;38289:4;38285:20;38281:1;38270:9;38266:17;38259:47;38323:131;38449:4;38323:131;:::i;:::-;38315:139;;38042:419;;;:::o;38467:::-;38633:4;38671:2;38660:9;38656:18;38648:26;;38720:9;38714:4;38710:20;38706:1;38695:9;38691:17;38684:47;38748:131;38874:4;38748:131;:::i;:::-;38740:139;;38467:419;;;:::o;38892:::-;39058:4;39096:2;39085:9;39081:18;39073:26;;39145:9;39139:4;39135:20;39131:1;39120:9;39116:17;39109:47;39173:131;39299:4;39173:131;:::i;:::-;39165:139;;38892:419;;;:::o;39317:::-;39483:4;39521:2;39510:9;39506:18;39498:26;;39570:9;39564:4;39560:20;39556:1;39545:9;39541:17;39534:47;39598:131;39724:4;39598:131;:::i;:::-;39590:139;;39317:419;;;:::o;39742:::-;39908:4;39946:2;39935:9;39931:18;39923:26;;39995:9;39989:4;39985:20;39981:1;39970:9;39966:17;39959:47;40023:131;40149:4;40023:131;:::i;:::-;40015:139;;39742:419;;;:::o;40167:::-;40333:4;40371:2;40360:9;40356:18;40348:26;;40420:9;40414:4;40410:20;40406:1;40395:9;40391:17;40384:47;40448:131;40574:4;40448:131;:::i;:::-;40440:139;;40167:419;;;:::o;40592:::-;40758:4;40796:2;40785:9;40781:18;40773:26;;40845:9;40839:4;40835:20;40831:1;40820:9;40816:17;40809:47;40873:131;40999:4;40873:131;:::i;:::-;40865:139;;40592:419;;;:::o;41017:::-;41183:4;41221:2;41210:9;41206:18;41198:26;;41270:9;41264:4;41260:20;41256:1;41245:9;41241:17;41234:47;41298:131;41424:4;41298:131;:::i;:::-;41290:139;;41017:419;;;:::o;41442:::-;41608:4;41646:2;41635:9;41631:18;41623:26;;41695:9;41689:4;41685:20;41681:1;41670:9;41666:17;41659:47;41723:131;41849:4;41723:131;:::i;:::-;41715:139;;41442:419;;;:::o;41867:::-;42033:4;42071:2;42060:9;42056:18;42048:26;;42120:9;42114:4;42110:20;42106:1;42095:9;42091:17;42084:47;42148:131;42274:4;42148:131;:::i;:::-;42140:139;;41867:419;;;:::o;42292:::-;42458:4;42496:2;42485:9;42481:18;42473:26;;42545:9;42539:4;42535:20;42531:1;42520:9;42516:17;42509:47;42573:131;42699:4;42573:131;:::i;:::-;42565:139;;42292:419;;;:::o;42717:::-;42883:4;42921:2;42910:9;42906:18;42898:26;;42970:9;42964:4;42960:20;42956:1;42945:9;42941:17;42934:47;42998:131;43124:4;42998:131;:::i;:::-;42990:139;;42717:419;;;:::o;43142:222::-;43235:4;43273:2;43262:9;43258:18;43250:26;;43286:71;43354:1;43343:9;43339:17;43330:6;43286:71;:::i;:::-;43142:222;;;;:::o;43370:129::-;43404:6;43431:20;;:::i;:::-;43421:30;;43460:33;43488:4;43480:6;43460:33;:::i;:::-;43370:129;;;:::o;43505:75::-;43538:6;43571:2;43565:9;43555:19;;43505:75;:::o;43586:311::-;43663:4;43753:18;43745:6;43742:30;43739:56;;;43775:18;;:::i;:::-;43739:56;43825:4;43817:6;43813:17;43805:25;;43885:4;43879;43875:15;43867:23;;43586:311;;;:::o;43903:307::-;43964:4;44054:18;44046:6;44043:30;44040:56;;;44076:18;;:::i;:::-;44040:56;44114:29;44136:6;44114:29;:::i;:::-;44106:37;;44198:4;44192;44188:15;44180:23;;43903:307;;;:::o;44216:308::-;44278:4;44368:18;44360:6;44357:30;44354:56;;;44390:18;;:::i;:::-;44354:56;44428:29;44450:6;44428:29;:::i;:::-;44420:37;;44512:4;44506;44502:15;44494:23;;44216:308;;;:::o;44530:141::-;44579:4;44602:3;44594:11;;44625:3;44622:1;44615:14;44659:4;44656:1;44646:18;44638:26;;44530:141;;;:::o;44677:98::-;44728:6;44762:5;44756:12;44746:22;;44677:98;;;:::o;44781:99::-;44833:6;44867:5;44861:12;44851:22;;44781:99;;;:::o;44886:168::-;44969:11;45003:6;44998:3;44991:19;45043:4;45038:3;45034:14;45019:29;;44886:168;;;;:::o;45060:169::-;45144:11;45178:6;45173:3;45166:19;45218:4;45213:3;45209:14;45194:29;;45060:169;;;;:::o;45235:148::-;45337:11;45374:3;45359:18;;45235:148;;;;:::o;45389:305::-;45429:3;45448:20;45466:1;45448:20;:::i;:::-;45443:25;;45482:20;45500:1;45482:20;:::i;:::-;45477:25;;45636:1;45568:66;45564:74;45561:1;45558:81;45555:107;;;45642:18;;:::i;:::-;45555:107;45686:1;45683;45679:9;45672:16;;45389:305;;;;:::o;45700:185::-;45740:1;45757:20;45775:1;45757:20;:::i;:::-;45752:25;;45791:20;45809:1;45791:20;:::i;:::-;45786:25;;45830:1;45820:35;;45835:18;;:::i;:::-;45820:35;45877:1;45874;45870:9;45865:14;;45700:185;;;;:::o;45891:348::-;45931:7;45954:20;45972:1;45954:20;:::i;:::-;45949:25;;45988:20;46006:1;45988:20;:::i;:::-;45983:25;;46176:1;46108:66;46104:74;46101:1;46098:81;46093:1;46086:9;46079:17;46075:105;46072:131;;;46183:18;;:::i;:::-;46072:131;46231:1;46228;46224:9;46213:20;;45891:348;;;;:::o;46245:191::-;46285:4;46305:20;46323:1;46305:20;:::i;:::-;46300:25;;46339:20;46357:1;46339:20;:::i;:::-;46334:25;;46378:1;46375;46372:8;46369:34;;;46383:18;;:::i;:::-;46369:34;46428:1;46425;46421:9;46413:17;;46245:191;;;;:::o;46442:96::-;46479:7;46508:24;46526:5;46508:24;:::i;:::-;46497:35;;46442:96;;;:::o;46544:90::-;46578:7;46621:5;46614:13;46607:21;46596:32;;46544:90;;;:::o;46640:77::-;46677:7;46706:5;46695:16;;46640:77;;;:::o;46723:149::-;46759:7;46799:66;46792:5;46788:78;46777:89;;46723:149;;;:::o;46878:126::-;46915:7;46955:42;46948:5;46944:54;46933:65;;46878:126;;;:::o;47010:77::-;47047:7;47076:5;47065:16;;47010:77;;;:::o;47093:154::-;47177:6;47172:3;47167;47154:30;47239:1;47230:6;47225:3;47221:16;47214:27;47093:154;;;:::o;47253:307::-;47321:1;47331:113;47345:6;47342:1;47339:13;47331:113;;;47430:1;47425:3;47421:11;47415:18;47411:1;47406:3;47402:11;47395:39;47367:2;47364:1;47360:10;47355:15;;47331:113;;;47462:6;47459:1;47456:13;47453:101;;;47542:1;47533:6;47528:3;47524:16;47517:27;47453:101;47302:258;47253:307;;;:::o;47566:320::-;47610:6;47647:1;47641:4;47637:12;47627:22;;47694:1;47688:4;47684:12;47715:18;47705:81;;47771:4;47763:6;47759:17;47749:27;;47705:81;47833:2;47825:6;47822:14;47802:18;47799:38;47796:84;;;47852:18;;:::i;:::-;47796:84;47617:269;47566:320;;;:::o;47892:281::-;47975:27;47997:4;47975:27;:::i;:::-;47967:6;47963:40;48105:6;48093:10;48090:22;48069:18;48057:10;48054:34;48051:62;48048:88;;;48116:18;;:::i;:::-;48048:88;48156:10;48152:2;48145:22;47935:238;47892:281;;:::o;48179:233::-;48218:3;48241:24;48259:5;48241:24;:::i;:::-;48232:33;;48287:66;48280:5;48277:77;48274:103;;;48357:18;;:::i;:::-;48274:103;48404:1;48397:5;48393:13;48386:20;;48179:233;;;:::o;48418:100::-;48457:7;48486:26;48506:5;48486:26;:::i;:::-;48475:37;;48418:100;;;:::o;48524:79::-;48563:7;48592:5;48581:16;;48524:79;;;:::o;48609:94::-;48648:7;48677:20;48691:5;48677:20;:::i;:::-;48666:31;;48609:94;;;:::o;48709:176::-;48741:1;48758:20;48776:1;48758:20;:::i;:::-;48753:25;;48792:20;48810:1;48792:20;:::i;:::-;48787:25;;48831:1;48821:35;;48836:18;;:::i;:::-;48821:35;48877:1;48874;48870:9;48865:14;;48709:176;;;;:::o;48891:180::-;48939:77;48936:1;48929:88;49036:4;49033:1;49026:15;49060:4;49057:1;49050:15;49077:180;49125:77;49122:1;49115:88;49222:4;49219:1;49212:15;49246:4;49243:1;49236:15;49263:180;49311:77;49308:1;49301:88;49408:4;49405:1;49398:15;49432:4;49429:1;49422:15;49449:180;49497:77;49494:1;49487:88;49594:4;49591:1;49584:15;49618:4;49615:1;49608:15;49635:180;49683:77;49680:1;49673:88;49780:4;49777:1;49770:15;49804:4;49801:1;49794:15;49821:180;49869:77;49866:1;49859:88;49966:4;49963:1;49956:15;49990:4;49987:1;49980:15;50007:117;50116:1;50113;50106:12;50130:117;50239:1;50236;50229:12;50253:117;50362:1;50359;50352:12;50376:117;50485:1;50482;50475:12;50499:117;50608:1;50605;50598:12;50622:117;50731:1;50728;50721:12;50745:102;50786:6;50837:2;50833:7;50828:2;50821:5;50817:14;50813:28;50803:38;;50745:102;;;:::o;50853:94::-;50886:8;50934:5;50930:2;50926:14;50905:35;;50853:94;;;:::o;50953:175::-;51093:27;51089:1;51081:6;51077:14;51070:51;50953:175;:::o;51134:230::-;51274:34;51270:1;51262:6;51258:14;51251:58;51343:13;51338:2;51330:6;51326:15;51319:38;51134:230;:::o;51370:237::-;51510:34;51506:1;51498:6;51494:14;51487:58;51579:20;51574:2;51566:6;51562:15;51555:45;51370:237;:::o;51613:225::-;51753:34;51749:1;51741:6;51737:14;51730:58;51822:8;51817:2;51809:6;51805:15;51798:33;51613:225;:::o;51844:173::-;51984:25;51980:1;51972:6;51968:14;51961:49;51844:173;:::o;52023:178::-;52163:30;52159:1;52151:6;52147:14;52140:54;52023:178;:::o;52207:232::-;52347:34;52343:1;52335:6;52331:14;52324:58;52416:15;52411:2;52403:6;52399:15;52392:40;52207:232;:::o;52445:169::-;52585:21;52581:1;52573:6;52569:14;52562:45;52445:169;:::o;52620:223::-;52760:34;52756:1;52748:6;52744:14;52737:58;52829:6;52824:2;52816:6;52812:15;52805:31;52620:223;:::o;52849:175::-;52989:27;52985:1;52977:6;52973:14;52966:51;52849:175;:::o;53030:231::-;53170:34;53166:1;53158:6;53154:14;53147:58;53239:14;53234:2;53226:6;53222:15;53215:39;53030:231;:::o;53267:179::-;53407:31;53403:1;53395:6;53391:14;53384:55;53267:179;:::o;53452:243::-;53592:34;53588:1;53580:6;53576:14;53569:58;53661:26;53656:2;53648:6;53644:15;53637:51;53452:243;:::o;53701:229::-;53841:34;53837:1;53829:6;53825:14;53818:58;53910:12;53905:2;53897:6;53893:15;53886:37;53701:229;:::o;53936:228::-;54076:34;54072:1;54064:6;54060:14;54053:58;54145:11;54140:2;54132:6;54128:15;54121:36;53936:228;:::o;54170:167::-;54310:19;54306:1;54298:6;54294:14;54287:43;54170:167;:::o;54343:182::-;54483:34;54479:1;54471:6;54467:14;54460:58;54343:182;:::o;54531:231::-;54671:34;54667:1;54659:6;54655:14;54648:58;54740:14;54735:2;54727:6;54723:15;54716:39;54531:231;:::o;54768:182::-;54908:34;54904:1;54896:6;54892:14;54885:58;54768:182;:::o;54956:228::-;55096:34;55092:1;55084:6;55080:14;55073:58;55165:11;55160:2;55152:6;55148:15;55141:36;54956:228;:::o;55190:234::-;55330:34;55326:1;55318:6;55314:14;55307:58;55399:17;55394:2;55386:6;55382:15;55375:42;55190:234;:::o;55430:220::-;55570:34;55566:1;55558:6;55554:14;55547:58;55639:3;55634:2;55626:6;55622:15;55615:28;55430:220;:::o;55656:170::-;55796:22;55792:1;55784:6;55780:14;55773:46;55656:170;:::o;55832:::-;55972:22;55968:1;55960:6;55956:14;55949:46;55832:170;:::o;56008:178::-;56148:30;56144:1;56136:6;56132:14;56125:54;56008:178;:::o;56192:236::-;56332:34;56328:1;56320:6;56316:14;56309:58;56401:19;56396:2;56388:6;56384:15;56377:44;56192:236;:::o;56434:231::-;56574:34;56570:1;56562:6;56558:14;56551:58;56643:14;56638:2;56630:6;56626:15;56619:39;56434:231;:::o;56671:182::-;56811:34;56807:1;56799:6;56795:14;56788:58;56671:182;:::o;56859:225::-;56999:34;56995:1;56987:6;56983:14;56976:58;57068:8;57063:2;57055:6;57051:15;57044:33;56859:225;:::o;57090:228::-;57230:34;57226:1;57218:6;57214:14;57207:58;57299:11;57294:2;57286:6;57282:15;57275:36;57090:228;:::o;57324:151::-;57464:3;57460:1;57452:6;57448:14;57441:27;57324:151;:::o;57481:162::-;57621:14;57617:1;57609:6;57605:14;57598:38;57481:162;:::o;57649:122::-;57722:24;57740:5;57722:24;:::i;:::-;57715:5;57712:35;57702:63;;57761:1;57758;57751:12;57702:63;57649:122;:::o;57777:116::-;57847:21;57862:5;57847:21;:::i;:::-;57840:5;57837:32;57827:60;;57883:1;57880;57873:12;57827:60;57777:116;:::o;57899:122::-;57972:24;57990:5;57972:24;:::i;:::-;57965:5;57962:35;57952:63;;58011:1;58008;58001:12;57952:63;57899:122;:::o;58027:120::-;58099:23;58116:5;58099:23;:::i;:::-;58092:5;58089:34;58079:62;;58137:1;58134;58127:12;58079:62;58027:120;:::o;58153:122::-;58226:24;58244:5;58226:24;:::i;:::-;58219:5;58216:35;58206:63;;58265:1;58262;58255:12;58206:63;58153:122;:::o

Swarm Source

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