ETH Price: $3,672.94 (+1.30%)

Token

MetapacWorldBrainwashPortrait (MPBW)
 

Overview

Max Total Supply

6,000 MPBW

Holders

3,769

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 MPBW
0x61c371ba956c7f2fbe0913843de98c5e55be8ee7
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:
MetapacWorldBrainwashPortrait

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-15
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-18
*/

// SPDX-License-Identifier: MIT
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: ECDSA.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: 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);
    }

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract Payment is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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


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

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


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

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

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

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

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

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


    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

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

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: 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: 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: 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: 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: 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: 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: ERC721A.sol


pragma solidity ^0.8.0;









contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.2;

contract MetapacWorldBrainwashPortrait is ERC721A, Ownable, ReentrancyGuard {  
    using Strings for uint256;
    string public _baseURIextended;

    //states
    bool public isAllowlistActive = false;
    bool public isPublicActive = false;

    //signer for allowlist
    address private signer = 0xCE487b4742909d7233078Eb3E3c33DfdF5b490d1;

    //settings
    uint256 public MAX_SUPPLY = 6000;
    uint256 public MAX_MINT_PER_WALLET = 1;

	//mapping for max mint
    mapping(address => uint256) public numMintedPerPerson;

	constructor() ERC721A("MetapacWorldBrainwashPortrait", "MPBW") {}

    //mint allowlist
 	function mintAllowlist(address _minter, bytes calldata _voucher) external nonReentrant {
  	    uint256 ts = totalSupply();
        require(isAllowlistActive, "Allowlist Mint Not Live");
        require(ts + MAX_MINT_PER_WALLET <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.sender == _minter, "Not your voucher");
        require(msg.sender == tx.origin);
    	require(numMintedPerPerson[_minter] < MAX_MINT_PER_WALLET, "Purchase would exceed max tokens per Wallet");

        bytes32 hash = keccak256(abi.encodePacked(_minter));
        require(_verifySignature(signer, hash, _voucher), "Invalid voucher");

        _safeMint(_minter, MAX_MINT_PER_WALLET);
        numMintedPerPerson[_minter] += MAX_MINT_PER_WALLET;
    }

    //mint public
 	function mintPublic() external nonReentrant {
  	    uint256 ts = totalSupply();
        require(isPublicActive, "Public Mint Not Live");
        require(ts + MAX_MINT_PER_WALLET <= MAX_SUPPLY, "Purchase would exceed max tokens");
    	require(numMintedPerPerson[msg.sender] < MAX_MINT_PER_WALLET, "Purchase would exceed max tokens per Wallet");
        require(msg.sender == tx.origin);

        _safeMint(msg.sender, MAX_MINT_PER_WALLET);
        numMintedPerPerson[msg.sender] += MAX_MINT_PER_WALLET;
    }

    //airdrop
 	function airdrop(address addr, uint256 _tokenAmount) public onlyOwner {
  	    uint256 ts = totalSupply();
	    require(ts + _tokenAmount <= MAX_SUPPLY);
        _safeMint(addr, _tokenAmount);
    }

    //signature verification
    function _verifySignature(address _signer, bytes32 _hash, bytes memory _signature) private pure returns (bool) {
        return _signer == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature);
    }

    function setSigner(address _signer) external onlyOwner {
        signer = _signer;
    }

     //allow minting
    function setAllowlist(bool _status) external onlyOwner {
        isAllowlistActive = _status;
    }

    function setPublic(bool _status) external onlyOwner {
        isPublicActive = _status;
    }

    //Max Mints
    function setMaxMint(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_WALLET = _amount;
    }

    //metadata
    function setMetadata(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    //withdraw any funds sent to contract directly
    function withdraw() public payable onlyOwner {
	(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
		require(success);
	}
}

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":[],"name":"MAX_MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistActive","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":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"bytes","name":"_voucher","type":"bytes"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPerson","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAllowlist","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":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555073ce487b4742909d7233078eb3e3c33dfdf5b490d1600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611770600b556001600c55348015620000a757600080fd5b506040518060400160405280601d81526020017f4d657461706163576f726c64427261696e77617368506f7274726169740000008152506040518060400160405280600481526020017f4d5042570000000000000000000000000000000000000000000000000000000081525081600190805190602001906200012c92919062000244565b5080600290805190602001906200014592919062000244565b505050620001686200015c6200017660201b60201c565b6200017e60201b60201c565b600160088190555062000358565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002529062000323565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033c57607f821691505b602082108103620003525762000351620002f4565b5b50919050565b61515c80620003686000396000f3fe6080604052600436106101f95760003560e01c806366776e421161010d578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde146106fc578063c87b56dd14610725578063d2d515cc14610762578063e985e9c51461078d578063f2fde38b146107ca576101f9565b8063a22cb46514610654578063a3330d251461067d578063a49a1e7d146106a8578063b19960e6146106d1576101f9565b80638ba4cc3c116100dc5780638ba4cc3c146105be5780638c874ebd146105e75780638da5cb5b146105fe57806395d89b4114610629576101f9565b806366776e42146105185780636c19e7831461054157806370a082311461056a578063715018a6146105a7576101f9565b80632f745c59116101905780634f6ccce71161015f5780634f6ccce714610423578063547520fe146104605780635ad1c1b5146104895780635cbcec4e146104b25780636352211e146104db576101f9565b80632f745c591461038857806332cb6b0c146103c55780633ccfd60b146103f057806342842e0e146103fa576101f9565b80630928fc22116101cc5780630928fc22146102e0578063095ea7b31461030b57806318160ddd1461033457806323b872dd1461035f576101f9565b806301ffc9a7146101fe578063066589fb1461023b57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061350f565b6107f3565b6040516102329190613557565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906135d0565b61093d565b60405161026f9190613616565b60405180910390f35b34801561028457600080fd5b5061028d610955565b60405161029a91906136ca565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613718565b6109e7565b6040516102d79190613754565b60405180910390f35b3480156102ec57600080fd5b506102f5610a6c565b60405161030291906136ca565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061376f565b610afa565b005b34801561034057600080fd5b50610349610c12565b6040516103569190613616565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906137af565b610c1b565b005b34801561039457600080fd5b506103af60048036038101906103aa919061376f565b610c2b565b6040516103bc9190613616565b60405180910390f35b3480156103d157600080fd5b506103da610e1b565b6040516103e79190613616565b60405180910390f35b6103f8610e21565b005b34801561040657600080fd5b50610421600480360381019061041c91906137af565b610f16565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613718565b610f36565b6040516104579190613616565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613718565b610f89565b005b34801561049557600080fd5b506104b060048036038101906104ab919061382e565b61100f565b005b3480156104be57600080fd5b506104d960048036038101906104d4919061382e565b6110a8565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613718565b611141565b60405161050f9190613754565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a91906138c0565b611157565b005b34801561054d57600080fd5b50610568600480360381019061056391906135d0565b6114c8565b005b34801561057657600080fd5b50610591600480360381019061058c91906135d0565b611588565b60405161059e9190613616565b60405180910390f35b3480156105b357600080fd5b506105bc611670565b005b3480156105ca57600080fd5b506105e560048036038101906105e0919061376f565b6116f8565b005b3480156105f357600080fd5b506105fc6117a9565b005b34801561060a57600080fd5b506106136119cd565b6040516106209190613754565b60405180910390f35b34801561063557600080fd5b5061063e6119f7565b60405161064b91906136ca565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613920565b611a89565b005b34801561068957600080fd5b50610692611c09565b60405161069f9190613557565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613a90565b611c1c565b005b3480156106dd57600080fd5b506106e6611cb2565b6040516106f39190613616565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190613b7a565b611cb8565b005b34801561073157600080fd5b5061074c60048036038101906107479190613718565b611d14565b60405161075991906136ca565b60405180910390f35b34801561076e57600080fd5b50610777611dbb565b6040516107849190613557565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613bfd565b611dce565b6040516107c19190613557565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec91906135d0565b611e62565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611f59565b5b9050919050565b600d6020528060005260406000206000915090505481565b60606001805461096490613c6c565b80601f016020809104026020016040519081016040528092919081815260200182805461099090613c6c565b80156109dd5780601f106109b2576101008083540402835291602001916109dd565b820191906000526020600020905b8154815290600101906020018083116109c057829003601f168201915b5050505050905090565b60006109f282611fc3565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890613d0f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610a7990613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613c6c565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b505050505081565b6000610b0582611141565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90613da1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b94611fd0565b73ffffffffffffffffffffffffffffffffffffffff161480610bc35750610bc281610bbd611fd0565b611dce565b5b610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990613e33565b60405180910390fd5b610c0d838383611fd8565b505050565b60008054905090565b610c2683838361208a565b505050565b6000610c3683611588565b8210610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613ec5565b60405180910390fd5b6000610c81610c12565b905060008060005b83811015610dd9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dcb57868403610dc2578195505050505050610e15565b83806001019450505b508080600101915050610c89565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0c90613f57565b60405180910390fd5b92915050565b600b5481565b610e29611fd0565b73ffffffffffffffffffffffffffffffffffffffff16610e476119cd565b73ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490613fc3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610ec390614014565b60006040518083038185875af1925050503d8060008114610f00576040519150601f19603f3d011682016040523d82523d6000602084013e610f05565b606091505b5050905080610f1357600080fd5b50565b610f3183838360405180602001604052806000815250611cb8565b505050565b6000610f40610c12565b8210610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061409b565b60405180910390fd5b819050919050565b610f91611fd0565b73ffffffffffffffffffffffffffffffffffffffff16610faf6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613fc3565b60405180910390fd5b80600c8190555050565b611017611fd0565b73ffffffffffffffffffffffffffffffffffffffff166110356119cd565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613fc3565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6110b0611fd0565b73ffffffffffffffffffffffffffffffffffffffff166110ce6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613fc3565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b600061114c826125c8565b600001519050919050565b60026008540361119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614107565b60405180910390fd5b600260088190555060006111ae610c12565b9050600a60009054906101000a900460ff166111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690614173565b60405180910390fd5b600b54600c548261121091906141c2565b1115611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614264565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b6906142d0565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f757600080fd5b600c54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614362565b60405180910390fd5b60008460405160200161138d91906143ca565b604051602081830303815290604052805190602001209050611416600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612762565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614431565b60405180910390fd5b61146185600c546127ad565b600c54600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b291906141c2565b9250508190555050506001600881905550505050565b6114d0611fd0565b73ffffffffffffffffffffffffffffffffffffffff166114ee6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90613fc3565b60405180910390fd5b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906144c3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611678611fd0565b73ffffffffffffffffffffffffffffffffffffffff166116966119cd565b73ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613fc3565b60405180910390fd5b6116f660006127cb565b565b611700611fd0565b73ffffffffffffffffffffffffffffffffffffffff1661171e6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613fc3565b60405180910390fd5b600061177e610c12565b9050600b54828261178f91906141c2565b111561179a57600080fd5b6117a483836127ad565b505050565b6002600854036117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614107565b60405180910390fd5b60026008819055506000611800610c12565b9050600a60019054906101000a900460ff16611851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118489061452f565b60405180910390fd5b600b54600c548261186291906141c2565b11156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614264565b60405180910390fd5b600c54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614362565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461195e57600080fd5b61196a33600c546127ad565b600c54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bb91906141c2565b92505081905550506001600881905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a0690613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3290613c6c565b8015611a7f5780601f10611a5457610100808354040283529160200191611a7f565b820191906000526020600020905b815481529060010190602001808311611a6257829003601f168201915b5050505050905090565b611a91611fd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af59061459b565b60405180910390fd5b8060066000611b0b611fd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bb8611fd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bfd9190613557565b60405180910390a35050565b600a60019054906101000a900460ff1681565b611c24611fd0565b73ffffffffffffffffffffffffffffffffffffffff16611c426119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90613fc3565b60405180910390fd5b8060099080519060200190611cae9291906133c6565b5050565b600c5481565b611cc384848461208a565b611ccf84848484612891565b611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d059061462d565b60405180910390fd5b50505050565b6060611d1f82611fc3565b611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906146bf565b60405180910390fd5b6000611d68612a18565b90506000815103611d885760405180602001604052806000815250611db3565b80611d9284612aaa565b604051602001611da392919061471b565b6040516020818303038152906040525b915050919050565b600a60009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e6a611fd0565b73ffffffffffffffffffffffffffffffffffffffff16611e886119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613fc3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906147b1565b60405180910390fd5b611f56816127cb565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612095826125c8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120bc611fd0565b73ffffffffffffffffffffffffffffffffffffffff16148061211857506120e1611fd0565b73ffffffffffffffffffffffffffffffffffffffff16612100846109e7565b73ffffffffffffffffffffffffffffffffffffffff16145b806121345750612133826000015161212e611fd0565b611dce565b5b905080612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614843565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df906148d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e90614967565b60405180910390fd5b6122648585856001612c0a565b6122746000848460000151611fd8565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612558576124b781611fc3565b156125575782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18585856001612c10565b5050505050565b6125d061344c565b6125d982611fc3565b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f906149f9565b60405180910390fd5b60008290505b60008110612721576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461271257809250505061275d565b5080806001900391505061261e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490614a8b565b60405180910390fd5b919050565b600061277661277084612c16565b83612c46565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6127c7828260405180602001604052806000815250612c6d565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006128b28473ffffffffffffffffffffffffffffffffffffffff16612c7f565b15612a0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128db611fd0565b8786866040518563ffffffff1660e01b81526004016128fd9493929190614b00565b6020604051808303816000875af192505050801561293957506040513d601f19601f820116820180604052508101906129369190614b61565b60015b6129bb573d8060008114612969576040519150601f19603f3d011682016040523d82523d6000602084013e61296e565b606091505b5060008151036129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa9061462d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a10565b600190505b949350505050565b606060098054612a2790613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5390613c6c565b8015612aa05780601f10612a7557610100808354040283529160200191612aa0565b820191906000526020600020905b815481529060010190602001808311612a8357829003601f168201915b5050505050905090565b606060008203612af1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c05565b600082905060005b60008214612b23578080612b0c90614b8e565b915050600a82612b1c9190614c05565b9150612af9565b60008167ffffffffffffffff811115612b3f57612b3e613965565b5b6040519080825280601f01601f191660200182016040528015612b715781602001600182028036833780820191505090505b5090505b60008514612bfe57600182612b8a9190614c36565b9150600a85612b999190614c6a565b6030612ba591906141c2565b60f81b818381518110612bbb57612bba614c9b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bf79190614c05565b9450612b75565b8093505050505b919050565b50505050565b50505050565b600081604051602001612c299190614d41565b604051602081830303815290604052805190602001209050919050565b6000806000612c558585612c92565b91509150612c6281612d13565b819250505092915050565b612c7a8383836001612edf565b505050565b600080823b905060008111915050919050565b6000806041835103612cd35760008060006020860151925060408601519150606086015160001a9050612cc78782858561325b565b94509450505050612d0c565b6040835103612d03576000806020850151915060408501519050612cf8868383613367565b935093505050612d0c565b60006002915091505b9250929050565b60006004811115612d2757612d26614d67565b5b816004811115612d3a57612d39614d67565b5b0315612edc5760016004811115612d5457612d53614d67565b5b816004811115612d6757612d66614d67565b5b03612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90614de2565b60405180910390fd5b60026004811115612dbb57612dba614d67565b5b816004811115612dce57612dcd614d67565b5b03612e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0590614e4e565b60405180910390fd5b60036004811115612e2257612e21614d67565b5b816004811115612e3557612e34614d67565b5b03612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6c90614ee0565b60405180910390fd5b600480811115612e8857612e87614d67565b5b816004811115612e9b57612e9a614d67565b5b03612edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed290614f72565b60405180910390fd5b5b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90615004565b60405180910390fd5b60008403612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90615096565b60405180910390fd5b612fa46000868387612c0a565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561323e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613229576131e96000888488612891565b613228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321f9061462d565b60405180910390fd5b5b81806001019250508080600101915050613172565b5080600081905550506132546000868387612c10565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561329657600060039150915061335e565b601b8560ff16141580156132ae5750601c8560ff1614155b156132c057600060049150915061335e565b6000600187878787604051600081526020016040526040516132e594939291906150e1565b6020604051602081039080840390855afa158015613307573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133555760006001925092505061335e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6133aa91906141c2565b90506133b88782888561325b565b935093505050935093915050565b8280546133d290613c6c565b90600052602060002090601f0160209004810192826133f4576000855561343b565b82601f1061340d57805160ff191683800117855561343b565b8280016001018555821561343b579182015b8281111561343a57825182559160200191906001019061341f565b5b5090506134489190613486565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561349f576000816000905550600101613487565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134ec816134b7565b81146134f757600080fd5b50565b600081359050613509816134e3565b92915050565b600060208284031215613525576135246134ad565b5b6000613533848285016134fa565b91505092915050565b60008115159050919050565b6135518161353c565b82525050565b600060208201905061356c6000830184613548565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359d82613572565b9050919050565b6135ad81613592565b81146135b857600080fd5b50565b6000813590506135ca816135a4565b92915050565b6000602082840312156135e6576135e56134ad565b5b60006135f4848285016135bb565b91505092915050565b6000819050919050565b613610816135fd565b82525050565b600060208201905061362b6000830184613607565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561366b578082015181840152602081019050613650565b8381111561367a576000848401525b50505050565b6000601f19601f8301169050919050565b600061369c82613631565b6136a6818561363c565b93506136b681856020860161364d565b6136bf81613680565b840191505092915050565b600060208201905081810360008301526136e48184613691565b905092915050565b6136f5816135fd565b811461370057600080fd5b50565b600081359050613712816136ec565b92915050565b60006020828403121561372e5761372d6134ad565b5b600061373c84828501613703565b91505092915050565b61374e81613592565b82525050565b60006020820190506137696000830184613745565b92915050565b60008060408385031215613786576137856134ad565b5b6000613794858286016135bb565b92505060206137a585828601613703565b9150509250929050565b6000806000606084860312156137c8576137c76134ad565b5b60006137d6868287016135bb565b93505060206137e7868287016135bb565b92505060406137f886828701613703565b9150509250925092565b61380b8161353c565b811461381657600080fd5b50565b60008135905061382881613802565b92915050565b600060208284031215613844576138436134ad565b5b600061385284828501613819565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126138805761387f61385b565b5b8235905067ffffffffffffffff81111561389d5761389c613860565b5b6020830191508360018202830111156138b9576138b8613865565b5b9250929050565b6000806000604084860312156138d9576138d86134ad565b5b60006138e7868287016135bb565b935050602084013567ffffffffffffffff811115613908576139076134b2565b5b6139148682870161386a565b92509250509250925092565b60008060408385031215613937576139366134ad565b5b6000613945858286016135bb565b925050602061395685828601613819565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61399d82613680565b810181811067ffffffffffffffff821117156139bc576139bb613965565b5b80604052505050565b60006139cf6134a3565b90506139db8282613994565b919050565b600067ffffffffffffffff8211156139fb576139fa613965565b5b613a0482613680565b9050602081019050919050565b82818337600083830152505050565b6000613a33613a2e846139e0565b6139c5565b905082815260208101848484011115613a4f57613a4e613960565b5b613a5a848285613a11565b509392505050565b600082601f830112613a7757613a7661385b565b5b8135613a87848260208601613a20565b91505092915050565b600060208284031215613aa657613aa56134ad565b5b600082013567ffffffffffffffff811115613ac457613ac36134b2565b5b613ad084828501613a62565b91505092915050565b600067ffffffffffffffff821115613af457613af3613965565b5b613afd82613680565b9050602081019050919050565b6000613b1d613b1884613ad9565b6139c5565b905082815260208101848484011115613b3957613b38613960565b5b613b44848285613a11565b509392505050565b600082601f830112613b6157613b6061385b565b5b8135613b71848260208601613b0a565b91505092915050565b60008060008060808587031215613b9457613b936134ad565b5b6000613ba2878288016135bb565b9450506020613bb3878288016135bb565b9350506040613bc487828801613703565b925050606085013567ffffffffffffffff811115613be557613be46134b2565b5b613bf187828801613b4c565b91505092959194509250565b60008060408385031215613c1457613c136134ad565b5b6000613c22858286016135bb565b9250506020613c33858286016135bb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c8457607f821691505b602082108103613c9757613c96613c3d565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cf9602d8361363c565b9150613d0482613c9d565b604082019050919050565b60006020820190508181036000830152613d2881613cec565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8b60228361363c565b9150613d9682613d2f565b604082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613e1d60398361363c565b9150613e2882613dc1565b604082019050919050565b60006020820190508181036000830152613e4c81613e10565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eaf60228361363c565b9150613eba82613e53565b604082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613f41602e8361363c565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fad60208361363c565b9150613fb882613f77565b602082019050919050565b60006020820190508181036000830152613fdc81613fa0565b9050919050565b600081905092915050565b50565b6000613ffe600083613fe3565b915061400982613fee565b600082019050919050565b600061401f82613ff1565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061408560238361363c565b915061409082614029565b604082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140f1601f8361363c565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b7f416c6c6f776c697374204d696e74204e6f74204c697665000000000000000000600082015250565b600061415d60178361363c565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141cd826135fd565b91506141d8836135fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561420d5761420c614193565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b600061424e60208361363c565b915061425982614218565b602082019050919050565b6000602082019050818103600083015261427d81614241565b9050919050565b7f4e6f7420796f757220766f756368657200000000000000000000000000000000600082015250565b60006142ba60108361363c565b91506142c582614284565b602082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b600061434c602b8361363c565b9150614357826142f0565b604082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b60008160601b9050919050565b600061439a82614382565b9050919050565b60006143ac8261438f565b9050919050565b6143c46143bf82613592565b6143a1565b82525050565b60006143d682846143b3565b60148201915081905092915050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b600061441b600f8361363c565b9150614426826143e5565b602082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006144ad602b8361363c565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f5075626c6963204d696e74204e6f74204c697665000000000000000000000000600082015250565b600061451960148361363c565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614585601a8361363c565b91506145908261454f565b602082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061461760338361363c565b9150614622826145bb565b604082019050919050565b600060208201905081810360008301526146468161460a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146a9602f8361363c565b91506146b48261464d565b604082019050919050565b600060208201905081810360008301526146d88161469c565b9050919050565b600081905092915050565b60006146f582613631565b6146ff81856146df565b935061470f81856020860161364d565b80840191505092915050565b600061472782856146ea565b915061473382846146ea565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479b60268361363c565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061482d60328361363c565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006148bf60268361363c565b91506148ca82614863565b604082019050919050565b600060208201905081810360008301526148ee816148b2565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495160258361363c565b915061495c826148f5565b604082019050919050565b6000602082019050818103600083015261498081614944565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006149e3602a8361363c565b91506149ee82614987565b604082019050919050565b60006020820190508181036000830152614a12816149d6565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614a75602f8361363c565b9150614a8082614a19565b604082019050919050565b60006020820190508181036000830152614aa481614a68565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ad282614aab565b614adc8185614ab6565b9350614aec81856020860161364d565b614af581613680565b840191505092915050565b6000608082019050614b156000830187613745565b614b226020830186613745565b614b2f6040830185613607565b8181036060830152614b418184614ac7565b905095945050505050565b600081519050614b5b816134e3565b92915050565b600060208284031215614b7757614b766134ad565b5b6000614b8584828501614b4c565b91505092915050565b6000614b99826135fd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bcb57614bca614193565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c10826135fd565b9150614c1b836135fd565b925082614c2b57614c2a614bd6565b5b828204905092915050565b6000614c41826135fd565b9150614c4c836135fd565b925082821015614c5f57614c5e614193565b5b828203905092915050565b6000614c75826135fd565b9150614c80836135fd565b925082614c9057614c8f614bd6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614d00601c836146df565b9150614d0b82614cca565b601c82019050919050565b6000819050919050565b6000819050919050565b614d3b614d3682614d16565b614d20565b82525050565b6000614d4c82614cf3565b9150614d588284614d2a565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614dcc60188361363c565b9150614dd782614d96565b602082019050919050565b60006020820190508181036000830152614dfb81614dbf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614e38601f8361363c565b9150614e4382614e02565b602082019050919050565b60006020820190508181036000830152614e6781614e2b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eca60228361363c565b9150614ed582614e6e565b604082019050919050565b60006020820190508181036000830152614ef981614ebd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f5c60228361363c565b9150614f6782614f00565b604082019050919050565b60006020820190508181036000830152614f8b81614f4f565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fee60218361363c565b9150614ff982614f92565b604082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061508060288361363c565b915061508b82615024565b604082019050919050565b600060208201905081810360008301526150af81615073565b9050919050565b6150bf81614d16565b82525050565b600060ff82169050919050565b6150db816150c5565b82525050565b60006080820190506150f660008301876150b6565b61510360208301866150d2565b61511060408301856150b6565b61511d60608301846150b6565b9594505050505056fea26469706673582212205c87631c1c78a0a97becfaf4253d598a9e9f67aa01b912d9c39733e9f0be2e6164736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806366776e421161010d578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde146106fc578063c87b56dd14610725578063d2d515cc14610762578063e985e9c51461078d578063f2fde38b146107ca576101f9565b8063a22cb46514610654578063a3330d251461067d578063a49a1e7d146106a8578063b19960e6146106d1576101f9565b80638ba4cc3c116100dc5780638ba4cc3c146105be5780638c874ebd146105e75780638da5cb5b146105fe57806395d89b4114610629576101f9565b806366776e42146105185780636c19e7831461054157806370a082311461056a578063715018a6146105a7576101f9565b80632f745c59116101905780634f6ccce71161015f5780634f6ccce714610423578063547520fe146104605780635ad1c1b5146104895780635cbcec4e146104b25780636352211e146104db576101f9565b80632f745c591461038857806332cb6b0c146103c55780633ccfd60b146103f057806342842e0e146103fa576101f9565b80630928fc22116101cc5780630928fc22146102e0578063095ea7b31461030b57806318160ddd1461033457806323b872dd1461035f576101f9565b806301ffc9a7146101fe578063066589fb1461023b57806306fdde0314610278578063081812fc146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061350f565b6107f3565b6040516102329190613557565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906135d0565b61093d565b60405161026f9190613616565b60405180910390f35b34801561028457600080fd5b5061028d610955565b60405161029a91906136ca565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613718565b6109e7565b6040516102d79190613754565b60405180910390f35b3480156102ec57600080fd5b506102f5610a6c565b60405161030291906136ca565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061376f565b610afa565b005b34801561034057600080fd5b50610349610c12565b6040516103569190613616565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906137af565b610c1b565b005b34801561039457600080fd5b506103af60048036038101906103aa919061376f565b610c2b565b6040516103bc9190613616565b60405180910390f35b3480156103d157600080fd5b506103da610e1b565b6040516103e79190613616565b60405180910390f35b6103f8610e21565b005b34801561040657600080fd5b50610421600480360381019061041c91906137af565b610f16565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613718565b610f36565b6040516104579190613616565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613718565b610f89565b005b34801561049557600080fd5b506104b060048036038101906104ab919061382e565b61100f565b005b3480156104be57600080fd5b506104d960048036038101906104d4919061382e565b6110a8565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613718565b611141565b60405161050f9190613754565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a91906138c0565b611157565b005b34801561054d57600080fd5b50610568600480360381019061056391906135d0565b6114c8565b005b34801561057657600080fd5b50610591600480360381019061058c91906135d0565b611588565b60405161059e9190613616565b60405180910390f35b3480156105b357600080fd5b506105bc611670565b005b3480156105ca57600080fd5b506105e560048036038101906105e0919061376f565b6116f8565b005b3480156105f357600080fd5b506105fc6117a9565b005b34801561060a57600080fd5b506106136119cd565b6040516106209190613754565b60405180910390f35b34801561063557600080fd5b5061063e6119f7565b60405161064b91906136ca565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613920565b611a89565b005b34801561068957600080fd5b50610692611c09565b60405161069f9190613557565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613a90565b611c1c565b005b3480156106dd57600080fd5b506106e6611cb2565b6040516106f39190613616565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190613b7a565b611cb8565b005b34801561073157600080fd5b5061074c60048036038101906107479190613718565b611d14565b60405161075991906136ca565b60405180910390f35b34801561076e57600080fd5b50610777611dbb565b6040516107849190613557565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613bfd565b611dce565b6040516107c19190613557565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec91906135d0565b611e62565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611f59565b5b9050919050565b600d6020528060005260406000206000915090505481565b60606001805461096490613c6c565b80601f016020809104026020016040519081016040528092919081815260200182805461099090613c6c565b80156109dd5780601f106109b2576101008083540402835291602001916109dd565b820191906000526020600020905b8154815290600101906020018083116109c057829003601f168201915b5050505050905090565b60006109f282611fc3565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890613d0f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610a7990613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613c6c565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b505050505081565b6000610b0582611141565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90613da1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b94611fd0565b73ffffffffffffffffffffffffffffffffffffffff161480610bc35750610bc281610bbd611fd0565b611dce565b5b610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990613e33565b60405180910390fd5b610c0d838383611fd8565b505050565b60008054905090565b610c2683838361208a565b505050565b6000610c3683611588565b8210610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613ec5565b60405180910390fd5b6000610c81610c12565b905060008060005b83811015610dd9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dcb57868403610dc2578195505050505050610e15565b83806001019450505b508080600101915050610c89565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0c90613f57565b60405180910390fd5b92915050565b600b5481565b610e29611fd0565b73ffffffffffffffffffffffffffffffffffffffff16610e476119cd565b73ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490613fc3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610ec390614014565b60006040518083038185875af1925050503d8060008114610f00576040519150601f19603f3d011682016040523d82523d6000602084013e610f05565b606091505b5050905080610f1357600080fd5b50565b610f3183838360405180602001604052806000815250611cb8565b505050565b6000610f40610c12565b8210610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f789061409b565b60405180910390fd5b819050919050565b610f91611fd0565b73ffffffffffffffffffffffffffffffffffffffff16610faf6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613fc3565b60405180910390fd5b80600c8190555050565b611017611fd0565b73ffffffffffffffffffffffffffffffffffffffff166110356119cd565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613fc3565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6110b0611fd0565b73ffffffffffffffffffffffffffffffffffffffff166110ce6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613fc3565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b600061114c826125c8565b600001519050919050565b60026008540361119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614107565b60405180910390fd5b600260088190555060006111ae610c12565b9050600a60009054906101000a900460ff166111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690614173565b60405180910390fd5b600b54600c548261121091906141c2565b1115611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614264565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b6906142d0565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f757600080fd5b600c54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614362565b60405180910390fd5b60008460405160200161138d91906143ca565b604051602081830303815290604052805190602001209050611416600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612762565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614431565b60405180910390fd5b61146185600c546127ad565b600c54600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b291906141c2565b9250508190555050506001600881905550505050565b6114d0611fd0565b73ffffffffffffffffffffffffffffffffffffffff166114ee6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90613fc3565b60405180910390fd5b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906144c3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611678611fd0565b73ffffffffffffffffffffffffffffffffffffffff166116966119cd565b73ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613fc3565b60405180910390fd5b6116f660006127cb565b565b611700611fd0565b73ffffffffffffffffffffffffffffffffffffffff1661171e6119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613fc3565b60405180910390fd5b600061177e610c12565b9050600b54828261178f91906141c2565b111561179a57600080fd5b6117a483836127ad565b505050565b6002600854036117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614107565b60405180910390fd5b60026008819055506000611800610c12565b9050600a60019054906101000a900460ff16611851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118489061452f565b60405180910390fd5b600b54600c548261186291906141c2565b11156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90614264565b60405180910390fd5b600c54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614362565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461195e57600080fd5b61196a33600c546127ad565b600c54600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bb91906141c2565b92505081905550506001600881905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a0690613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3290613c6c565b8015611a7f5780601f10611a5457610100808354040283529160200191611a7f565b820191906000526020600020905b815481529060010190602001808311611a6257829003601f168201915b5050505050905090565b611a91611fd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af59061459b565b60405180910390fd5b8060066000611b0b611fd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bb8611fd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bfd9190613557565b60405180910390a35050565b600a60019054906101000a900460ff1681565b611c24611fd0565b73ffffffffffffffffffffffffffffffffffffffff16611c426119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90613fc3565b60405180910390fd5b8060099080519060200190611cae9291906133c6565b5050565b600c5481565b611cc384848461208a565b611ccf84848484612891565b611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d059061462d565b60405180910390fd5b50505050565b6060611d1f82611fc3565b611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906146bf565b60405180910390fd5b6000611d68612a18565b90506000815103611d885760405180602001604052806000815250611db3565b80611d9284612aaa565b604051602001611da392919061471b565b6040516020818303038152906040525b915050919050565b600a60009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e6a611fd0565b73ffffffffffffffffffffffffffffffffffffffff16611e886119cd565b73ffffffffffffffffffffffffffffffffffffffff1614611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613fc3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906147b1565b60405180910390fd5b611f56816127cb565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612095826125c8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120bc611fd0565b73ffffffffffffffffffffffffffffffffffffffff16148061211857506120e1611fd0565b73ffffffffffffffffffffffffffffffffffffffff16612100846109e7565b73ffffffffffffffffffffffffffffffffffffffff16145b806121345750612133826000015161212e611fd0565b611dce565b5b905080612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614843565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df906148d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e90614967565b60405180910390fd5b6122648585856001612c0a565b6122746000848460000151611fd8565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612558576124b781611fc3565b156125575782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18585856001612c10565b5050505050565b6125d061344c565b6125d982611fc3565b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f906149f9565b60405180910390fd5b60008290505b60008110612721576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461271257809250505061275d565b5080806001900391505061261e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490614a8b565b60405180910390fd5b919050565b600061277661277084612c16565b83612c46565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6127c7828260405180602001604052806000815250612c6d565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006128b28473ffffffffffffffffffffffffffffffffffffffff16612c7f565b15612a0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128db611fd0565b8786866040518563ffffffff1660e01b81526004016128fd9493929190614b00565b6020604051808303816000875af192505050801561293957506040513d601f19601f820116820180604052508101906129369190614b61565b60015b6129bb573d8060008114612969576040519150601f19603f3d011682016040523d82523d6000602084013e61296e565b606091505b5060008151036129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa9061462d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a10565b600190505b949350505050565b606060098054612a2790613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5390613c6c565b8015612aa05780601f10612a7557610100808354040283529160200191612aa0565b820191906000526020600020905b815481529060010190602001808311612a8357829003601f168201915b5050505050905090565b606060008203612af1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c05565b600082905060005b60008214612b23578080612b0c90614b8e565b915050600a82612b1c9190614c05565b9150612af9565b60008167ffffffffffffffff811115612b3f57612b3e613965565b5b6040519080825280601f01601f191660200182016040528015612b715781602001600182028036833780820191505090505b5090505b60008514612bfe57600182612b8a9190614c36565b9150600a85612b999190614c6a565b6030612ba591906141c2565b60f81b818381518110612bbb57612bba614c9b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bf79190614c05565b9450612b75565b8093505050505b919050565b50505050565b50505050565b600081604051602001612c299190614d41565b604051602081830303815290604052805190602001209050919050565b6000806000612c558585612c92565b91509150612c6281612d13565b819250505092915050565b612c7a8383836001612edf565b505050565b600080823b905060008111915050919050565b6000806041835103612cd35760008060006020860151925060408601519150606086015160001a9050612cc78782858561325b565b94509450505050612d0c565b6040835103612d03576000806020850151915060408501519050612cf8868383613367565b935093505050612d0c565b60006002915091505b9250929050565b60006004811115612d2757612d26614d67565b5b816004811115612d3a57612d39614d67565b5b0315612edc5760016004811115612d5457612d53614d67565b5b816004811115612d6757612d66614d67565b5b03612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90614de2565b60405180910390fd5b60026004811115612dbb57612dba614d67565b5b816004811115612dce57612dcd614d67565b5b03612e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0590614e4e565b60405180910390fd5b60036004811115612e2257612e21614d67565b5b816004811115612e3557612e34614d67565b5b03612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6c90614ee0565b60405180910390fd5b600480811115612e8857612e87614d67565b5b816004811115612e9b57612e9a614d67565b5b03612edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed290614f72565b60405180910390fd5b5b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90615004565b60405180910390fd5b60008403612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90615096565b60405180910390fd5b612fa46000868387612c0a565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561323e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613229576131e96000888488612891565b613228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321f9061462d565b60405180910390fd5b5b81806001019250508080600101915050613172565b5080600081905550506132546000868387612c10565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561329657600060039150915061335e565b601b8560ff16141580156132ae5750601c8560ff1614155b156132c057600060049150915061335e565b6000600187878787604051600081526020016040526040516132e594939291906150e1565b6020604051602081039080840390855afa158015613307573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133555760006001925092505061335e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6133aa91906141c2565b90506133b88782888561325b565b935093505050935093915050565b8280546133d290613c6c565b90600052602060002090601f0160209004810192826133f4576000855561343b565b82601f1061340d57805160ff191683800117855561343b565b8280016001018555821561343b579182015b8281111561343a57825182559160200191906001019061341f565b5b5090506134489190613486565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561349f576000816000905550600101613487565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134ec816134b7565b81146134f757600080fd5b50565b600081359050613509816134e3565b92915050565b600060208284031215613525576135246134ad565b5b6000613533848285016134fa565b91505092915050565b60008115159050919050565b6135518161353c565b82525050565b600060208201905061356c6000830184613548565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359d82613572565b9050919050565b6135ad81613592565b81146135b857600080fd5b50565b6000813590506135ca816135a4565b92915050565b6000602082840312156135e6576135e56134ad565b5b60006135f4848285016135bb565b91505092915050565b6000819050919050565b613610816135fd565b82525050565b600060208201905061362b6000830184613607565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561366b578082015181840152602081019050613650565b8381111561367a576000848401525b50505050565b6000601f19601f8301169050919050565b600061369c82613631565b6136a6818561363c565b93506136b681856020860161364d565b6136bf81613680565b840191505092915050565b600060208201905081810360008301526136e48184613691565b905092915050565b6136f5816135fd565b811461370057600080fd5b50565b600081359050613712816136ec565b92915050565b60006020828403121561372e5761372d6134ad565b5b600061373c84828501613703565b91505092915050565b61374e81613592565b82525050565b60006020820190506137696000830184613745565b92915050565b60008060408385031215613786576137856134ad565b5b6000613794858286016135bb565b92505060206137a585828601613703565b9150509250929050565b6000806000606084860312156137c8576137c76134ad565b5b60006137d6868287016135bb565b93505060206137e7868287016135bb565b92505060406137f886828701613703565b9150509250925092565b61380b8161353c565b811461381657600080fd5b50565b60008135905061382881613802565b92915050565b600060208284031215613844576138436134ad565b5b600061385284828501613819565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126138805761387f61385b565b5b8235905067ffffffffffffffff81111561389d5761389c613860565b5b6020830191508360018202830111156138b9576138b8613865565b5b9250929050565b6000806000604084860312156138d9576138d86134ad565b5b60006138e7868287016135bb565b935050602084013567ffffffffffffffff811115613908576139076134b2565b5b6139148682870161386a565b92509250509250925092565b60008060408385031215613937576139366134ad565b5b6000613945858286016135bb565b925050602061395685828601613819565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61399d82613680565b810181811067ffffffffffffffff821117156139bc576139bb613965565b5b80604052505050565b60006139cf6134a3565b90506139db8282613994565b919050565b600067ffffffffffffffff8211156139fb576139fa613965565b5b613a0482613680565b9050602081019050919050565b82818337600083830152505050565b6000613a33613a2e846139e0565b6139c5565b905082815260208101848484011115613a4f57613a4e613960565b5b613a5a848285613a11565b509392505050565b600082601f830112613a7757613a7661385b565b5b8135613a87848260208601613a20565b91505092915050565b600060208284031215613aa657613aa56134ad565b5b600082013567ffffffffffffffff811115613ac457613ac36134b2565b5b613ad084828501613a62565b91505092915050565b600067ffffffffffffffff821115613af457613af3613965565b5b613afd82613680565b9050602081019050919050565b6000613b1d613b1884613ad9565b6139c5565b905082815260208101848484011115613b3957613b38613960565b5b613b44848285613a11565b509392505050565b600082601f830112613b6157613b6061385b565b5b8135613b71848260208601613b0a565b91505092915050565b60008060008060808587031215613b9457613b936134ad565b5b6000613ba2878288016135bb565b9450506020613bb3878288016135bb565b9350506040613bc487828801613703565b925050606085013567ffffffffffffffff811115613be557613be46134b2565b5b613bf187828801613b4c565b91505092959194509250565b60008060408385031215613c1457613c136134ad565b5b6000613c22858286016135bb565b9250506020613c33858286016135bb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c8457607f821691505b602082108103613c9757613c96613c3d565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cf9602d8361363c565b9150613d0482613c9d565b604082019050919050565b60006020820190508181036000830152613d2881613cec565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8b60228361363c565b9150613d9682613d2f565b604082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613e1d60398361363c565b9150613e2882613dc1565b604082019050919050565b60006020820190508181036000830152613e4c81613e10565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eaf60228361363c565b9150613eba82613e53565b604082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613f41602e8361363c565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fad60208361363c565b9150613fb882613f77565b602082019050919050565b60006020820190508181036000830152613fdc81613fa0565b9050919050565b600081905092915050565b50565b6000613ffe600083613fe3565b915061400982613fee565b600082019050919050565b600061401f82613ff1565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061408560238361363c565b915061409082614029565b604082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140f1601f8361363c565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b7f416c6c6f776c697374204d696e74204e6f74204c697665000000000000000000600082015250565b600061415d60178361363c565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141cd826135fd565b91506141d8836135fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561420d5761420c614193565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b600061424e60208361363c565b915061425982614218565b602082019050919050565b6000602082019050818103600083015261427d81614241565b9050919050565b7f4e6f7420796f757220766f756368657200000000000000000000000000000000600082015250565b60006142ba60108361363c565b91506142c582614284565b602082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b600061434c602b8361363c565b9150614357826142f0565b604082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b60008160601b9050919050565b600061439a82614382565b9050919050565b60006143ac8261438f565b9050919050565b6143c46143bf82613592565b6143a1565b82525050565b60006143d682846143b3565b60148201915081905092915050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b600061441b600f8361363c565b9150614426826143e5565b602082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006144ad602b8361363c565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f5075626c6963204d696e74204e6f74204c697665000000000000000000000000600082015250565b600061451960148361363c565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614585601a8361363c565b91506145908261454f565b602082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061461760338361363c565b9150614622826145bb565b604082019050919050565b600060208201905081810360008301526146468161460a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146a9602f8361363c565b91506146b48261464d565b604082019050919050565b600060208201905081810360008301526146d88161469c565b9050919050565b600081905092915050565b60006146f582613631565b6146ff81856146df565b935061470f81856020860161364d565b80840191505092915050565b600061472782856146ea565b915061473382846146ea565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479b60268361363c565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061482d60328361363c565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006148bf60268361363c565b91506148ca82614863565b604082019050919050565b600060208201905081810360008301526148ee816148b2565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495160258361363c565b915061495c826148f5565b604082019050919050565b6000602082019050818103600083015261498081614944565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006149e3602a8361363c565b91506149ee82614987565b604082019050919050565b60006020820190508181036000830152614a12816149d6565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614a75602f8361363c565b9150614a8082614a19565b604082019050919050565b60006020820190508181036000830152614aa481614a68565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ad282614aab565b614adc8185614ab6565b9350614aec81856020860161364d565b614af581613680565b840191505092915050565b6000608082019050614b156000830187613745565b614b226020830186613745565b614b2f6040830185613607565b8181036060830152614b418184614ac7565b905095945050505050565b600081519050614b5b816134e3565b92915050565b600060208284031215614b7757614b766134ad565b5b6000614b8584828501614b4c565b91505092915050565b6000614b99826135fd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bcb57614bca614193565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c10826135fd565b9150614c1b836135fd565b925082614c2b57614c2a614bd6565b5b828204905092915050565b6000614c41826135fd565b9150614c4c836135fd565b925082821015614c5f57614c5e614193565b5b828203905092915050565b6000614c75826135fd565b9150614c80836135fd565b925082614c9057614c8f614bd6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614d00601c836146df565b9150614d0b82614cca565b601c82019050919050565b6000819050919050565b6000819050919050565b614d3b614d3682614d16565b614d20565b82525050565b6000614d4c82614cf3565b9150614d588284614d2a565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614dcc60188361363c565b9150614dd782614d96565b602082019050919050565b60006020820190508181036000830152614dfb81614dbf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614e38601f8361363c565b9150614e4382614e02565b602082019050919050565b60006020820190508181036000830152614e6781614e2b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eca60228361363c565b9150614ed582614e6e565b604082019050919050565b60006020820190508181036000830152614ef981614ebd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f5c60228361363c565b9150614f6782614f00565b604082019050919050565b60006020820190508181036000830152614f8b81614f4f565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fee60218361363c565b9150614ff982614f92565b604082019050919050565b6000602082019050818103600083015261501d81614fe1565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061508060288361363c565b915061508b82615024565b604082019050919050565b600060208201905081810360008301526150af81615073565b9050919050565b6150bf81614d16565b82525050565b600060ff82169050919050565b6150db816150c5565b82525050565b60006080820190506150f660008301876150b6565b61510360208301866150d2565b61511060408301856150b6565b61511d60608301846150b6565b9594505050505056fea26469706673582212205c87631c1c78a0a97becfaf4253d598a9e9f67aa01b912d9c39733e9f0be2e6164736f6c634300080d0033

Deployed Bytecode Sourcemap

56269:3351:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40426:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56757:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43874:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56386:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43395:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44750:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39347:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56646:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59465:152;;;:::i;:::-;;44983:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38860:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59042:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58813:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58922:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42121:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56909:762;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58693:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40862:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14013:94;;;;;;;;;;;;;:::i;:::-;;58235:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57696:518;;;;;;;;;;;;;:::i;:::-;;13362:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42481:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44160:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56483:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59170:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56685:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45231:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42656:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56439:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44519:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14262:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40426:372;40528:4;40580:25;40565:40;;;:11;:40;;;;:105;;;;40637:33;40622:48;;;:11;:48;;;;40565:105;:172;;;;40702:35;40687:50;;;:11;:50;;;;40565:172;:225;;;;40754:36;40778:11;40754:23;:36::i;:::-;40565:225;40545:245;;40426:372;;;:::o;56757:53::-;;;;;;;;;;;;;;;;;:::o;42312:100::-;42366:13;42399:5;42392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42312:100;:::o;43874:214::-;43942:7;43970:16;43978:7;43970;:16::i;:::-;43962:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44056:15;:24;44072:7;44056:24;;;;;;;;;;;;;;;;;;;;;44049:31;;43874:214;;;:::o;56386:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43395:413::-;43468:13;43484:24;43500:7;43484:15;:24::i;:::-;43468:40;;43533:5;43527:11;;:2;:11;;;43519:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43628:5;43612:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43637:37;43654:5;43661:12;:10;:12::i;:::-;43637:16;:37::i;:::-;43612:62;43590:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;43772:28;43781:2;43785:7;43794:5;43772:8;:28::i;:::-;43457:351;43395:413;;:::o;38683:100::-;38736:7;38763:12;;38756:19;;38683:100;:::o;44750:162::-;44876:28;44886:4;44892:2;44896:7;44876:9;:28::i;:::-;44750:162;;;:::o;39347:1007::-;39436:7;39472:16;39482:5;39472:9;:16::i;:::-;39464:5;:24;39456:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39538:22;39563:13;:11;:13::i;:::-;39538:38;;39587:19;39617:25;39806:9;39801:466;39821:14;39817:1;:18;39801:466;;;39861:31;39895:11;:14;39907:1;39895:14;;;;;;;;;;;39861:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39958:1;39932:28;;:9;:14;;;:28;;;39928:111;;40005:9;:14;;;39985:34;;39928:111;40082:5;40061:26;;:17;:26;;;40057:195;;40131:5;40116:11;:20;40112:85;;40172:1;40165:8;;;;;;;;;40112:85;40219:13;;;;;;;40057:195;39842:425;39837:3;;;;;;;39801:466;;;;40290:56;;;;;;;;;;:::i;:::-;;;;;;;;39347:1007;;;;;:::o;56646:32::-;;;;:::o;59465:152::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59515:12:::1;59541:10;59533:24;;59565:21;59533:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59514:77;;;59604:7;59596:16;;;::::0;::::1;;59510:107;59465:152::o:0;44983:177::-;45113:39;45130:4;45136:2;45140:7;45113:39;;;;;;;;;;;;:16;:39::i;:::-;44983:177;;;:::o;38860:187::-;38927:7;38963:13;:11;:13::i;:::-;38955:5;:21;38947:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39034:5;39027:12;;38860:187;;;:::o;59042:104::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59131:7:::1;59109:19;:29;;;;59042:104:::0;:::o;58813:101::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58899:7:::1;58879:17;;:27;;;;;;;;;;;;;;;;;;58813:101:::0;:::o;58922:95::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59002:7:::1;58985:14;;:24;;;;;;;;;;;;;;;;;;58922:95:::0;:::o;42121:124::-;42185:7;42212:20;42224:7;42212:11;:20::i;:::-;:25;;;42205:32;;42121:124;;;:::o;56909:762::-;55295:1;55893:7;;:19;55885:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55295:1;56026:7;:18;;;;57006:10:::1;57019:13;:11;:13::i;:::-;57006:26;;57051:17;;;;;;;;;;;57043:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57143:10;;57120:19;;57115:2;:24;;;;:::i;:::-;:38;;57107:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57223:7;57209:21;;:10;:21;;;57201:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57284:9;57270:23;;:10;:23;;;57262:32;;;::::0;::::1;;57340:19;;57310:18;:27;57329:7;57310:27;;;;;;;;;;;;;;;;:49;57302:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;57420:12;57462:7;57445:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57435:36;;;;;;57420:51;;57490:40;57507:6;;;;;;;;;;;57515:4;57521:8;;57490:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:40::i;:::-;57482:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57563:39;57573:7;57582:19;;57563:9;:39::i;:::-;57644:19;;57613:18;:27;57632:7;57613:27;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;56996:675;;55251:1:::0;56205:7;:22;;;;56909:762;;;:::o;58693:90::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58768:7:::1;58759:6;;:16;;;;;;;;;;;;;;;;;;58693:90:::0;:::o;40862:221::-;40926:7;40971:1;40954:19;;:5;:19;;;40946:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;41047:12;:19;41060:5;41047:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;41039:36;;41032:43;;40862:221;;;:::o;14013:94::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14078:21:::1;14096:1;14078:9;:21::i;:::-;14013:94::o:0;58235:202::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58315:10:::1;58328:13;:11;:13::i;:::-;58315:26;;58378:10;;58362:12;58357:2;:17;;;;:::i;:::-;:31;;58349:40;;;::::0;::::1;;58400:29;58410:4;58416:12;58400:9;:29::i;:::-;58305:132;58235:202:::0;;:::o;57696:518::-;55295:1;55893:7;;:19;55885:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55295:1;56026:7;:18;;;;57750:10:::1;57763:13;:11;:13::i;:::-;57750:26;;57795:14;;;;;;;;;;;57787:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57881:10;;57858:19;;57853:2;:24;;;;:::i;:::-;:38;;57845:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57977:19;;57944:18;:30;57963:10;57944:30;;;;;;;;;;;;;;;;:52;57936:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;58077:9;58063:23;;:10;:23;;;58055:32;;;::::0;::::1;;58100:42;58110:10;58122:19;;58100:9;:42::i;:::-;58187:19;;58153:18;:30;58172:10;58153:30;;;;;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;;;;;;;57740:474;55251:1:::0;56205:7;:22;;;;57696:518::o;13362:87::-;13408:7;13435:6;;;;;;;;;;;13428:13;;13362:87;:::o;42481:104::-;42537:13;42570:7;42563:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42481:104;:::o;44160:288::-;44267:12;:10;:12::i;:::-;44255:24;;:8;:24;;;44247:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44368:8;44323:18;:32;44342:12;:10;:12::i;:::-;44323:32;;;;;;;;;;;;;;;:42;44356:8;44323:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44421:8;44392:48;;44407:12;:10;:12::i;:::-;44392:48;;;44431:8;44392:48;;;;;;:::i;:::-;;;;;;;;44160:288;;:::o;56483:34::-;;;;;;;;;;;;;:::o;59170:110::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59264:8:::1;59245:16;:27;;;;;;;;;;;;:::i;:::-;;59170:110:::0;:::o;56685:38::-;;;;:::o;45231:355::-;45390:28;45400:4;45406:2;45410:7;45390:9;:28::i;:::-;45451:48;45474:4;45480:2;45484:7;45493:5;45451:22;:48::i;:::-;45429:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;45231:355;;;;:::o;42656:335::-;42729:13;42763:16;42771:7;42763;:16::i;:::-;42755:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42844:21;42868:10;:8;:10::i;:::-;42844:34;;42921:1;42902:7;42896:21;:26;:87;;;;;;;;;;;;;;;;;42949:7;42958:18;:7;:16;:18::i;:::-;42932:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42896:87;42889:94;;;42656:335;;;:::o;56439:37::-;;;;;;;;;;;;;:::o;44519:164::-;44616:4;44640:18;:25;44659:5;44640:25;;;;;;;;;;;;;;;:35;44666:8;44640:35;;;;;;;;;;;;;;;;;;;;;;;;;44633:42;;44519:164;;;;:::o;14262:192::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14371:1:::1;14351:22;;:8;:22;;::::0;14343:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14427:19;14437:8;14427:9;:19::i;:::-;14262:192:::0;:::o;30814:157::-;30899:4;30938:25;30923:40;;;:11;:40;;;;30916:47;;30814:157;;;:::o;45841:111::-;45898:4;45932:12;;45922:7;:22;45915:29;;45841:111;;;:::o;12183:98::-;12236:7;12263:10;12256:17;;12183:98;:::o;50761:196::-;50903:2;50876:15;:24;50892:7;50876:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50941:7;50937:2;50921:28;;50930:5;50921:28;;;;;;;;;;;;50761:196;;;:::o;48641:2002::-;48756:35;48794:20;48806:7;48794:11;:20::i;:::-;48756:58;;48827:22;48869:13;:18;;;48853:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;48928:12;:10;:12::i;:::-;48904:36;;:20;48916:7;48904:11;:20::i;:::-;:36;;;48853:87;:154;;;;48957:50;48974:13;:18;;;48994:12;:10;:12::i;:::-;48957:16;:50::i;:::-;48853:154;48827:181;;49029:17;49021:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49144:4;49122:26;;:13;:18;;;:26;;;49114:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49224:1;49210:16;;:2;:16;;;49202:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49281:43;49303:4;49309:2;49313:7;49322:1;49281:21;:43::i;:::-;49389:49;49406:1;49410:7;49419:13;:18;;;49389:8;:49::i;:::-;49764:1;49734:12;:18;49747:4;49734:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49808:1;49780:12;:16;49793:2;49780:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49854:2;49826:11;:20;49838:7;49826:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;49916:15;49871:11;:20;49883:7;49871:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;50184:19;50216:1;50206:7;:11;50184:33;;50277:1;50236:43;;:11;:24;50248:11;50236:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50232:295;;50304:20;50312:11;50304:7;:20::i;:::-;50300:212;;;50381:13;:18;;;50349:11;:24;50361:11;50349:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;50464:13;:28;;;50422:11;:24;50434:11;50422:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;50300:212;50232:295;49709:829;50574:7;50570:2;50555:27;;50564:4;50555:27;;;;;;;;;;;;50593:42;50614:4;50620:2;50624:7;50633:1;50593:20;:42::i;:::-;48745:1898;;48641:2002;;;:::o;41522:537::-;41583:21;;:::i;:::-;41625:16;41633:7;41625;:16::i;:::-;41617:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41731:12;41746:7;41731:22;;41726:245;41763:1;41755:4;:9;41726:245;;41793:31;41827:11;:17;41839:4;41827:17;;;;;;;;;;;41793:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41893:1;41867:28;;:9;:14;;;:28;;;41863:93;;41927:9;41920:16;;;;;;41863:93;41774:197;41766:6;;;;;;;;41726:245;;;;41994:57;;;;;;;;;;:::i;:::-;;;;;;;;41522:537;;;;:::o;58475:210::-;58580:4;58615:62;58629:35;58658:5;58629:28;:35::i;:::-;58666:10;58615:13;:62::i;:::-;58604:73;;:7;:73;;;58597:80;;58475:210;;;;;:::o;45960:104::-;46029:27;46039:2;46043:8;46029:27;;;;;;;;;;;;:9;:27::i;:::-;45960:104;;:::o;14462:173::-;14518:16;14537:6;;;;;;;;;;;14518:25;;14563:8;14554:6;;:17;;;;;;;;;;;;;;;;;;14618:8;14587:40;;14608:8;14587:40;;;;;;;;;;;;14507:128;14462:173;:::o;51522:804::-;51677:4;51698:15;:2;:13;;;:15::i;:::-;51694:625;;;51750:2;51734:36;;;51771:12;:10;:12::i;:::-;51785:4;51791:7;51800:5;51734:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51730:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51997:1;51980:6;:13;:18;51976:273;;52023:61;;;;;;;;;;:::i;:::-;;;;;;;;51976:273;52199:6;52193:13;52184:6;52180:2;52176:15;52169:38;51730:534;51867:45;;;51857:55;;;:6;:55;;;;51850:62;;;;;51694:625;52303:4;52296:11;;51522:804;;;;;;;:::o;59288:117::-;59348:13;59381:16;59374:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59288:117;:::o;357:723::-;413:13;643:1;634:5;:10;630:53;;661:10;;;;;;;;;;;;;;;;;;;;;630:53;693:12;708:5;693:20;;724:14;749:78;764:1;756:4;:9;749:78;;782:8;;;;;:::i;:::-;;;;813:2;805:10;;;;;:::i;:::-;;;749:78;;;837:19;869:6;859:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;837:39;;887:154;903:1;894:5;:10;887:154;;931:1;921:11;;;;;:::i;:::-;;;998:2;990:5;:10;;;;:::i;:::-;977:2;:24;;;;:::i;:::-;964:39;;947:6;954;947:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1027:2;1018:11;;;;;:::i;:::-;;;887:154;;;1065:6;1051:21;;;;;357:723;;;;:::o;52814:159::-;;;;;:::o;53385:158::-;;;;;:::o;10275:269::-;10344:7;10530:4;10477:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10467:69;;;;;;10460:76;;10275:269;;;:::o;6473:231::-;6551:7;6572:17;6591:18;6613:27;6624:4;6630:9;6613:10;:27::i;:::-;6571:69;;;;6651:18;6663:5;6651:11;:18::i;:::-;6687:9;6680:16;;;;6473:231;;;;:::o;46427:163::-;46550:32;46556:2;46560:8;46570:5;46577:4;46550:5;:32::i;:::-;46427:163;;;:::o;15376:387::-;15436:4;15644:12;15711:7;15699:20;15691:28;;15754:1;15747:4;:8;15740:15;;;15376:387;;;:::o;4363:1308::-;4444:7;4453:12;4698:2;4678:9;:16;:22;4674:990;;4717:9;4741;4765:7;4974:4;4963:9;4959:20;4953:27;4948:32;;5024:4;5013:9;5009:20;5003:27;4998:32;;5082:4;5071:9;5067:20;5061:27;5058:1;5053:36;5048:41;;5125:25;5136:4;5142:1;5145;5148;5125:10;:25::i;:::-;5118:32;;;;;;;;;4674:990;5192:2;5172:9;:16;:22;5168:496;;5211:9;5235:10;5447:4;5436:9;5432:20;5426:27;5421:32;;5498:4;5487:9;5483:20;5477:27;5471:33;;5540:23;5551:4;5557:1;5560:2;5540:10;:23::i;:::-;5533:30;;;;;;;;5168:496;5612:1;5616:35;5596:56;;;;4363:1308;;;;;;:::o;2634:643::-;2712:20;2703:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2699:571;2749:7;2699:571;2810:29;2801:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2797:473;;2856:34;;;;;;;;;;:::i;:::-;;;;;;;;2797:473;2921:35;2912:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2908:362;;2973:41;;;;;;;;;;:::i;:::-;;;;;;;;2908:362;3045:30;3036:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3032:238;;3092:44;;;;;;;;;;:::i;:::-;;;;;;;;3032:238;3167:30;3158:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3154:116;;3214:44;;;;;;;;;;:::i;:::-;;;;;;;;3154:116;2634:643;;:::o;46849:1538::-;46988:20;47011:12;;46988:35;;47056:1;47042:16;;:2;:16;;;47034:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47127:1;47115:8;:13;47107:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47186:61;47216:1;47220:2;47224:12;47238:8;47186:21;:61::i;:::-;47561:8;47525:12;:16;47538:2;47525:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47626:8;47585:12;:16;47598:2;47585:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47685:2;47652:11;:25;47664:12;47652:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47752:15;47702:11;:25;47714:12;47702:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;47785:20;47808:12;47785:35;;47842:9;47837:415;47857:8;47853:1;:12;47837:415;;;47921:12;47917:2;47896:38;;47913:1;47896:38;;;;;;;;;;;;47957:4;47953:249;;;48020:59;48051:1;48055:2;48059:12;48073:5;48020:22;:59::i;:::-;47986:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;47953:249;48222:14;;;;;;;47867:3;;;;;;;47837:415;;;;48283:12;48268;:27;;;;47500:807;48319:60;48348:1;48352:2;48356:12;48370:8;48319:20;:60::i;:::-;46977:1410;46849:1538;;;;:::o;7925:1632::-;8056:7;8065:12;8990:66;8985:1;8977:10;;:79;8973:163;;;9089:1;9093:30;9073:51;;;;;;8973:163;9155:2;9150:1;:7;;;;:18;;;;;9166:2;9161:1;:7;;;;9150:18;9146:102;;;9201:1;9205:30;9185:51;;;;;;9146:102;9345:14;9362:24;9372:4;9378:1;9381;9384;9362:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9345:41;;9419:1;9401:20;;:6;:20;;;9397:103;;9454:1;9458:29;9438:50;;;;;;;9397:103;9520:6;9528:20;9512:37;;;;;7925:1632;;;;;;;;:::o;6967:344::-;7081:7;7090:12;7115:9;7140:66;7132:75;;7127:2;:80;7115:92;;7218:7;7257:2;7250:3;7243:2;7235:11;;:18;;7234:25;;;;:::i;:::-;7218:42;;7278:25;7289:4;7295:1;7298;7301;7278:10;:25::i;:::-;7271:32;;;;;;6967:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:77::-;2397:7;2426:5;2415:16;;2360:77;;;:::o;2443:118::-;2530:24;2548:5;2530:24;:::i;:::-;2525:3;2518:37;2443:118;;:::o;2567:222::-;2660:4;2698:2;2687:9;2683:18;2675:26;;2711:71;2779:1;2768:9;2764:17;2755:6;2711:71;:::i;:::-;2567:222;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:323::-;6567:6;6616:2;6604:9;6595:7;6591:23;6587:32;6584:119;;;6622:79;;:::i;:::-;6584:119;6742:1;6767:50;6809:7;6800:6;6789:9;6785:22;6767:50;:::i;:::-;6757:60;;6713:114;6511:323;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:117;7072:1;7069;7062:12;7086:117;7195:1;7192;7185:12;7222:552;7279:8;7289:6;7339:3;7332:4;7324:6;7320:17;7316:27;7306:122;;7347:79;;:::i;:::-;7306:122;7460:6;7447:20;7437:30;;7490:18;7482:6;7479:30;7476:117;;;7512:79;;:::i;:::-;7476:117;7626:4;7618:6;7614:17;7602:29;;7680:3;7672:4;7664:6;7660:17;7650:8;7646:32;7643:41;7640:128;;;7687:79;;:::i;:::-;7640:128;7222:552;;;;;:::o;7780:672::-;7859:6;7867;7875;7924:2;7912:9;7903:7;7899:23;7895:32;7892:119;;;7930:79;;:::i;:::-;7892:119;8050:1;8075:53;8120:7;8111:6;8100:9;8096:22;8075:53;:::i;:::-;8065:63;;8021:117;8205:2;8194:9;8190:18;8177:32;8236:18;8228:6;8225:30;8222:117;;;8258:79;;:::i;:::-;8222:117;8371:64;8427:7;8418:6;8407:9;8403:22;8371:64;:::i;:::-;8353:82;;;;8148:297;7780:672;;;;;:::o;8458:468::-;8523:6;8531;8580:2;8568:9;8559:7;8555:23;8551:32;8548:119;;;8586:79;;:::i;:::-;8548:119;8706:1;8731:53;8776:7;8767:6;8756:9;8752:22;8731:53;:::i;:::-;8721:63;;8677:117;8833:2;8859:50;8901:7;8892:6;8881:9;8877:22;8859:50;:::i;:::-;8849:60;;8804:115;8458:468;;;;;:::o;8932:117::-;9041:1;9038;9031:12;9055:180;9103:77;9100:1;9093:88;9200:4;9197:1;9190:15;9224:4;9221:1;9214:15;9241:281;9324:27;9346:4;9324:27;:::i;:::-;9316:6;9312:40;9454:6;9442:10;9439:22;9418:18;9406:10;9403:34;9400:62;9397:88;;;9465:18;;:::i;:::-;9397:88;9505:10;9501:2;9494:22;9284:238;9241:281;;:::o;9528:129::-;9562:6;9589:20;;:::i;:::-;9579:30;;9618:33;9646:4;9638:6;9618:33;:::i;:::-;9528:129;;;:::o;9663:308::-;9725:4;9815:18;9807:6;9804:30;9801:56;;;9837:18;;:::i;:::-;9801:56;9875:29;9897:6;9875:29;:::i;:::-;9867:37;;9959:4;9953;9949:15;9941:23;;9663:308;;;:::o;9977:154::-;10061:6;10056:3;10051;10038:30;10123:1;10114:6;10109:3;10105:16;10098:27;9977:154;;;:::o;10137:412::-;10215:5;10240:66;10256:49;10298:6;10256:49;:::i;:::-;10240:66;:::i;:::-;10231:75;;10329:6;10322:5;10315:21;10367:4;10360:5;10356:16;10405:3;10396:6;10391:3;10387:16;10384:25;10381:112;;;10412:79;;:::i;:::-;10381:112;10502:41;10536:6;10531:3;10526;10502:41;:::i;:::-;10221:328;10137:412;;;;;:::o;10569:340::-;10625:5;10674:3;10667:4;10659:6;10655:17;10651:27;10641:122;;10682:79;;:::i;:::-;10641:122;10799:6;10786:20;10824:79;10899:3;10891:6;10884:4;10876:6;10872:17;10824:79;:::i;:::-;10815:88;;10631:278;10569:340;;;;:::o;10915:509::-;10984:6;11033:2;11021:9;11012:7;11008:23;11004:32;11001:119;;;11039:79;;:::i;:::-;11001:119;11187:1;11176:9;11172:17;11159:31;11217:18;11209:6;11206:30;11203:117;;;11239:79;;:::i;:::-;11203:117;11344:63;11399:7;11390:6;11379:9;11375:22;11344:63;:::i;:::-;11334:73;;11130:287;10915:509;;;;:::o;11430:307::-;11491:4;11581:18;11573:6;11570:30;11567:56;;;11603:18;;:::i;:::-;11567:56;11641:29;11663:6;11641:29;:::i;:::-;11633:37;;11725:4;11719;11715:15;11707:23;;11430:307;;;:::o;11743:410::-;11820:5;11845:65;11861:48;11902:6;11861:48;:::i;:::-;11845:65;:::i;:::-;11836:74;;11933:6;11926:5;11919:21;11971:4;11964:5;11960:16;12009:3;12000:6;11995:3;11991:16;11988:25;11985:112;;;12016:79;;:::i;:::-;11985:112;12106:41;12140:6;12135:3;12130;12106:41;:::i;:::-;11826:327;11743:410;;;;;:::o;12172:338::-;12227:5;12276:3;12269:4;12261:6;12257:17;12253:27;12243:122;;12284:79;;:::i;:::-;12243:122;12401:6;12388:20;12426:78;12500:3;12492:6;12485:4;12477:6;12473:17;12426:78;:::i;:::-;12417:87;;12233:277;12172:338;;;;:::o;12516:943::-;12611:6;12619;12627;12635;12684:3;12672:9;12663:7;12659:23;12655:33;12652:120;;;12691:79;;:::i;:::-;12652:120;12811:1;12836:53;12881:7;12872:6;12861:9;12857:22;12836:53;:::i;:::-;12826:63;;12782:117;12938:2;12964:53;13009:7;13000:6;12989:9;12985:22;12964:53;:::i;:::-;12954:63;;12909:118;13066:2;13092:53;13137:7;13128:6;13117:9;13113:22;13092:53;:::i;:::-;13082:63;;13037:118;13222:2;13211:9;13207:18;13194:32;13253:18;13245:6;13242:30;13239:117;;;13275:79;;:::i;:::-;13239:117;13380:62;13434:7;13425:6;13414:9;13410:22;13380:62;:::i;:::-;13370:72;;13165:287;12516:943;;;;;;;:::o;13465:474::-;13533:6;13541;13590:2;13578:9;13569:7;13565:23;13561:32;13558:119;;;13596:79;;:::i;:::-;13558:119;13716:1;13741:53;13786:7;13777:6;13766:9;13762:22;13741:53;:::i;:::-;13731:63;;13687:117;13843:2;13869:53;13914:7;13905:6;13894:9;13890:22;13869:53;:::i;:::-;13859:63;;13814:118;13465:474;;;;;:::o;13945:180::-;13993:77;13990:1;13983:88;14090:4;14087:1;14080:15;14114:4;14111:1;14104:15;14131:320;14175:6;14212:1;14206:4;14202:12;14192:22;;14259:1;14253:4;14249:12;14280:18;14270:81;;14336:4;14328:6;14324:17;14314:27;;14270:81;14398:2;14390:6;14387:14;14367:18;14364:38;14361:84;;14417:18;;:::i;:::-;14361:84;14182:269;14131:320;;;:::o;14457:232::-;14597:34;14593:1;14585:6;14581:14;14574:58;14666:15;14661:2;14653:6;14649:15;14642:40;14457:232;:::o;14695:366::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:419::-;15233:4;15271:2;15260:9;15256:18;15248:26;;15320:9;15314:4;15310:20;15306:1;15295:9;15291:17;15284:47;15348:131;15474:4;15348:131;:::i;:::-;15340:139;;15067:419;;;:::o;15492:221::-;15632:34;15628:1;15620:6;15616:14;15609:58;15701:4;15696:2;15688:6;15684:15;15677:29;15492:221;:::o;15719:366::-;15861:3;15882:67;15946:2;15941:3;15882:67;:::i;:::-;15875:74;;15958:93;16047:3;15958:93;:::i;:::-;16076:2;16071:3;16067:12;16060:19;;15719:366;;;:::o;16091:419::-;16257:4;16295:2;16284:9;16280:18;16272:26;;16344:9;16338:4;16334:20;16330:1;16319:9;16315:17;16308:47;16372:131;16498:4;16372:131;:::i;:::-;16364:139;;16091:419;;;:::o;16516:244::-;16656:34;16652:1;16644:6;16640:14;16633:58;16725:27;16720:2;16712:6;16708:15;16701:52;16516:244;:::o;16766:366::-;16908:3;16929:67;16993:2;16988:3;16929:67;:::i;:::-;16922:74;;17005:93;17094:3;17005:93;:::i;:::-;17123:2;17118:3;17114:12;17107:19;;16766:366;;;:::o;17138:419::-;17304:4;17342:2;17331:9;17327:18;17319:26;;17391:9;17385:4;17381:20;17377:1;17366:9;17362:17;17355:47;17419:131;17545:4;17419:131;:::i;:::-;17411:139;;17138:419;;;:::o;17563:221::-;17703:34;17699:1;17691:6;17687:14;17680:58;17772:4;17767:2;17759:6;17755:15;17748:29;17563:221;:::o;17790:366::-;17932:3;17953:67;18017:2;18012:3;17953:67;:::i;:::-;17946:74;;18029:93;18118:3;18029:93;:::i;:::-;18147:2;18142:3;18138:12;18131:19;;17790:366;;;:::o;18162:419::-;18328:4;18366:2;18355:9;18351:18;18343:26;;18415:9;18409:4;18405:20;18401:1;18390:9;18386:17;18379:47;18443:131;18569:4;18443:131;:::i;:::-;18435:139;;18162:419;;;:::o;18587:233::-;18727:34;18723:1;18715:6;18711:14;18704:58;18796:16;18791:2;18783:6;18779:15;18772:41;18587:233;:::o;18826:366::-;18968:3;18989:67;19053:2;19048:3;18989:67;:::i;:::-;18982:74;;19065:93;19154:3;19065:93;:::i;:::-;19183:2;19178:3;19174:12;19167:19;;18826:366;;;:::o;19198:419::-;19364:4;19402:2;19391:9;19387:18;19379:26;;19451:9;19445:4;19441:20;19437:1;19426:9;19422:17;19415:47;19479:131;19605:4;19479:131;:::i;:::-;19471:139;;19198:419;;;:::o;19623:182::-;19763:34;19759:1;19751:6;19747:14;19740:58;19623:182;:::o;19811:366::-;19953:3;19974:67;20038:2;20033:3;19974:67;:::i;:::-;19967:74;;20050:93;20139:3;20050:93;:::i;:::-;20168:2;20163:3;20159:12;20152:19;;19811:366;;;:::o;20183:419::-;20349:4;20387:2;20376:9;20372:18;20364:26;;20436:9;20430:4;20426:20;20422:1;20411:9;20407:17;20400:47;20464:131;20590:4;20464:131;:::i;:::-;20456:139;;20183:419;;;:::o;20608:147::-;20709:11;20746:3;20731:18;;20608:147;;;;:::o;20761:114::-;;:::o;20881:398::-;21040:3;21061:83;21142:1;21137:3;21061:83;:::i;:::-;21054:90;;21153:93;21242:3;21153:93;:::i;:::-;21271:1;21266:3;21262:11;21255:18;;20881:398;;;:::o;21285:379::-;21469:3;21491:147;21634:3;21491:147;:::i;:::-;21484:154;;21655:3;21648:10;;21285:379;;;:::o;21670:222::-;21810:34;21806:1;21798:6;21794:14;21787:58;21879:5;21874:2;21866:6;21862:15;21855:30;21670:222;:::o;21898:366::-;22040:3;22061:67;22125:2;22120:3;22061:67;:::i;:::-;22054:74;;22137:93;22226:3;22137:93;:::i;:::-;22255:2;22250:3;22246:12;22239:19;;21898:366;;;:::o;22270:419::-;22436:4;22474:2;22463:9;22459:18;22451:26;;22523:9;22517:4;22513:20;22509:1;22498:9;22494:17;22487:47;22551:131;22677:4;22551:131;:::i;:::-;22543:139;;22270:419;;;:::o;22695:181::-;22835:33;22831:1;22823:6;22819:14;22812:57;22695:181;:::o;22882:366::-;23024:3;23045:67;23109:2;23104:3;23045:67;:::i;:::-;23038:74;;23121:93;23210:3;23121:93;:::i;:::-;23239:2;23234:3;23230:12;23223:19;;22882:366;;;:::o;23254:419::-;23420:4;23458:2;23447:9;23443:18;23435:26;;23507:9;23501:4;23497:20;23493:1;23482:9;23478:17;23471:47;23535:131;23661:4;23535:131;:::i;:::-;23527:139;;23254:419;;;:::o;23679:173::-;23819:25;23815:1;23807:6;23803:14;23796:49;23679:173;:::o;23858:366::-;24000:3;24021:67;24085:2;24080:3;24021:67;:::i;:::-;24014:74;;24097:93;24186:3;24097:93;:::i;:::-;24215:2;24210:3;24206:12;24199:19;;23858:366;;;:::o;24230:419::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24483:9;24477:4;24473:20;24469:1;24458:9;24454:17;24447:47;24511:131;24637:4;24511:131;:::i;:::-;24503:139;;24230:419;;;:::o;24655:180::-;24703:77;24700:1;24693:88;24800:4;24797:1;24790:15;24824:4;24821:1;24814:15;24841:305;24881:3;24900:20;24918:1;24900:20;:::i;:::-;24895:25;;24934:20;24952:1;24934:20;:::i;:::-;24929:25;;25088:1;25020:66;25016:74;25013:1;25010:81;25007:107;;;25094:18;;:::i;:::-;25007:107;25138:1;25135;25131:9;25124:16;;24841:305;;;;:::o;25152:182::-;25292:34;25288:1;25280:6;25276:14;25269:58;25152:182;:::o;25340:366::-;25482:3;25503:67;25567:2;25562:3;25503:67;:::i;:::-;25496:74;;25579:93;25668:3;25579:93;:::i;:::-;25697:2;25692:3;25688:12;25681:19;;25340:366;;;:::o;25712:419::-;25878:4;25916:2;25905:9;25901:18;25893:26;;25965:9;25959:4;25955:20;25951:1;25940:9;25936:17;25929:47;25993:131;26119:4;25993:131;:::i;:::-;25985:139;;25712:419;;;:::o;26137:166::-;26277:18;26273:1;26265:6;26261:14;26254:42;26137:166;:::o;26309:366::-;26451:3;26472:67;26536:2;26531:3;26472:67;:::i;:::-;26465:74;;26548:93;26637:3;26548:93;:::i;:::-;26666:2;26661:3;26657:12;26650:19;;26309:366;;;:::o;26681:419::-;26847:4;26885:2;26874:9;26870:18;26862:26;;26934:9;26928:4;26924:20;26920:1;26909:9;26905:17;26898:47;26962:131;27088:4;26962:131;:::i;:::-;26954:139;;26681:419;;;:::o;27106:230::-;27246:34;27242:1;27234:6;27230:14;27223:58;27315:13;27310:2;27302:6;27298:15;27291:38;27106:230;:::o;27342:366::-;27484:3;27505:67;27569:2;27564:3;27505:67;:::i;:::-;27498:74;;27581:93;27670:3;27581:93;:::i;:::-;27699:2;27694:3;27690:12;27683:19;;27342:366;;;:::o;27714:419::-;27880:4;27918:2;27907:9;27903:18;27895:26;;27967:9;27961:4;27957:20;27953:1;27942:9;27938:17;27931:47;27995:131;28121:4;27995:131;:::i;:::-;27987:139;;27714:419;;;:::o;28139:94::-;28172:8;28220:5;28216:2;28212:14;28191:35;;28139:94;;;:::o;28239:::-;28278:7;28307:20;28321:5;28307:20;:::i;:::-;28296:31;;28239:94;;;:::o;28339:100::-;28378:7;28407:26;28427:5;28407:26;:::i;:::-;28396:37;;28339:100;;;:::o;28445:157::-;28550:45;28570:24;28588:5;28570:24;:::i;:::-;28550:45;:::i;:::-;28545:3;28538:58;28445:157;;:::o;28608:256::-;28720:3;28735:75;28806:3;28797:6;28735:75;:::i;:::-;28835:2;28830:3;28826:12;28819:19;;28855:3;28848:10;;28608:256;;;;:::o;28870:165::-;29010:17;29006:1;28998:6;28994:14;28987:41;28870:165;:::o;29041:366::-;29183:3;29204:67;29268:2;29263:3;29204:67;:::i;:::-;29197:74;;29280:93;29369:3;29280:93;:::i;:::-;29398:2;29393:3;29389:12;29382:19;;29041:366;;;:::o;29413:419::-;29579:4;29617:2;29606:9;29602:18;29594:26;;29666:9;29660:4;29656:20;29652:1;29641:9;29637:17;29630:47;29694:131;29820:4;29694:131;:::i;:::-;29686:139;;29413:419;;;:::o;29838:230::-;29978:34;29974:1;29966:6;29962:14;29955:58;30047:13;30042:2;30034:6;30030:15;30023:38;29838:230;:::o;30074:366::-;30216:3;30237:67;30301:2;30296:3;30237:67;:::i;:::-;30230:74;;30313:93;30402:3;30313:93;:::i;:::-;30431:2;30426:3;30422:12;30415:19;;30074:366;;;:::o;30446:419::-;30612:4;30650:2;30639:9;30635:18;30627:26;;30699:9;30693:4;30689:20;30685:1;30674:9;30670:17;30663:47;30727:131;30853:4;30727:131;:::i;:::-;30719:139;;30446:419;;;:::o;30871:170::-;31011:22;31007:1;30999:6;30995:14;30988:46;30871:170;:::o;31047:366::-;31189:3;31210:67;31274:2;31269:3;31210:67;:::i;:::-;31203:74;;31286:93;31375:3;31286:93;:::i;:::-;31404:2;31399:3;31395:12;31388:19;;31047:366;;;:::o;31419:419::-;31585:4;31623:2;31612:9;31608:18;31600:26;;31672:9;31666:4;31662:20;31658:1;31647:9;31643:17;31636:47;31700:131;31826:4;31700:131;:::i;:::-;31692:139;;31419:419;;;:::o;31844:176::-;31984:28;31980:1;31972:6;31968:14;31961:52;31844:176;:::o;32026:366::-;32168:3;32189:67;32253:2;32248:3;32189:67;:::i;:::-;32182:74;;32265:93;32354:3;32265:93;:::i;:::-;32383:2;32378:3;32374:12;32367:19;;32026:366;;;:::o;32398:419::-;32564:4;32602:2;32591:9;32587:18;32579:26;;32651:9;32645:4;32641:20;32637:1;32626:9;32622:17;32615:47;32679:131;32805:4;32679:131;:::i;:::-;32671:139;;32398:419;;;:::o;32823:238::-;32963:34;32959:1;32951:6;32947:14;32940:58;33032:21;33027:2;33019:6;33015:15;33008:46;32823:238;:::o;33067:366::-;33209:3;33230:67;33294:2;33289:3;33230:67;:::i;:::-;33223:74;;33306:93;33395:3;33306:93;:::i;:::-;33424:2;33419:3;33415:12;33408:19;;33067:366;;;:::o;33439:419::-;33605:4;33643:2;33632:9;33628:18;33620:26;;33692:9;33686:4;33682:20;33678:1;33667:9;33663:17;33656:47;33720:131;33846:4;33720:131;:::i;:::-;33712:139;;33439:419;;;:::o;33864:234::-;34004:34;34000:1;33992:6;33988:14;33981:58;34073:17;34068:2;34060:6;34056:15;34049:42;33864:234;:::o;34104:366::-;34246:3;34267:67;34331:2;34326:3;34267:67;:::i;:::-;34260:74;;34343:93;34432:3;34343:93;:::i;:::-;34461:2;34456:3;34452:12;34445:19;;34104:366;;;:::o;34476:419::-;34642:4;34680:2;34669:9;34665:18;34657:26;;34729:9;34723:4;34719:20;34715:1;34704:9;34700:17;34693:47;34757:131;34883:4;34757:131;:::i;:::-;34749:139;;34476:419;;;:::o;34901:148::-;35003:11;35040:3;35025:18;;34901:148;;;;:::o;35055:377::-;35161:3;35189:39;35222:5;35189:39;:::i;:::-;35244:89;35326:6;35321:3;35244:89;:::i;:::-;35237:96;;35342:52;35387:6;35382:3;35375:4;35368:5;35364:16;35342:52;:::i;:::-;35419:6;35414:3;35410:16;35403:23;;35165:267;35055:377;;;;:::o;35438:435::-;35618:3;35640:95;35731:3;35722:6;35640:95;:::i;:::-;35633:102;;35752:95;35843:3;35834:6;35752:95;:::i;:::-;35745:102;;35864:3;35857:10;;35438:435;;;;;:::o;35879:225::-;36019:34;36015:1;36007:6;36003:14;35996:58;36088:8;36083:2;36075:6;36071:15;36064:33;35879:225;:::o;36110:366::-;36252:3;36273:67;36337:2;36332:3;36273:67;:::i;:::-;36266:74;;36349:93;36438:3;36349:93;:::i;:::-;36467:2;36462:3;36458:12;36451:19;;36110:366;;;:::o;36482:419::-;36648:4;36686:2;36675:9;36671:18;36663:26;;36735:9;36729:4;36725:20;36721:1;36710:9;36706:17;36699:47;36763:131;36889:4;36763:131;:::i;:::-;36755:139;;36482:419;;;:::o;36907:237::-;37047:34;37043:1;37035:6;37031:14;37024:58;37116:20;37111:2;37103:6;37099:15;37092:45;36907:237;:::o;37150:366::-;37292:3;37313:67;37377:2;37372:3;37313:67;:::i;:::-;37306:74;;37389:93;37478:3;37389:93;:::i;:::-;37507:2;37502:3;37498:12;37491:19;;37150:366;;;:::o;37522:419::-;37688:4;37726:2;37715:9;37711:18;37703:26;;37775:9;37769:4;37765:20;37761:1;37750:9;37746:17;37739:47;37803:131;37929:4;37803:131;:::i;:::-;37795:139;;37522:419;;;:::o;37947:225::-;38087:34;38083:1;38075:6;38071:14;38064:58;38156:8;38151:2;38143:6;38139:15;38132:33;37947:225;:::o;38178:366::-;38320:3;38341:67;38405:2;38400:3;38341:67;:::i;:::-;38334:74;;38417:93;38506:3;38417:93;:::i;:::-;38535:2;38530:3;38526:12;38519:19;;38178:366;;;:::o;38550:419::-;38716:4;38754:2;38743:9;38739:18;38731:26;;38803:9;38797:4;38793:20;38789:1;38778:9;38774:17;38767:47;38831:131;38957:4;38831:131;:::i;:::-;38823:139;;38550:419;;;:::o;38975:224::-;39115:34;39111:1;39103:6;39099:14;39092:58;39184:7;39179:2;39171:6;39167:15;39160:32;38975:224;:::o;39205:366::-;39347:3;39368:67;39432:2;39427:3;39368:67;:::i;:::-;39361:74;;39444:93;39533:3;39444:93;:::i;:::-;39562:2;39557:3;39553:12;39546:19;;39205:366;;;:::o;39577:419::-;39743:4;39781:2;39770:9;39766:18;39758:26;;39830:9;39824:4;39820:20;39816:1;39805:9;39801:17;39794:47;39858:131;39984:4;39858:131;:::i;:::-;39850:139;;39577:419;;;:::o;40002:229::-;40142:34;40138:1;40130:6;40126:14;40119:58;40211:12;40206:2;40198:6;40194:15;40187:37;40002:229;:::o;40237:366::-;40379:3;40400:67;40464:2;40459:3;40400:67;:::i;:::-;40393:74;;40476:93;40565:3;40476:93;:::i;:::-;40594:2;40589:3;40585:12;40578:19;;40237:366;;;:::o;40609:419::-;40775:4;40813:2;40802:9;40798:18;40790:26;;40862:9;40856:4;40852:20;40848:1;40837:9;40833:17;40826:47;40890:131;41016:4;40890:131;:::i;:::-;40882:139;;40609:419;;;:::o;41034:234::-;41174:34;41170:1;41162:6;41158:14;41151:58;41243:17;41238:2;41230:6;41226:15;41219:42;41034:234;:::o;41274:366::-;41416:3;41437:67;41501:2;41496:3;41437:67;:::i;:::-;41430:74;;41513:93;41602:3;41513:93;:::i;:::-;41631:2;41626:3;41622:12;41615:19;;41274:366;;;:::o;41646:419::-;41812:4;41850:2;41839:9;41835:18;41827:26;;41899:9;41893:4;41889:20;41885:1;41874:9;41870:17;41863:47;41927:131;42053:4;41927:131;:::i;:::-;41919:139;;41646:419;;;:::o;42071:98::-;42122:6;42156:5;42150:12;42140:22;;42071:98;;;:::o;42175:168::-;42258:11;42292:6;42287:3;42280:19;42332:4;42327:3;42323:14;42308:29;;42175:168;;;;:::o;42349:360::-;42435:3;42463:38;42495:5;42463:38;:::i;:::-;42517:70;42580:6;42575:3;42517:70;:::i;:::-;42510:77;;42596:52;42641:6;42636:3;42629:4;42622:5;42618:16;42596:52;:::i;:::-;42673:29;42695:6;42673:29;:::i;:::-;42668:3;42664:39;42657:46;;42439:270;42349:360;;;;:::o;42715:640::-;42910:4;42948:3;42937:9;42933:19;42925:27;;42962:71;43030:1;43019:9;43015:17;43006:6;42962:71;:::i;:::-;43043:72;43111:2;43100:9;43096:18;43087:6;43043:72;:::i;:::-;43125;43193:2;43182:9;43178:18;43169:6;43125:72;:::i;:::-;43244:9;43238:4;43234:20;43229:2;43218:9;43214:18;43207:48;43272:76;43343:4;43334:6;43272:76;:::i;:::-;43264:84;;42715:640;;;;;;;:::o;43361:141::-;43417:5;43448:6;43442:13;43433:22;;43464:32;43490:5;43464:32;:::i;:::-;43361:141;;;;:::o;43508:349::-;43577:6;43626:2;43614:9;43605:7;43601:23;43597:32;43594:119;;;43632:79;;:::i;:::-;43594:119;43752:1;43777:63;43832:7;43823:6;43812:9;43808:22;43777:63;:::i;:::-;43767:73;;43723:127;43508:349;;;;:::o;43863:233::-;43902:3;43925:24;43943:5;43925:24;:::i;:::-;43916:33;;43971:66;43964:5;43961:77;43958:103;;44041:18;;:::i;:::-;43958:103;44088:1;44081:5;44077:13;44070:20;;43863:233;;;:::o;44102:180::-;44150:77;44147:1;44140:88;44247:4;44244:1;44237:15;44271:4;44268:1;44261:15;44288:185;44328:1;44345:20;44363:1;44345:20;:::i;:::-;44340:25;;44379:20;44397:1;44379:20;:::i;:::-;44374:25;;44418:1;44408:35;;44423:18;;:::i;:::-;44408:35;44465:1;44462;44458:9;44453:14;;44288:185;;;;:::o;44479:191::-;44519:4;44539:20;44557:1;44539:20;:::i;:::-;44534:25;;44573:20;44591:1;44573:20;:::i;:::-;44568:25;;44612:1;44609;44606:8;44603:34;;;44617:18;;:::i;:::-;44603:34;44662:1;44659;44655:9;44647:17;;44479:191;;;;:::o;44676:176::-;44708:1;44725:20;44743:1;44725:20;:::i;:::-;44720:25;;44759:20;44777:1;44759:20;:::i;:::-;44754:25;;44798:1;44788:35;;44803:18;;:::i;:::-;44788:35;44844:1;44841;44837:9;44832:14;;44676:176;;;;:::o;44858:180::-;44906:77;44903:1;44896:88;45003:4;45000:1;44993:15;45027:4;45024:1;45017:15;45044:214;45184:66;45180:1;45172:6;45168:14;45161:90;45044:214;:::o;45264:402::-;45424:3;45445:85;45527:2;45522:3;45445:85;:::i;:::-;45438:92;;45539:93;45628:3;45539:93;:::i;:::-;45657:2;45652:3;45648:12;45641:19;;45264:402;;;:::o;45672:77::-;45709:7;45738:5;45727:16;;45672:77;;;:::o;45755:79::-;45794:7;45823:5;45812:16;;45755:79;;;:::o;45840:157::-;45945:45;45965:24;45983:5;45965:24;:::i;:::-;45945:45;:::i;:::-;45940:3;45933:58;45840:157;;:::o;46003:522::-;46216:3;46238:148;46382:3;46238:148;:::i;:::-;46231:155;;46396:75;46467:3;46458:6;46396:75;:::i;:::-;46496:2;46491:3;46487:12;46480:19;;46516:3;46509:10;;46003:522;;;;:::o;46531:180::-;46579:77;46576:1;46569:88;46676:4;46673:1;46666:15;46700:4;46697:1;46690:15;46717:174;46857:26;46853:1;46845:6;46841:14;46834:50;46717:174;:::o;46897:366::-;47039:3;47060:67;47124:2;47119:3;47060:67;:::i;:::-;47053:74;;47136:93;47225:3;47136:93;:::i;:::-;47254:2;47249:3;47245:12;47238:19;;46897:366;;;:::o;47269:419::-;47435:4;47473:2;47462:9;47458:18;47450:26;;47522:9;47516:4;47512:20;47508:1;47497:9;47493:17;47486:47;47550:131;47676:4;47550:131;:::i;:::-;47542:139;;47269:419;;;:::o;47694:181::-;47834:33;47830:1;47822:6;47818:14;47811:57;47694:181;:::o;47881:366::-;48023:3;48044:67;48108:2;48103:3;48044:67;:::i;:::-;48037:74;;48120:93;48209:3;48120:93;:::i;:::-;48238:2;48233:3;48229:12;48222:19;;47881:366;;;:::o;48253:419::-;48419:4;48457:2;48446:9;48442:18;48434:26;;48506:9;48500:4;48496:20;48492:1;48481:9;48477:17;48470:47;48534:131;48660:4;48534:131;:::i;:::-;48526:139;;48253:419;;;:::o;48678:221::-;48818:34;48814:1;48806:6;48802:14;48795:58;48887:4;48882:2;48874:6;48870:15;48863:29;48678:221;:::o;48905:366::-;49047:3;49068:67;49132:2;49127:3;49068:67;:::i;:::-;49061:74;;49144:93;49233:3;49144:93;:::i;:::-;49262:2;49257:3;49253:12;49246:19;;48905:366;;;:::o;49277:419::-;49443:4;49481:2;49470:9;49466:18;49458:26;;49530:9;49524:4;49520:20;49516:1;49505:9;49501:17;49494:47;49558:131;49684:4;49558:131;:::i;:::-;49550:139;;49277:419;;;:::o;49702:221::-;49842:34;49838:1;49830:6;49826:14;49819:58;49911:4;49906:2;49898:6;49894:15;49887:29;49702:221;:::o;49929:366::-;50071:3;50092:67;50156:2;50151:3;50092:67;:::i;:::-;50085:74;;50168:93;50257:3;50168:93;:::i;:::-;50286:2;50281:3;50277:12;50270:19;;49929:366;;;:::o;50301:419::-;50467:4;50505:2;50494:9;50490:18;50482:26;;50554:9;50548:4;50544:20;50540:1;50529:9;50525:17;50518:47;50582:131;50708:4;50582:131;:::i;:::-;50574:139;;50301:419;;;:::o;50726:220::-;50866:34;50862:1;50854:6;50850:14;50843:58;50935:3;50930:2;50922:6;50918:15;50911:28;50726:220;:::o;50952:366::-;51094:3;51115:67;51179:2;51174:3;51115:67;:::i;:::-;51108:74;;51191:93;51280:3;51191:93;:::i;:::-;51309:2;51304:3;51300:12;51293:19;;50952:366;;;:::o;51324:419::-;51490:4;51528:2;51517:9;51513:18;51505:26;;51577:9;51571:4;51567:20;51563:1;51552:9;51548:17;51541:47;51605:131;51731:4;51605:131;:::i;:::-;51597:139;;51324:419;;;:::o;51749:227::-;51889:34;51885:1;51877:6;51873:14;51866:58;51958:10;51953:2;51945:6;51941:15;51934:35;51749:227;:::o;51982:366::-;52124:3;52145:67;52209:2;52204:3;52145:67;:::i;:::-;52138:74;;52221:93;52310:3;52221:93;:::i;:::-;52339:2;52334:3;52330:12;52323:19;;51982:366;;;:::o;52354:419::-;52520:4;52558:2;52547:9;52543:18;52535:26;;52607:9;52601:4;52597:20;52593:1;52582:9;52578:17;52571:47;52635:131;52761:4;52635:131;:::i;:::-;52627:139;;52354:419;;;:::o;52779:118::-;52866:24;52884:5;52866:24;:::i;:::-;52861:3;52854:37;52779:118;;:::o;52903:86::-;52938:7;52978:4;52971:5;52967:16;52956:27;;52903:86;;;:::o;52995:112::-;53078:22;53094:5;53078:22;:::i;:::-;53073:3;53066:35;52995:112;;:::o;53113:545::-;53286:4;53324:3;53313:9;53309:19;53301:27;;53338:71;53406:1;53395:9;53391:17;53382:6;53338:71;:::i;:::-;53419:68;53483:2;53472:9;53468:18;53459:6;53419:68;:::i;:::-;53497:72;53565:2;53554:9;53550:18;53541:6;53497:72;:::i;:::-;53579;53647:2;53636:9;53632:18;53623:6;53579:72;:::i;:::-;53113:545;;;;;;;:::o

Swarm Source

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