Token Gold Partner Collection

Overview CRC721

Total Supply:
300 GPC

Holders:
109 addresses
Balance
4 GPC
0xd156f87ea9f25b7820582b460553ee621eddc258
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GoldPartner

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-03-24
*/

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/SafeMathLite.sol


pragma solidity ^0.8.4;
library SafeMathLite{

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

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

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

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


// File contracts/SafePct.sol


pragma solidity ^0.8.4;

/**
 * @dev Compute percentages safely without phantom overflows.
 *
 * Intermediate operations can overflow even when the result will always
 * fit into computed type. Developers usually
 * assume that overflows raise errors. `SafePct` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */

library SafePct {
    using SafeMathLite for uint256;
    /**
     * Requirements:
     *
     * - intermediate operations must revert on overflow
     */
    function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) {
        require(z > 0, "Division by zero");

        if (x == 0) return 0;
        uint256 xy = x * y;
        if (xy / x == y) { // no overflow happened - same as in SafeMath mul
            return xy / z;
        }

        //slither-disable-next-line divide-before-multiply
        uint256 a = x / z;
        uint256 b = x % z; // x = a * z + b

        //slither-disable-next-line divide-before-multiply
        uint256 c = y / z;
        uint256 d = y % z; // y = c * z + d

        return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z));
    }


}


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


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

pragma solidity ^0.8.0;

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


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


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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


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


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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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


// OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol)

pragma solidity ^0.8.0;


/**
 * @title Escrow
 * @dev Base escrow contract, holds funds designated for a payee until they
 * withdraw them.
 *
 * Intended usage: This contract (and derived escrow contracts) should be a
 * standalone contract, that only interacts with the contract that instantiated
 * it. That way, it is guaranteed that all Ether will be handled according to
 * the `Escrow` rules, and there is no need to check for payable functions or
 * transfers in the inheritance tree. The contract that uses the escrow as its
 * payment method should be its owner, and provide public methods redirecting
 * to the escrow's deposit and withdraw.
 */
contract Escrow is Ownable {
    using Address for address payable;

    event Deposited(address indexed payee, uint256 weiAmount);
    event Withdrawn(address indexed payee, uint256 weiAmount);

    mapping(address => uint256) private _deposits;

    function depositsOf(address payee) public view returns (uint256) {
        return _deposits[payee];
    }

    /**
     * @dev Stores the sent amount as credit to be withdrawn.
     * @param payee The destination address of the funds.
     */
    function deposit(address payee) public payable virtual onlyOwner {
        uint256 amount = msg.value;
        _deposits[payee] += amount;
        emit Deposited(payee, amount);
    }

    /**
     * @dev Withdraw accumulated balance for a payee, forwarding all gas to the
     * recipient.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee The address whose funds will be withdrawn and transferred to.
     */
    function withdraw(address payable payee) public virtual onlyOwner {
        uint256 payment = _deposits[payee];

        _deposits[payee] = 0;

        payee.sendValue(payment);

        emit Withdrawn(payee, payment);
    }
}


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


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

pragma solidity ^0.8.0;

/**
 * @dev Simple implementation of a
 * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]
 * strategy, where the paying contract doesn't interact directly with the
 * receiver account, which must withdraw its payments itself.
 *
 * Pull-payments are often considered the best practice when it comes to sending
 * Ether, security-wise. It prevents recipients from blocking execution, and
 * eliminates reentrancy concerns.
 *
 * 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].
 *
 * To use, derive from the `PullPayment` contract, and use {_asyncTransfer}
 * instead of Solidity's `transfer` function. Payees can query their due
 * payments with {payments}, and retrieve them with {withdrawPayments}.
 */
abstract contract PullPayment {
    Escrow private immutable _escrow;

    constructor() {
        _escrow = new Escrow();
    }

    /**
     * @dev Withdraw accumulated payments, forwarding all gas to the recipient.
     *
     * Note that _any_ account can call this function, not just the `payee`.
     * This means that contracts unaware of the `PullPayment` protocol can still
     * receive funds this way, by having a separate account call
     * {withdrawPayments}.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee Whose payments will be withdrawn.
     */
    function withdrawPayments(address payable payee) public virtual {
        _escrow.withdraw(payee);
    }

    /**
     * @dev Returns the payments owed to an address.
     * @param dest The creditor's address.
     */
    function payments(address dest) public view returns (uint256) {
        return _escrow.depositsOf(dest);
    }

    /**
     * @dev Called by the payer to store the sent amount as credit to be pulled.
     * Funds sent in this way are stored in an intermediate {Escrow} contract, so
     * there is no danger of them being spent before withdrawal.
     *
     * @param dest The destination address of the funds.
     * @param amount The amount to transfer.
     */
    function _asyncTransfer(address dest, uint256 amount) internal virtual {
        _escrow.deposit{value: amount}(dest);
    }
}


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


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

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

    bool private _paused;

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

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

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

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

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

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


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


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


// File contracts/BaseDrop.sol


pragma solidity ^0.8.4;
abstract contract BaseDrop is ERC721Enumerable, Ownable, PullPayment, Pausable, ReentrancyGuard {
    using Address for address payable;
   
    ERC1155 public memberships;
    address public artist;
    uint128 constant internal SCALE = 10000;
    uint128 internal fee = 2500;
    uint16[] internal order;

    function isMember(address _address) public view returns (bool) {
        return memberships.balanceOf(_address, 1) > 0 || memberships.balanceOf(_address, 2) > 0;
    }

    function withdrawPayments(address payable payee) public virtual override nonReentrant{
        super.withdrawPayments(payee);
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

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

    function pause() public onlyOwner{
        _pause();
    }

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


// File contracts/interfaces/IDrop.sol


pragma solidity ^0.8.4;


interface IDrop {
    struct Info {
        uint256 regularCost;
        uint256 memberCost;
        uint256 whitelistCost;
        uint256 maxSupply;
        uint256 totalSupply;
        uint256 maxMintPerAddress;
        uint256 maxMintPerTx;
    }
    
    function mintCost(address _minter) external view returns(uint256);
    function canMint(address _minter) external view returns (uint256);
    function mint(uint256 _amount) external payable;
    function maxSupply() external view returns (uint256);
    function getInfo() external view returns (Info memory);
}


// File contracts/drops/GoldPartner.sol


pragma solidity ^0.8.4;






contract GoldPartner is IDrop, BaseDrop {
    using Counters for Counters.Counter;
    using SafePct for uint256;
    using SafeMathLite for uint256;
    Counters.Counter public _tokenIdCounter;
    
    uint256 private whitelistCost = 325 ether;
    uint256 private memberCost = 325 ether;
    uint256 private regularCost = 375 ether;

    uint128 constant MAX_TOKENS = 300;
    uint64 constant MAX_MINTAMOUNT = 5;
    uint64 constant MAX_WALLETAMOUNT = 5;
    string baseURI = "ipfs://QmXSDbFctxtmVhvvmnDN47bqkZjgdwENzeFNzT9LBCkazr";

    mapping(address => bool) whitelist;
    mapping(address => uint8) balances;

    constructor(address _memberships, address _artist, uint16[] memory _order) ERC721("Gold Partner Collection", "GPC") {
        memberships = ERC1155(_memberships);
        artist = _artist;
        fee = 1000;
        order = _order;

        mintForArtist();
    }

    function getInfo() external override view returns (Info memory) {
        Info memory allInfo;
        allInfo.regularCost = regularCost;
        allInfo.memberCost = memberCost;
        allInfo.whitelistCost = whitelistCost;
        allInfo.maxSupply = MAX_TOKENS;
        allInfo.totalSupply = super.totalSupply();
        allInfo.maxMintPerTx = MAX_MINTAMOUNT;
        return allInfo;
    }

    function addWhiteList(address[] calldata _addresses) public onlyOwner {
        uint len = _addresses.length;
        for(uint i = 0; i < len; i ++) {
            whitelist[_addresses[i]] = true;
        }        
    }
    
    function addWhiteListAddress(address _address) public onlyOwner {
        whitelist[_address] = true;
    }

    function removeWhiteList(address _address) public onlyOwner {
        if (whitelist[_address]) {
            delete whitelist[_address];
        }
    }

    function mintCost(address _minter) external override view returns(uint256) {
        if (isWhiteList(_minter)) {
            return whitelistCost;
        } else if (isMember(_minter)) {
            return memberCost;
        } else {
            return regularCost;
        }
    }

    function isWhiteList(address _address) public view returns (bool) {
        return whitelist[_address];
    }
    
    function setRegularCost(uint256 _cost) external onlyOwner {
        regularCost = _cost;
    }

    function setMemberCost(uint256 _cost) external onlyOwner {
        memberCost = _cost;
    }

    function setWhitelistCost(uint256 _cost) external onlyOwner {
        whitelistCost = _cost;
    }

    function mintForArtist() private {
        for (uint i = 1; i <= 10; i ++) {
            _mint(artist, i);
        }
    }

    function setBaseURI(string memory _baseURI) external onlyOwner{
        baseURI = _baseURI;
    }

    function mint(uint256 _amount) external override whenNotPaused payable {
        require(_amount <= MAX_MINTAMOUNT, "not mint more than max amount");
        
        uint256 price;
        balances[msg.sender] = balances[msg.sender] + uint8(_amount);
        require(balances[msg.sender] <= MAX_WALLETAMOUNT, "exceed amount");

        if (isWhiteList(msg.sender)) {
            price = whitelistCost.mul(_amount); 
        } else {
            bool _isMember = isMember(msg.sender);
            if (_isMember){
                price = memberCost.mul(_amount); 
            } else {
                price = regularCost.mul(_amount); 
            }
        }
        
        require(msg.value >= price, "not enough funds");

        uint256 amountFee = price.mulDiv(fee, SCALE); 

        for(uint256 i = 0; i < _amount; i++){
            safeMint(msg.sender);
        }
        _asyncTransfer(artist, price - amountFee);
    }

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

      string memory _tokenURI = string(abi.encodePacked(baseURI, "/", Strings.toString(_tokenId), ".json"));

      return _tokenURI;
    }

   function safeMint(address _to) private {
        uint256 tokenId;
        
        tokenId = _tokenIdCounter.current();
        
        require(tokenId < MAX_TOKENS - 10, "sold out!");
        _tokenIdCounter.increment();

        _safeMint(_to, order[tokenId]);
    }

    function maxSupply() external override pure returns (uint256) {
        return MAX_TOKENS;
    }

    function canMint(address) external override pure returns (uint256) {
        return MAX_MINTAMOUNT;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_memberships","type":"address"},{"internalType":"address","name":"_artist","type":"address"},{"internalType":"uint16[]","name":"_order","type":"uint16[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_tokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhiteListAddress","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":[],"name":"artist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"memberships","outputs":[{"internalType":"contract ERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMemberCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setRegularCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600e80546001600160801b0319166109c417905568119e47f21381f4000060118190556012556814542ba12a337c0000601355610100604052603560a08181529062003f3660c03980516200005d9160149160209091019062000729565b503480156200006b57600080fd5b5060405162003f6b38038062003f6b8339810160408190526200008e91620008b3565b604080518082018252601781527f476f6c6420506172746e657220436f6c6c656374696f6e00000000000000000060208083019182528351808501909452600384526247504360e81b908401528151919291620000ee9160009162000729565b5080516200010490600190602084019062000729565b505050620001216200011b620001df60201b60201c565b620001e3565b6040516200012f90620007b8565b604051809103906000f0801580156200014c573d6000803e3d6000fd5b506001600160601b031960609190911b16608052600a805460ff60a01b191690556001600b55600c80546001600160a01b038581166001600160a01b031992831617909255600d805492851692909116919091179055600e80546001600160801b0319166103e81790558051620001cb90600f906020840190620007c6565b50620001d662000235565b50505062000a6b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60015b600a81116200026e57600d5462000259906001600160a01b03168262000271565b80620002658162000a21565b91505062000238565b50565b6001600160a01b038216620002cd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b6000818152600260205260409020546001600160a01b031615620003345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620002c4565b6200034260008383620003cb565b6001600160a01b03821660009081526003602052604081208054600192906200036d908490620009af565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b620003e3838383620003e860201b620016ae1760201c565b505050565b62000400838383620003e360201b62000a471760201c565b6001600160a01b0383166200045e576200045881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000484565b816001600160a01b0316836001600160a01b0316146200048457620004848382620004c4565b6001600160a01b0382166200049e57620003e38162000571565b826001600160a01b0316826001600160a01b031614620003e357620003e382826200064f565b60006001620004de84620006a060201b62000f701760201c565b620004ea9190620009ca565b6000838152600760205260409020549091508082146200053e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906200058590600190620009ca565b60008381526009602052604081205460088054939450909284908110620005bc57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110620005ec57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806200063357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006200066783620006a060201b62000f701760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b0382166200070d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620002c4565b506001600160a01b031660009081526003602052604090205490565b8280546200073790620009e4565b90600052602060002090601f0160209004810192826200075b5760008555620007a6565b82601f106200077657805160ff1916838001178555620007a6565b82800160010185558215620007a6579182015b82811115620007a657825182559160200191906001019062000789565b50620007b49291506200086c565b5090565b6105ef806200394783390190565b82805482825590600052602060002090600f01601090048101928215620007a65791602002820160005b838211156200083257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620007f0565b8015620008625782816101000a81549061ffff021916905560020160208160010104928301926001030262000832565b5050620007b49291505b5b80821115620007b457600081556001016200086d565b80516001600160a01b03811681146200089b57600080fd5b919050565b805161ffff811681146200089b57600080fd5b600080600060608486031215620008c8578283fd5b620008d38462000883565b92506020620008e481860162000883565b60408601519093506001600160401b038082111562000901578384fd5b818701915087601f83011262000915578384fd5b8151818111156200092a576200092a62000a55565b8060051b604051601f19603f8301168101818110858211171562000952576200095262000a55565b604052828152858101935084860182860187018c101562000971578788fd5b8795505b838610156200099e576200098981620008a0565b85526001959095019493860193860162000975565b508096505050505050509250925092565b60008219821115620009c557620009c562000a3f565b500190565b600082821015620009df57620009df62000a3f565b500390565b600181811c90821680620009f957607f821691505b6020821081141562000a1b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000a385762000a3862000a3f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160601c612eaf62000a986000396000818161159a01528181611ab60152611fa00152612eaf6000f3fe6080604052600436106102515760003560e01c8063715018a611610139578063b88fe6a3116100b6578063dc09e9231161007a578063dc09e923146106f7578063e1ec629414610717578063e2982c2114610737578063e985e9c514610757578063f2fde38b146107a0578063f99031a7146107c057600080fd5b8063b88fe6a314610661578063c2ba474414610681578063c87b56dd146106a2578063d49479eb146106c2578063d5abeb01146106e257600080fd5b806395d89b41116100fd57806395d89b41146105d9578063a0712d68146105ee578063a22cb46514610601578063a230c52414610621578063b88d4fde1461064157600080fd5b8063715018a61461055a5780638164c3091461056f5780638456cb591461058f57806384c4bd4b146105a45780638da5cb5b146105bb57600080fd5b80633ccfd60b116101d257806355f804b31161019657806355f804b3146104505780635a9b0b89146104705780635c975abb146104db5780635e1045ec146104fa5780636352211e1461051a57806370a082311461053a57600080fd5b80633ccfd60b146103c65780633f4ba83a146103db57806342842e0e146103f057806343bc1612146104105780634f6ccce71461043057600080fd5b80632042e5c2116102195780632042e5c21461032657806323b872dd146103465780632acc659e146103665780632f745c591461038657806331b3eb94146103a657600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e557806318160ddd14610307575b600080fd5b34801561026257600080fd5b506102766102713660046129df565b6107f9565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a061080a565b6040516102829190612bdc565b3480156102b957600080fd5b506102cd6102c8366004612a5d565b61089c565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b50610305610300366004612944565b610936565b005b34801561031357600080fd5b506008545b604051908152602001610282565b34801561033257600080fd5b50610305610341366004612802565b610a4c565b34801561035257600080fd5b50610305610361366004612856565b610abb565b34801561037257600080fd5b50610318610381366004612802565b610aec565b34801561039257600080fd5b506103186103a1366004612944565b610b33565b3480156103b257600080fd5b506103056103c1366004612802565b610bc9565b3480156103d257600080fd5b50610305610c32565b3480156103e757600080fd5b50610305610c68565b3480156103fc57600080fd5b5061030561040b366004612856565b610c9a565b34801561041c57600080fd5b50600d546102cd906001600160a01b031681565b34801561043c57600080fd5b5061031861044b366004612a5d565b610cb5565b34801561045c57600080fd5b5061030561046b366004612a17565b610d56565b34801561047c57600080fd5b50610485610d97565b6040516102829190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b3480156104e757600080fd5b50600a54600160a01b900460ff16610276565b34801561050657600080fd5b5061030561051536600461296f565b610e48565b34801561052657600080fd5b506102cd610535366004612a5d565b610ef9565b34801561054657600080fd5b50610318610555366004612802565b610f70565b34801561056657600080fd5b50610305610ff7565b34801561057b57600080fd5b5061030561058a366004612802565b61102b565b34801561059b57600080fd5b50610305611079565b3480156105b057600080fd5b506010546103189081565b3480156105c757600080fd5b50600a546001600160a01b03166102cd565b3480156105e557600080fd5b506102a06110ab565b6103056105fc366004612a5d565b6110ba565b34801561060d57600080fd5b5061030561061c366004612913565b6112e3565b34801561062d57600080fd5b5061027661063c366004612802565b6112ee565b34801561064d57600080fd5b5061030561065c366004612896565b611405565b34801561066d57600080fd5b50600c546102cd906001600160a01b031681565b34801561068d57600080fd5b5061031861069c366004612802565b50600590565b3480156106ae57600080fd5b506102a06106bd366004612a5d565b611437565b3480156106ce57600080fd5b506103056106dd366004612a5d565b6114eb565b3480156106ee57600080fd5b5061012c610318565b34801561070357600080fd5b50610305610712366004612a5d565b61151a565b34801561072357600080fd5b50610305610732366004612a5d565b611549565b34801561074357600080fd5b50610318610752366004612802565b611578565b34801561076357600080fd5b5061027661077236600461281e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ac57600080fd5b506103056107bb366004612802565b611616565b3480156107cc57600080fd5b506102766107db366004612802565b6001600160a01b031660009081526015602052604090205460ff1690565b600061080482611766565b92915050565b60606000805461081990612da2565b80601f016020809104026020016040519081016040528092919081815260200182805461084590612da2565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661091a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061094182610ef9565b9050806001600160a01b0316836001600160a01b031614156109af5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610911565b336001600160a01b03821614806109cb57506109cb8133610772565b610a3d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610911565b610a47838361178b565b505050565b600a546001600160a01b03163314610a765760405162461bcd60e51b815260040161091190612c41565b6001600160a01b03811660009081526015602052604090205460ff1615610ab8576001600160a01b0381166000908152601560205260409020805460ff191690555b50565b610ac533826117f9565b610ae15760405162461bcd60e51b815260040161091190612c76565b610a478383836118f0565b6001600160a01b03811660009081526015602052604081205460ff1615610b1557505060115490565b610b1e826112ee565b15610b2b57505060125490565b505060135490565b6000610b3e83610f70565b8210610ba05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610911565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610c1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610911565b6002600b55610c2a81611a97565b506001600b55565b600a546001600160a01b03163314610c5c5760405162461bcd60e51b815260040161091190612c41565b610c663347611b15565b565b600a546001600160a01b03163314610c925760405162461bcd60e51b815260040161091190612c41565b610c66611c2e565b610a4783838360405180602001604052806000815250611405565b6000610cc060085490565b8210610d235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610911565b60088281548110610d4457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d805760405162461bcd60e51b815260040161091190612c41565b8051610d939060149060208401906126f3565b5050565b610dd76040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b610e176040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60135481526012546020820152601154604082015261012c60608201526008546080820152600560c0820152919050565b600a546001600160a01b03163314610e725760405162461bcd60e51b815260040161091190612c41565b8060005b81811015610ef357600160156000868685818110610ea457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610eb99190612802565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610eeb81612ddd565b915050610e76565b50505050565b6000818152600260205260408120546001600160a01b0316806108045760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610911565b60006001600160a01b038216610fdb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610911565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110215760405162461bcd60e51b815260040161091190612c41565b610c666000611ccb565b600a546001600160a01b031633146110555760405162461bcd60e51b815260040161091190612c41565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b600a546001600160a01b031633146110a35760405162461bcd60e51b815260040161091190612c41565b610c66611d1d565b60606001805461081990612da2565b600a54600160a01b900460ff16156111075760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610911565b60058111156111585760405162461bcd60e51b815260206004820152601d60248201527f6e6f74206d696e74206d6f7265207468616e206d617820616d6f756e740000006044820152606401610911565b3360009081526016602052604081205461117690839060ff16612cdf565b336000908152601660205260409020805460ff191660ff929092169182179055600510156111d65760405162461bcd60e51b815260206004820152600d60248201526c195e18d9595908185b5bdd5b9d609a1b6044820152606401610911565b3360009081526015602052604090205460ff1615611202576011546111fb9083611da5565b905061123b565b600061120d336112ee565b90508015611229576012546112229084611da5565b9150611239565b6013546112369084611da5565b91505b505b8034101561127e5760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b6044820152606401610911565b600e5460009061129b9083906001600160801b0316612710611db8565b905060005b838110156112c3576112b133611eca565b806112bb81612ddd565b9150506112a0565b50600d54610a47906001600160a01b03166112de8385612d5f565b611f81565b610d93338383612002565b600c54604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190612a75565b11806108045750600c54604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b1580156113c657600080fd5b505afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190612a75565b1192915050565b61140f33836117f9565b61142b5760405162461bcd60e51b815260040161091190612c76565b610ef3848484846120d1565b6000818152600260205260409020546060906001600160a01b03166114b65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610911565b600060146114c384612104565b6040516020016114d4929190612ad5565b60408051601f198184030181529190529392505050565b600a546001600160a01b031633146115155760405162461bcd60e51b815260040161091190612c41565b601155565b600a546001600160a01b031633146115445760405162461bcd60e51b815260040161091190612c41565b601255565b600a546001600160a01b031633146115735760405162461bcd60e51b815260040161091190612c41565b601355565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a9060240160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108049190612a75565b600a546001600160a01b031633146116405760405162461bcd60e51b815260040161091190612c41565b6001600160a01b0381166116a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610911565b610ab881611ccb565b6001600160a01b0383166117095761170481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61172c565b816001600160a01b0316836001600160a01b03161461172c5761172c838261221e565b6001600160a01b03821661174357610a47816122bb565b826001600160a01b0316826001600160a01b031614610a4757610a478282612394565b60006001600160e01b0319821663780e9d6360e01b14806108045750610804826123d8565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117c082610ef9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610911565b600061187d83610ef9565b9050806001600160a01b0316846001600160a01b031614806118b85750836001600160a01b03166118ad8461089c565b6001600160a01b0316145b806118e857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661190382610ef9565b6001600160a01b0316146119675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610911565b6001600160a01b0382166119c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610911565b6119d4838383612428565b6119df60008261178b565b6001600160a01b0383166000908152600360205260408120805460019290611a08908490612d5f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a36908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b158015611afa57600080fd5b505af1158015611b0e573d6000803e3d6000fd5b5050505050565b80471015611b655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610911565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611bb2576040519150601f19603f3d011682016040523d82523d6000602084013e611bb7565b606091505b5050905080610a475760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610911565b600a54600160a01b900460ff16611c7e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610911565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff1615611d6a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610911565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cae3390565b6000611db18284612d18565b9392505050565b6000808211611dfc5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610911565b83611e0957506000611db1565b6000611e158486612d18565b905083611e228683612d04565b1415611e3a57611e328382612d04565b915050611db1565b6000611e468487612d04565b90506000611e548588612df8565b90506000611e628688612d04565b90506000611e708789612df8565b9050611ebd611e8988611e838685611da5565b90612433565b611eb7611e968686611da5565b611eb7611ea38987611da5565b611eb78d611eb18c8b611da5565b90611da5565b9061243f565b9998505050505050505050565b6000611ed560105490565b9050611ee4600a61012c612d37565b6001600160801b03168110611f275760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610911565b611f35601080546001019055565b610d9382600f8381548110611f5a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1661244b565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b031614156120645760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610911565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6120dc8484846118f0565b6120e884848484612465565b610ef35760405162461bcd60e51b815260040161091190612bef565b6060816121285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612152578061213c81612ddd565b915061214b9050600a83612d04565b915061212c565b60008167ffffffffffffffff81111561217b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121a5576020820181803683370190505b5090505b84156118e8576121ba600183612d5f565b91506121c7600a86612df8565b6121d2906030612cc7565b60f81b8183815181106121f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612217600a86612d04565b94506121a9565b6000600161222b84610f70565b6122359190612d5f565b600083815260076020526040902054909150808214612288576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122cd90600190612d5f565b6000838152600960205260408120546008805493945090928490811061230357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061233257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061237857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239f83610f70565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b148061240957506001600160e01b03198216635b5e139f60e01b145b8061080457506301ffc9a760e01b6001600160e01b0319831614610804565b610a478383836116ae565b6000611db18284612d04565b6000611db18284612cc7565b610d93828260405180602001604052806000815250612572565b60006001600160a01b0384163b1561256757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a9903390899088908890600401612b9f565b602060405180830381600087803b1580156124c357600080fd5b505af19250505080156124f3575060408051601f3d908101601f191682019092526124f0918101906129fb565b60015b61254d573d808015612521576040519150601f19603f3d011682016040523d82523d6000602084013e612526565b606091505b5080516125455760405162461bcd60e51b815260040161091190612bef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118e8565b506001949350505050565b61257c83836125a5565b6125896000848484612465565b610a475760405162461bcd60e51b815260040161091190612bef565b6001600160a01b0382166125fb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610911565b6000818152600260205260409020546001600160a01b0316156126605760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610911565b61266c60008383612428565b6001600160a01b0382166000908152600360205260408120805460019290612695908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126ff90612da2565b90600052602060002090601f0160209004810192826127215760008555612767565b82601f1061273a57805160ff1916838001178555612767565b82800160010185558215612767579182015b8281111561276757825182559160200191906001019061274c565b50612773929150612777565b5090565b5b808211156127735760008155600101612778565b600067ffffffffffffffff808411156127a7576127a7612e38565b604051601f8501601f19908116603f011681019082821181831017156127cf576127cf612e38565b816040528093508581528686860111156127e857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612813578081fd5b8135611db181612e4e565b60008060408385031215612830578081fd5b823561283b81612e4e565b9150602083013561284b81612e4e565b809150509250929050565b60008060006060848603121561286a578081fd5b833561287581612e4e565b9250602084013561288581612e4e565b929592945050506040919091013590565b600080600080608085870312156128ab578081fd5b84356128b681612e4e565b935060208501356128c681612e4e565b925060408501359150606085013567ffffffffffffffff8111156128e8578182fd5b8501601f810187136128f8578182fd5b6129078782356020840161278c565b91505092959194509250565b60008060408385031215612925578182fd5b823561293081612e4e565b91506020830135801515811461284b578182fd5b60008060408385031215612956578182fd5b823561296181612e4e565b946020939093013593505050565b60008060208385031215612981578182fd5b823567ffffffffffffffff80821115612998578384fd5b818501915085601f8301126129ab578384fd5b8135818111156129b9578485fd5b8660208260051b85010111156129cd578485fd5b60209290920196919550909350505050565b6000602082840312156129f0578081fd5b8135611db181612e63565b600060208284031215612a0c578081fd5b8151611db181612e63565b600060208284031215612a28578081fd5b813567ffffffffffffffff811115612a3e578182fd5b8201601f81018413612a4e578182fd5b6118e88482356020840161278c565b600060208284031215612a6e578081fd5b5035919050565b600060208284031215612a86578081fd5b5051919050565b60008151808452612aa5816020860160208601612d76565b601f01601f19169290920160200192915050565b60008151612acb818560208601612d76565b9290920192915050565b600080845482600182811c915080831680612af157607f831692505b6020808410821415612b1157634e487b7160e01b87526022600452602487fd5b818015612b255760018114612b3657612b62565b60ff19861689528489019650612b62565b60008b815260209020885b86811015612b5a5781548b820152908501908301612b41565b505084890196505b505050505050612b96612b85612b7f83602f60f81b815260010190565b86612ab9565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bd290830184612a8d565b9695505050505050565b602081526000611db16020830184612a8d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cda57612cda612e0c565b500190565b600060ff821660ff84168060ff03821115612cfc57612cfc612e0c565b019392505050565b600082612d1357612d13612e22565b500490565b6000816000190483118215151615612d3257612d32612e0c565b500290565b60006001600160801b0383811690831681811015612d5757612d57612e0c565b039392505050565b600082821015612d7157612d71612e0c565b500390565b60005b83811015612d91578181015183820152602001612d79565b83811115610ef35750506000910152565b600181811c90821680612db657607f821691505b60208210811415612dd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612df157612df1612e0c565b5060010190565b600082612e0757612e07612e22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ab857600080fd5b6001600160e01b031981168114610ab857600080fdfea2646970667358221220c0fd8ff50fd6b0d11440f570775c3d87c65cc57962a13aa3cae338c7538bdfc664736f6c63430008040033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105718061007e6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a61461007c5780638da5cb5b14610091578063e3a9db1a146100be578063f2fde38b14610102578063f340fa0114610122575b600080fd5b34801561006657600080fd5b5061007a6100753660046104aa565b610135565b005b34801561008857600080fd5b5061007a6101d7565b34801561009d57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100ca57600080fd5b506100f46100d93660046104aa565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100b5565b34801561010e57600080fd5b5061007a61011d3660046104aa565b61020d565b61007a6101303660046104aa565b6102a8565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906104cd565b60405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610190908261033c565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516101cb91815260200190565b60405180910390a25050565b6000546001600160a01b031633146102015760405162461bcd60e51b815260040161015f906104cd565b61020b600061045a565b565b6000546001600160a01b031633146102375760405162461bcd60e51b815260040161015f906104cd565b6001600160a01b03811661029c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015f565b6102a58161045a565b50565b6000546001600160a01b031633146102d25760405162461bcd60e51b815260040161015f906104cd565b6001600160a01b0381166000908152600160205260408120805434928392916102fc908490610502565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4906020016101cb565b8047101561038c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161015f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146103d9576040519150601f19603f3d011682016040523d82523d6000602084013e6103de565b606091505b50509050806104555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161015f565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156104bb578081fd5b81356104c681610526565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561052157634e487b7160e01b81526011600452602481fd5b500190565b6001600160a01b03811681146102a557600080fdfea264697066735822122097aaf8330e2b679c3d08b05923d025844a488ff53c65b2f148c20b20172688e864736f6c63430008040033697066733a2f2f516d5853446246637478746d566876766d6e444e343762716b5a6a676477454e7a65464e7a54394c42436b617a720000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f500000000000000000000000001220e9f944489dfa3ca81f324926ae6bb97aedc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012200000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000113000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000011c000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000011a00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000001270000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000010f000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000dd0000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000010d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000f10000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000011900000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000012300000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000010600000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000000000000000000000000000000000000000105000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000121000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001090000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000011e00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000010c00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000011d0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000012b0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000001260000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000011f000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000010700000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000001150000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000011b00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000112000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000114000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000116000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000011700000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000012500000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000010e0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c10000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000003b00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000010a0000000000000000000000000000000000000000000000000000000000000118

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063715018a611610139578063b88fe6a3116100b6578063dc09e9231161007a578063dc09e923146106f7578063e1ec629414610717578063e2982c2114610737578063e985e9c514610757578063f2fde38b146107a0578063f99031a7146107c057600080fd5b8063b88fe6a314610661578063c2ba474414610681578063c87b56dd146106a2578063d49479eb146106c2578063d5abeb01146106e257600080fd5b806395d89b41116100fd57806395d89b41146105d9578063a0712d68146105ee578063a22cb46514610601578063a230c52414610621578063b88d4fde1461064157600080fd5b8063715018a61461055a5780638164c3091461056f5780638456cb591461058f57806384c4bd4b146105a45780638da5cb5b146105bb57600080fd5b80633ccfd60b116101d257806355f804b31161019657806355f804b3146104505780635a9b0b89146104705780635c975abb146104db5780635e1045ec146104fa5780636352211e1461051a57806370a082311461053a57600080fd5b80633ccfd60b146103c65780633f4ba83a146103db57806342842e0e146103f057806343bc1612146104105780634f6ccce71461043057600080fd5b80632042e5c2116102195780632042e5c21461032657806323b872dd146103465780632acc659e146103665780632f745c591461038657806331b3eb94146103a657600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e557806318160ddd14610307575b600080fd5b34801561026257600080fd5b506102766102713660046129df565b6107f9565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a061080a565b6040516102829190612bdc565b3480156102b957600080fd5b506102cd6102c8366004612a5d565b61089c565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b50610305610300366004612944565b610936565b005b34801561031357600080fd5b506008545b604051908152602001610282565b34801561033257600080fd5b50610305610341366004612802565b610a4c565b34801561035257600080fd5b50610305610361366004612856565b610abb565b34801561037257600080fd5b50610318610381366004612802565b610aec565b34801561039257600080fd5b506103186103a1366004612944565b610b33565b3480156103b257600080fd5b506103056103c1366004612802565b610bc9565b3480156103d257600080fd5b50610305610c32565b3480156103e757600080fd5b50610305610c68565b3480156103fc57600080fd5b5061030561040b366004612856565b610c9a565b34801561041c57600080fd5b50600d546102cd906001600160a01b031681565b34801561043c57600080fd5b5061031861044b366004612a5d565b610cb5565b34801561045c57600080fd5b5061030561046b366004612a17565b610d56565b34801561047c57600080fd5b50610485610d97565b6040516102829190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b3480156104e757600080fd5b50600a54600160a01b900460ff16610276565b34801561050657600080fd5b5061030561051536600461296f565b610e48565b34801561052657600080fd5b506102cd610535366004612a5d565b610ef9565b34801561054657600080fd5b50610318610555366004612802565b610f70565b34801561056657600080fd5b50610305610ff7565b34801561057b57600080fd5b5061030561058a366004612802565b61102b565b34801561059b57600080fd5b50610305611079565b3480156105b057600080fd5b506010546103189081565b3480156105c757600080fd5b50600a546001600160a01b03166102cd565b3480156105e557600080fd5b506102a06110ab565b6103056105fc366004612a5d565b6110ba565b34801561060d57600080fd5b5061030561061c366004612913565b6112e3565b34801561062d57600080fd5b5061027661063c366004612802565b6112ee565b34801561064d57600080fd5b5061030561065c366004612896565b611405565b34801561066d57600080fd5b50600c546102cd906001600160a01b031681565b34801561068d57600080fd5b5061031861069c366004612802565b50600590565b3480156106ae57600080fd5b506102a06106bd366004612a5d565b611437565b3480156106ce57600080fd5b506103056106dd366004612a5d565b6114eb565b3480156106ee57600080fd5b5061012c610318565b34801561070357600080fd5b50610305610712366004612a5d565b61151a565b34801561072357600080fd5b50610305610732366004612a5d565b611549565b34801561074357600080fd5b50610318610752366004612802565b611578565b34801561076357600080fd5b5061027661077236600461281e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ac57600080fd5b506103056107bb366004612802565b611616565b3480156107cc57600080fd5b506102766107db366004612802565b6001600160a01b031660009081526015602052604090205460ff1690565b600061080482611766565b92915050565b60606000805461081990612da2565b80601f016020809104026020016040519081016040528092919081815260200182805461084590612da2565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661091a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061094182610ef9565b9050806001600160a01b0316836001600160a01b031614156109af5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610911565b336001600160a01b03821614806109cb57506109cb8133610772565b610a3d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610911565b610a47838361178b565b505050565b600a546001600160a01b03163314610a765760405162461bcd60e51b815260040161091190612c41565b6001600160a01b03811660009081526015602052604090205460ff1615610ab8576001600160a01b0381166000908152601560205260409020805460ff191690555b50565b610ac533826117f9565b610ae15760405162461bcd60e51b815260040161091190612c76565b610a478383836118f0565b6001600160a01b03811660009081526015602052604081205460ff1615610b1557505060115490565b610b1e826112ee565b15610b2b57505060125490565b505060135490565b6000610b3e83610f70565b8210610ba05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610911565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600b541415610c1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610911565b6002600b55610c2a81611a97565b506001600b55565b600a546001600160a01b03163314610c5c5760405162461bcd60e51b815260040161091190612c41565b610c663347611b15565b565b600a546001600160a01b03163314610c925760405162461bcd60e51b815260040161091190612c41565b610c66611c2e565b610a4783838360405180602001604052806000815250611405565b6000610cc060085490565b8210610d235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610911565b60088281548110610d4457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d805760405162461bcd60e51b815260040161091190612c41565b8051610d939060149060208401906126f3565b5050565b610dd76040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b610e176040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60135481526012546020820152601154604082015261012c60608201526008546080820152600560c0820152919050565b600a546001600160a01b03163314610e725760405162461bcd60e51b815260040161091190612c41565b8060005b81811015610ef357600160156000868685818110610ea457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610eb99190612802565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610eeb81612ddd565b915050610e76565b50505050565b6000818152600260205260408120546001600160a01b0316806108045760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610911565b60006001600160a01b038216610fdb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610911565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110215760405162461bcd60e51b815260040161091190612c41565b610c666000611ccb565b600a546001600160a01b031633146110555760405162461bcd60e51b815260040161091190612c41565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b600a546001600160a01b031633146110a35760405162461bcd60e51b815260040161091190612c41565b610c66611d1d565b60606001805461081990612da2565b600a54600160a01b900460ff16156111075760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610911565b60058111156111585760405162461bcd60e51b815260206004820152601d60248201527f6e6f74206d696e74206d6f7265207468616e206d617820616d6f756e740000006044820152606401610911565b3360009081526016602052604081205461117690839060ff16612cdf565b336000908152601660205260409020805460ff191660ff929092169182179055600510156111d65760405162461bcd60e51b815260206004820152600d60248201526c195e18d9595908185b5bdd5b9d609a1b6044820152606401610911565b3360009081526015602052604090205460ff1615611202576011546111fb9083611da5565b905061123b565b600061120d336112ee565b90508015611229576012546112229084611da5565b9150611239565b6013546112369084611da5565b91505b505b8034101561127e5760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b6044820152606401610911565b600e5460009061129b9083906001600160801b0316612710611db8565b905060005b838110156112c3576112b133611eca565b806112bb81612ddd565b9150506112a0565b50600d54610a47906001600160a01b03166112de8385612d5f565b611f81565b610d93338383612002565b600c54604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190612a75565b11806108045750600c54604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b1580156113c657600080fd5b505afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190612a75565b1192915050565b61140f33836117f9565b61142b5760405162461bcd60e51b815260040161091190612c76565b610ef3848484846120d1565b6000818152600260205260409020546060906001600160a01b03166114b65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610911565b600060146114c384612104565b6040516020016114d4929190612ad5565b60408051601f198184030181529190529392505050565b600a546001600160a01b031633146115155760405162461bcd60e51b815260040161091190612c41565b601155565b600a546001600160a01b031633146115445760405162461bcd60e51b815260040161091190612c41565b601255565b600a546001600160a01b031633146115735760405162461bcd60e51b815260040161091190612c41565b601355565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f000000000000000000000000c084169695fd91e44ac5c4b18cc0fd12bf51b4fb9091169063e3a9db1a9060240160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108049190612a75565b600a546001600160a01b031633146116405760405162461bcd60e51b815260040161091190612c41565b6001600160a01b0381166116a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610911565b610ab881611ccb565b6001600160a01b0383166117095761170481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61172c565b816001600160a01b0316836001600160a01b03161461172c5761172c838261221e565b6001600160a01b03821661174357610a47816122bb565b826001600160a01b0316826001600160a01b031614610a4757610a478282612394565b60006001600160e01b0319821663780e9d6360e01b14806108045750610804826123d8565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117c082610ef9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610911565b600061187d83610ef9565b9050806001600160a01b0316846001600160a01b031614806118b85750836001600160a01b03166118ad8461089c565b6001600160a01b0316145b806118e857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661190382610ef9565b6001600160a01b0316146119675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610911565b6001600160a01b0382166119c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610911565b6119d4838383612428565b6119df60008261178b565b6001600160a01b0383166000908152600360205260408120805460019290611a08908490612d5f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a36908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000c084169695fd91e44ac5c4b18cc0fd12bf51b4fb16906351cff8d990602401600060405180830381600087803b158015611afa57600080fd5b505af1158015611b0e573d6000803e3d6000fd5b5050505050565b80471015611b655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610911565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611bb2576040519150601f19603f3d011682016040523d82523d6000602084013e611bb7565b606091505b5050905080610a475760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610911565b600a54600160a01b900460ff16611c7e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610911565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff1615611d6a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610911565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cae3390565b6000611db18284612d18565b9392505050565b6000808211611dfc5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610911565b83611e0957506000611db1565b6000611e158486612d18565b905083611e228683612d04565b1415611e3a57611e328382612d04565b915050611db1565b6000611e468487612d04565b90506000611e548588612df8565b90506000611e628688612d04565b90506000611e708789612df8565b9050611ebd611e8988611e838685611da5565b90612433565b611eb7611e968686611da5565b611eb7611ea38987611da5565b611eb78d611eb18c8b611da5565b90611da5565b9061243f565b9998505050505050505050565b6000611ed560105490565b9050611ee4600a61012c612d37565b6001600160801b03168110611f275760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610911565b611f35601080546001019055565b610d9382600f8381548110611f5a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1661244b565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f000000000000000000000000c084169695fd91e44ac5c4b18cc0fd12bf51b4fb169063f340fa019083906024016000604051808303818588803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b031614156120645760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610911565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6120dc8484846118f0565b6120e884848484612465565b610ef35760405162461bcd60e51b815260040161091190612bef565b6060816121285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612152578061213c81612ddd565b915061214b9050600a83612d04565b915061212c565b60008167ffffffffffffffff81111561217b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121a5576020820181803683370190505b5090505b84156118e8576121ba600183612d5f565b91506121c7600a86612df8565b6121d2906030612cc7565b60f81b8183815181106121f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612217600a86612d04565b94506121a9565b6000600161222b84610f70565b6122359190612d5f565b600083815260076020526040902054909150808214612288576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122cd90600190612d5f565b6000838152600960205260408120546008805493945090928490811061230357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061233257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061237857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239f83610f70565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b148061240957506001600160e01b03198216635b5e139f60e01b145b8061080457506301ffc9a760e01b6001600160e01b0319831614610804565b610a478383836116ae565b6000611db18284612d04565b6000611db18284612cc7565b610d93828260405180602001604052806000815250612572565b60006001600160a01b0384163b1561256757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a9903390899088908890600401612b9f565b602060405180830381600087803b1580156124c357600080fd5b505af19250505080156124f3575060408051601f3d908101601f191682019092526124f0918101906129fb565b60015b61254d573d808015612521576040519150601f19603f3d011682016040523d82523d6000602084013e612526565b606091505b5080516125455760405162461bcd60e51b815260040161091190612bef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118e8565b506001949350505050565b61257c83836125a5565b6125896000848484612465565b610a475760405162461bcd60e51b815260040161091190612bef565b6001600160a01b0382166125fb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610911565b6000818152600260205260409020546001600160a01b0316156126605760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610911565b61266c60008383612428565b6001600160a01b0382166000908152600360205260408120805460019290612695908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126ff90612da2565b90600052602060002090601f0160209004810192826127215760008555612767565b82601f1061273a57805160ff1916838001178555612767565b82800160010185558215612767579182015b8281111561276757825182559160200191906001019061274c565b50612773929150612777565b5090565b5b808211156127735760008155600101612778565b600067ffffffffffffffff808411156127a7576127a7612e38565b604051601f8501601f19908116603f011681019082821181831017156127cf576127cf612e38565b816040528093508581528686860111156127e857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612813578081fd5b8135611db181612e4e565b60008060408385031215612830578081fd5b823561283b81612e4e565b9150602083013561284b81612e4e565b809150509250929050565b60008060006060848603121561286a578081fd5b833561287581612e4e565b9250602084013561288581612e4e565b929592945050506040919091013590565b600080600080608085870312156128ab578081fd5b84356128b681612e4e565b935060208501356128c681612e4e565b925060408501359150606085013567ffffffffffffffff8111156128e8578182fd5b8501601f810187136128f8578182fd5b6129078782356020840161278c565b91505092959194509250565b60008060408385031215612925578182fd5b823561293081612e4e565b91506020830135801515811461284b578182fd5b60008060408385031215612956578182fd5b823561296181612e4e565b946020939093013593505050565b60008060208385031215612981578182fd5b823567ffffffffffffffff80821115612998578384fd5b818501915085601f8301126129ab578384fd5b8135818111156129b9578485fd5b8660208260051b85010111156129cd578485fd5b60209290920196919550909350505050565b6000602082840312156129f0578081fd5b8135611db181612e63565b600060208284031215612a0c578081fd5b8151611db181612e63565b600060208284031215612a28578081fd5b813567ffffffffffffffff811115612a3e578182fd5b8201601f81018413612a4e578182fd5b6118e88482356020840161278c565b600060208284031215612a6e578081fd5b5035919050565b600060208284031215612a86578081fd5b5051919050565b60008151808452612aa5816020860160208601612d76565b601f01601f19169290920160200192915050565b60008151612acb818560208601612d76565b9290920192915050565b600080845482600182811c915080831680612af157607f831692505b6020808410821415612b1157634e487b7160e01b87526022600452602487fd5b818015612b255760018114612b3657612b62565b60ff19861689528489019650612b62565b60008b815260209020885b86811015612b5a5781548b820152908501908301612b41565b505084890196505b505050505050612b96612b85612b7f83602f60f81b815260010190565b86612ab9565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bd290830184612a8d565b9695505050505050565b602081526000611db16020830184612a8d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cda57612cda612e0c565b500190565b600060ff821660ff84168060ff03821115612cfc57612cfc612e0c565b019392505050565b600082612d1357612d13612e22565b500490565b6000816000190483118215151615612d3257612d32612e0c565b500290565b60006001600160801b0383811690831681811015612d5757612d57612e0c565b039392505050565b600082821015612d7157612d71612e0c565b500390565b60005b83811015612d91578181015183820152602001612d79565b83811115610ef35750506000910152565b600181811c90821680612db657607f821691505b60208210811415612dd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612df157612df1612e0c565b5060010190565b600082612e0757612e07612e22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ab857600080fd5b6001600160e01b031981168114610ab857600080fdfea2646970667358221220c0fd8ff50fd6b0d11440f570775c3d87c65cc57962a13aa3cae338c7538bdfc664736f6c63430008040033

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

0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f500000000000000000000000001220e9f944489dfa3ca81f324926ae6bb97aedc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012200000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000113000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000011c000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000011a00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000001270000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000010f000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000dd0000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000010d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000f10000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000011900000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000012300000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000010600000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000000000000000000000000000000000000000105000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000121000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000001090000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000011e00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000010c00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000011d0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000012b0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000001260000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000011f000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000010700000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000001150000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000011b00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000112000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000114000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000116000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000011700000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000012500000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000010e0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c10000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000003b00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000010a0000000000000000000000000000000000000000000000000000000000000118

-----Decoded View---------------
Arg [0] : _memberships (address): 0x8d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [1] : _artist (address): 0x01220e9f944489dfa3ca81f324926ae6bb97aedc
Arg [2] : _order (uint16[]): 207,98,197,222,44,244,99,159,150,41,136,196,78,84,24,275,12,22,239,11,201,122,260,137,227,284,135,184,16,212,230,282,169,295,128,115,249,46,168,271,30,134,185,161,173,79,214,221,89,298,95,216,199,40,191,54,69,269,126,141,144,124,61,73,172,241,21,256,258,48,281,202,247,264,156,291,240,143,152,251,288,80,26,32,178,45,231,160,70,60,96,145,121,190,262,208,252,101,297,267,153,236,83,167,43,87,255,75,154,42,55,93,218,261,112,253,235,204,20,232,225,189,58,102,56,109,223,157,174,36,206,289,107,226,179,215,72,238,219,265,103,63,117,108,146,37,31,166,254,205,66,171,162,176,133,158,17,123,155,290,286,151,118,82,250,213,114,242,300,92,116,234,13,268,186,246,90,259,211,182,285,120,139,53,51,299,119,292,245,18,28,163,131,47,23,164,294,100,287,94,220,228,263,237,65,277,39,113,85,81,57,217,33,148,283,170,188,25,243,142,274,74,68,187,138,15,296,130,106,147,19,276,77,273,278,86,203,248,140,200,279,183,129,104,105,111,91,257,14,127,233,71,192,110,293,177,210,76,52,209,195,27,67,35,165,270,88,97,198,194,193,50,125,49,34,272,38,132,64,229,175,29,224,149,62,181,59,180,266,280

-----Encoded View---------------
294 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [1] : 00000000000000000000000001220e9f944489dfa3ca81f324926ae6bb97aedc
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000122
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000cf
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000062
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000c5
Arg [7] : 00000000000000000000000000000000000000000000000000000000000000de
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [9] : 00000000000000000000000000000000000000000000000000000000000000f4
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000063
Arg [11] : 000000000000000000000000000000000000000000000000000000000000009f
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000088
Arg [15] : 00000000000000000000000000000000000000000000000000000000000000c4
Arg [16] : 000000000000000000000000000000000000000000000000000000000000004e
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000054
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000113
Arg [20] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [22] : 00000000000000000000000000000000000000000000000000000000000000ef
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [24] : 00000000000000000000000000000000000000000000000000000000000000c9
Arg [25] : 000000000000000000000000000000000000000000000000000000000000007a
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000104
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000089
Arg [28] : 00000000000000000000000000000000000000000000000000000000000000e3
Arg [29] : 000000000000000000000000000000000000000000000000000000000000011c
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000087
Arg [31] : 00000000000000000000000000000000000000000000000000000000000000b8
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [33] : 00000000000000000000000000000000000000000000000000000000000000d4
Arg [34] : 00000000000000000000000000000000000000000000000000000000000000e6
Arg [35] : 000000000000000000000000000000000000000000000000000000000000011a
Arg [36] : 00000000000000000000000000000000000000000000000000000000000000a9
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000127
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000073
Arg [40] : 00000000000000000000000000000000000000000000000000000000000000f9
Arg [41] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [42] : 00000000000000000000000000000000000000000000000000000000000000a8
Arg [43] : 000000000000000000000000000000000000000000000000000000000000010f
Arg [44] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000086
Arg [46] : 00000000000000000000000000000000000000000000000000000000000000b9
Arg [47] : 00000000000000000000000000000000000000000000000000000000000000a1
Arg [48] : 00000000000000000000000000000000000000000000000000000000000000ad
Arg [49] : 000000000000000000000000000000000000000000000000000000000000004f
Arg [50] : 00000000000000000000000000000000000000000000000000000000000000d6
Arg [51] : 00000000000000000000000000000000000000000000000000000000000000dd
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [53] : 000000000000000000000000000000000000000000000000000000000000012a
Arg [54] : 000000000000000000000000000000000000000000000000000000000000005f
Arg [55] : 00000000000000000000000000000000000000000000000000000000000000d8
Arg [56] : 00000000000000000000000000000000000000000000000000000000000000c7
Arg [57] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [58] : 00000000000000000000000000000000000000000000000000000000000000bf
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [61] : 000000000000000000000000000000000000000000000000000000000000010d
Arg [62] : 000000000000000000000000000000000000000000000000000000000000007e
Arg [63] : 000000000000000000000000000000000000000000000000000000000000008d
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000090
Arg [65] : 000000000000000000000000000000000000000000000000000000000000007c
Arg [66] : 000000000000000000000000000000000000000000000000000000000000003d
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000049
Arg [68] : 00000000000000000000000000000000000000000000000000000000000000ac
Arg [69] : 00000000000000000000000000000000000000000000000000000000000000f1
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000102
Arg [73] : 0000000000000000000000000000000000000000000000000000000000000030
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000119
Arg [75] : 00000000000000000000000000000000000000000000000000000000000000ca
Arg [76] : 00000000000000000000000000000000000000000000000000000000000000f7
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000108
Arg [78] : 000000000000000000000000000000000000000000000000000000000000009c
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000123
Arg [80] : 00000000000000000000000000000000000000000000000000000000000000f0
Arg [81] : 000000000000000000000000000000000000000000000000000000000000008f
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000098
Arg [83] : 00000000000000000000000000000000000000000000000000000000000000fb
Arg [84] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [85] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [86] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [87] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [88] : 00000000000000000000000000000000000000000000000000000000000000b2
Arg [89] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [90] : 00000000000000000000000000000000000000000000000000000000000000e7
Arg [91] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [92] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [93] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [94] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [95] : 0000000000000000000000000000000000000000000000000000000000000091
Arg [96] : 0000000000000000000000000000000000000000000000000000000000000079
Arg [97] : 00000000000000000000000000000000000000000000000000000000000000be
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000106
Arg [99] : 00000000000000000000000000000000000000000000000000000000000000d0
Arg [100] : 00000000000000000000000000000000000000000000000000000000000000fc
Arg [101] : 0000000000000000000000000000000000000000000000000000000000000065
Arg [102] : 0000000000000000000000000000000000000000000000000000000000000129
Arg [103] : 000000000000000000000000000000000000000000000000000000000000010b
Arg [104] : 0000000000000000000000000000000000000000000000000000000000000099
Arg [105] : 00000000000000000000000000000000000000000000000000000000000000ec
Arg [106] : 0000000000000000000000000000000000000000000000000000000000000053
Arg [107] : 00000000000000000000000000000000000000000000000000000000000000a7
Arg [108] : 000000000000000000000000000000000000000000000000000000000000002b
Arg [109] : 0000000000000000000000000000000000000000000000000000000000000057
Arg [110] : 00000000000000000000000000000000000000000000000000000000000000ff
Arg [111] : 000000000000000000000000000000000000000000000000000000000000004b
Arg [112] : 000000000000000000000000000000000000000000000000000000000000009a
Arg [113] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [114] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [115] : 000000000000000000000000000000000000000000000000000000000000005d
Arg [116] : 00000000000000000000000000000000000000000000000000000000000000da
Arg [117] : 0000000000000000000000000000000000000000000000000000000000000105
Arg [118] : 0000000000000000000000000000000000000000000000000000000000000070
Arg [119] : 00000000000000000000000000000000000000000000000000000000000000fd
Arg [120] : 00000000000000000000000000000000000000000000000000000000000000eb
Arg [121] : 00000000000000000000000000000000000000000000000000000000000000cc
Arg [122] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [123] : 00000000000000000000000000000000000000000000000000000000000000e8
Arg [124] : 00000000000000000000000000000000000000000000000000000000000000e1
Arg [125] : 00000000000000000000000000000000000000000000000000000000000000bd
Arg [126] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [127] : 0000000000000000000000000000000000000000000000000000000000000066
Arg [128] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [129] : 000000000000000000000000000000000000000000000000000000000000006d
Arg [130] : 00000000000000000000000000000000000000000000000000000000000000df
Arg [131] : 000000000000000000000000000000000000000000000000000000000000009d
Arg [132] : 00000000000000000000000000000000000000000000000000000000000000ae
Arg [133] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [134] : 00000000000000000000000000000000000000000000000000000000000000ce
Arg [135] : 0000000000000000000000000000000000000000000000000000000000000121
Arg [136] : 000000000000000000000000000000000000000000000000000000000000006b
Arg [137] : 00000000000000000000000000000000000000000000000000000000000000e2
Arg [138] : 00000000000000000000000000000000000000000000000000000000000000b3
Arg [139] : 00000000000000000000000000000000000000000000000000000000000000d7
Arg [140] : 0000000000000000000000000000000000000000000000000000000000000048
Arg [141] : 00000000000000000000000000000000000000000000000000000000000000ee
Arg [142] : 00000000000000000000000000000000000000000000000000000000000000db
Arg [143] : 0000000000000000000000000000000000000000000000000000000000000109
Arg [144] : 0000000000000000000000000000000000000000000000000000000000000067
Arg [145] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [146] : 0000000000000000000000000000000000000000000000000000000000000075
Arg [147] : 000000000000000000000000000000000000000000000000000000000000006c
Arg [148] : 0000000000000000000000000000000000000000000000000000000000000092
Arg [149] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [150] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [151] : 00000000000000000000000000000000000000000000000000000000000000a6
Arg [152] : 00000000000000000000000000000000000000000000000000000000000000fe
Arg [153] : 00000000000000000000000000000000000000000000000000000000000000cd
Arg [154] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [155] : 00000000000000000000000000000000000000000000000000000000000000ab
Arg [156] : 00000000000000000000000000000000000000000000000000000000000000a2
Arg [157] : 00000000000000000000000000000000000000000000000000000000000000b0
Arg [158] : 0000000000000000000000000000000000000000000000000000000000000085
Arg [159] : 000000000000000000000000000000000000000000000000000000000000009e
Arg [160] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [161] : 000000000000000000000000000000000000000000000000000000000000007b
Arg [162] : 000000000000000000000000000000000000000000000000000000000000009b
Arg [163] : 0000000000000000000000000000000000000000000000000000000000000122
Arg [164] : 000000000000000000000000000000000000000000000000000000000000011e
Arg [165] : 0000000000000000000000000000000000000000000000000000000000000097
Arg [166] : 0000000000000000000000000000000000000000000000000000000000000076
Arg [167] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [168] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [169] : 00000000000000000000000000000000000000000000000000000000000000d5
Arg [170] : 0000000000000000000000000000000000000000000000000000000000000072
Arg [171] : 00000000000000000000000000000000000000000000000000000000000000f2
Arg [172] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [173] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [174] : 0000000000000000000000000000000000000000000000000000000000000074
Arg [175] : 00000000000000000000000000000000000000000000000000000000000000ea
Arg [176] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [177] : 000000000000000000000000000000000000000000000000000000000000010c
Arg [178] : 00000000000000000000000000000000000000000000000000000000000000ba
Arg [179] : 00000000000000000000000000000000000000000000000000000000000000f6
Arg [180] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [181] : 0000000000000000000000000000000000000000000000000000000000000103
Arg [182] : 00000000000000000000000000000000000000000000000000000000000000d3
Arg [183] : 00000000000000000000000000000000000000000000000000000000000000b6
Arg [184] : 000000000000000000000000000000000000000000000000000000000000011d
Arg [185] : 0000000000000000000000000000000000000000000000000000000000000078
Arg [186] : 000000000000000000000000000000000000000000000000000000000000008b
Arg [187] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [188] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [189] : 000000000000000000000000000000000000000000000000000000000000012b
Arg [190] : 0000000000000000000000000000000000000000000000000000000000000077
Arg [191] : 0000000000000000000000000000000000000000000000000000000000000124
Arg [192] : 00000000000000000000000000000000000000000000000000000000000000f5
Arg [193] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [194] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [195] : 00000000000000000000000000000000000000000000000000000000000000a3
Arg [196] : 0000000000000000000000000000000000000000000000000000000000000083
Arg [197] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [198] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [199] : 00000000000000000000000000000000000000000000000000000000000000a4
Arg [200] : 0000000000000000000000000000000000000000000000000000000000000126
Arg [201] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [202] : 000000000000000000000000000000000000000000000000000000000000011f
Arg [203] : 000000000000000000000000000000000000000000000000000000000000005e
Arg [204] : 00000000000000000000000000000000000000000000000000000000000000dc
Arg [205] : 00000000000000000000000000000000000000000000000000000000000000e4
Arg [206] : 0000000000000000000000000000000000000000000000000000000000000107
Arg [207] : 00000000000000000000000000000000000000000000000000000000000000ed
Arg [208] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [209] : 0000000000000000000000000000000000000000000000000000000000000115
Arg [210] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [211] : 0000000000000000000000000000000000000000000000000000000000000071
Arg [212] : 0000000000000000000000000000000000000000000000000000000000000055
Arg [213] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [214] : 0000000000000000000000000000000000000000000000000000000000000039
Arg [215] : 00000000000000000000000000000000000000000000000000000000000000d9
Arg [216] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [217] : 0000000000000000000000000000000000000000000000000000000000000094
Arg [218] : 000000000000000000000000000000000000000000000000000000000000011b
Arg [219] : 00000000000000000000000000000000000000000000000000000000000000aa
Arg [220] : 00000000000000000000000000000000000000000000000000000000000000bc
Arg [221] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [222] : 00000000000000000000000000000000000000000000000000000000000000f3
Arg [223] : 000000000000000000000000000000000000000000000000000000000000008e
Arg [224] : 0000000000000000000000000000000000000000000000000000000000000112
Arg [225] : 000000000000000000000000000000000000000000000000000000000000004a
Arg [226] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [227] : 00000000000000000000000000000000000000000000000000000000000000bb
Arg [228] : 000000000000000000000000000000000000000000000000000000000000008a
Arg [229] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [230] : 0000000000000000000000000000000000000000000000000000000000000128
Arg [231] : 0000000000000000000000000000000000000000000000000000000000000082
Arg [232] : 000000000000000000000000000000000000000000000000000000000000006a
Arg [233] : 0000000000000000000000000000000000000000000000000000000000000093
Arg [234] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [235] : 0000000000000000000000000000000000000000000000000000000000000114
Arg [236] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [237] : 0000000000000000000000000000000000000000000000000000000000000111
Arg [238] : 0000000000000000000000000000000000000000000000000000000000000116
Arg [239] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [240] : 00000000000000000000000000000000000000000000000000000000000000cb
Arg [241] : 00000000000000000000000000000000000000000000000000000000000000f8
Arg [242] : 000000000000000000000000000000000000000000000000000000000000008c
Arg [243] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [244] : 0000000000000000000000000000000000000000000000000000000000000117
Arg [245] : 00000000000000000000000000000000000000000000000000000000000000b7
Arg [246] : 0000000000000000000000000000000000000000000000000000000000000081
Arg [247] : 0000000000000000000000000000000000000000000000000000000000000068
Arg [248] : 0000000000000000000000000000000000000000000000000000000000000069
Arg [249] : 000000000000000000000000000000000000000000000000000000000000006f
Arg [250] : 000000000000000000000000000000000000000000000000000000000000005b
Arg [251] : 0000000000000000000000000000000000000000000000000000000000000101
Arg [252] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [253] : 000000000000000000000000000000000000000000000000000000000000007f
Arg [254] : 00000000000000000000000000000000000000000000000000000000000000e9
Arg [255] : 0000000000000000000000000000000000000000000000000000000000000047
Arg [256] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [257] : 000000000000000000000000000000000000000000000000000000000000006e
Arg [258] : 0000000000000000000000000000000000000000000000000000000000000125
Arg [259] : 00000000000000000000000000000000000000000000000000000000000000b1
Arg [260] : 00000000000000000000000000000000000000000000000000000000000000d2
Arg [261] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [262] : 0000000000000000000000000000000000000000000000000000000000000034
Arg [263] : 00000000000000000000000000000000000000000000000000000000000000d1
Arg [264] : 00000000000000000000000000000000000000000000000000000000000000c3
Arg [265] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [266] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [267] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [268] : 00000000000000000000000000000000000000000000000000000000000000a5
Arg [269] : 000000000000000000000000000000000000000000000000000000000000010e
Arg [270] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [271] : 0000000000000000000000000000000000000000000000000000000000000061
Arg [272] : 00000000000000000000000000000000000000000000000000000000000000c6
Arg [273] : 00000000000000000000000000000000000000000000000000000000000000c2
Arg [274] : 00000000000000000000000000000000000000000000000000000000000000c1
Arg [275] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [276] : 000000000000000000000000000000000000000000000000000000000000007d
Arg [277] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [278] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [279] : 0000000000000000000000000000000000000000000000000000000000000110
Arg [280] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [281] : 0000000000000000000000000000000000000000000000000000000000000084
Arg [282] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [283] : 00000000000000000000000000000000000000000000000000000000000000e5
Arg [284] : 00000000000000000000000000000000000000000000000000000000000000af
Arg [285] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [286] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [287] : 0000000000000000000000000000000000000000000000000000000000000095
Arg [288] : 000000000000000000000000000000000000000000000000000000000000003e
Arg [289] : 00000000000000000000000000000000000000000000000000000000000000b5
Arg [290] : 000000000000000000000000000000000000000000000000000000000000003b
Arg [291] : 00000000000000000000000000000000000000000000000000000000000000b4
Arg [292] : 000000000000000000000000000000000000000000000000000000000000010a
Arg [293] : 0000000000000000000000000000000000000000000000000000000000000118


Deployed ByteCode Sourcemap

88311:4611:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87147:145;;;;;;;;;;-1:-1:-1;87147:145:0;;;;;:::i;:::-;;:::i;:::-;;;9734:14:1;;9727:22;9709:41;;9697:2;9682:18;87147:145:0;;;;;;;;53199:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54758:221::-;;;;;;;;;;-1:-1:-1;54758:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8234:32:1;;;8216:51;;8204:2;8189:18;54758:221:0;8171:102:1;54281:411:0;;;;;;;;;;-1:-1:-1;54281:411:0;;;;;:::i;:::-;;:::i;:::-;;68111:113;;;;;;;;;;-1:-1:-1;68199:10:0;:17;68111:113;;;21736:25:1;;;21724:2;21709:18;68111:113:0;21691:76:1;89993:156:0;;;;;;;;;;-1:-1:-1;89993:156:0;;;;;:::i;:::-;;:::i;55508:339::-;;;;;;;;;;-1:-1:-1;55508:339:0;;;;;:::i;:::-;;:::i;90157:290::-;;;;;;;;;;-1:-1:-1;90157:290:0;;;;;:::i;:::-;;:::i;67779:256::-;;;;;;;;;;-1:-1:-1;67779:256:0;;;;;:::i;:::-;;:::i;86775:133::-;;;;;;;;;;-1:-1:-1;86775:133:0;;;;;:::i;:::-;;:::i;87300:115::-;;;;;;;;;;;;;:::i;87491:64::-;;;;;;;;;;;;;:::i;55918:185::-;;;;;;;;;;-1:-1:-1;55918:185:0;;;;;:::i;:::-;;:::i;86458:21::-;;;;;;;;;;-1:-1:-1;86458:21:0;;;;-1:-1:-1;;;;;86458:21:0;;;68301:233;;;;;;;;;;-1:-1:-1;68301:233:0;;;;;:::i;:::-;;:::i;91026:99::-;;;;;;;;;;-1:-1:-1;91026:99:0;;;;;:::i;:::-;;:::i;89230:402::-;;;;;;;;;;;;;:::i;:::-;;;;;;21114:4:1;21156:3;21145:9;21141:19;21133:27;;21193:6;21187:13;21176:9;21169:32;21257:4;21249:6;21245:17;21239:24;21232:4;21221:9;21217:20;21210:54;21320:4;21312:6;21308:17;21302:24;21295:4;21284:9;21280:20;21273:54;21383:4;21375:6;21371:17;21365:24;21358:4;21347:9;21343:20;21336:54;21446:4;21438:6;21434:17;21428:24;21421:4;21410:9;21406:20;21399:54;21509:4;21501:6;21497:17;21491:24;21484:4;21473:9;21469:20;21462:54;21572:4;21564:6;21560:17;21554:24;21547:4;21536:9;21532:20;21525:54;21123:462;;;;;82261:86:0;;;;;;;;;;-1:-1:-1;82332:7:0;;-1:-1:-1;;;82332:7:0;;;;82261:86;;89640:224;;;;;;;;;;-1:-1:-1;89640:224:0;;;;;:::i;:::-;;:::i;52893:239::-;;;;;;;;;;-1:-1:-1;52893:239:0;;;;;:::i;:::-;;:::i;52623:208::-;;;;;;;;;;-1:-1:-1;52623:208:0;;;;;:::i;:::-;;:::i;75338:103::-;;;;;;;;;;;;;:::i;89876:109::-;;;;;;;;;;-1:-1:-1;89876:109:0;;;;;:::i;:::-;;:::i;87423:60::-;;;;;;;;;;;;;:::i;88469:39::-;;;;;;;;;;-1:-1:-1;88469:39:0;;;;;;74687:87;;;;;;;;;;-1:-1:-1;74760:6:0;;-1:-1:-1;;;;;74760:6:0;74687:87;;53368:104;;;;;;;;;;;;;:::i;91133:954::-;;;;;;:::i;:::-;;:::i;55051:155::-;;;;;;;;;;-1:-1:-1;55051:155:0;;;;;:::i;:::-;;:::i;86598:169::-;;;;;;;;;;-1:-1:-1;86598:169:0;;;;;:::i;:::-;;:::i;56174:328::-;;;;;;;;;;-1:-1:-1;56174:328:0;;;;;:::i;:::-;;:::i;86425:26::-;;;;;;;;;;-1:-1:-1;86425:26:0;;;;-1:-1:-1;;;;;86425:26:0;;;92812:107;;;;;;;;;;-1:-1:-1;92812:107:0;;;;;:::i;:::-;-1:-1:-1;88735:1:0;;92812:107;92095:318;;;;;;;;;;-1:-1:-1;92095:318:0;;;;;:::i;:::-;;:::i;90784:100::-;;;;;;;;;;-1:-1:-1;90784:100:0;;;;;:::i;:::-;;:::i;92706:98::-;;;;;;;;;;-1:-1:-1;88692:3:0;92706:98;;90682:94;;;;;;;;;;-1:-1:-1;90682:94:0;;;;;:::i;:::-;;:::i;90578:96::-;;;;;;;;;;-1:-1:-1;90578:96:0;;;;;:::i;:::-;;:::i;80509:112::-;;;;;;;;;;-1:-1:-1;80509:112:0;;;;;:::i;:::-;;:::i;55277:164::-;;;;;;;;;;-1:-1:-1;55277:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;55398:25:0;;;55374:4;55398:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;55277:164;75596:201;;;;;;;;;;-1:-1:-1;75596:201:0;;;;;:::i;:::-;;:::i;90455:111::-;;;;;;;;;;-1:-1:-1;90455:111:0;;;;;:::i;:::-;-1:-1:-1;;;;;90539:19:0;90515:4;90539:19;;;:9;:19;;;;;;;;;90455:111;87147:145;87224:4;87248:36;87272:11;87248:23;:36::i;:::-;87241:43;87147:145;-1:-1:-1;;87147:145:0:o;53199:100::-;53253:13;53286:5;53279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53199:100;:::o;54758:221::-;54834:7;58101:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58101:16:0;54854:73;;;;-1:-1:-1;;;54854:73:0;;16670:2:1;54854:73:0;;;16652:21:1;16709:2;16689:18;;;16682:30;16748:34;16728:18;;;16721:62;-1:-1:-1;;;16799:18:1;;;16792:42;16851:19;;54854:73:0;;;;;;;;;-1:-1:-1;54947:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54947:24:0;;54758:221::o;54281:411::-;54362:13;54378:23;54393:7;54378:14;:23::i;:::-;54362:39;;54426:5;-1:-1:-1;;;;;54420:11:0;:2;-1:-1:-1;;;;;54420:11:0;;;54412:57;;;;-1:-1:-1;;;54412:57:0;;18205:2:1;54412:57:0;;;18187:21:1;18244:2;18224:18;;;18217:30;18283:34;18263:18;;;18256:62;-1:-1:-1;;;18334:18:1;;;18327:31;18375:19;;54412:57:0;18177:223:1;54412:57:0;25257:10;-1:-1:-1;;;;;54504:21:0;;;;:62;;-1:-1:-1;54529:37:0;54546:5;25257:10;55277:164;:::i;54529:37::-;54482:168;;;;-1:-1:-1;;;54482:168:0;;15063:2:1;54482:168:0;;;15045:21:1;15102:2;15082:18;;;15075:30;15141:34;15121:18;;;15114:62;15212:26;15192:18;;;15185:54;15256:19;;54482:168:0;15035:246:1;54482:168:0;54663:21;54672:2;54676:7;54663:8;:21::i;:::-;54281:411;;;:::o;89993:156::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;90068:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;::::1;;90064:78;;;-1:-1:-1::0;;;;;90111:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;90104:26;;-1:-1:-1;;90104:26:0::1;::::0;;90064:78:::1;89993:156:::0;:::o;55508:339::-;55703:41;25257:10;55736:7;55703:18;:41::i;:::-;55695:103;;;;-1:-1:-1;;;55695:103:0;;;;;;;:::i;:::-;55811:28;55821:4;55827:2;55831:7;55811:9;:28::i;90157:290::-;-1:-1:-1;;;;;90539:19:0;;90223:7;90539:19;;;:9;:19;;;;;;;;90243:197;;;-1:-1:-1;;90291:13:0;;;90157:290::o;90243:197::-;90326:17;90335:7;90326:8;:17::i;:::-;90322:118;;;-1:-1:-1;;90367:10:0;;;90157:290::o;90322:118::-;-1:-1:-1;;90417:11:0;;;90157:290::o;67779:256::-;67876:7;67912:23;67929:5;67912:16;:23::i;:::-;67904:5;:31;67896:87;;;;-1:-1:-1;;;67896:87:0;;10760:2:1;67896:87:0;;;10742:21:1;10799:2;10779:18;;;10772:30;10838:34;10818:18;;;10811:62;-1:-1:-1;;;10889:18:1;;;10882:41;10940:19;;67896:87:0;10732:233:1;67896:87:0;-1:-1:-1;;;;;;68001:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;67779:256::o;86775:133::-;85267:1;85865:7;;:19;;85857:63;;;;-1:-1:-1;;;85857:63:0;;20141:2:1;85857:63:0;;;20123:21:1;20180:2;20160:18;;;20153:30;20219:33;20199:18;;;20192:61;20270:18;;85857:63:0;20113:181:1;85857:63:0;85267:1;85998:7;:18;86871:29:::1;86894:5:::0;86871:22:::1;:29::i;:::-;-1:-1:-1::0;85223:1:0;86177:7;:22;86775:133::o;87300:115::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;87355:52:::1;87363:10;87385:21;87355:29;:52::i;:::-;87300:115::o:0;87491:64::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;87537:10:::1;:8;:10::i;55918:185::-:0;56056:39;56073:4;56079:2;56083:7;56056:39;;;;;;;;;;;;:16;:39::i;68301:233::-;68376:7;68412:30;68199:10;:17;;68111:113;68412:30;68404:5;:38;68396:95;;;;-1:-1:-1;;;68396:95:0;;19728:2:1;68396:95:0;;;19710:21:1;19767:2;19747:18;;;19740:30;19806:34;19786:18;;;19779:62;-1:-1:-1;;;19857:18:1;;;19850:42;19909:19;;68396:95:0;19700:234:1;68396:95:0;68509:10;68520:5;68509:17;;;;;;-1:-1:-1;;;68509:17:0;;;;;;;;;;;;;;;;;68502:24;;68301:233;;;:::o;91026:99::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;91099:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;91026:99:::0;:::o;89230:402::-;89281:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89281:11:0;89305:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89305:19:0;89357:11;;89335:33;;89400:10;;89379:18;;;:31;89445:13;;89421:21;;;:37;88692:3;89469:17;;;:30;68199:10;:17;89510:19;;;:41;88735:1;89562:20;;;:37;89510:7;89230:402;-1:-1:-1;89230:402:0:o;89640:224::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;89732:10;89721:8:::1;89760:89;89780:3;89776:1;:7;89760:89;;;89833:4;89806:9;:24;89816:10;;89827:1;89816:13;;;;;-1:-1:-1::0;;;89816:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;89806:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;89806:24:0;:31;;-1:-1:-1;;89806:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;89785:4;::::1;::::0;::::1;:::i;:::-;;;;89760:89;;;;74978:1;89640:224:::0;;:::o;52893:239::-;52965:7;53001:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53001:16:0;53036:19;53028:73;;;;-1:-1:-1;;;53028:73:0;;15899:2:1;53028:73:0;;;15881:21:1;15938:2;15918:18;;;15911:30;15977:34;15957:18;;;15950:62;-1:-1:-1;;;16028:18:1;;;16021:39;16077:19;;53028:73:0;15871:231:1;52623:208:0;52695:7;-1:-1:-1;;;;;52723:19:0;;52715:74;;;;-1:-1:-1;;;52715:74:0;;15488:2:1;52715:74:0;;;15470:21:1;15527:2;15507:18;;;15500:30;15566:34;15546:18;;;15539:62;-1:-1:-1;;;15617:18:1;;;15610:40;15667:19;;52715:74:0;15460:232:1;52715:74:0;-1:-1:-1;;;;;;52807:16:0;;;;;:9;:16;;;;;;;52623:208::o;75338:103::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;75403:30:::1;75430:1;75403:18;:30::i;89876:109::-:0;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;89951:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;89951:26:0::1;89973:4;89951:26;::::0;;89876:109::o;87423:60::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;87467:8:::1;:6;:8::i;53368:104::-:0;53424:13;53457:7;53450:14;;;;;:::i;91133:954::-;82332:7;;-1:-1:-1;;;82332:7:0;;;;82586:9;82578:38;;;;-1:-1:-1;;;82578:38:0;;14718:2:1;82578:38:0;;;14700:21:1;14757:2;14737:18;;;14730:30;-1:-1:-1;;;14776:18:1;;;14769:46;14832:18;;82578:38:0;14690:166:1;82578:38:0;88735:1:::1;91223:25:::0;::::1;;91215:67;;;::::0;-1:-1:-1;;;91215:67:0;;19025:2:1;91215:67:0::1;::::0;::::1;19007:21:1::0;19064:2;19044:18;;;19037:30;19103:31;19083:18;;;19076:59;19152:18;;91215:67:0::1;18997:179:1::0;91215:67:0::1;91359:10;91303:13;91350:20:::0;;;:8:::1;:20;::::0;;;;;:37:::1;::::0;91379:7;;91350:20:::1;;:37;:::i;:::-;91336:10;91327:20;::::0;;;:8:::1;:20;::::0;;;;:60;;-1:-1:-1;;91327:60:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;88778:1:::1;-1:-1:-1::0;91406:40:0::1;91398:66;;;::::0;-1:-1:-1;;;91398:66:0;;20838:2:1;91398:66:0::1;::::0;::::1;20820:21:1::0;20877:2;20857:18;;;20850:30;-1:-1:-1;;;20896:18:1;;;20889:43;20949:18;;91398:66:0::1;20810:163:1::0;91398:66:0::1;91493:10;90515:4:::0;90539:19;;;:9;:19;;;;;;;;91477:330:::1;;;91529:13;::::0;:26:::1;::::0;91547:7;91529:17:::1;:26::i;:::-;91521:34;;91477:330;;;91589:14;91606:20;91615:10;91606:8;:20::i;:::-;91589:37;;91645:9;91641:155;;;91682:10;::::0;:23:::1;::::0;91697:7;91682:14:::1;:23::i;:::-;91674:31;;91641:155;;;91755:11;::::0;:24:::1;::::0;91771:7;91755:15:::1;:24::i;:::-;91747:32;;91641:155;91477:330;;91848:5;91835:9;:18;;91827:47;;;::::0;-1:-1:-1;;;91827:47:0;;19383:2:1;91827:47:0::1;::::0;::::1;19365:21:1::0;19422:2;19402:18;;;19395:30;-1:-1:-1;;;19441:18:1;;;19434:46;19497:18;;91827:47:0::1;19355:166:1::0;91827:47:0::1;91920:3;::::0;91887:17:::1;::::0;91907:24:::1;::::0;:5;;-1:-1:-1;;;;;91920:3:0::1;86520:5;91907:12;:24::i;:::-;91887:44;;91949:9;91945:83;91968:7;91964:1;:11;91945:83;;;91996:20;92005:10;91996:8;:20::i;:::-;91977:3:::0;::::1;::::0;::::1;:::i;:::-;;;;91945:83;;;-1:-1:-1::0;92053:6:0::1;::::0;92038:41:::1;::::0;-1:-1:-1;;;;;92053:6:0::1;92061:17;92069:9:::0;92061:5;:17:::1;:::i;:::-;92038:14;:41::i;55051:155::-:0;55146:52;25257:10;55179:8;55189;55146:18;:52::i;86598:169::-;86679:11;;:34;;-1:-1:-1;;;86679:34:0;;-1:-1:-1;;;;;9195:32:1;;;86679:34:0;;;9177:51:1;86679:11:0;9244:18:1;;;9237:34;86655:4:0;;;;86679:11;;;:21;;9150:18:1;;86679:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:80;;;-1:-1:-1;86721:11:0;;:34;;-1:-1:-1;;;86721:34:0;;-1:-1:-1;;;;;9195:32:1;;;86721:34:0;;;9177:51:1;86753:1:0;9244:18:1;;;9237:34;86758:1:0;;86721:11;;:21;;9150:18:1;;86721:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;86672:87;86598:169;-1:-1:-1;;86598:169:0:o;56174:328::-;56349:41;25257:10;56382:7;56349:18;:41::i;:::-;56341:103;;;;-1:-1:-1;;;56341:103:0;;;;;;;:::i;:::-;56455:39;56469:4;56475:2;56479:7;56488:5;56455:13;:39::i;92095:318::-;58077:4;58101:16;;;:7;:16;;;;;;92166:13;;-1:-1:-1;;;;;58101:16:0;92190:76;;;;-1:-1:-1;;;92190:76:0;;17789:2:1;92190:76:0;;;17771:21:1;17828:2;17808:18;;;17801:30;17867:34;17847:18;;;17840:62;-1:-1:-1;;;17918:18:1;;;17911:45;17973:19;;92190:76:0;17761:237:1;92190:76:0;92277:23;92327:7;92341:26;92358:8;92341:16;:26::i;:::-;92310:67;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;92310:67:0;;;;;;;;;;92095:318;-1:-1:-1;;;92095:318:0:o;90784:100::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;90855:13:::1;:21:::0;90784:100::o;90682:94::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;90750:10:::1;:18:::0;90682:94::o;90578:96::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;90647:11:::1;:19:::0;90578:96::o;80509:112::-;80589:24;;-1:-1:-1;;;80589:24:0;;-1:-1:-1;;;;;8234:32:1;;;80589:24:0;;;8216:51:1;80562:7:0;;80589;:18;;;;;;8189::1;;80589:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75596:201::-;74760:6;;-1:-1:-1;;;;;74760:6:0;25257:10;74907:23;74899:68;;;;-1:-1:-1;;;74899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75685:22:0;::::1;75677:73;;;::::0;-1:-1:-1;;;75677:73:0;;11591:2:1;75677:73:0::1;::::0;::::1;11573:21:1::0;11630:2;11610:18;;;11603:30;11669:34;11649:18;;;11642:62;-1:-1:-1;;;11720:18:1;;;11713:36;11766:19;;75677:73:0::1;11563:228:1::0;75677:73:0::1;75761:28;75780:8;75761:18;:28::i;69147:589::-:0;-1:-1:-1;;;;;69353:18:0;;69349:187;;69388:40;69420:7;70563:10;:17;;70536:24;;;;:15;:24;;;;;:44;;;70591:24;;;;;;;;;;;;70459:164;69388:40;69349:187;;;69458:2;-1:-1:-1;;;;;69450:10:0;:4;-1:-1:-1;;;;;69450:10:0;;69446:90;;69477:47;69510:4;69516:7;69477:32;:47::i;:::-;-1:-1:-1;;;;;69550:16:0;;69546:183;;69583:45;69620:7;69583:36;:45::i;69546:183::-;69656:4;-1:-1:-1;;;;;69650:10:0;:2;-1:-1:-1;;;;;69650:10:0;;69646:83;;69677:40;69705:2;69709:7;69677:27;:40::i;67471:224::-;67573:4;-1:-1:-1;;;;;;67597:50:0;;-1:-1:-1;;;67597:50:0;;:90;;;67651:36;67675:11;67651:23;:36::i;62158:174::-;62233:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;62233:29:0;-1:-1:-1;;;;;62233:29:0;;;;;;;;:24;;62287:23;62233:24;62287:14;:23::i;:::-;-1:-1:-1;;;;;62278:46:0;;;;;;;;;;;62158:174;;:::o;58306:348::-;58399:4;58101:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58101:16:0;58416:73;;;;-1:-1:-1;;;58416:73:0;;14305:2:1;58416:73:0;;;14287:21:1;14344:2;14324:18;;;14317:30;14383:34;14363:18;;;14356:62;-1:-1:-1;;;14434:18:1;;;14427:42;14486:19;;58416:73:0;14277:234:1;58416:73:0;58500:13;58516:23;58531:7;58516:14;:23::i;:::-;58500:39;;58569:5;-1:-1:-1;;;;;58558:16:0;:7;-1:-1:-1;;;;;58558:16:0;;:51;;;;58602:7;-1:-1:-1;;;;;58578:31:0;:20;58590:7;58578:11;:20::i;:::-;-1:-1:-1;;;;;58578:31:0;;58558:51;:87;;;-1:-1:-1;;;;;;55398:25:0;;;55374:4;55398:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;58613:32;58550:96;58306:348;-1:-1:-1;;;;58306:348:0:o;61415:625::-;61574:4;-1:-1:-1;;;;;61547:31:0;:23;61562:7;61547:14;:23::i;:::-;-1:-1:-1;;;;;61547:31:0;;61539:81;;;;-1:-1:-1;;;61539:81:0;;11998:2:1;61539:81:0;;;11980:21:1;12037:2;12017:18;;;12010:30;12076:34;12056:18;;;12049:62;-1:-1:-1;;;12127:18:1;;;12120:35;12172:19;;61539:81:0;11970:227:1;61539:81:0;-1:-1:-1;;;;;61639:16:0;;61631:65;;;;-1:-1:-1;;;61631:65:0;;12761:2:1;61631:65:0;;;12743:21:1;12800:2;12780:18;;;12773:30;12839:34;12819:18;;;12812:62;-1:-1:-1;;;12890:18:1;;;12883:34;12934:19;;61631:65:0;12733:226:1;61631:65:0;61709:39;61730:4;61736:2;61740:7;61709:20;:39::i;:::-;61813:29;61830:1;61834:7;61813:8;:29::i;:::-;-1:-1:-1;;;;;61855:15:0;;;;;;:9;:15;;;;;:20;;61874:1;;61855:15;:20;;61874:1;;61855:20;:::i;:::-;;;;-1:-1:-1;;;;;;;61886:13:0;;;;;;:9;:13;;;;;:18;;61903:1;;61886:13;:18;;61903:1;;61886:18;:::i;:::-;;;;-1:-1:-1;;61915:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;61915:21:0;-1:-1:-1;;;;;61915:21:0;;;;;;;;;61954:27;;61915:16;;61954:27;;;;;;;54281:411;;;:::o;80279:106::-;80354:23;;-1:-1:-1;;;80354:23:0;;-1:-1:-1;;;;;8234:32:1;;;80354:23:0;;;8216:51:1;80354:7:0;:16;;;;8189:18:1;;80354:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80279:106;:::o;18481:317::-;18596:6;18571:21;:31;;18563:73;;;;-1:-1:-1;;;18563:73:0;;13947:2:1;18563:73:0;;;13929:21:1;13986:2;13966:18;;;13959:30;14025:31;14005:18;;;13998:59;14074:18;;18563:73:0;13919:179:1;18563:73:0;18650:12;18668:9;-1:-1:-1;;;;;18668:14:0;18690:6;18668:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18649:52;;;18720:7;18712:78;;;;-1:-1:-1;;;18712:78:0;;13520:2:1;18712:78:0;;;13502:21:1;13559:2;13539:18;;;13532:30;13598:34;13578:18;;;13571:62;13669:28;13649:18;;;13642:56;13715:19;;18712:78:0;13492:248:1;83320:120:0;82332:7;;-1:-1:-1;;;82332:7:0;;;;82856:41;;;;-1:-1:-1;;;82856:41:0;;10411:2:1;82856:41:0;;;10393:21:1;10450:2;10430:18;;;10423:30;-1:-1:-1;;;10469:18:1;;;10462:50;10529:18;;82856:41:0;10383:170:1;82856:41:0;83379:7:::1;:15:::0;;-1:-1:-1;;;;83379:15:0::1;::::0;;83410:22:::1;25257:10:::0;83419:12:::1;83410:22;::::0;-1:-1:-1;;;;;8234:32:1;;;8216:51;;8204:2;8189:18;83410:22:0::1;;;;;;;83320:120::o:0;75957:191::-;76050:6;;;-1:-1:-1;;;;;76067:17:0;;;-1:-1:-1;;;;;;76067:17:0;;;;;;;76100:40;;76050:6;;;76067:17;76050:6;;76100:40;;76031:16;;76100:40;75957:191;;:::o;83061:118::-;82332:7;;-1:-1:-1;;;82332:7:0;;;;82586:9;82578:38;;;;-1:-1:-1;;;82578:38:0;;14718:2:1;82578:38:0;;;14700:21:1;14757:2;14737:18;;;14730:30;-1:-1:-1;;;14776:18:1;;;14769:46;14832:18;;82578:38:0;14690:166:1;82578:38:0;83121:7:::1;:14:::0;;-1:-1:-1;;;;83121:14:0::1;-1:-1:-1::0;;;83121:14:0::1;::::0;;83151:20:::1;83158:12;25257:10:::0;;25177:98;5526;5584:7;5611:5;5615:1;5611;:5;:::i;:::-;5604:12;5526:98;-1:-1:-1;;;5526:98:0:o;6909:669::-;6981:7;7013:1;7009;:5;7001:34;;;;-1:-1:-1;;;7001:34:0;;17083:2:1;7001:34:0;;;17065:21:1;17122:2;17102:18;;;17095:30;-1:-1:-1;;;17141:18:1;;;17134:46;17197:18;;7001:34:0;17055:166:1;7001:34:0;7052:6;7048:20;;-1:-1:-1;7067:1:0;7060:8;;7048:20;7079:10;7092:5;7096:1;7092;:5;:::i;:::-;7079:18;-1:-1:-1;7122:1:0;7112:6;7117:1;7079:18;7112:6;:::i;:::-;:11;7108:107;;;7197:6;7202:1;7197:2;:6;:::i;:::-;7190:13;;;;;7108:107;7287:9;7299:5;7303:1;7299;:5;:::i;:::-;7287:17;-1:-1:-1;7315:9:0;7327:5;7331:1;7327;:5;:::i;:::-;7315:17;-1:-1:-1;7422:9:0;7434:5;7438:1;7434;:5;:::i;:::-;7422:17;-1:-1:-1;7450:9:0;7462:5;7466:1;7462;:5;:::i;:::-;7450:17;-1:-1:-1;7504:66:0;7554:15;7567:1;7554:8;:1;7450:17;7554:5;:8::i;:::-;:12;;:15::i;:::-;7504:45;7540:8;:1;7546;7540:5;:8::i;:::-;7504:31;7526:8;:1;7532;7526:5;:8::i;:::-;7505:15;7518:1;7505:8;:1;7511;7505:5;:8::i;:::-;:12;;:15::i;:::-;7504:21;;:31::i;:66::-;7497:73;6909:669;-1:-1:-1;;;;;;;;;6909:669:0:o;92420:278::-;92470:15;92516:25;:15;1065:14;;973:114;92516:25;92506:35;-1:-1:-1;92580:15:0;92593:2;88692:3;92580:15;:::i;:::-;-1:-1:-1;;;;;92570:25:0;:7;:25;92562:47;;;;-1:-1:-1;;;92562:47:0;;20501:2:1;92562:47:0;;;20483:21:1;20540:1;20520:18;;;20513:29;-1:-1:-1;;;20558:18:1;;;20551:39;20607:18;;92562:47:0;20473:158:1;92562:47:0;92620:27;:15;1184:19;;1202:1;1184:19;;;1095:127;92620:27;92660:30;92670:3;92675:5;92681:7;92675:14;;;;;;-1:-1:-1;;;92675:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92660:9;:30::i;80990:126::-;81072:36;;-1:-1:-1;;;81072:36:0;;-1:-1:-1;;;;;8234:32:1;;;81072:36:0;;;8216:51:1;81072:7:0;:15;;;;81095:6;;8189:18:1;;81072:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80990:126;;:::o;62474:315::-;62629:8;-1:-1:-1;;;;;62620:17:0;:5;-1:-1:-1;;;;;62620:17:0;;;62612:55;;;;-1:-1:-1;;;62612:55:0;;13166:2:1;62612:55:0;;;13148:21:1;13205:2;13185:18;;;13178:30;13244:27;13224:18;;;13217:55;13289:18;;62612:55:0;13138:175:1;62612:55:0;-1:-1:-1;;;;;62678:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;62678:46:0;;;;;;;;;;62740:41;;9709::1;;;62740::0;;9682:18:1;62740:41:0;;;;;;;62474:315;;;:::o;57384:::-;57541:28;57551:4;57557:2;57561:7;57541:9;:28::i;:::-;57588:48;57611:4;57617:2;57621:7;57630:5;57588:22;:48::i;:::-;57580:111;;;;-1:-1:-1;;;57580:111:0;;;;;;;:::i;49082:723::-;49138:13;49359:10;49355:53;;-1:-1:-1;;49386:10:0;;;;;;;;;;;;-1:-1:-1;;;49386:10:0;;;;;49082:723::o;49355:53::-;49433:5;49418:12;49474:78;49481:9;;49474:78;;49507:8;;;;:::i;:::-;;-1:-1:-1;49530:10:0;;-1:-1:-1;49538:2:0;49530:10;;:::i;:::-;;;49474:78;;;49562:19;49594:6;49584:17;;;;;;-1:-1:-1;;;49584:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49584:17:0;;49562:39;;49612:154;49619:10;;49612:154;;49646:11;49656:1;49646:11;;:::i;:::-;;-1:-1:-1;49715:10:0;49723:2;49715:5;:10;:::i;:::-;49702:24;;:2;:24;:::i;:::-;49689:39;;49672:6;49679;49672:14;;;;;;-1:-1:-1;;;49672:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;49672:56:0;;;;;;;;-1:-1:-1;49743:11:0;49752:2;49743:11;;:::i;:::-;;;49612:154;;71250:988;71516:22;71566:1;71541:22;71558:4;71541:16;:22::i;:::-;:26;;;;:::i;:::-;71578:18;71599:26;;;:17;:26;;;;;;71516:51;;-1:-1:-1;71732:28:0;;;71728:328;;-1:-1:-1;;;;;71799:18:0;;71777:19;71799:18;;;:12;:18;;;;;;;;:34;;;;;;;;;71850:30;;;;;;:44;;;71967:30;;:17;:30;;;;;:43;;;71728:328;-1:-1:-1;72152:26:0;;;;:17;:26;;;;;;;;72145:33;;;-1:-1:-1;;;;;72196:18:0;;;;;:12;:18;;;;;:34;;;;;;;72189:41;71250:988::o;72533:1079::-;72811:10;:17;72786:22;;72811:21;;72831:1;;72811:21;:::i;:::-;72843:18;72864:24;;;:15;:24;;;;;;73237:10;:26;;72786:46;;-1:-1:-1;72864:24:0;;72786:46;;73237:26;;;;-1:-1:-1;;;73237:26:0;;;;;;;;;;;;;;;;;73215:48;;73301:11;73276:10;73287;73276:22;;;;;;-1:-1:-1;;;73276:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;73381:28;;;:15;:28;;;;;;;:41;;;73553:24;;;;;73546:31;73588:10;:16;;;;;-1:-1:-1;;;73588:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;72533:1079;;;;:::o;70037:221::-;70122:14;70139:20;70156:2;70139:16;:20::i;:::-;-1:-1:-1;;;;;70170:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;70215:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;70037:221:0:o;52254:305::-;52356:4;-1:-1:-1;;;;;;52393:40:0;;-1:-1:-1;;;52393:40:0;;:105;;-1:-1:-1;;;;;;;52450:48:0;;-1:-1:-1;;;52450:48:0;52393:105;:158;;;-1:-1:-1;;;;;;;;;;26371:40:0;;;52515:36;26262:157;86984:155;87086:45;87113:4;87119:2;87123:7;87086:26;:45::i;5925:98::-;5983:7;6010:5;6014:1;6010;:5;:::i;4788:98::-;4846:7;4873:5;4877:1;4873;:5;:::i;58996:110::-;59072:26;59082:2;59086:7;59072:26;;;;;;;;;;;;:9;:26::i;63354:799::-;63509:4;-1:-1:-1;;;;;63530:13:0;;17515:19;:23;63526:620;;63566:72;;-1:-1:-1;;;63566:72:0;;-1:-1:-1;;;;;63566:36:0;;;;;:72;;25257:10;;63617:4;;63623:7;;63632:5;;63566:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63566:72:0;;;;;;;;-1:-1:-1;;63566:72:0;;;;;;;;;;;;:::i;:::-;;;63562:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63808:13:0;;63804:272;;63851:60;;-1:-1:-1;;;63851:60:0;;;;;;;:::i;63804:272::-;64026:6;64020:13;64011:6;64007:2;64003:15;63996:38;63562:529;-1:-1:-1;;;;;;63689:51:0;-1:-1:-1;;;63689:51:0;;-1:-1:-1;63682:58:0;;63526:620;-1:-1:-1;64130:4:0;63354:799;;;;;;:::o;59333:321::-;59463:18;59469:2;59473:7;59463:5;:18::i;:::-;59514:54;59545:1;59549:2;59553:7;59562:5;59514:22;:54::i;:::-;59492:154;;;;-1:-1:-1;;;59492:154:0;;;;;;;:::i;59990:439::-;-1:-1:-1;;;;;60070:16:0;;60062:61;;;;-1:-1:-1;;;60062:61:0;;16309:2:1;60062:61:0;;;16291:21:1;;;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;16439:18;;60062:61:0;16281:182:1;60062:61:0;58077:4;58101:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58101:16:0;:30;60134:58;;;;-1:-1:-1;;;60134:58:0;;12404:2:1;60134:58:0;;;12386:21:1;12443:2;12423:18;;;12416:30;12482;12462:18;;;12455:58;12530:18;;60134:58:0;12376:178:1;60134:58:0;60205:45;60234:1;60238:2;60242:7;60205:20;:45::i;:::-;-1:-1:-1;;;;;60263:13:0;;;;;;:9;:13;;;;;:18;;60280:1;;60263:13;:18;;60280:1;;60263:18;:::i;:::-;;;;-1:-1:-1;;60292:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;60292:21:0;-1:-1:-1;;;;;60292:21:0;;;;;;;;60331:33;;60292:16;;;60331:33;;60292:16;;60331:33;91099:18:::1;91026:99:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;709:6;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;1250:6;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;1662:6;1670;1678;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;2151:6;2159;2167;2175;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:436::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3244:15;;3237:23;3225:36;;3215:2;;3280:6;3272;3265:22;3326:325;3394:6;3402;3455:2;3443:9;3434:7;3430:23;3426:32;3423:2;;;3476:6;3468;3461:22;3423:2;3520:9;3507:23;3539:31;3564:5;3539:31;:::i;:::-;3589:5;3641:2;3626:18;;;;3613:32;;-1:-1:-1;;;3413:238:1:o;3656:665::-;3742:6;3750;3803:2;3791:9;3782:7;3778:23;3774:32;3771:2;;;3824:6;3816;3809:22;3771:2;3869:9;3856:23;3898:18;3939:2;3931:6;3928:14;3925:2;;;3960:6;3952;3945:22;3925:2;4003:6;3992:9;3988:22;3978:32;;4048:7;4041:4;4037:2;4033:13;4029:27;4019:2;;4075:6;4067;4060:22;4019:2;4120;4107:16;4146:2;4138:6;4135:14;4132:2;;;4167:6;4159;4152:22;4132:2;4225:7;4220:2;4210:6;4207:1;4203:14;4199:2;4195:23;4191:32;4188:45;4185:2;;;4251:6;4243;4236:22;4185:2;4287;4279:11;;;;;4309:6;;-1:-1:-1;3761:560:1;;-1:-1:-1;;;;3761:560:1:o;4326:255::-;4384:6;4437:2;4425:9;4416:7;4412:23;4408:32;4405:2;;;4458:6;4450;4443:22;4405:2;4502:9;4489:23;4521:30;4545:5;4521:30;:::i;4586:259::-;4655:6;4708:2;4696:9;4687:7;4683:23;4679:32;4676:2;;;4729:6;4721;4714:22;4676:2;4766:9;4760:16;4785:30;4809:5;4785:30;:::i;4850:480::-;4919:6;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4993:6;4985;4978:22;4940:2;5038:9;5025:23;5071:18;5063:6;5060:30;5057:2;;;5108:6;5100;5093:22;5057:2;5136:22;;5189:4;5181:13;;5177:27;-1:-1:-1;5167:2:1;;5223:6;5215;5208:22;5167:2;5251:73;5316:7;5311:2;5298:16;5293:2;5289;5285:11;5251:73;:::i;5335:190::-;5394:6;5447:2;5435:9;5426:7;5422:23;5418:32;5415:2;;;5468:6;5460;5453:22;5415:2;-1:-1:-1;5496:23:1;;5405:120;-1:-1:-1;5405:120:1:o;5530:194::-;5600:6;5653:2;5641:9;5632:7;5628:23;5624:32;5621:2;;;5674:6;5666;5659:22;5621:2;-1:-1:-1;5702:16:1;;5611:113;-1:-1:-1;5611:113:1:o;5729:257::-;5770:3;5808:5;5802:12;5835:6;5830:3;5823:19;5851:63;5907:6;5900:4;5895:3;5891:14;5884:4;5877:5;5873:16;5851:63;:::i;:::-;5968:2;5947:15;-1:-1:-1;;5943:29:1;5934:39;;;;5975:4;5930:50;;5778:208;-1:-1:-1;;5778:208:1:o;5991:185::-;6033:3;6071:5;6065:12;6086:52;6131:6;6126:3;6119:4;6112:5;6108:16;6086:52;:::i;:::-;6154:16;;;;;6041:135;-1:-1:-1;;6041:135:1:o;6418:1437::-;6796:3;6825;6860:6;6854:13;6890:3;6912:1;6940:9;6936:2;6932:18;6922:28;;7000:2;6989:9;6985:18;7022;7012:2;;7066:4;7058:6;7054:17;7044:27;;7012:2;7092;7140;7132:6;7129:14;7109:18;7106:38;7103:2;;;-1:-1:-1;;;7167:33:1;;7223:4;7220:1;7213:15;7253:4;7174:3;7241:17;7103:2;7284:18;7311:104;;;;7429:1;7424:322;;;;7277:469;;7311:104;-1:-1:-1;;7344:24:1;;7332:37;;7389:16;;;;-1:-1:-1;7311:104:1;;7424:322;21819:4;21838:17;;;21888:4;21872:21;;7519:3;7535:165;7549:6;7546:1;7543:13;7535:165;;;7627:14;;7614:11;;;7607:35;7670:16;;;;7564:10;;7535:165;;;7539:3;;7729:6;7724:3;7720:16;7713:23;;7277:469;;;;;;;7762:87;7787:61;7813:34;7843:3;-1:-1:-1;;;6364:16:1;;6405:1;6396:11;;6354:59;7813:34;7805:6;7787:61;:::i;:::-;-1:-1:-1;;;6241:20:1;;6286:1;6277:11;;6231:63;7762:87;7755:94;6804:1051;-1:-1:-1;;;;;6804:1051:1:o;8502:488::-;-1:-1:-1;;;;;8771:15:1;;;8753:34;;8823:15;;8818:2;8803:18;;8796:43;8870:2;8855:18;;8848:34;;;8918:3;8913:2;8898:18;;8891:31;;;8696:4;;8939:45;;8964:19;;8956:6;8939:45;:::i;:::-;8931:53;8705:285;-1:-1:-1;;;;;;8705:285:1:o;9985:219::-;10134:2;10123:9;10116:21;10097:4;10154:44;10194:2;10183:9;10179:18;10171:6;10154:44;:::i;10970:414::-;11172:2;11154:21;;;11211:2;11191:18;;;11184:30;11250:34;11245:2;11230:18;;11223:62;-1:-1:-1;;;11316:2:1;11301:18;;11294:48;11374:3;11359:19;;11144:240::o;17226:356::-;17428:2;17410:21;;;17447:18;;;17440:30;17506:34;17501:2;17486:18;;17479:62;17573:2;17558:18;;17400:182::o;18405:413::-;18607:2;18589:21;;;18646:2;18626:18;;;18619:30;18685:34;18680:2;18665:18;;18658:62;-1:-1:-1;;;18751:2:1;18736:18;;18729:47;18808:3;18793:19;;18579:239::o;21904:128::-;21944:3;21975:1;21971:6;21968:1;21965:13;21962:2;;;21981:18;;:::i;:::-;-1:-1:-1;22017:9:1;;21952:80::o;22037:204::-;22075:3;22111:4;22108:1;22104:12;22143:4;22140:1;22136:12;22178:3;22172:4;22168:14;22163:3;22160:23;22157:2;;;22186:18;;:::i;:::-;22222:13;;22083:158;-1:-1:-1;;;22083:158:1:o;22246:120::-;22286:1;22312;22302:2;;22317:18;;:::i;:::-;-1:-1:-1;22351:9:1;;22292:74::o;22371:168::-;22411:7;22477:1;22473;22469:6;22465:14;22462:1;22459:21;22454:1;22447:9;22440:17;22436:45;22433:2;;;22484:18;;:::i;:::-;-1:-1:-1;22524:9:1;;22423:116::o;22544:246::-;22584:4;-1:-1:-1;;;;;22697:10:1;;;;22667;;22719:12;;;22716:2;;;22734:18;;:::i;:::-;22771:13;;22593:197;-1:-1:-1;;;22593:197:1:o;22795:125::-;22835:4;22863:1;22860;22857:8;22854:2;;;22868:18;;:::i;:::-;-1:-1:-1;22905:9:1;;22844:76::o;22925:258::-;22997:1;23007:113;23021:6;23018:1;23015:13;23007:113;;;23097:11;;;23091:18;23078:11;;;23071:39;23043:2;23036:10;23007:113;;;23138:6;23135:1;23132:13;23129:2;;;-1:-1:-1;;23173:1:1;23155:16;;23148:27;22978:205::o;23188:380::-;23267:1;23263:12;;;;23310;;;23331:2;;23385:4;23377:6;23373:17;23363:27;;23331:2;23438;23430:6;23427:14;23407:18;23404:38;23401:2;;;23484:10;23479:3;23475:20;23472:1;23465:31;23519:4;23516:1;23509:15;23547:4;23544:1;23537:15;23401:2;;23243:325;;;:::o;23573:135::-;23612:3;-1:-1:-1;;23633:17:1;;23630:2;;;23653:18;;:::i;:::-;-1:-1:-1;23700:1:1;23689:13;;23620:88::o;23713:112::-;23745:1;23771;23761:2;;23776:18;;:::i;:::-;-1:-1:-1;23810:9:1;;23751:74::o;23830:127::-;23891:10;23886:3;23882:20;23879:1;23872:31;23922:4;23919:1;23912:15;23946:4;23943:1;23936:15;23962:127;24023:10;24018:3;24014:20;24011:1;24004:31;24054:4;24051:1;24044:15;24078:4;24075:1;24068:15;24094:127;24155:10;24150:3;24146:20;24143:1;24136:31;24186:4;24183:1;24176:15;24210:4;24207:1;24200:15;24226:131;-1:-1:-1;;;;;24301:31:1;;24291:42;;24281:2;;24347:1;24344;24337:12;24362:131;-1:-1:-1;;;;;;24436:32:1;;24426:43;;24416:2;;24483:1;24480;24473:12

Swarm Source

ipfs://97aaf8330e2b679c3d08b05923d025844a488ff53c65b2f148c20b20172688e8
Loading