ETH Price: $2,504.30 (-4.94%)

Token

First (FIRST)
 

Overview

Max Total Supply

5,000 FIRST

Holders

1,661

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FIRST
0xf73dac1d2c0c3027b9ee18735c311962e105a4f9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The fist satirical on-chain generative text NFT about NFT firsts. Proceeds sent to GiveDirectly.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
First

Compiler Version
v0.7.3+commit.9bfce1f6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
/* First satirical on-chain generative text NFT about NFT firsts.
   Don't sleep on this historic collection.
   
   0xdeafbeef 2021-09-06
*/


/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

pragma solidity >=0.6.2 <0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity >=0.6.0 <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);
}

pragma solidity >=0.6.2 <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;
}

pragma solidity >=0.6.2 <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);
}

pragma solidity >=0.6.2 <0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

pragma solidity >=0.6.0 <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);
}

pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
/*
library Strings {
    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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}
*/
pragma solidity >=0.6.0 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  //    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
//    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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) {
    	     return ("");
	     /*
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
	*/
	
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /*
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }
    */
    
    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

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



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */


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

contract First is ERC721,ReentrancyGuard {
  address admin_address;
  uint32 public num_minted;
  
  //after data is written and verified, lock()
  // can be called once to permanently lock the contract
  // (no further updates permitted)
  bool public locked;
  bool public paused;  

  bytes[32] public t1; //text data
  //pointers to strings in t1
  uint16[32][32] public p1;
  uint16[32] public n1;   

  modifier requireAdmin() {
    require(admin_address == msg.sender,"Requires admin privileges");
    _;
  }  

  //transfers contract balance to GiveDirectly.org
  function donate() public payable requireAdmin {
    payable(0xc7464dbcA260A8faF033460622B23467Df5AEA42).transfer(address(this).balance);
  }
  
  function calc_pointers(uint16 cid) internal  {
    uint16 k=0;
    p1[cid][k] = 0;
    for (uint i=0;i<t1[cid].length;i++) {
      if (t1[cid][i]=='|') {
	p1[cid][++k] = uint16(i+1);
      }
    }
    n1[cid] = k;
  }

  function owner() public view virtual returns (address) {
    return admin_address;
  }

  constructor() ERC721("First", "FIRST") {
    admin_address = msg.sender;
    paused = true;
    for (uint16 i=0;i<32;i++) {
      t1[i] = "||";
      calc_pointers(i);
    }
  }

  /* Lock contract permanently, preventing any further writes */
  function lock() public requireAdmin {
    locked=true;
  }

  //pause or unpause
  function setPaused(bool m) public requireAdmin {
    paused = m;
  }
    
  /* Returns randomly generated 'first' description, returning string */
  function getString(uint256 id) public view returns (string memory) {
    return string(generate(id));
  }
  
  /* Returns randomly generated 'first' description, returning bytes */
  function generate(uint256 id) public view returns (bytes memory) {
    require(id > 0 && id < 1000000);

    //generate a sequence of 25 pseudo random numbers, seeded by id
    uint32[25] memory seq;
    uint256 r = id + 20000;
    uint16 sp = 0;
    for (uint i=0;i<25;i++) {
      r = r * 16807 % 2147483647; //advance PRNG
      seq[i] = uint32(r);
    }

    bytes memory h = "The first ";
    bytes memory NFT = "NFT ";    
    bytes memory s = new bytes(512); //max length
    uint p = 0;
    uint16 o = 0;
    uint16 f = 0;
    uint16 slot = 0;
    for (uint i=0;i<h.length;i++) s[p++] = h[i];

    f = uint16(seq[sp++] % 100);
    if (f < 50) {
      //qualifier 1
      slot = 2;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    }

    f = uint16(seq[sp++] % 100);
    if (f < 32) {
      //generative art category

      slot = 4; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
	
      bytes memory str = "generative ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];

      uint16 f2 = uint16(seq[sp++] % 100);
      if (f2 < 50) {	
	slot = 7; 
	o = uint16(seq[sp++] % n1[slot]);
	for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
      }
	
      slot = 10; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 50) {
      //PFP

      uint16 f2 = uint16(seq[sp++] % 100);
      if (f2 < 50) {	
	slot = 9; 
	o = uint16(seq[sp++] % n1[slot]);
	for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
	p--;
	bytes memory str = "-derivative ";
	for (uint i=0;i<str.length;i++) s[p++] = str[i];
      }
	
      slot = 3; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 12; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

    } else if (f < 54) {
      // 4% with none
    } else {
      //general category
      slot = 0; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    }
      
    for (uint i=0;i<NFT.length;i++) s[p++] = NFT[i];

    f = uint16(seq[sp++] % 100);      
    if (f < 50) {      
      slot = 1; //which chain
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    }
      
    f = uint16(seq[sp++] % 110);

    if (f < 5) {
      //special stuff
      slot = 13;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 15) {
      //featured in
      bytes memory str = "to be featured ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
      
      slot = 14; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];	
    } else if (f < 23) {
      //action by a 'dao vote'
      slot = 22;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 26;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

    } else if (f < 27) {
      // 4% with none	
    } else if (f < 40) {
      //action by a person
      slot = 8; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 5;  
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];	
    } else if (f < 50) {
      //airdropped
      bytes memory str = "to be airdropped to ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
	
      slot = 9; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 19;  
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];	
    } else if (f < 60) {
      //stakable/burnable for x
      slot = 15;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
	
      slot = 6; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 63) {
      //redeemable for x
      bytes memory str = "redeemable ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
	
      slot = 25;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 67) {
      //other special stuff
      slot = 27;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];	
    } else if (f < 80) {
      //with on-chain
      slot = 16;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 17;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 18;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 83) {
      //that changes over x
      slot = 20;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      slot = 21;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 87) {
      //sold on an x price ramp
      bytes memory str = "to be sold ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
      slot = 23;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 92) {
      //made using 100% programming language
      bytes memory str = "made entirely with ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
      slot = 24;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 99) {
      //inspired by
      bytes memory str = "inspired by ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
      slot = 28;
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];
    } else if (f < 110) {
      bytes memory str = "to be sold at ";
      for (uint i=0;i<str.length;i++) s[p++] = str[i];
      
      slot = 11; 
      o = uint16(seq[sp++] % n1[slot]);
      for (uint i=p1[slot][o];t1[slot][i] != '|';i++) s[p++] = t1[slot][i];

      uint16 f2 = uint16(seq[sp++] % 100);
      if (f2 < 20) {	
	bytes memory str2 = "for a record price ";
	for (uint i=0;i<str2.length;i++) s[p++] = str2[i];
      } else if (f2 < 40) {	
	bytes memory str2 = "for a pittance ";
	for (uint i=0;i<str2.length;i++) s[p++] = str2[i];
      }      
    }

    s[p-1] = '.';
    s[p] = '0';

    bytes memory s2 = new bytes(p);
    for (uint i=0;i<p;i++) s2[i] = s[i];
    return s2;
  }

  /* Upload a chunk of data */
  function setT1(uint16 cid, string calldata s) public requireAdmin {
    require(!locked,"Can't change data after locked");
    require(cid < 32);
    t1[cid] = bytes(s);
    calc_pointers(cid);
  }

  function tokenURI(uint256 tokenId) public view override returns (string memory) {
    string memory output = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: Courier New; font-size: 18px; }</style><rect width="100%" height="100%" fill="black" />';
    
    uint256 j = 25;
    bytes memory b = generate(tokenId);
    //calculate word wrapping 
    uint i = 0;
    uint e = 0;    
    uint ll = 30; //max length of each line
    
    while (true) {
      e = i + ll;
      if (e >= b.length) {
	e = b.length;
      } else {
	while (b[e] != ' ' && e > i) { e--; }
      }
      //splice the line in
      bytes memory line = new bytes(e-i);
      for (uint k = i; k < e; k++) {
	line[k-i] = b[k];
      }

      output = string(abi.encodePacked(output,'<text class="base" x="15" y = "',toString(j),'">',line,'</text>'));
      if (j > 200) break;
      
      j += 22;
      if (e >= b.length) break; //finished
      i = e + 1;
    }
    
    output = string(abi.encodePacked(output,'</svg>'));

    string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "First NFT #', toString(tokenId), '", "description": "First satirical on-chain generative text NFT about NFT firsts. Don\'t sleep on this historic collection.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
    output = string(abi.encodePacked('data:application/json;base64,', json));

    return output;
  }
  
    function claim(uint256 tokenId) public payable nonReentrant {
      require(!paused,"Currently paused");      
      require(!locked,"Can't mint after locked");
      
      require(tokenId > 0 && tokenId < 1000000, "Token ID invalid");
      require(num_minted < 5000,"All have been claimed.");

      uint price = 10000000000000000; //0.01 ETH
      require(msg.value>=10000000000000000, "Must send minimum value to purchase!");

      _mint(_msgSender(), tokenId);
      num_minted++;
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }

}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"generate","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"n1","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"num_minted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"p1","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"m","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"cid","type":"uint16"},{"internalType":"string","name":"s","type":"string"}],"name":"setT1","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":"","type":"uint256"}],"name":"t1","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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"}]

60806040523480156200001157600080fd5b5060405180604001604052806005815260200164119a5c9cdd60da1b8152506040518060400160405280600581526020016411925494d560da1b815250620000666301ffc9a760e01b6200016060201b60201c565b81516200007b90600690602085019062000371565b5080516200009190600790602084019062000371565b50620000a46380ac58cd60e01b62000160565b620000b6635b5e139f60e01b62000160565b620000c863780e9d6360e01b62000160565b50506001600a55600b805460ff60c81b196001600160a01b0319909116331716600160c81b17905560005b60208161ffff1610156200015957604051806040016040528060028152602001611f1f60f21b815250600c8261ffff16602081106200012e57fe5b0190805190602001906200014492919062000371565b506200015081620001e5565b600101620000f3565b506200040d565b6001600160e01b03198082161415620001c0576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b600080602c8361ffff1660208110620001fa57fe5b600202018261ffff16602081106200020e57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060005b600c8361ffff16602081106200024857fe5b0154600260001961010060018416150201909116048110156200033457600c8361ffff16602081106200027757fe5b01818154600181600116156101000203166002900481106200029557fe5b815460011615620002b55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14156200032b5780600101602c8461ffff1660208110620002eb57fe5b600202018360010193508361ffff16602081106200030557fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b60010162000236565b5080606c8361ffff16602081106200034857fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003b457805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e4578251825591602001919060010190620003c7565b50620003f2929150620003f6565b5090565b5b80821115620003f25760008155600101620003f7565b615eff806200041d6000396000f3fe6080604052600436106101d85760003560e01c806364dbea9911610102578063a305747611610095578063cf30901211610064578063cf30901214610817578063e985e9c51461082c578063ed88c68e14610867578063f83d08ba1461086f576101d8565b8063a3057476146106c2578063b7c763b5146106f0578063b88d4fde1461071a578063c87b56dd146107ed576101d8565b80638da5cb5b116100d15780638da5cb5b1461063357806395d89b411461064857806398c6ddb31461065d578063a22cb46514610687576101d8565b806364dbea991461057a5780636c0360eb146105bb57806370a08231146105d05780638d11da9b14610603576101d8565b806323b872dd1161017a5780634a7dd523116101495780634a7dd523146104e75780634f6ccce7146105115780635c975abb1461053b5780636352211e14610550576101d8565b806323b872dd1461040b5780632f745c591461044e578063379607f51461048757806342842e0e146104a4576101d8565b8063081812fc116101b6578063081812fc14610339578063095ea7b31461037f57806316c38b3c146103b857806318160ddd146103e4576101d8565b806301ffc9a7146101dd57806305dc023d1461022557806306fdde03146102af575b600080fd5b3480156101e957600080fd5b506102116004803603602081101561020057600080fd5b50356001600160e01b031916610884565b604080519115158252519081900360200190f35b34801561023157600080fd5b506102ad6004803603604081101561024857600080fd5b61ffff823516919081019060408101602082013564010000000081111561026e57600080fd5b82018360208201111561028057600080fd5b803590602001918460018302840111640100000000831117156102a257600080fd5b5090925090506108a7565b005b3480156102bb57600080fd5b506102c46109a0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034557600080fd5b506103636004803603602081101561035c57600080fd5b5035610a36565b604080516001600160a01b039092168252519081900360200190f35b34801561038b57600080fd5b506102ad600480360360408110156103a257600080fd5b506001600160a01b038135169060200135610a98565b3480156103c457600080fd5b506102ad600480360360208110156103db57600080fd5b50351515610b6e565b3480156103f057600080fd5b506103f9610be7565b60408051918252519081900360200190f35b34801561041757600080fd5b506102ad6004803603606081101561042e57600080fd5b506001600160a01b03813581169160208101359091169060400135610bf8565b34801561045a57600080fd5b506103f96004803603604081101561047157600080fd5b506001600160a01b038135169060200135610c4f565b6102ad6004803603602081101561049d57600080fd5b5035610c7a565b3480156104b057600080fd5b506102ad600480360360608110156104c757600080fd5b506001600160a01b03813581169160208101359091169060400135610eca565b3480156104f357600080fd5b506102c46004803603602081101561050a57600080fd5b5035610ee5565b34801561051d57600080fd5b506103f96004803603602081101561053457600080fd5b503561452d565b34801561054757600080fd5b50610211614543565b34801561055c57600080fd5b506103636004803603602081101561057357600080fd5b5035614553565b34801561058657600080fd5b506105a46004803603602081101561059d57600080fd5b503561457b565b6040805161ffff9092168252519081900360200190f35b3480156105c757600080fd5b506102c46145a6565b3480156105dc57600080fd5b506103f9600480360360208110156105f357600080fd5b50356001600160a01b0316614607565b34801561060f57600080fd5b506105a46004803603604081101561062657600080fd5b508035906020013561466f565b34801561063f57600080fd5b506103636146ac565b34801561065457600080fd5b506102c46146bb565b34801561066957600080fd5b506102c46004803603602081101561068057600080fd5b503561471c565b34801561069357600080fd5b506102ad600480360360408110156106aa57600080fd5b506001600160a01b03813516906020013515156147b7565b3480156106ce57600080fd5b506106d76148bc565b6040805163ffffffff9092168252519081900360200190f35b3480156106fc57600080fd5b506102c46004803603602081101561071357600080fd5b50356148cf565b34801561072657600080fd5b506102ad6004803603608081101561073d57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561077857600080fd5b82018360208201111561078a57600080fd5b803590602001918460018302840111640100000000831117156107ac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506148da945050505050565b3480156107f957600080fd5b506102c46004803603602081101561081057600080fd5b5035614938565b34801561082357600080fd5b50610211614dfa565b34801561083857600080fd5b506102116004803603604081101561084f57600080fd5b506001600160a01b0381358116916020013516614e0a565b6102ad614e38565b34801561087b57600080fd5b506102ad614ed6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600b546001600160a01b03163314610902576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b54600160c01b900460ff1615610961576040805162461bcd60e51b815260206004820152601e60248201527f43616e2774206368616e67652064617461206166746572206c6f636b65640000604482015290519081900360640190fd5b60208361ffff161061097257600080fd5b8181600c8561ffff166020811061098557fe5b61099193910191615a6a565b5061099b83614f46565b505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050905090565b6000610a41826150c6565b610a7c5760405162461bcd60e51b815260040180806020018281038252602c815260200180615d41602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610aa382614553565b9050806001600160a01b0316836001600160a01b03161415610af65760405162461bcd60e51b8152600401808060200182810382526021815260200180615d966021913960400191505060405180910390fd5b806001600160a01b0316610b086150d3565b6001600160a01b03161480610b295750610b2981610b246150d3565b614e0a565b610b645760405162461bcd60e51b8152600401808060200182810382526038815260200180615c546038913960400191505060405180910390fd5b61099b83836150d7565b600b546001600160a01b03163314610bc9576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b8054911515600160c81b0260ff60c81b19909216919091179055565b6000610bf36002615145565b905090565b610c09610c036150d3565b82615150565b610c445760405162461bcd60e51b8152600401808060200182810382526031815260200180615db76031913960400191505060405180910390fd5b61099b8383836151f4565b6001600160a01b0382166000908152600160205260408120610c719083615340565b90505b92915050565b6002600a541415610cd2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600a55600b54600160c81b900460ff1615610d29576040805162461bcd60e51b815260206004820152601060248201526f10dd5c9c995b9d1b1e481c185d5cd95960821b604482015290519081900360640190fd5b600b54600160c01b900460ff1615610d88576040805162461bcd60e51b815260206004820152601760248201527f43616e2774206d696e74206166746572206c6f636b6564000000000000000000604482015290519081900360640190fd5b600081118015610d9a5750620f424081105b610dde576040805162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015290519081900360640190fd5b600b54611388600160a01b90910463ffffffff1610610e3d576040805162461bcd60e51b815260206004820152601660248201527520b636103430bb32903132b2b71031b630b4b6b2b21760511b604482015290519081900360640190fd5b662386f26fc1000034811115610e845760405162461bcd60e51b8152600401808060200182810382526024815260200180615c306024913960400191505060405180910390fd5b610e95610e8f6150d3565b8361534c565b5050600b8054600163ffffffff600160a01b808404821683019091160263ffffffff60a01b1990921691909117909155600a55565b61099b838383604051806020016040528060008152506148da565b6060600082118015610ef95750620f424082105b610f0257600080fd5b610f0a615ae8565b614e2083016000805b6019811015610f4e57637fffffff6141a7840206925082848260198110610f3657fe5b63ffffffff9092166020929092020152600101610f13565b50604080518082018252600a81526902a3432903334b939ba160b51b602080830191909152825180840184526004815263027232a160e51b8183015283516102008082526102208201909552929390926060929091908201818036833701905050905060008060008060005b875181101561100b57878181518110610fcf57fe5b602001015160f81c60f81b868680600101975081518110610fec57fe5b60200101906001600160f81b031916908160001a905350600101610fba565b5060648a89806001019a5061ffff166019811061102457fe5b602002015163ffffffff168161103657fe5b06915060328261ffff1610156111bf5750606c54600188019760029161ffff6401000000009091048116918c91166019811061106e57fe5b602002015163ffffffff168161108057fe5b0692506000602c8261ffff166020811061109657fe5b600202018461ffff16602081106110a957fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106110db57fe5b01818154600181600116156101000203166002900481106110f857fe5b8154600116156111175790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146111bd57600c8261ffff166020811061114657fe5b018181546001816001161561010002031660029004811061116357fe5b8154600116156111825790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061119e57fe5b60200101906001600160f81b031916908160001a9053506001016110ca565b505b60648a89806001019a5061ffff16601981106111d757fe5b602002015163ffffffff16816111e957fe5b06915060208261ffff1610156117195750606c54600188019760049161ffff600160401b9091048116918c91166019811061122057fe5b602002015163ffffffff168161123257fe5b0692506000602c8261ffff166020811061124857fe5b600202018461ffff166020811061125b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061128d57fe5b01818154600181600116156101000203166002900481106112aa57fe5b8154600116156112c95790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461136f57600c8261ffff16602081106112f857fe5b018181546001816001161561010002031660029004811061131557fe5b8154600116156113345790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061135057fe5b60200101906001600160f81b031916908160001a90535060010161127c565b5060408051808201909152600b81526a033b2b732b930ba34bb32960ad1b602082015260005b81518110156113e6578181815181106113aa57fe5b602001015160f81c60f81b8787806001019850815181106113c757fe5b60200101906001600160f81b031916908160001a905350600101611395565b50600060648c8b806001019c5061ffff166019811061140157fe5b602002015163ffffffff168161141357fe5b06905060328161ffff16101561159b57606c5460018b019a6007945061ffff600160701b9092048216918e91166019811061144a57fe5b602002015163ffffffff168161145c57fe5b0694506000602c8461ffff166020811061147257fe5b600202018661ffff166020811061148557fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8461ffff16602081106114b757fe5b01818154600181600116156101000203166002900481106114d457fe5b8154600116156114f35790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461159957600c8461ffff166020811061152257fe5b018181546001816001161561010002031660029004811061153f57fe5b81546001161561155e5790600052602060002090602091828204019190065b9054901a600160f81b0288888060010199508151811061157a57fe5b60200101906001600160f81b031916908160001a9053506001016114a6565b505b606c5460018b019a600a945061ffff600160a01b9092048216918e9116601981106115c257fe5b602002015163ffffffff16816115d457fe5b0694506000602c8461ffff16602081106115ea57fe5b600202018661ffff16602081106115fd57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8461ffff166020811061162f57fe5b018181546001816001161561010002031660029004811061164c57fe5b81546001161561166b5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461171157600c8461ffff166020811061169a57fe5b01818154600181600116156101000203166002900481106116b757fe5b8154600116156116d65790600052602060002090602091828204019190065b9054901a600160f81b028888806001019950815181106116f257fe5b60200101906001600160f81b031916908160001a90535060010161161e565b505050611dd4565b60328261ffff161015611c5157600060648b8a806001019b5061ffff166019811061174057fe5b602002015163ffffffff168161175257fe5b06905060328161ffff16101561195a57606c5460018a01996009935061ffff600160901b9092048216918d91166019811061178957fe5b602002015163ffffffff168161179b57fe5b0693506000602c8361ffff16602081106117b157fe5b600202018561ffff16602081106117c457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106117f657fe5b018181546001816001161561010002031660029004811061181357fe5b8154600116156118325790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146118d857600c8361ffff166020811061186157fe5b018181546001816001161561010002031660029004811061187e57fe5b81546001161561189d5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106118b957fe5b60200101906001600160f81b031916908160001a9053506001016117e5565b5060408051808201909152600c81526b016b232b934bb30ba34bb32960a51b60208201526000199095019460005b81518110156119575781818151811061191b57fe5b602001015160f81c60f81b88888060010199508151811061193857fe5b60200101906001600160f81b031916908160001a905350600101611906565b50505b606c5460018a01996003935061ffff66010000000000009092048216918d91166019811061198457fe5b602002015163ffffffff168161199657fe5b0693506000602c8361ffff16602081106119ac57fe5b600202018561ffff16602081106119bf57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106119f157fe5b0181815460018160011615610100020316600290048110611a0e57fe5b815460011615611a2d5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611ad357600c8361ffff1660208110611a5c57fe5b0181815460018160011615610100020316600290048110611a7957fe5b815460011615611a985790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110611ab457fe5b60200101906001600160f81b031916908160001a9053506001016119e0565b50606c5460018a0199600c935061ffff600160c01b9092048216918d911660198110611afb57fe5b602002015163ffffffff1681611b0d57fe5b0693506000602c8361ffff1660208110611b2357fe5b600202018561ffff1660208110611b3657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110611b6857fe5b0181815460018160011615610100020316600290048110611b8557fe5b815460011615611ba45790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611c4a57600c8361ffff1660208110611bd357fe5b0181815460018160011615610100020316600290048110611bf057fe5b815460011615611c0f5790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110611c2b57fe5b60200101906001600160f81b031916908160001a905350600101611b57565b5050611dd4565b60368261ffff161015611c6357611dd4565b50606c54600188019760009161ffff908116918c911660198110611c8357fe5b602002015163ffffffff1681611c9557fe5b0692506000602c8261ffff1660208110611cab57fe5b600202018461ffff1660208110611cbe57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110611cf057fe5b0181815460018160011615610100020316600290048110611d0d57fe5b815460011615611d2c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611dd257600c8261ffff1660208110611d5b57fe5b0181815460018160011615610100020316600290048110611d7857fe5b815460011615611d975790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110611db357fe5b60200101906001600160f81b031916908160001a905350600101611cdf565b505b60005b8651811015611e2857868181518110611dec57fe5b602001015160f81c60f81b868680600101975081518110611e0957fe5b60200101906001600160f81b031916908160001a905350600101611dd7565b5060648a89806001019a5061ffff1660198110611e4157fe5b602002015163ffffffff1681611e5357fe5b06915060328261ffff161015611fda5750606c54600188810198909161ffff620100009091048116918c911660198110611e8957fe5b602002015163ffffffff1681611e9b57fe5b0692506000602c8261ffff1660208110611eb157fe5b600202018461ffff1660208110611ec457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110611ef657fe5b0181815460018160011615610100020316600290048110611f1357fe5b815460011615611f325790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611fd857600c8261ffff1660208110611f6157fe5b0181815460018160011615610100020316600290048110611f7e57fe5b815460011615611f9d5790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110611fb957fe5b60200101906001600160f81b031916908160001a905350600101611ee5565b505b606e8a89806001019a5061ffff1660198110611ff257fe5b602002015163ffffffff168161200457fe5b06915060058261ffff1610156121905750606c546001880197600d9161ffff600160d01b9091048116918c91166019811061203b57fe5b602002015163ffffffff168161204d57fe5b0692506000602c8261ffff166020811061206357fe5b600202018461ffff166020811061207657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106120a857fe5b01818154600181600116156101000203166002900481106120c557fe5b8154600116156120e45790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061211357fe5b018181546001816001161561010002031660029004811061213057fe5b81546001161561214f5790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061216b57fe5b60200101906001600160f81b031916908160001a905350600101612097565b50614435565b600f8261ffff1610156123955760408051808201909152600f81526e03a37903132903332b0ba3ab932b21608d1b602082015260005b8151811015612217578181815181106121db57fe5b602001015160f81c60f81b8787806001019850815181106121f857fe5b60200101906001600160f81b031916908160001a9053506001016121c6565b50606c5460018a0199600e935061ffff600160e01b9092048216918d91166019811061223f57fe5b602002015163ffffffff168161225157fe5b0693506000602c8361ffff166020811061226757fe5b600202018561ffff166020811061227a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106122ac57fe5b01818154600181600116156101000203166002900481106122c957fe5b8154600116156122e85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061231757fe5b018181546001816001161561010002031660029004811061233457fe5b8154600116156123535790600052602060002090602091828204019190065b9054901a600160f81b0287878060010198508151811061236f57fe5b60200101906001600160f81b031916908160001a90535060010161229b565b5050614435565b60178261ffff16101561268f5750606d54600188019760169161ffff600160601b9091048116918c9116601981106123c957fe5b602002015163ffffffff16816123db57fe5b0692506000602c8261ffff16602081106123f157fe5b600202018461ffff166020811061240457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061243657fe5b018181546001816001161561010002031660029004811061245357fe5b8154600116156124725790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461251857600c8261ffff16602081106124a157fe5b01818154600181600116156101000203166002900481106124be57fe5b8154600116156124dd5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106124f957fe5b60200101906001600160f81b031916908160001a905350600101612425565b5050606d546001880197601a9161ffff600160a01b9091048116918c91166019811061254057fe5b602002015163ffffffff168161255257fe5b0692506000602c8261ffff166020811061256857fe5b600202018461ffff166020811061257b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106125ad57fe5b01818154600181600116156101000203166002900481106125ca57fe5b8154600116156125e95790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061261857fe5b018181546001816001161561010002031660029004811061263557fe5b8154600116156126545790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061267057fe5b60200101906001600160f81b031916908160001a90535060010161259c565b601b8261ffff1610156126a157614435565b60288261ffff16101561299b5750606c54600188019760089161ffff600160801b9091048116918c9116601981106126d557fe5b602002015163ffffffff16816126e757fe5b0692506000602c8261ffff16602081106126fd57fe5b600202018461ffff166020811061271057fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061274257fe5b018181546001816001161561010002031660029004811061275f57fe5b81546001161561277e5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461282457600c8261ffff16602081106127ad57fe5b01818154600181600116156101000203166002900481106127ca57fe5b8154600116156127e95790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061280557fe5b60200101906001600160f81b031916908160001a905350600101612731565b5050606c54600188019760059161ffff600160501b9091048116918c91166019811061284c57fe5b602002015163ffffffff168161285e57fe5b0692506000602c8261ffff166020811061287457fe5b600202018461ffff166020811061288757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106128b957fe5b01818154600181600116156101000203166002900481106128d657fe5b8154600116156128f55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061292457fe5b018181546001816001161561010002031660029004811061294157fe5b8154600116156129605790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061297c57fe5b60200101906001600160f81b031916908160001a9053506001016128a8565b60328261ffff161015612d185760408051808201909152601481527303a379031329030b4b9323937b83832b2103a37960651b602082015260005b8151811015612a27578181815181106129eb57fe5b602001015160f81c60f81b878780600101985081518110612a0857fe5b60200101906001600160f81b031916908160001a9053506001016129d6565b50606c5460018a01996009935061ffff600160901b9092048216918d911660198110612a4f57fe5b602002015163ffffffff1681612a6157fe5b0693506000602c8361ffff1660208110612a7757fe5b600202018561ffff1660208110612a8a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110612abc57fe5b0181815460018160011615610100020316600290048110612ad957fe5b815460011615612af85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14612b9e57600c8361ffff1660208110612b2757fe5b0181815460018160011615610100020316600290048110612b4457fe5b815460011615612b635790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110612b7f57fe5b60200101906001600160f81b031916908160001a905350600101612aab565b50606d5460018a01996013935061ffff66010000000000009092048216918d911660198110612bc957fe5b602002015163ffffffff1681612bdb57fe5b0693506000602c8361ffff1660208110612bf157fe5b600202018561ffff1660208110612c0457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110612c3657fe5b0181815460018160011615610100020316600290048110612c5357fe5b815460011615612c725790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110612ca157fe5b0181815460018160011615610100020316600290048110612cbe57fe5b815460011615612cdd5790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110612cf957fe5b60200101906001600160f81b031916908160001a905350600101612c25565b603c8261ffff1610156130125750606c546001880197600f9161ffff600160f01b9091048116918c911660198110612d4c57fe5b602002015163ffffffff1681612d5e57fe5b0692506000602c8261ffff1660208110612d7457fe5b600202018461ffff1660208110612d8757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110612db957fe5b0181815460018160011615610100020316600290048110612dd657fe5b815460011615612df55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14612e9b57600c8261ffff1660208110612e2457fe5b0181815460018160011615610100020316600290048110612e4157fe5b815460011615612e605790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110612e7c57fe5b60200101906001600160f81b031916908160001a905350600101612da8565b5050606c54600188019760069161ffff600160601b9091048116918c911660198110612ec357fe5b602002015163ffffffff1681612ed557fe5b0692506000602c8261ffff1660208110612eeb57fe5b600202018461ffff1660208110612efe57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110612f3057fe5b0181815460018160011615610100020316600290048110612f4d57fe5b815460011615612f6c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff1660208110612f9b57fe5b0181815460018160011615610100020316600290048110612fb857fe5b815460011615612fd75790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110612ff357fe5b60200101906001600160f81b031916908160001a905350600101612f1f565b603f8261ffff16101561320b5760408051808201909152600b81526a03932b232b2b6b0b13632960ad1b602082015260005b81518110156130955781818151811061305957fe5b602001015160f81c60f81b87878060010198508151811061307657fe5b60200101906001600160f81b031916908160001a905350600101613044565b50606d5460018a01996019935061ffff600160901b9092048216918d91168481106130bc57fe5b602002015163ffffffff16816130ce57fe5b0693506000602c8361ffff16602081106130e457fe5b600202018561ffff16602081106130f757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061312957fe5b018181546001816001161561010002031660029004811061314657fe5b8154600116156131655790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061319457fe5b01818154600181600116156101000203166002900481106131b157fe5b8154600116156131d05790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106131ec57fe5b60200101906001600160f81b031916908160001a905350600101613118565b60438261ffff16101561338e5750606d546001880197601b9161ffff600160b01b9091048116918c91166019811061323f57fe5b602002015163ffffffff168161325157fe5b0692506000602c8261ffff166020811061326757fe5b600202018461ffff166020811061327a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106132ac57fe5b01818154600181600116156101000203166002900481106132c957fe5b8154600116156132e85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061331757fe5b018181546001816001161561010002031660029004811061333457fe5b8154600116156133535790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061336f57fe5b60200101906001600160f81b031916908160001a90535060010161329b565b60508261ffff1610156137f85750606d54600188019760109161ffff908116918c9116601981106133bb57fe5b602002015163ffffffff16816133cd57fe5b0692506000602c8261ffff16602081106133e357fe5b600202018461ffff16602081106133f657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061342857fe5b018181546001816001161561010002031660029004811061344557fe5b8154600116156134645790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461350a57600c8261ffff166020811061349357fe5b01818154600181600116156101000203166002900481106134b057fe5b8154600116156134cf5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106134eb57fe5b60200101906001600160f81b031916908160001a905350600101613417565b5050606d54600188019760119161ffff620100009091048116918c91166019811061353157fe5b602002015163ffffffff168161354357fe5b0692506000602c8261ffff166020811061355957fe5b600202018461ffff166020811061356c57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061359e57fe5b01818154600181600116156101000203166002900481106135bb57fe5b8154600116156135da5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461368057600c8261ffff166020811061360957fe5b018181546001816001161561010002031660029004811061362657fe5b8154600116156136455790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061366157fe5b60200101906001600160f81b031916908160001a90535060010161358d565b5050606d54600188019760129161ffff6401000000009091048116918c9116601981106136a957fe5b602002015163ffffffff16816136bb57fe5b0692506000602c8261ffff16602081106136d157fe5b600202018461ffff16602081106136e457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061371657fe5b018181546001816001161561010002031660029004811061373357fe5b8154600116156137525790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061378157fe5b018181546001816001161561010002031660029004811061379e57fe5b8154600116156137bd5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106137d957fe5b60200101906001600160f81b031916908160001a905350600101613705565b60538261ffff161015613af25750606d54600188019760149161ffff600160401b9091048116918c91166019811061382c57fe5b602002015163ffffffff168161383e57fe5b0692506000602c8261ffff166020811061385457fe5b600202018461ffff166020811061386757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061389957fe5b01818154600181600116156101000203166002900481106138b657fe5b8154600116156138d55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461397b57600c8261ffff166020811061390457fe5b018181546001816001161561010002031660029004811061392157fe5b8154600116156139405790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061395c57fe5b60200101906001600160f81b031916908160001a905350600101613888565b5050606d54600188019760159161ffff600160501b9091048116918c9116601981106139a357fe5b602002015163ffffffff16816139b557fe5b0692506000602c8261ffff16602081106139cb57fe5b600202018461ffff16602081106139de57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110613a1057fe5b0181815460018160011615610100020316600290048110613a2d57fe5b815460011615613a4c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff1660208110613a7b57fe5b0181815460018160011615610100020316600290048110613a9857fe5b815460011615613ab75790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110613ad357fe5b60200101906001600160f81b031916908160001a9053506001016139ff565b60578261ffff161015613cec5760408051808201909152600b81526a03a379031329039b7b632160ad1b602082015260005b8151811015613b7557818181518110613b3957fe5b602001015160f81c60f81b878780600101985081518110613b5657fe5b60200101906001600160f81b031916908160001a905350600101613b24565b50606d5460018a01996017935061ffff600160701b9092048216918d911660198110613b9d57fe5b602002015163ffffffff1681613baf57fe5b0693506000602c8361ffff1660208110613bc557fe5b600202018561ffff1660208110613bd857fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110613c0a57fe5b0181815460018160011615610100020316600290048110613c2757fe5b815460011615613c465790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110613c7557fe5b0181815460018160011615610100020316600290048110613c9257fe5b815460011615613cb15790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110613ccd57fe5b60200101906001600160f81b031916908160001a905350600101613bf9565b605c8261ffff161015613eee57604080518082019091526013815272036b0b2329032b73a34b932b63c903bb4ba341606d1b602082015260005b8151811015613d7757818181518110613d3b57fe5b602001015160f81c60f81b878780600101985081518110613d5857fe5b60200101906001600160f81b031916908160001a905350600101613d26565b50606d5460018a01996018935061ffff600160801b9092048216918d911660198110613d9f57fe5b602002015163ffffffff1681613db157fe5b0693506000602c8361ffff1660208110613dc757fe5b600202018561ffff1660208110613dda57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110613e0c57fe5b0181815460018160011615610100020316600290048110613e2957fe5b815460011615613e485790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110613e7757fe5b0181815460018160011615610100020316600290048110613e9457fe5b815460011615613eb35790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110613ecf57fe5b60200101906001600160f81b031916908160001a905350600101613dfb565b60638261ffff1610156140e95760408051808201909152600c81526b034b739b834b932b210313c960a51b602082015260005b8151811015613f7257818181518110613f3657fe5b602001015160f81c60f81b878780600101985081518110613f5357fe5b60200101906001600160f81b031916908160001a905350600101613f21565b50606d5460018a0199601c935061ffff600160c01b9092048216918d911660198110613f9a57fe5b602002015163ffffffff1681613fac57fe5b0693506000602c8361ffff1660208110613fc257fe5b600202018561ffff1660208110613fd557fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061400757fe5b018181546001816001161561010002031660029004811061402457fe5b8154600116156140435790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061407257fe5b018181546001816001161561010002031660029004811061408f57fe5b8154600116156140ae5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106140ca57fe5b60200101906001600160f81b031916908160001a905350600101613ff6565b606e8261ffff1610156144355760408051808201909152600e81526d03a379031329039b7b6321030ba160951b602082015260005b815181101561416f5781818151811061413357fe5b602001015160f81c60f81b87878060010198508151811061415057fe5b60200101906001600160f81b031916908160001a90535060010161411e565b50606c5460018a0199600b935061ffff600160b01b9092048216918d91166019811061419757fe5b602002015163ffffffff16816141a957fe5b0693506000602c8361ffff16602081106141bf57fe5b600202018561ffff16602081106141d257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061420457fe5b018181546001816001161561010002031660029004811061422157fe5b8154600116156142405790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146142e657600c8361ffff166020811061426f57fe5b018181546001816001161561010002031660029004811061428c57fe5b8154600116156142ab5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106142c757fe5b60200101906001600160f81b031916908160001a9053506001016141f3565b50600060648c8b806001019c5061ffff166019811061430157fe5b602002015163ffffffff168161431357fe5b06905060148161ffff1610156143a85760408051808201909152601381527203337b91030903932b1b7b93210383934b1b29606d1b602082015260005b81518110156143a15781818151811061436557fe5b602001015160f81c60f81b8989806001019a508151811061438257fe5b60200101906001600160f81b031916908160001a905350600101614350565b5050614432565b60288161ffff1610156144325760408051808201909152600f81526e03337b91030903834ba3a30b731b29608d1b602082015260005b815181101561442f578181815181106143f357fe5b602001015160f81c60f81b8989806001019a508151811061441057fe5b60200101906001600160f81b031916908160001a9053506001016143de565b50505b50505b601760f91b85600186038151811061444957fe5b60200101906001600160f81b031916908160001a905350600360fc1b85858151811061447157fe5b60200101906001600160f81b031916908160001a90535060608467ffffffffffffffff811180156144a157600080fd5b506040519080825280601f01601f1916602001820160405280156144cc576020820181803683370190505b50905060005b8581101561451c578681815181106144e657fe5b602001015160f81c60f81b8282815181106144fd57fe5b60200101906001600160f81b031916908160001a9053506001016144d2565b509c9b505050505050505050505050565b60008061453b60028461547a565b509392505050565b600b54600160c81b900460ff1681565b6000610c7482604051806060016040528060298152602001615cb66029913960029190615496565b606c816020811061458857fe5b60109182820401919006600202915054906101000a900461ffff1681565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b60006001600160a01b03821661464e5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c8c602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600160205260409020610c7490615145565b602c826020811061467c57fe5b60020201816020811061468b57fe5b60109182820401919006600202915091509054906101000a900461ffff1681565b600b546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b600c816020811061472957fe5b018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815293508301828280156147af5780601f10614784576101008083540402835291602001916147af565b820191906000526020600020905b81548152906001019060200180831161479257829003601f168201915b505050505081565b6147bf6150d3565b6001600160a01b0316826001600160a01b03161415614825576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80600560006148326150d3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556148766150d3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600b54600160a01b900463ffffffff1681565b6060610c7482610ee5565b6148eb6148e56150d3565b83615150565b6149265760405162461bcd60e51b8152600401808060200182810382526031815260200180615db76031913960400191505060405180910390fd5b614932848484846154ad565b50505050565b60608060405180610120016040528060e28152602001615de860e2913990506019606061496485610ee5565b9050600080601e5b80830191508351821061498257835191506149c1565b83828151811061498e57fe5b6020910101516001600160f81b031916600160fd1b148015906149b057508282115b156149c15760001990910190614982565b606083830367ffffffffffffffff811180156149dc57600080fd5b506040519080825280601f01601f191660200182016040528015614a07576020820181803683370190505b509050835b83811015614a5857858181518110614a2057fe5b602001015160f81c60f81b8286830381518110614a3957fe5b60200101906001600160f81b031916908160001a905350600101614a0c565b5086614a63876154b8565b826040516020018084805190602001908083835b60208310614a965780518252601f199092019160209182019101614a77565b51815160209384036101000a60001901801990921691161790527f3c7465787420636c6173733d22626173652220783d223135222079203d202200919093019081528551601f90910192860191508083835b60208310614b075780518252601f199092019160209182019101614ae8565b51815160209384036101000a600019018019909216911617905261111f60f11b919093019081528451600290910192850191508083835b60208310614b5d5780518252601f199092019160209182019101614b3e565b6001836020036101000a03801982511681845116808217855250505050505090500180661e17ba32bc3a1f60c91b8152506007019350505050604051602081830303815290604052965060c8861115614bb65750614bd6565b60168601955084518310614bca5750614bd6565b8260010193505061496c565b856040516020018082805190602001908083835b60208310614c095780518252601f199092019160209182019101614bea565b6001836020036101000a03801982511681845116808217855250505050505090500180651e17b9bb339f60d11b81525060060191505060405160208183030381529060405295506060614d58614c5e8a6154b8565b614c6789615582565b6040516020018080747b226e616d65223a20224669727374204e4654202360581b81525060150183805190602001908083835b60208310614cb95780518252601f199092019160209182019101614c9a565b6001836020036101000a03801982511681845116808217855250505050505090500180615b3f60a1913960a10182805190602001908083835b60208310614d115780518252601f199092019160209182019101614cf2565b6001836020036101000a0380198251168184511680821785525050505050509050018061227d60f01b81525060020192505050604051602081830303815290604052615582565b90508060405160200180807f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250601d0182805190602001908083835b60208310614db55780518252601f199092019160209182019101614d96565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052965086975050505050505050919050565b600b54600160c01b900460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b03163314614e93576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b60405173c7464dbca260a8faf033460622b23467df5aea42904780156108fc02916000818181858888f19350505050158015614ed3573d6000803e3d6000fd5b50565b600b546001600160a01b03163314614f31576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b805460ff60c01b1916600160c01b179055565b600080602c8361ffff1660208110614f5a57fe5b600202018261ffff1660208110614f6d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060005b600c8361ffff1660208110614fa657fe5b01546002600019610100600184161502019091160481101561508a57600c8361ffff1660208110614fd357fe5b0181815460018160011615610100020316600290048110614ff057fe5b81546001161561500f5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14156150825780600101602c8461ffff166020811061504357fe5b600202018360010193508361ffff166020811061505c57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b600101614f95565b5080606c8361ffff166020811061509d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6000610c746002836156c4565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061510c82614553565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610c74826156d0565b600061515b826150c6565b6151965760405162461bcd60e51b815260040180806020018281038252602c815260200180615c04602c913960400191505060405180910390fd5b60006151a183614553565b9050806001600160a01b0316846001600160a01b031614806151dc5750836001600160a01b03166151d184610a36565b6001600160a01b0316145b806151ec57506151ec8185614e0a565b949350505050565b826001600160a01b031661520782614553565b6001600160a01b03161461524c5760405162461bcd60e51b8152600401808060200182810382526029815260200180615d6d6029913960400191505060405180910390fd5b6001600160a01b0382166152915760405162461bcd60e51b8152600401808060200182810382526024815260200180615be06024913960400191505060405180910390fd5b61529c83838361099b565b6152a76000826150d7565b6001600160a01b03831660009081526001602052604090206152c990826156d4565b506001600160a01b03821660009081526001602052604090206152ec90826156e0565b506152f9600282846156ec565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610c718383615702565b6001600160a01b0382166153a7576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6153b0816150c6565b15615402576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61540e6000838361099b565b6001600160a01b038216600090815260016020526040902061543090826156e0565b5061543d600282846156ec565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008080806154898686615766565b9097909650945050505050565b60006154a38484846157e1565b90505b9392505050565b6149328484846151f4565b6060816154dd57506040805180820190915260018152600360fc1b60208201526108a2565b8160005b81156154f557600101600a820491506154e1565b60608167ffffffffffffffff8111801561550e57600080fd5b506040519080825280601f01601f191660200182016040528015615539576020820181803683370190505b5090505b84156151ec5760001990910190600a850660300160f81b81838151811061556057fe5b60200101906001600160f81b031916908160001a905350600a8504945061553d565b8051606090806155a25750506040805160208101909152600081526108a2565b6004600360028301040260606020820167ffffffffffffffff811180156155c857600080fd5b506040519080825280601f01601f1916602001820160405280156155f3576020820181803683370190505b5090506060604051806060016040528060408152602001615cdf604091399050600181016020830160005b8681101561567f576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161561e565b50600386066001811461569957600281146156aa576156b6565b613d3d60f01b6001198301526156b6565b603d60f81b6000198301525b505050918152949350505050565b6000610c7183836158ab565b5490565b6000610c7183836158c3565b6000610c718383615989565b60006154a384846001600160a01b0385166159d3565b815460009082106157445760405162461bcd60e51b8152600401808060200182810382526022815260200180615b1d6022913960400191505060405180910390fd5b82600001828154811061575357fe5b9060005260206000200154905092915050565b8154600090819083106157aa5760405162461bcd60e51b8152600401808060200182810382526022815260200180615d1f6022913960400191505060405180910390fd5b60008460000184815481106157bb57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161587c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615841578181015183820152602001615829565b50505050905090810190601f16801561586e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061588f57fe5b9060005260206000209060020201600101549150509392505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561597f57835460001980830191908101906000908790839081106158f657fe5b906000526020600020015490508087600001848154811061591357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061594357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c74565b6000915050610c74565b600061599583836158ab565b6159cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c74565b506000610c74565b600082815260018401602052604081205480615a385750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556154a6565b82856000016001830381548110615a4b57fe5b90600052602060002090600202016001018190555060009150506154a6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615aab5782800160ff19823516178555615ad8565b82800160010185558215615ad8579182015b82811115615ad8578235825591602001919060010190615abd565b50615ae4929150615b07565b5090565b6040518061032001604052806019906020820280368337509192915050565b5b80821115615ae45760008155600101615b0856fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473222c20226465736372697074696f6e223a202246697273742073617469726963616c206f6e2d636861696e2067656e657261746976652074657874204e46542061626f7574204e4654206669727374732e20446f6e277420736c656570206f6e207468697320686973746f72696320636f6c6c656374696f6e2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d7573742073656e64206d696e696d756d2076616c756520746f207075726368617365214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665643c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a20436f7572696572204e65773b20666f6e742d73697a653a20313870783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3ea2646970667358221220cc930c597bed7e7f19a79561ee2875949cb9c79c270ec02030aa240e0d53556264736f6c63430007030033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806364dbea9911610102578063a305747611610095578063cf30901211610064578063cf30901214610817578063e985e9c51461082c578063ed88c68e14610867578063f83d08ba1461086f576101d8565b8063a3057476146106c2578063b7c763b5146106f0578063b88d4fde1461071a578063c87b56dd146107ed576101d8565b80638da5cb5b116100d15780638da5cb5b1461063357806395d89b411461064857806398c6ddb31461065d578063a22cb46514610687576101d8565b806364dbea991461057a5780636c0360eb146105bb57806370a08231146105d05780638d11da9b14610603576101d8565b806323b872dd1161017a5780634a7dd523116101495780634a7dd523146104e75780634f6ccce7146105115780635c975abb1461053b5780636352211e14610550576101d8565b806323b872dd1461040b5780632f745c591461044e578063379607f51461048757806342842e0e146104a4576101d8565b8063081812fc116101b6578063081812fc14610339578063095ea7b31461037f57806316c38b3c146103b857806318160ddd146103e4576101d8565b806301ffc9a7146101dd57806305dc023d1461022557806306fdde03146102af575b600080fd5b3480156101e957600080fd5b506102116004803603602081101561020057600080fd5b50356001600160e01b031916610884565b604080519115158252519081900360200190f35b34801561023157600080fd5b506102ad6004803603604081101561024857600080fd5b61ffff823516919081019060408101602082013564010000000081111561026e57600080fd5b82018360208201111561028057600080fd5b803590602001918460018302840111640100000000831117156102a257600080fd5b5090925090506108a7565b005b3480156102bb57600080fd5b506102c46109a0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034557600080fd5b506103636004803603602081101561035c57600080fd5b5035610a36565b604080516001600160a01b039092168252519081900360200190f35b34801561038b57600080fd5b506102ad600480360360408110156103a257600080fd5b506001600160a01b038135169060200135610a98565b3480156103c457600080fd5b506102ad600480360360208110156103db57600080fd5b50351515610b6e565b3480156103f057600080fd5b506103f9610be7565b60408051918252519081900360200190f35b34801561041757600080fd5b506102ad6004803603606081101561042e57600080fd5b506001600160a01b03813581169160208101359091169060400135610bf8565b34801561045a57600080fd5b506103f96004803603604081101561047157600080fd5b506001600160a01b038135169060200135610c4f565b6102ad6004803603602081101561049d57600080fd5b5035610c7a565b3480156104b057600080fd5b506102ad600480360360608110156104c757600080fd5b506001600160a01b03813581169160208101359091169060400135610eca565b3480156104f357600080fd5b506102c46004803603602081101561050a57600080fd5b5035610ee5565b34801561051d57600080fd5b506103f96004803603602081101561053457600080fd5b503561452d565b34801561054757600080fd5b50610211614543565b34801561055c57600080fd5b506103636004803603602081101561057357600080fd5b5035614553565b34801561058657600080fd5b506105a46004803603602081101561059d57600080fd5b503561457b565b6040805161ffff9092168252519081900360200190f35b3480156105c757600080fd5b506102c46145a6565b3480156105dc57600080fd5b506103f9600480360360208110156105f357600080fd5b50356001600160a01b0316614607565b34801561060f57600080fd5b506105a46004803603604081101561062657600080fd5b508035906020013561466f565b34801561063f57600080fd5b506103636146ac565b34801561065457600080fd5b506102c46146bb565b34801561066957600080fd5b506102c46004803603602081101561068057600080fd5b503561471c565b34801561069357600080fd5b506102ad600480360360408110156106aa57600080fd5b506001600160a01b03813516906020013515156147b7565b3480156106ce57600080fd5b506106d76148bc565b6040805163ffffffff9092168252519081900360200190f35b3480156106fc57600080fd5b506102c46004803603602081101561071357600080fd5b50356148cf565b34801561072657600080fd5b506102ad6004803603608081101561073d57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561077857600080fd5b82018360208201111561078a57600080fd5b803590602001918460018302840111640100000000831117156107ac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506148da945050505050565b3480156107f957600080fd5b506102c46004803603602081101561081057600080fd5b5035614938565b34801561082357600080fd5b50610211614dfa565b34801561083857600080fd5b506102116004803603604081101561084f57600080fd5b506001600160a01b0381358116916020013516614e0a565b6102ad614e38565b34801561087b57600080fd5b506102ad614ed6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600b546001600160a01b03163314610902576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b54600160c01b900460ff1615610961576040805162461bcd60e51b815260206004820152601e60248201527f43616e2774206368616e67652064617461206166746572206c6f636b65640000604482015290519081900360640190fd5b60208361ffff161061097257600080fd5b8181600c8561ffff166020811061098557fe5b61099193910191615a6a565b5061099b83614f46565b505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050905090565b6000610a41826150c6565b610a7c5760405162461bcd60e51b815260040180806020018281038252602c815260200180615d41602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610aa382614553565b9050806001600160a01b0316836001600160a01b03161415610af65760405162461bcd60e51b8152600401808060200182810382526021815260200180615d966021913960400191505060405180910390fd5b806001600160a01b0316610b086150d3565b6001600160a01b03161480610b295750610b2981610b246150d3565b614e0a565b610b645760405162461bcd60e51b8152600401808060200182810382526038815260200180615c546038913960400191505060405180910390fd5b61099b83836150d7565b600b546001600160a01b03163314610bc9576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b8054911515600160c81b0260ff60c81b19909216919091179055565b6000610bf36002615145565b905090565b610c09610c036150d3565b82615150565b610c445760405162461bcd60e51b8152600401808060200182810382526031815260200180615db76031913960400191505060405180910390fd5b61099b8383836151f4565b6001600160a01b0382166000908152600160205260408120610c719083615340565b90505b92915050565b6002600a541415610cd2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600a55600b54600160c81b900460ff1615610d29576040805162461bcd60e51b815260206004820152601060248201526f10dd5c9c995b9d1b1e481c185d5cd95960821b604482015290519081900360640190fd5b600b54600160c01b900460ff1615610d88576040805162461bcd60e51b815260206004820152601760248201527f43616e2774206d696e74206166746572206c6f636b6564000000000000000000604482015290519081900360640190fd5b600081118015610d9a5750620f424081105b610dde576040805162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015290519081900360640190fd5b600b54611388600160a01b90910463ffffffff1610610e3d576040805162461bcd60e51b815260206004820152601660248201527520b636103430bb32903132b2b71031b630b4b6b2b21760511b604482015290519081900360640190fd5b662386f26fc1000034811115610e845760405162461bcd60e51b8152600401808060200182810382526024815260200180615c306024913960400191505060405180910390fd5b610e95610e8f6150d3565b8361534c565b5050600b8054600163ffffffff600160a01b808404821683019091160263ffffffff60a01b1990921691909117909155600a55565b61099b838383604051806020016040528060008152506148da565b6060600082118015610ef95750620f424082105b610f0257600080fd5b610f0a615ae8565b614e2083016000805b6019811015610f4e57637fffffff6141a7840206925082848260198110610f3657fe5b63ffffffff9092166020929092020152600101610f13565b50604080518082018252600a81526902a3432903334b939ba160b51b602080830191909152825180840184526004815263027232a160e51b8183015283516102008082526102208201909552929390926060929091908201818036833701905050905060008060008060005b875181101561100b57878181518110610fcf57fe5b602001015160f81c60f81b868680600101975081518110610fec57fe5b60200101906001600160f81b031916908160001a905350600101610fba565b5060648a89806001019a5061ffff166019811061102457fe5b602002015163ffffffff168161103657fe5b06915060328261ffff1610156111bf5750606c54600188019760029161ffff6401000000009091048116918c91166019811061106e57fe5b602002015163ffffffff168161108057fe5b0692506000602c8261ffff166020811061109657fe5b600202018461ffff16602081106110a957fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106110db57fe5b01818154600181600116156101000203166002900481106110f857fe5b8154600116156111175790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146111bd57600c8261ffff166020811061114657fe5b018181546001816001161561010002031660029004811061116357fe5b8154600116156111825790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061119e57fe5b60200101906001600160f81b031916908160001a9053506001016110ca565b505b60648a89806001019a5061ffff16601981106111d757fe5b602002015163ffffffff16816111e957fe5b06915060208261ffff1610156117195750606c54600188019760049161ffff600160401b9091048116918c91166019811061122057fe5b602002015163ffffffff168161123257fe5b0692506000602c8261ffff166020811061124857fe5b600202018461ffff166020811061125b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061128d57fe5b01818154600181600116156101000203166002900481106112aa57fe5b8154600116156112c95790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461136f57600c8261ffff16602081106112f857fe5b018181546001816001161561010002031660029004811061131557fe5b8154600116156113345790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061135057fe5b60200101906001600160f81b031916908160001a90535060010161127c565b5060408051808201909152600b81526a033b2b732b930ba34bb32960ad1b602082015260005b81518110156113e6578181815181106113aa57fe5b602001015160f81c60f81b8787806001019850815181106113c757fe5b60200101906001600160f81b031916908160001a905350600101611395565b50600060648c8b806001019c5061ffff166019811061140157fe5b602002015163ffffffff168161141357fe5b06905060328161ffff16101561159b57606c5460018b019a6007945061ffff600160701b9092048216918e91166019811061144a57fe5b602002015163ffffffff168161145c57fe5b0694506000602c8461ffff166020811061147257fe5b600202018661ffff166020811061148557fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8461ffff16602081106114b757fe5b01818154600181600116156101000203166002900481106114d457fe5b8154600116156114f35790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461159957600c8461ffff166020811061152257fe5b018181546001816001161561010002031660029004811061153f57fe5b81546001161561155e5790600052602060002090602091828204019190065b9054901a600160f81b0288888060010199508151811061157a57fe5b60200101906001600160f81b031916908160001a9053506001016114a6565b505b606c5460018b019a600a945061ffff600160a01b9092048216918e9116601981106115c257fe5b602002015163ffffffff16816115d457fe5b0694506000602c8461ffff16602081106115ea57fe5b600202018661ffff16602081106115fd57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8461ffff166020811061162f57fe5b018181546001816001161561010002031660029004811061164c57fe5b81546001161561166b5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461171157600c8461ffff166020811061169a57fe5b01818154600181600116156101000203166002900481106116b757fe5b8154600116156116d65790600052602060002090602091828204019190065b9054901a600160f81b028888806001019950815181106116f257fe5b60200101906001600160f81b031916908160001a90535060010161161e565b505050611dd4565b60328261ffff161015611c5157600060648b8a806001019b5061ffff166019811061174057fe5b602002015163ffffffff168161175257fe5b06905060328161ffff16101561195a57606c5460018a01996009935061ffff600160901b9092048216918d91166019811061178957fe5b602002015163ffffffff168161179b57fe5b0693506000602c8361ffff16602081106117b157fe5b600202018561ffff16602081106117c457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106117f657fe5b018181546001816001161561010002031660029004811061181357fe5b8154600116156118325790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146118d857600c8361ffff166020811061186157fe5b018181546001816001161561010002031660029004811061187e57fe5b81546001161561189d5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106118b957fe5b60200101906001600160f81b031916908160001a9053506001016117e5565b5060408051808201909152600c81526b016b232b934bb30ba34bb32960a51b60208201526000199095019460005b81518110156119575781818151811061191b57fe5b602001015160f81c60f81b88888060010199508151811061193857fe5b60200101906001600160f81b031916908160001a905350600101611906565b50505b606c5460018a01996003935061ffff66010000000000009092048216918d91166019811061198457fe5b602002015163ffffffff168161199657fe5b0693506000602c8361ffff16602081106119ac57fe5b600202018561ffff16602081106119bf57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106119f157fe5b0181815460018160011615610100020316600290048110611a0e57fe5b815460011615611a2d5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611ad357600c8361ffff1660208110611a5c57fe5b0181815460018160011615610100020316600290048110611a7957fe5b815460011615611a985790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110611ab457fe5b60200101906001600160f81b031916908160001a9053506001016119e0565b50606c5460018a0199600c935061ffff600160c01b9092048216918d911660198110611afb57fe5b602002015163ffffffff1681611b0d57fe5b0693506000602c8361ffff1660208110611b2357fe5b600202018561ffff1660208110611b3657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110611b6857fe5b0181815460018160011615610100020316600290048110611b8557fe5b815460011615611ba45790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611c4a57600c8361ffff1660208110611bd357fe5b0181815460018160011615610100020316600290048110611bf057fe5b815460011615611c0f5790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110611c2b57fe5b60200101906001600160f81b031916908160001a905350600101611b57565b5050611dd4565b60368261ffff161015611c6357611dd4565b50606c54600188019760009161ffff908116918c911660198110611c8357fe5b602002015163ffffffff1681611c9557fe5b0692506000602c8261ffff1660208110611cab57fe5b600202018461ffff1660208110611cbe57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110611cf057fe5b0181815460018160011615610100020316600290048110611d0d57fe5b815460011615611d2c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611dd257600c8261ffff1660208110611d5b57fe5b0181815460018160011615610100020316600290048110611d7857fe5b815460011615611d975790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110611db357fe5b60200101906001600160f81b031916908160001a905350600101611cdf565b505b60005b8651811015611e2857868181518110611dec57fe5b602001015160f81c60f81b868680600101975081518110611e0957fe5b60200101906001600160f81b031916908160001a905350600101611dd7565b5060648a89806001019a5061ffff1660198110611e4157fe5b602002015163ffffffff1681611e5357fe5b06915060328261ffff161015611fda5750606c54600188810198909161ffff620100009091048116918c911660198110611e8957fe5b602002015163ffffffff1681611e9b57fe5b0692506000602c8261ffff1660208110611eb157fe5b600202018461ffff1660208110611ec457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110611ef657fe5b0181815460018160011615610100020316600290048110611f1357fe5b815460011615611f325790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14611fd857600c8261ffff1660208110611f6157fe5b0181815460018160011615610100020316600290048110611f7e57fe5b815460011615611f9d5790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110611fb957fe5b60200101906001600160f81b031916908160001a905350600101611ee5565b505b606e8a89806001019a5061ffff1660198110611ff257fe5b602002015163ffffffff168161200457fe5b06915060058261ffff1610156121905750606c546001880197600d9161ffff600160d01b9091048116918c91166019811061203b57fe5b602002015163ffffffff168161204d57fe5b0692506000602c8261ffff166020811061206357fe5b600202018461ffff166020811061207657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106120a857fe5b01818154600181600116156101000203166002900481106120c557fe5b8154600116156120e45790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061211357fe5b018181546001816001161561010002031660029004811061213057fe5b81546001161561214f5790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061216b57fe5b60200101906001600160f81b031916908160001a905350600101612097565b50614435565b600f8261ffff1610156123955760408051808201909152600f81526e03a37903132903332b0ba3ab932b21608d1b602082015260005b8151811015612217578181815181106121db57fe5b602001015160f81c60f81b8787806001019850815181106121f857fe5b60200101906001600160f81b031916908160001a9053506001016121c6565b50606c5460018a0199600e935061ffff600160e01b9092048216918d91166019811061223f57fe5b602002015163ffffffff168161225157fe5b0693506000602c8361ffff166020811061226757fe5b600202018561ffff166020811061227a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff16602081106122ac57fe5b01818154600181600116156101000203166002900481106122c957fe5b8154600116156122e85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061231757fe5b018181546001816001161561010002031660029004811061233457fe5b8154600116156123535790600052602060002090602091828204019190065b9054901a600160f81b0287878060010198508151811061236f57fe5b60200101906001600160f81b031916908160001a90535060010161229b565b5050614435565b60178261ffff16101561268f5750606d54600188019760169161ffff600160601b9091048116918c9116601981106123c957fe5b602002015163ffffffff16816123db57fe5b0692506000602c8261ffff16602081106123f157fe5b600202018461ffff166020811061240457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061243657fe5b018181546001816001161561010002031660029004811061245357fe5b8154600116156124725790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461251857600c8261ffff16602081106124a157fe5b01818154600181600116156101000203166002900481106124be57fe5b8154600116156124dd5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106124f957fe5b60200101906001600160f81b031916908160001a905350600101612425565b5050606d546001880197601a9161ffff600160a01b9091048116918c91166019811061254057fe5b602002015163ffffffff168161255257fe5b0692506000602c8261ffff166020811061256857fe5b600202018461ffff166020811061257b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106125ad57fe5b01818154600181600116156101000203166002900481106125ca57fe5b8154600116156125e95790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061261857fe5b018181546001816001161561010002031660029004811061263557fe5b8154600116156126545790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061267057fe5b60200101906001600160f81b031916908160001a90535060010161259c565b601b8261ffff1610156126a157614435565b60288261ffff16101561299b5750606c54600188019760089161ffff600160801b9091048116918c9116601981106126d557fe5b602002015163ffffffff16816126e757fe5b0692506000602c8261ffff16602081106126fd57fe5b600202018461ffff166020811061271057fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061274257fe5b018181546001816001161561010002031660029004811061275f57fe5b81546001161561277e5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461282457600c8261ffff16602081106127ad57fe5b01818154600181600116156101000203166002900481106127ca57fe5b8154600116156127e95790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061280557fe5b60200101906001600160f81b031916908160001a905350600101612731565b5050606c54600188019760059161ffff600160501b9091048116918c91166019811061284c57fe5b602002015163ffffffff168161285e57fe5b0692506000602c8261ffff166020811061287457fe5b600202018461ffff166020811061288757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106128b957fe5b01818154600181600116156101000203166002900481106128d657fe5b8154600116156128f55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061292457fe5b018181546001816001161561010002031660029004811061294157fe5b8154600116156129605790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061297c57fe5b60200101906001600160f81b031916908160001a9053506001016128a8565b60328261ffff161015612d185760408051808201909152601481527303a379031329030b4b9323937b83832b2103a37960651b602082015260005b8151811015612a27578181815181106129eb57fe5b602001015160f81c60f81b878780600101985081518110612a0857fe5b60200101906001600160f81b031916908160001a9053506001016129d6565b50606c5460018a01996009935061ffff600160901b9092048216918d911660198110612a4f57fe5b602002015163ffffffff1681612a6157fe5b0693506000602c8361ffff1660208110612a7757fe5b600202018561ffff1660208110612a8a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110612abc57fe5b0181815460018160011615610100020316600290048110612ad957fe5b815460011615612af85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14612b9e57600c8361ffff1660208110612b2757fe5b0181815460018160011615610100020316600290048110612b4457fe5b815460011615612b635790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110612b7f57fe5b60200101906001600160f81b031916908160001a905350600101612aab565b50606d5460018a01996013935061ffff66010000000000009092048216918d911660198110612bc957fe5b602002015163ffffffff1681612bdb57fe5b0693506000602c8361ffff1660208110612bf157fe5b600202018561ffff1660208110612c0457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110612c3657fe5b0181815460018160011615610100020316600290048110612c5357fe5b815460011615612c725790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110612ca157fe5b0181815460018160011615610100020316600290048110612cbe57fe5b815460011615612cdd5790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110612cf957fe5b60200101906001600160f81b031916908160001a905350600101612c25565b603c8261ffff1610156130125750606c546001880197600f9161ffff600160f01b9091048116918c911660198110612d4c57fe5b602002015163ffffffff1681612d5e57fe5b0692506000602c8261ffff1660208110612d7457fe5b600202018461ffff1660208110612d8757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110612db957fe5b0181815460018160011615610100020316600290048110612dd657fe5b815460011615612df55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14612e9b57600c8261ffff1660208110612e2457fe5b0181815460018160011615610100020316600290048110612e4157fe5b815460011615612e605790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110612e7c57fe5b60200101906001600160f81b031916908160001a905350600101612da8565b5050606c54600188019760069161ffff600160601b9091048116918c911660198110612ec357fe5b602002015163ffffffff1681612ed557fe5b0692506000602c8261ffff1660208110612eeb57fe5b600202018461ffff1660208110612efe57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110612f3057fe5b0181815460018160011615610100020316600290048110612f4d57fe5b815460011615612f6c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff1660208110612f9b57fe5b0181815460018160011615610100020316600290048110612fb857fe5b815460011615612fd75790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110612ff357fe5b60200101906001600160f81b031916908160001a905350600101612f1f565b603f8261ffff16101561320b5760408051808201909152600b81526a03932b232b2b6b0b13632960ad1b602082015260005b81518110156130955781818151811061305957fe5b602001015160f81c60f81b87878060010198508151811061307657fe5b60200101906001600160f81b031916908160001a905350600101613044565b50606d5460018a01996019935061ffff600160901b9092048216918d91168481106130bc57fe5b602002015163ffffffff16816130ce57fe5b0693506000602c8361ffff16602081106130e457fe5b600202018561ffff16602081106130f757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061312957fe5b018181546001816001161561010002031660029004811061314657fe5b8154600116156131655790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061319457fe5b01818154600181600116156101000203166002900481106131b157fe5b8154600116156131d05790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106131ec57fe5b60200101906001600160f81b031916908160001a905350600101613118565b60438261ffff16101561338e5750606d546001880197601b9161ffff600160b01b9091048116918c91166019811061323f57fe5b602002015163ffffffff168161325157fe5b0692506000602c8261ffff166020811061326757fe5b600202018461ffff166020811061327a57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff16602081106132ac57fe5b01818154600181600116156101000203166002900481106132c957fe5b8154600116156132e85790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061331757fe5b018181546001816001161561010002031660029004811061333457fe5b8154600116156133535790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061336f57fe5b60200101906001600160f81b031916908160001a90535060010161329b565b60508261ffff1610156137f85750606d54600188019760109161ffff908116918c9116601981106133bb57fe5b602002015163ffffffff16816133cd57fe5b0692506000602c8261ffff16602081106133e357fe5b600202018461ffff16602081106133f657fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061342857fe5b018181546001816001161561010002031660029004811061344557fe5b8154600116156134645790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461350a57600c8261ffff166020811061349357fe5b01818154600181600116156101000203166002900481106134b057fe5b8154600116156134cf5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106134eb57fe5b60200101906001600160f81b031916908160001a905350600101613417565b5050606d54600188019760119161ffff620100009091048116918c91166019811061353157fe5b602002015163ffffffff168161354357fe5b0692506000602c8261ffff166020811061355957fe5b600202018461ffff166020811061356c57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061359e57fe5b01818154600181600116156101000203166002900481106135bb57fe5b8154600116156135da5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461368057600c8261ffff166020811061360957fe5b018181546001816001161561010002031660029004811061362657fe5b8154600116156136455790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061366157fe5b60200101906001600160f81b031916908160001a90535060010161358d565b5050606d54600188019760129161ffff6401000000009091048116918c9116601981106136a957fe5b602002015163ffffffff16816136bb57fe5b0692506000602c8261ffff16602081106136d157fe5b600202018461ffff16602081106136e457fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061371657fe5b018181546001816001161561010002031660029004811061373357fe5b8154600116156137525790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff166020811061378157fe5b018181546001816001161561010002031660029004811061379e57fe5b8154600116156137bd5790600052602060002090602091828204019190065b9054901a600160f81b028686806001019750815181106137d957fe5b60200101906001600160f81b031916908160001a905350600101613705565b60538261ffff161015613af25750606d54600188019760149161ffff600160401b9091048116918c91166019811061382c57fe5b602002015163ffffffff168161383e57fe5b0692506000602c8261ffff166020811061385457fe5b600202018461ffff166020811061386757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff166020811061389957fe5b01818154600181600116156101000203166002900481106138b657fe5b8154600116156138d55790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461397b57600c8261ffff166020811061390457fe5b018181546001816001161561010002031660029004811061392157fe5b8154600116156139405790600052602060002090602091828204019190065b9054901a600160f81b0286868060010197508151811061395c57fe5b60200101906001600160f81b031916908160001a905350600101613888565b5050606d54600188019760159161ffff600160501b9091048116918c9116601981106139a357fe5b602002015163ffffffff16816139b557fe5b0692506000602c8261ffff16602081106139cb57fe5b600202018461ffff16602081106139de57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8261ffff1660208110613a1057fe5b0181815460018160011615610100020316600290048110613a2d57fe5b815460011615613a4c5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461218a57600c8261ffff1660208110613a7b57fe5b0181815460018160011615610100020316600290048110613a9857fe5b815460011615613ab75790600052602060002090602091828204019190065b9054901a600160f81b02868680600101975081518110613ad357fe5b60200101906001600160f81b031916908160001a9053506001016139ff565b60578261ffff161015613cec5760408051808201909152600b81526a03a379031329039b7b632160ad1b602082015260005b8151811015613b7557818181518110613b3957fe5b602001015160f81c60f81b878780600101985081518110613b5657fe5b60200101906001600160f81b031916908160001a905350600101613b24565b50606d5460018a01996017935061ffff600160701b9092048216918d911660198110613b9d57fe5b602002015163ffffffff1681613baf57fe5b0693506000602c8361ffff1660208110613bc557fe5b600202018561ffff1660208110613bd857fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110613c0a57fe5b0181815460018160011615610100020316600290048110613c2757fe5b815460011615613c465790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110613c7557fe5b0181815460018160011615610100020316600290048110613c9257fe5b815460011615613cb15790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110613ccd57fe5b60200101906001600160f81b031916908160001a905350600101613bf9565b605c8261ffff161015613eee57604080518082019091526013815272036b0b2329032b73a34b932b63c903bb4ba341606d1b602082015260005b8151811015613d7757818181518110613d3b57fe5b602001015160f81c60f81b878780600101985081518110613d5857fe5b60200101906001600160f81b031916908160001a905350600101613d26565b50606d5460018a01996018935061ffff600160801b9092048216918d911660198110613d9f57fe5b602002015163ffffffff1681613db157fe5b0693506000602c8361ffff1660208110613dc757fe5b600202018561ffff1660208110613dda57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff1660208110613e0c57fe5b0181815460018160011615610100020316600290048110613e2957fe5b815460011615613e485790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff1660208110613e7757fe5b0181815460018160011615610100020316600290048110613e9457fe5b815460011615613eb35790600052602060002090602091828204019190065b9054901a600160f81b02878780600101985081518110613ecf57fe5b60200101906001600160f81b031916908160001a905350600101613dfb565b60638261ffff1610156140e95760408051808201909152600c81526b034b739b834b932b210313c960a51b602082015260005b8151811015613f7257818181518110613f3657fe5b602001015160f81c60f81b878780600101985081518110613f5357fe5b60200101906001600160f81b031916908160001a905350600101613f21565b50606d5460018a0199601c935061ffff600160c01b9092048216918d911660198110613f9a57fe5b602002015163ffffffff1681613fac57fe5b0693506000602c8361ffff1660208110613fc257fe5b600202018561ffff1660208110613fd557fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061400757fe5b018181546001816001161561010002031660029004811061402457fe5b8154600116156140435790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b1461238e57600c8361ffff166020811061407257fe5b018181546001816001161561010002031660029004811061408f57fe5b8154600116156140ae5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106140ca57fe5b60200101906001600160f81b031916908160001a905350600101613ff6565b606e8261ffff1610156144355760408051808201909152600e81526d03a379031329039b7b6321030ba160951b602082015260005b815181101561416f5781818151811061413357fe5b602001015160f81c60f81b87878060010198508151811061415057fe5b60200101906001600160f81b031916908160001a90535060010161411e565b50606c5460018a0199600b935061ffff600160b01b9092048216918d91166019811061419757fe5b602002015163ffffffff16816141a957fe5b0693506000602c8361ffff16602081106141bf57fe5b600202018561ffff16602081106141d257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b600c8361ffff166020811061420457fe5b018181546001816001161561010002031660029004811061422157fe5b8154600116156142405790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b146142e657600c8361ffff166020811061426f57fe5b018181546001816001161561010002031660029004811061428c57fe5b8154600116156142ab5790600052602060002090602091828204019190065b9054901a600160f81b028787806001019850815181106142c757fe5b60200101906001600160f81b031916908160001a9053506001016141f3565b50600060648c8b806001019c5061ffff166019811061430157fe5b602002015163ffffffff168161431357fe5b06905060148161ffff1610156143a85760408051808201909152601381527203337b91030903932b1b7b93210383934b1b29606d1b602082015260005b81518110156143a15781818151811061436557fe5b602001015160f81c60f81b8989806001019a508151811061438257fe5b60200101906001600160f81b031916908160001a905350600101614350565b5050614432565b60288161ffff1610156144325760408051808201909152600f81526e03337b91030903834ba3a30b731b29608d1b602082015260005b815181101561442f578181815181106143f357fe5b602001015160f81c60f81b8989806001019a508151811061441057fe5b60200101906001600160f81b031916908160001a9053506001016143de565b50505b50505b601760f91b85600186038151811061444957fe5b60200101906001600160f81b031916908160001a905350600360fc1b85858151811061447157fe5b60200101906001600160f81b031916908160001a90535060608467ffffffffffffffff811180156144a157600080fd5b506040519080825280601f01601f1916602001820160405280156144cc576020820181803683370190505b50905060005b8581101561451c578681815181106144e657fe5b602001015160f81c60f81b8282815181106144fd57fe5b60200101906001600160f81b031916908160001a9053506001016144d2565b509c9b505050505050505050505050565b60008061453b60028461547a565b509392505050565b600b54600160c81b900460ff1681565b6000610c7482604051806060016040528060298152602001615cb66029913960029190615496565b606c816020811061458857fe5b60109182820401919006600202915054906101000a900461ffff1681565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b60006001600160a01b03821661464e5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c8c602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600160205260409020610c7490615145565b602c826020811061467c57fe5b60020201816020811061468b57fe5b60109182820401919006600202915091509054906101000a900461ffff1681565b600b546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b600c816020811061472957fe5b018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815293508301828280156147af5780601f10614784576101008083540402835291602001916147af565b820191906000526020600020905b81548152906001019060200180831161479257829003601f168201915b505050505081565b6147bf6150d3565b6001600160a01b0316826001600160a01b03161415614825576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80600560006148326150d3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556148766150d3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600b54600160a01b900463ffffffff1681565b6060610c7482610ee5565b6148eb6148e56150d3565b83615150565b6149265760405162461bcd60e51b8152600401808060200182810382526031815260200180615db76031913960400191505060405180910390fd5b614932848484846154ad565b50505050565b60608060405180610120016040528060e28152602001615de860e2913990506019606061496485610ee5565b9050600080601e5b80830191508351821061498257835191506149c1565b83828151811061498e57fe5b6020910101516001600160f81b031916600160fd1b148015906149b057508282115b156149c15760001990910190614982565b606083830367ffffffffffffffff811180156149dc57600080fd5b506040519080825280601f01601f191660200182016040528015614a07576020820181803683370190505b509050835b83811015614a5857858181518110614a2057fe5b602001015160f81c60f81b8286830381518110614a3957fe5b60200101906001600160f81b031916908160001a905350600101614a0c565b5086614a63876154b8565b826040516020018084805190602001908083835b60208310614a965780518252601f199092019160209182019101614a77565b51815160209384036101000a60001901801990921691161790527f3c7465787420636c6173733d22626173652220783d223135222079203d202200919093019081528551601f90910192860191508083835b60208310614b075780518252601f199092019160209182019101614ae8565b51815160209384036101000a600019018019909216911617905261111f60f11b919093019081528451600290910192850191508083835b60208310614b5d5780518252601f199092019160209182019101614b3e565b6001836020036101000a03801982511681845116808217855250505050505090500180661e17ba32bc3a1f60c91b8152506007019350505050604051602081830303815290604052965060c8861115614bb65750614bd6565b60168601955084518310614bca5750614bd6565b8260010193505061496c565b856040516020018082805190602001908083835b60208310614c095780518252601f199092019160209182019101614bea565b6001836020036101000a03801982511681845116808217855250505050505090500180651e17b9bb339f60d11b81525060060191505060405160208183030381529060405295506060614d58614c5e8a6154b8565b614c6789615582565b6040516020018080747b226e616d65223a20224669727374204e4654202360581b81525060150183805190602001908083835b60208310614cb95780518252601f199092019160209182019101614c9a565b6001836020036101000a03801982511681845116808217855250505050505090500180615b3f60a1913960a10182805190602001908083835b60208310614d115780518252601f199092019160209182019101614cf2565b6001836020036101000a0380198251168184511680821785525050505050509050018061227d60f01b81525060020192505050604051602081830303815290604052615582565b90508060405160200180807f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250601d0182805190602001908083835b60208310614db55780518252601f199092019160209182019101614d96565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052965086975050505050505050919050565b600b54600160c01b900460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b03163314614e93576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b60405173c7464dbca260a8faf033460622b23467df5aea42904780156108fc02916000818181858888f19350505050158015614ed3573d6000803e3d6000fd5b50565b600b546001600160a01b03163314614f31576040805162461bcd60e51b815260206004820152601960248201527852657175697265732061646d696e2070726976696c6567657360381b604482015290519081900360640190fd5b600b805460ff60c01b1916600160c01b179055565b600080602c8361ffff1660208110614f5a57fe5b600202018261ffff1660208110614f6d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060005b600c8361ffff1660208110614fa657fe5b01546002600019610100600184161502019091160481101561508a57600c8361ffff1660208110614fd357fe5b0181815460018160011615610100020316600290048110614ff057fe5b81546001161561500f5790600052602060002090602091828204019190065b9054901a600160f81b026001600160f81b031916601f60fa1b14156150825780600101602c8461ffff166020811061504357fe5b600202018360010193508361ffff166020811061505c57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b600101614f95565b5080606c8361ffff166020811061509d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6000610c746002836156c4565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061510c82614553565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610c74826156d0565b600061515b826150c6565b6151965760405162461bcd60e51b815260040180806020018281038252602c815260200180615c04602c913960400191505060405180910390fd5b60006151a183614553565b9050806001600160a01b0316846001600160a01b031614806151dc5750836001600160a01b03166151d184610a36565b6001600160a01b0316145b806151ec57506151ec8185614e0a565b949350505050565b826001600160a01b031661520782614553565b6001600160a01b03161461524c5760405162461bcd60e51b8152600401808060200182810382526029815260200180615d6d6029913960400191505060405180910390fd5b6001600160a01b0382166152915760405162461bcd60e51b8152600401808060200182810382526024815260200180615be06024913960400191505060405180910390fd5b61529c83838361099b565b6152a76000826150d7565b6001600160a01b03831660009081526001602052604090206152c990826156d4565b506001600160a01b03821660009081526001602052604090206152ec90826156e0565b506152f9600282846156ec565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610c718383615702565b6001600160a01b0382166153a7576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6153b0816150c6565b15615402576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61540e6000838361099b565b6001600160a01b038216600090815260016020526040902061543090826156e0565b5061543d600282846156ec565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008080806154898686615766565b9097909650945050505050565b60006154a38484846157e1565b90505b9392505050565b6149328484846151f4565b6060816154dd57506040805180820190915260018152600360fc1b60208201526108a2565b8160005b81156154f557600101600a820491506154e1565b60608167ffffffffffffffff8111801561550e57600080fd5b506040519080825280601f01601f191660200182016040528015615539576020820181803683370190505b5090505b84156151ec5760001990910190600a850660300160f81b81838151811061556057fe5b60200101906001600160f81b031916908160001a905350600a8504945061553d565b8051606090806155a25750506040805160208101909152600081526108a2565b6004600360028301040260606020820167ffffffffffffffff811180156155c857600080fd5b506040519080825280601f01601f1916602001820160405280156155f3576020820181803683370190505b5090506060604051806060016040528060408152602001615cdf604091399050600181016020830160005b8681101561567f576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161561e565b50600386066001811461569957600281146156aa576156b6565b613d3d60f01b6001198301526156b6565b603d60f81b6000198301525b505050918152949350505050565b6000610c7183836158ab565b5490565b6000610c7183836158c3565b6000610c718383615989565b60006154a384846001600160a01b0385166159d3565b815460009082106157445760405162461bcd60e51b8152600401808060200182810382526022815260200180615b1d6022913960400191505060405180910390fd5b82600001828154811061575357fe5b9060005260206000200154905092915050565b8154600090819083106157aa5760405162461bcd60e51b8152600401808060200182810382526022815260200180615d1f6022913960400191505060405180910390fd5b60008460000184815481106157bb57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161587c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615841578181015183820152602001615829565b50505050905090810190601f16801561586e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061588f57fe5b9060005260206000209060020201600101549150509392505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561597f57835460001980830191908101906000908790839081106158f657fe5b906000526020600020015490508087600001848154811061591357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061594357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c74565b6000915050610c74565b600061599583836158ab565b6159cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c74565b506000610c74565b600082815260018401602052604081205480615a385750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556154a6565b82856000016001830381548110615a4b57fe5b90600052602060002090600202016001018190555060009150506154a6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615aab5782800160ff19823516178555615ad8565b82800160010185558215615ad8579182015b82811115615ad8578235825591602001919060010190615abd565b50615ae4929150615b07565b5090565b6040518061032001604052806019906020820280368337509192915050565b5b80821115615ae45760008155600101615b0856fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473222c20226465736372697074696f6e223a202246697273742073617469726963616c206f6e2d636861696e2067656e657261746976652074657874204e46542061626f7574204e4654206669727374732e20446f6e277420736c656570206f6e207468697320686973746f72696320636f6c6c656374696f6e2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d7573742073656e64206d696e696d756d2076616c756520746f207075726368617365214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665643c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a20436f7572696572204e65773b20666f6e742d73697a653a20313870783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3ea2646970667358221220cc930c597bed7e7f19a79561ee2875949cb9c79c270ec02030aa240e0d53556264736f6c63430007030033

Deployed Bytecode Sourcemap

58846:12299:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27505:150;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27505:150:0;-1:-1:-1;;;;;;27505:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68147:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68147:202:0;;-1:-1:-1;68147:202:0;-1:-1:-1;68147:202:0;:::i;:::-;;43312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46140:221;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46140:221:0;;:::i;:::-;;;;-1:-1:-1;;;;;46140:221:0;;;;;;;;;;;;;;45670:404;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45670:404:0;;;;;;;;:::i;60259:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60259:70:0;;;;:::i;45148:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47030:305;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47030:305:0;;;;;;;;;;;;;;;;;:::i;44910:162::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44910:162:0;;;;;;;;:::i;69908:505::-;;;;;;;;;;;;;;;;-1:-1:-1;69908:505:0;;:::i;47406:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47406:151:0;;;;;;;;;;;;;;;;;:::i;60601:7508::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60601:7508:0;;:::i;45436:172::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45436:172:0;;:::i;59117:18::-;;;;;;;;;;;;;:::i;43068:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43068:177:0;;:::i;59240:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59240:20:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;44729:97;;;;;;;;;;;;;:::i;42785:221::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42785:221:0;-1:-1:-1;;;;;42785:221:0;;:::i;59211:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59211:24:0;;;;;;;:::i;59821:88::-;;;;;;;;;;;;;:::i;43481:104::-;;;;;;;;;;;;;:::i;59144:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59144:19:0;;:::i;46433:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46433:295:0;;;;;;;;;;:::i;58918:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60413:107;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60413:107:0;;:::i;47628:285::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47628:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47628:285:0;;-1:-1:-1;47628:285:0;;-1:-1:-1;;;;;47628:285:0:i;68355:1543::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68355:1543:0;;:::i;59094:18::-;;;;;;;;;;;;;:::i;46799:164::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46799:164:0;;;;;;;;;;:::i;59439:142::-;;;:::i;60171:60::-;;;;;;;;;;;;;:::i;27505:150::-;-1:-1:-1;;;;;;27614:33:0;;27590:4;27614:33;;;;;;;;;;;;;27505:150;;;;:::o;68147:202::-;59309:13;;-1:-1:-1;;;;;59309:13:0;59326:10;59309:27;59301:64;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;;;;68229:6:::1;::::0;-1:-1:-1;;;68229:6:0;::::1;;;68228:7;68220:49;;;::::0;;-1:-1:-1;;;68220:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;68290:2;68284:3;:8;;;68276:17;;;::::0;::::1;;68316:1;;68300:2;68303:3;68300:7;;;;;;;;;:18;::::0;:7;::::1;::::0;:18:::1;:::i;:::-;;68325;68339:3;68325:13;:18::i;:::-;68147:202:::0;;;:::o;43312:100::-;43399:5;43392:12;;;;;;;;-1:-1:-1;;43392:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43366:13;;43392:12;;43399:5;;43392:12;;43399:5;43392:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43312:100;:::o;46140:221::-;46216:7;46244:16;46252:7;46244;:16::i;:::-;46236:73;;;;-1:-1:-1;;;46236:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46329:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46329:24:0;;46140:221::o;45670:404::-;45751:13;45767:23;45782:7;45767:14;:23::i;:::-;45751:39;;45815:5;-1:-1:-1;;;;;45809:11:0;:2;-1:-1:-1;;;;;45809:11:0;;;45801:57;;;;-1:-1:-1;;;45801:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45895:5;-1:-1:-1;;;;;45879:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45879:21:0;;:69;;;;45904:44;45928:5;45935:12;:10;:12::i;:::-;45904:23;:44::i;:::-;45871:161;;;;-1:-1:-1;;;45871:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46045:21;46054:2;46058:7;46045:8;:21::i;60259:70::-;59309:13;;-1:-1:-1;;;;;59309:13:0;59326:10;59309:27;59301:64;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;;;;60313:6:::1;:10:::0;;;::::1;;-1:-1:-1::0;;;60313:10:0::1;-1:-1:-1::0;;;;60313:10:0;;::::1;::::0;;;::::1;::::0;;60259:70::o;45148:211::-;45209:7;45330:21;:12;:19;:21::i;:::-;45323:28;;45148:211;:::o;47030:305::-;47191:41;47210:12;:10;:12::i;:::-;47224:7;47191:18;:41::i;:::-;47183:103;;;;-1:-1:-1;;;47183:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47299:28;47309:4;47315:2;47319:7;47299:9;:28::i;44910:162::-;-1:-1:-1;;;;;45034:20:0;;45007:7;45034:20;;;:13;:20;;;;;:30;;45058:5;45034:23;:30::i;:::-;45027:37;;44910:162;;;;;:::o;69908:505::-;57901:1;58497:7;;:19;;58489:63;;;;;-1:-1:-1;;;58489:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57901:1;58630:7;:18;69986:6:::1;::::0;-1:-1:-1;;;69986:6:0;::::1;;;69985:7;69977:35;;;::::0;;-1:-1:-1;;;69977:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;69977:35:0;;;;;;;;;;;;;::::1;;70036:6;::::0;-1:-1:-1;;;70036:6:0;::::1;;;70035:7;70027:42;;;::::0;;-1:-1:-1;;;70027:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;70104:1;70094:7;:11;:32;;;;;70119:7;70109;:17;70094:32;70086:61;;;::::0;;-1:-1:-1;;;70086:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;70086:61:0;;;;;;;;;;;;;::::1;;70164:10;::::0;70177:4:::1;-1:-1:-1::0;;;70164:10:0;;::::1;;;:17;70156:51;;;::::0;;-1:-1:-1;;;70156:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;70156:51:0;;;;;;;;;;;;;::::1;;70231:17;70276:9;:28:::0;-1:-1:-1;70276:28:0::1;70268:77;;;;-1:-1:-1::0;;;70268:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70356:28;70362:12;:10;:12::i;:::-;70376:7;70356:5;:28::i;:::-;-1:-1:-1::0;;70393:10:0::1;:12:::0;;::::1;;-1:-1:-1::0;;;70393:12:0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;-1:-1:-1::0;;;;70393:12:0;;::::1;::::0;;;::::1;::::0;;;58809:7;:22;69908:505::o;47406:151::-;47510:39;47527:4;47533:2;47537:7;47510:39;;;;;;;;;;;;:16;:39::i;60601:7508::-;60652:12;60686:1;60681:2;:6;:22;;;;;60696:7;60691:2;:12;60681:22;60673:31;;;;;;60782:21;;:::i;:::-;60827:5;60822:10;;60810:9;;60859:109;60875:2;60873:1;:4;60859:109;;;60908:10;60900:5;60896:9;;:22;60892:26;;60958:1;60942:3;60946:1;60942:6;;;;;;;:18;;;;:6;;;;;;:18;60878:3;;60859:109;;;-1:-1:-1;60976:29:0;;;;;;;;;;;-1:-1:-1;;;60976:29:0;;;;;;;;61012:25;;;;;;;;;;-1:-1:-1;;;61012:25:0;;;;61065:14;;61075:3;61065:14;;;;;;;;;60976:29;;61012:25;;60976:14;;61065;;61075:3;61065:14;;61075:3;;61065:14;;;;;-1:-1:-1;61065:14:0;61048:31;;61099:6;61116:8;61135;61154:11;61181:6;61176:43;61192:1;:8;61190:1;:10;61176:43;;;61215:1;61217;61215:4;;;;;;;;;;;;;;;;61206:1;61208:3;;;;;;61206:6;;;;;;;;;;;:13;-1:-1:-1;;;;;61206:13:0;;;;;;;;-1:-1:-1;61201:3:0;;61176:43;;;;61251:3;61239;61243:4;;;;;;61239:9;;;;;;;;;;;;;:15;;;;;;;;61228:27;;61270:2;61266:1;:6;;;61262:176;;;-1:-1:-1;61344:2:0;:8;61336:4;;;;61311:1;;61344:8;;;;;;;;61332:3;;:9;;;;;;;;;;;;:20;;;;;;;;61321:32;;61367:6;61374:2;61377:4;61374:8;;;;;;;;;;;;61383:1;61374:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61367:18;;;;61362:68;61386:2;61389:4;61386:8;;;;;;;;;;61395:1;61386:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61386:11:0;-1:-1:-1;;;;;61386:18:0;;-1:-1:-1;;;61386:18:0;61362:68;;61419:2;61422:4;61419:8;;;;;;;;;;61428:1;61419:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61419:11:0;61410:1;61412:3;;;;;;61410:6;;;;;;;;;;;:20;-1:-1:-1;;;;;61410:20:0;;;;;;;;-1:-1:-1;61405:3:0;;61362:68;;;;61262:176;61469:3;61457;61461:4;;;;;;61457:9;;;;;;;;;;;;;:15;;;;;;;;61446:27;;61488:2;61484:1;:6;;;61480:1468;;;-1:-1:-1;61577:2:0;:8;61569:4;;;;61543:1;;61577:8;-1:-1:-1;;;61577:8:0;;;;;;61565:3;;:9;;;;;;;;;;;;:20;;;;;;;;61554:32;;61600:6;61607:2;61610:4;61607:8;;;;;;;;;;;;61616:1;61607:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61600:18;;;;61595:68;61619:2;61622:4;61619:8;;;;;;;;;;61628:1;61619:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61619:11:0;-1:-1:-1;;;;;61619:18:0;;-1:-1:-1;;;61619:18:0;61595:68;;61652:2;61655:4;61652:8;;;;;;;;;;61661:1;61652:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61652:11:0;61643:1;61645:3;;;;;;61643:6;;;;;;;;;;;:20;-1:-1:-1;;;;;61643:20:0;;;;;;;;-1:-1:-1;61638:3:0;;61595:68;;;-1:-1:-1;61675:32:0;;;;;;;;;;;;-1:-1:-1;;;61675:32:0;;;;-1:-1:-1;61716:47:0;61732:3;:10;61730:1;:12;61716:47;;;61757:3;61761:1;61757:6;;;;;;;;;;;;;;;;61748:1;61750:3;;;;;;61748:6;;;;;;;;;;;:15;-1:-1:-1;;;;;61748:15:0;;;;;;;;-1:-1:-1;61743:3:0;;61716:47;;;;61774:9;61805:3;61793;61797:4;;;;;;61793:9;;;;;;;;;;;;;:15;;;;;;;;61774:35;;61827:2;61822;:7;;;61818:145;;;61872:2;:8;61864:4;;;;61843:1;;-1:-1:-1;61872:8:0;-1:-1:-1;;;61872:8:0;;;;;;61860:3;;:9;;;;;;;;;;;;:20;;;;;;;;61849:32;;61890:6;61897:2;61900:4;61897:8;;;;;;;;;;;;61906:1;61897:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61890:18;;;;61885:68;61909:2;61912:4;61909:8;;;;;;;;;;61918:1;61909:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61909:11:0;-1:-1:-1;;;;;61909:18:0;;-1:-1:-1;;;61909:18:0;61885:68;;61942:2;61945:4;61942:8;;;;;;;;;;61951:1;61942:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61942:11:0;61933:1;61935:3;;;;;;61933:6;;;;;;;;;;;:20;-1:-1:-1;;;;;61933:20:0;;;;;;;;-1:-1:-1;61928:3:0;;61885:68;;;;61818:145;62016:2;:8;62008:4;;;;61981:2;;-1:-1:-1;62016:8:0;-1:-1:-1;;;62016:8:0;;;;;;62004:3;;:9;;;;;;;;;;;;:20;;;;;;;;61993:32;;62039:6;62046:2;62049:4;62046:8;;;;;;;;;;;;62055:1;62046:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62039:18;;;;62034:68;62058:2;62061:4;62058:8;;;;;;;;;;62067:1;62058:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62058:11:0;-1:-1:-1;;;;;62058:18:0;;-1:-1:-1;;;62058:18:0;62034:68;;62091:2;62094:4;62091:8;;;;;;;;;;62100:1;62091:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62091:11:0;62082:1;62084:3;;;;;;62082:6;;;;;;;;;;;:20;-1:-1:-1;;;;;62082:20:0;;;;;;;;-1:-1:-1;62077:3:0;;62034:68;;;;61480:1468;;;;;62124:2;62120:1;:6;;;62116:832;;;62152:9;62183:3;62171;62175:4;;;;;;62171:9;;;;;;;;;;;;;:15;;;;;;;;62152:35;;62205:2;62200;:7;;;62196:240;;;62250:2;:8;62242:4;;;;62221:1;;-1:-1:-1;62250:8:0;-1:-1:-1;;;62250:8:0;;;;;;62238:3;;:9;;;;;;;;;;;;:20;;;;;;;;62227:32;;62268:6;62275:2;62278:4;62275:8;;;;;;;;;;;;62284:1;62275:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62268:18;;;;62263:68;62287:2;62290:4;62287:8;;;;;;;;;;62296:1;62287:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62287:11:0;-1:-1:-1;;;;;62287:18:0;;-1:-1:-1;;;62287:18:0;62263:68;;62320:2;62323:4;62320:8;;;;;;;;;;62329:1;62320:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62320:11:0;62311:1;62313:3;;;;;;62311:6;;;;;;;;;;;:20;-1:-1:-1;;;;;62311:20:0;;;;;;;;-1:-1:-1;62306:3:0;;62263:68;;;-1:-1:-1;62342:33:0;;;;;;;;;;;;-1:-1:-1;;;62342:33:0;;;;-1:-1:-1;;62335:3:0;;;;-1:-1:-1;62379:47:0;62395:3;:10;62393:1;:12;62379:47;;;62420:3;62424:1;62420:6;;;;;;;;;;;;;;;;62411:1;62413:3;;;;;;62411:6;;;;;;;;;;;:15;-1:-1:-1;;;;;62411:15:0;;;;;;;;-1:-1:-1;62406:3:0;;62379:47;;;;62196:240;;62488:2;:8;62480:4;;;;62454:1;;-1:-1:-1;62488:8:0;;;;;;;;62476:3;;:9;;;;;;;;;;;;:20;;;;;;;;62465:32;;62511:6;62518:2;62521:4;62518:8;;;;;;;;;;;;62527:1;62518:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62511:18;;;;62506:68;62530:2;62533:4;62530:8;;;;;;;;;;62539:1;62530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62530:11:0;-1:-1:-1;;;;;62530:18:0;;-1:-1:-1;;;62530:18:0;62506:68;;62563:2;62566:4;62563:8;;;;;;;;;;62572:1;62563:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62563:11:0;62554:1;62556:3;;;;;;62554:6;;;;;;;;;;;:20;-1:-1:-1;;;;;62554:20:0;;;;;;;;-1:-1:-1;62549:3:0;;62506:68;;;-1:-1:-1;62627:2:0;:8;62619:4;;;;62592:2;;-1:-1:-1;62627:8:0;-1:-1:-1;;;62627:8:0;;;;;;62615:3;;:9;;;;;;;;;;;;:20;;;;;;;;62604:32;;62650:6;62657:2;62660:4;62657:8;;;;;;;;;;;;62666:1;62657:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62650:18;;;;62645:68;62669:2;62672:4;62669:8;;;;;;;;;;62678:1;62669:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62669:11:0;-1:-1:-1;;;;;62669:18:0;;-1:-1:-1;;;62669:18:0;62645:68;;62702:2;62705:4;62702:8;;;;;;;;;;62711:1;62702:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62702:11:0;62693:1;62695:3;;;;;;62693:6;;;;;;;;;;;:20;-1:-1:-1;;;;;62693:20:0;;;;;;;;-1:-1:-1;62688:3:0;;62645:68;;;;62116:832;;;;62737:2;62733:1;:6;;;62729:219;;;;;;-1:-1:-1;62854:2:0;:8;;62846:4;;;62820:1;;62854:8;;;;;62842:3;;:9;;;;;;;;;;;;:20;;;;;;;;62831:32;;62877:6;62884:2;62887:4;62884:8;;;;;;;;;;;;62893:1;62884:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62877:18;;;;62872:68;62896:2;62899:4;62896:8;;;;;;;;;;62905:1;62896:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62896:11:0;-1:-1:-1;;;;;62896:18:0;;-1:-1:-1;;;62896:18:0;62872:68;;62929:2;62932:4;62929:8;;;;;;;;;;62938:1;62929:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62929:11:0;62920:1;62922:3;;;;;;62920:6;;;;;;;;;;;:20;-1:-1:-1;;;;;62920:20:0;;;;;;;;-1:-1:-1;62915:3:0;;62872:68;;;;62729:219;62967:6;62962:47;62978:3;:10;62976:1;:12;62962:47;;;63003:3;63007:1;63003:6;;;;;;;;;;;;;;;;62994:1;62996:3;;;;;;62994:6;;;;;;;;;;;:15;-1:-1:-1;;;;;62994:15:0;;;;;;;;-1:-1:-1;62989:3:0;;62962:47;;;;63041:3;63029;63033:4;;;;;;63029:9;;;;;;;;;;;;;:15;;;;;;;;63018:27;;63066:2;63062:1;:6;;;63058:175;;;-1:-1:-1;63139:2:0;:8;63092:1;63131:4;;;;63092:1;;63139:8;;;;;;;;63127:3;;:9;;;;;;;;;;;;:20;;;;;;;;63116:32;;63162:6;63169:2;63172:4;63169:8;;;;;;;;;;;;63178:1;63169:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63162:18;;;;63157:68;63181:2;63184:4;63181:8;;;;;;;;;;63190:1;63181:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63181:11:0;-1:-1:-1;;;;;63181:18:0;;-1:-1:-1;;;63181:18:0;63157:68;;63214:2;63217:4;63214:8;;;;;;;;;;63223:1;63214:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63214:11:0;63205:1;63207:3;;;;;;63205:6;;;;;;;;;;;:20;-1:-1:-1;;;;;63205:20:0;;;;;;;;-1:-1:-1;63200:3:0;;63157:68;;;;63058:175;63270:3;63258;63262:4;;;;;;63258:9;;;;;;;;;;;;;:15;;;;;;;;63247:27;;63291:1;63287;:5;;;63283:4686;;;-1:-1:-1;63367:2:0;:8;63359:4;;;;63333:2;;63367:8;-1:-1:-1;;;63367:8:0;;;;;;63355:3;;:9;;;;;;;;;;;;:20;;;;;;;;63344:32;;63390:6;63397:2;63400:4;63397:8;;;;;;;;;;;;63406:1;63397:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63390:18;;;;63385:68;63409:2;63412:4;63409:8;;;;;;;;;;63418:1;63409:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63409:11:0;-1:-1:-1;;;;;63409:18:0;;-1:-1:-1;;;63409:18:0;63385:68;;63442:2;63445:4;63442:8;;;;;;;;;;63451:1;63442:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63442:11:0;63433:1;63435:3;;;;;;63433:6;;;;;;;;;;;:20;-1:-1:-1;;;;;63433:20:0;;;;;;;;-1:-1:-1;63428:3:0;;63385:68;;;;63283:4686;;;63475:2;63471:1;:6;;;63467:4502;;;63509:36;;;;;;;;;;;;-1:-1:-1;;;63509:36:0;;;;-1:-1:-1;63554:47:0;63570:3;:10;63568:1;:12;63554:47;;;63595:3;63599:1;63595:6;;;;;;;;;;;;;;;;63586:1;63588:3;;;;;;63586:6;;;;;;;;;;;:15;-1:-1:-1;;;;;63586:15:0;;;;;;;;-1:-1:-1;63581:3:0;;63554:47;;;-1:-1:-1;63660:2:0;:8;63652:4;;;;63625:2;;-1:-1:-1;63660:8:0;-1:-1:-1;;;63660:8:0;;;;;;63648:3;;:9;;;;;;;;;;;;:20;;;;;;;;63637:32;;63683:6;63690:2;63693:4;63690:8;;;;;;;;;;;;63699:1;63690:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63683:18;;;;63678:68;63702:2;63705:4;63702:8;;;;;;;;;;63711:1;63702:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63702:11:0;-1:-1:-1;;;;;63702:18:0;;-1:-1:-1;;;63702:18:0;63678:68;;63735:2;63738:4;63735:8;;;;;;;;;;63744:1;63735:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63735:11:0;63726:1;63728:3;;;;;;63726:6;;;;;;;;;;;:20;-1:-1:-1;;;;;63726:20:0;;;;;;;;-1:-1:-1;63721:3:0;;63678:68;;;;63467:4502;;;;63769:2;63765:1;:6;;;63761:4208;;;-1:-1:-1;63855:8:0;;;63847:4;;;63821:2;;63855:8;-1:-1:-1;;;63855:8:0;;;;;;63843:3;;:9;;;;;;;;;;;;:20;;;;;;;;63832:32;;63878:6;63885:2;63888:4;63885:8;;;;;;;;;;;;63894:1;63885:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63878:18;;;;63873:68;63897:2;63900:4;63897:8;;;;;;;;;;63906:1;63897:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63897:11:0;-1:-1:-1;;;;;63897:18:0;;-1:-1:-1;;;63897:18:0;63873:68;;63930:2;63933:4;63930:8;;;;;;;;;;63939:1;63930:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63930:11:0;63921:1;63923:3;;;;;;63921:6;;;;;;;;;;;:20;-1:-1:-1;;;;;63921:20:0;;;;;;;;-1:-1:-1;63916:3:0;;63873:68;;;-1:-1:-1;;63993:8:0;;;63985:4;;;63959:2;;63993:8;-1:-1:-1;;;63993:8:0;;;;;;63981:3;;:9;;;;;;;;;;;;:20;;;;;;;;63970:32;;64016:6;64023:2;64026:4;64023:8;;;;;;;;;;;;64032:1;64023:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64016:18;;;;64011:68;64035:2;64038:4;64035:8;;;;;;;;;;64044:1;64035:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64035:11:0;-1:-1:-1;;;;;64035:18:0;;-1:-1:-1;;;64035:18:0;64011:68;;64068:2;64071:4;64068:8;;;;;;;;;;64077:1;64068:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64068:11:0;64059:1;64061:3;;;;;;64059:6;;;;;;;;;;;:20;-1:-1:-1;;;;;64059:20:0;;;;;;;;-1:-1:-1;64054:3:0;;64011:68;;63761:4208;64103:2;64099:1;:6;;;64095:3874;;;;;;64153:2;64149:1;:6;;;64145:3824;;;-1:-1:-1;64235:2:0;:8;64227:4;;;;64201:1;;64235:8;-1:-1:-1;;;64235:8:0;;;;;;64223:3;;:9;;;;;;;;;;;;:20;;;;;;;;64212:32;;64258:6;64265:2;64268:4;64265:8;;;;;;;;;;;;64274:1;64265:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64258:18;;;;64253:68;64277:2;64280:4;64277:8;;;;;;;;;;64286:1;64277:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64277:11:0;-1:-1:-1;;;;;64277:18:0;;-1:-1:-1;;;64277:18:0;64253:68;;64310:2;64313:4;64310:8;;;;;;;;;;64319:1;64310:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64310:11:0;64301:1;64303:3;;;;;;64301:6;;;;;;;;;;;:20;-1:-1:-1;;;;;64301:20:0;;;;;;;;-1:-1:-1;64296:3:0;;64253:68;;;-1:-1:-1;;64374:2:0;:8;64366:4;;;;64339:1;;64374:8;-1:-1:-1;;;64374:8:0;;;;;;64362:3;;:9;;;;;;;;;;;;:20;;;;;;;;64351:32;;64397:6;64404:2;64407:4;64404:8;;;;;;;;;;;;64413:1;64404:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64397:18;;;;64392:68;64416:2;64419:4;64416:8;;;;;;;;;;64425:1;64416:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64416:11:0;-1:-1:-1;;;;;64416:18:0;;-1:-1:-1;;;64416:18:0;64392:68;;64449:2;64452:4;64449:8;;;;;;;;;;64458:1;64449:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64449:11:0;64440:1;64442:3;;;;;;64440:6;;;;;;;;;;;:20;-1:-1:-1;;;;;64440:20:0;;;;;;;;-1:-1:-1;64435:3:0;;64392:68;;64145:3824;64483:2;64479:1;:6;;;64475:3494;;;64516:41;;;;;;;;;;;;-1:-1:-1;;;64516:41:0;;;;-1:-1:-1;64566:47:0;64582:3;:10;64580:1;:12;64566:47;;;64607:3;64611:1;64607:6;;;;;;;;;;;;;;;;64598:1;64600:3;;;;;;64598:6;;;;;;;;;;;:15;-1:-1:-1;;;;;64598:15:0;;;;;;;;-1:-1:-1;64593:3:0;;64566:47;;;-1:-1:-1;64666:2:0;:8;64658:4;;;;64632:1;;-1:-1:-1;64666:8:0;-1:-1:-1;;;64666:8:0;;;;;;64654:3;;:9;;;;;;;;;;;;:20;;;;;;;;64643:32;;64689:6;64696:2;64699:4;64696:8;;;;;;;;;;;;64705:1;64696:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64689:18;;;;64684:68;64708:2;64711:4;64708:8;;;;;;;;;;64717:1;64708:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64708:11:0;-1:-1:-1;;;;;64708:18:0;;-1:-1:-1;;;64708:18:0;64684:68;;64741:2;64744:4;64741:8;;;;;;;;;;64750:1;64741:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64741:11:0;64732:1;64734:3;;;;;;64732:6;;;;;;;;;;;:20;-1:-1:-1;;;;;64732:20:0;;;;;;;;-1:-1:-1;64727:3:0;;64684:68;;;-1:-1:-1;64806:8:0;;;64798:4;;;64770:2;;-1:-1:-1;64806:8:0;;;;;;;;64794:3;;:9;;;;;;;;;;;;:20;;;;;;;;64783:32;;64829:6;64836:2;64839:4;64836:8;;;;;;;;;;;;64845:1;64836:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64829:18;;;;64824:68;64848:2;64851:4;64848:8;;;;;;;;;;64857:1;64848:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64848:11:0;-1:-1:-1;;;;;64848:18:0;;-1:-1:-1;;;64848:18:0;64824:68;;64881:2;64884:4;64881:8;;;;;;;;;;64890:1;64881:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64881:11:0;64872:1;64874:3;;;;;;64872:6;;;;;;;;;;;:20;-1:-1:-1;;;;;64872:20:0;;;;;;;;-1:-1:-1;64867:3:0;;64824:68;;64475:3494;64915:2;64911:1;:6;;;64907:3062;;;-1:-1:-1;65002:2:0;:8;64994:4;;;;64968:2;;65002:8;-1:-1:-1;;;65002:8:0;;;;;;64990:3;;:9;;;;;;;;;;;;:20;;;;;;;;64979:32;;65025:6;65032:2;65035:4;65032:8;;;;;;;;;;;;65041:1;65032:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65025:18;;;;65020:68;65044:2;65047:4;65044:8;;;;;;;;;;65053:1;65044:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65044:11:0;-1:-1:-1;;;;;65044:18:0;;-1:-1:-1;;;65044:18:0;65020:68;;65077:2;65080:4;65077:8;;;;;;;;;;65086:1;65077:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65077:11:0;65068:1;65070:3;;;;;;65068:6;;;;;;;;;;;:20;-1:-1:-1;;;;;65068:20:0;;;;;;;;-1:-1:-1;65063:3:0;;65020:68;;;-1:-1:-1;;65141:2:0;:8;65133:4;;;;65107:1;;65141:8;-1:-1:-1;;;65141:8:0;;;;;;65129:3;;:9;;;;;;;;;;;;:20;;;;;;;;65118:32;;65164:6;65171:2;65174:4;65171:8;;;;;;;;;;;;65180:1;65171:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65164:18;;;;65159:68;65183:2;65186:4;65183:8;;;;;;;;;;65192:1;65183:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65183:11:0;-1:-1:-1;;;;;65183:18:0;;-1:-1:-1;;;65183:18:0;65159:68;;65216:2;65219:4;65216:8;;;;;;;;;;65225:1;65216:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65216:11:0;65207:1;65209:3;;;;;;65207:6;;;;;;;;;;;:20;-1:-1:-1;;;;;65207:20:0;;;;;;;;-1:-1:-1;65202:3:0;;65159:68;;64907:3062;65249:2;65245:1;:6;;;65241:2728;;;65288:32;;;;;;;;;;;;-1:-1:-1;;;65288:32:0;;;;-1:-1:-1;65329:47:0;65345:3;:10;65343:1;:12;65329:47;;;65370:3;65374:1;65370:6;;;;;;;;;;;;;;;;65361:1;65363:3;;;;;;65361:6;;;;;;;;;;;:15;-1:-1:-1;;;;;65361:15:0;;;;;;;;-1:-1:-1;65356:3:0;;65329:47;;;-1:-1:-1;65429:8:0;;;65421:4;;;65395:2;;-1:-1:-1;65429:8:0;-1:-1:-1;;;65429:8:0;;;;;;65417:3;;:9;;;;;;;;;;;;:20;;;;;;;;65406:32;;65452:6;65459:2;65462:4;65459:8;;;;;;;;;;;;65468:1;65459:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65452:18;;;;65447:68;65471:2;65474:4;65471:8;;;;;;;;;;65480:1;65471:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65471:11:0;-1:-1:-1;;;;;65471:18:0;;-1:-1:-1;;;65471:18:0;65447:68;;65504:2;65507:4;65504:8;;;;;;;;;;65513:1;65504:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65504:11:0;65495:1;65497:3;;;;;;65495:6;;;;;;;;;;;:20;-1:-1:-1;;;;;65495:20:0;;;;;;;;-1:-1:-1;65490:3:0;;65447:68;;65241:2728;65537:2;65533:1;:6;;;65529:2440;;;-1:-1:-1;65620:8:0;;;65612:4;;;65586:2;;65620:8;-1:-1:-1;;;65620:8:0;;;;;;65608:3;;:9;;;;;;;;;;;;:20;;;;;;;;65597:32;;65643:6;65650:2;65653:4;65650:8;;;;;;;;;;;;65659:1;65650:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65643:18;;;;65638:68;65662:2;65665:4;65662:8;;;;;;;;;;65671:1;65662:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65662:11:0;-1:-1:-1;;;;;65662:18:0;;-1:-1:-1;;;65662:18:0;65638:68;;65695:2;65698:4;65695:8;;;;;;;;;;65704:1;65695:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65695:11:0;65686:1;65688:3;;;;;;65686:6;;;;;;;;;;;:20;-1:-1:-1;;;;;65686:20:0;;;;;;;;-1:-1:-1;65681:3:0;;65638:68;;65529:2440;65729:2;65725:1;:6;;;65721:2248;;;-1:-1:-1;65806:8:0;;;65798:4;;;65772:2;;65806:8;;;;;65794:3;;:9;;;;;;;;;;;;:20;;;;;;;;65783:32;;65829:6;65836:2;65839:4;65836:8;;;;;;;;;;;;65845:1;65836:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65829:18;;;;65824:68;65848:2;65851:4;65848:8;;;;;;;;;;65857:1;65848:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65848:11:0;-1:-1:-1;;;;;65848:18:0;;-1:-1:-1;;;65848:18:0;65824:68;;65881:2;65884:4;65881:8;;;;;;;;;;65890:1;65881:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65881:11:0;65872:1;65874:3;;;;;;65872:6;;;;;;;;;;;:20;-1:-1:-1;;;;;65872:20:0;;;;;;;;-1:-1:-1;65867:3:0;;65824:68;;;-1:-1:-1;;65944:8:0;;;65936:4;;;65910:2;;65944:8;;;;;;;;65932:3;;:9;;;;;;;;;;;;:20;;;;;;;;65921:32;;65967:6;65974:2;65977:4;65974:8;;;;;;;;;;;;65983:1;65974:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65967:18;;;;65962:68;65986:2;65989:4;65986:8;;;;;;;;;;65995:1;65986:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65986:11:0;-1:-1:-1;;;;;65986:18:0;;-1:-1:-1;;;65986:18:0;65962:68;;66019:2;66022:4;66019:8;;;;;;;;;;66028:1;66019:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66019:11:0;66010:1;66012:3;;;;;;66010:6;;;;;;;;;;;:20;-1:-1:-1;;;;;66010:20:0;;;;;;;;-1:-1:-1;66005:3:0;;65962:68;;;-1:-1:-1;;66082:8:0;;;66074:4;;;66048:2;;66082:8;;;;;;;;66070:3;;:9;;;;;;;;;;;;:20;;;;;;;;66059:32;;66105:6;66112:2;66115:4;66112:8;;;;;;;;;;;;66121:1;66112:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66105:18;;;;66100:68;66124:2;66127:4;66124:8;;;;;;;;;;66133:1;66124:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66124:11:0;-1:-1:-1;;;;;66124:18:0;;-1:-1:-1;;;66124:18:0;66100:68;;66157:2;66160:4;66157:8;;;;;;;;;;66166:1;66157:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66157:11:0;66148:1;66150:3;;;;;;66148:6;;;;;;;;;;;:20;-1:-1:-1;;;;;66148:20:0;;;;;;;;-1:-1:-1;66143:3:0;;66100:68;;65721:2248;66190:2;66186:1;:6;;;66182:1787;;;-1:-1:-1;66273:8:0;;;66265:4;;;66239:2;;66273:8;-1:-1:-1;;;66273:8:0;;;;;;66261:3;;:9;;;;;;;;;;;;:20;;;;;;;;66250:32;;66296:6;66303:2;66306:4;66303:8;;;;;;;;;;;;66312:1;66303:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66296:18;;;;66291:68;66315:2;66318:4;66315:8;;;;;;;;;;66324:1;66315:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66315:11:0;-1:-1:-1;;;;;66315:18:0;;-1:-1:-1;;;66315:18:0;66291:68;;66348:2;66351:4;66348:8;;;;;;;;;;66357:1;66348:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66348:11:0;66339:1;66341:3;;;;;;66339:6;;;;;;;;;;;:20;-1:-1:-1;;;;;66339:20:0;;;;;;;;-1:-1:-1;66334:3:0;;66291:68;;;-1:-1:-1;;66411:8:0;;;66403:4;;;66377:2;;66411:8;-1:-1:-1;;;66411:8:0;;;;;;66399:3;;:9;;;;;;;;;;;;:20;;;;;;;;66388:32;;66434:6;66441:2;66444:4;66441:8;;;;;;;;;;;;66450:1;66441:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66434:18;;;;66429:68;66453:2;66456:4;66453:8;;;;;;;;;;66462:1;66453:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66453:11:0;-1:-1:-1;;;;;66453:18:0;;-1:-1:-1;;;66453:18:0;66429:68;;66486:2;66489:4;66486:8;;;;;;;;;;66495:1;66486:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66486:11:0;66477:1;66479:3;;;;;;66477:6;;;;;;;;;;;:20;-1:-1:-1;;;;;66477:20:0;;;;;;;;-1:-1:-1;66472:3:0;;66429:68;;66182:1787;66519:2;66515:1;:6;;;66511:1458;;;66565:32;;;;;;;;;;;;-1:-1:-1;;;66565:32:0;;;;-1:-1:-1;66606:47:0;66622:3;:10;66620:1;:12;66606:47;;;66647:3;66651:1;66647:6;;;;;;;;;;;;;;;;66638:1;66640:3;;;;;;66638:6;;;;;;;;;;;:15;-1:-1:-1;;;;;66638:15:0;;;;;;;;-1:-1:-1;66633:3:0;;66606:47;;;-1:-1:-1;66703:8:0;;;66695:4;;;66669:2;;-1:-1:-1;66703:8:0;-1:-1:-1;;;66703:8:0;;;;;;66691:3;;:9;;;;;;;;;;;;:20;;;;;;;;66680:32;;66726:6;66733:2;66736:4;66733:8;;;;;;;;;;;;66742:1;66733:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66726:18;;;;66721:68;66745:2;66748:4;66745:8;;;;;;;;;;66754:1;66745:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66745:11:0;-1:-1:-1;;;;;66745:18:0;;-1:-1:-1;;;66745:18:0;66721:68;;66778:2;66781:4;66778:8;;;;;;;;;;66787:1;66778:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66778:11:0;66769:1;66771:3;;;;;;66769:6;;;;;;;;;;;:20;-1:-1:-1;;;;;66769:20:0;;;;;;;;-1:-1:-1;66764:3:0;;66721:68;;66511:1458;66811:2;66807:1;:6;;;66803:1166;;;66870:40;;;;;;;;;;;;-1:-1:-1;;;66870:40:0;;;;-1:-1:-1;66919:47:0;66935:3;:10;66933:1;:12;66919:47;;;66960:3;66964:1;66960:6;;;;;;;;;;;;;;;;66951:1;66953:3;;;;;;66951:6;;;;;;;;;;;:15;-1:-1:-1;;;;;66951:15:0;;;;;;;;-1:-1:-1;66946:3:0;;66919:47;;;-1:-1:-1;67016:8:0;;;67008:4;;;66982:2;;-1:-1:-1;67016:8:0;-1:-1:-1;;;67016:8:0;;;;;;67004:3;;:9;;;;;;;;;;;;:20;;;;;;;;66993:32;;67039:6;67046:2;67049:4;67046:8;;;;;;;;;;;;67055:1;67046:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67039:18;;;;67034:68;67058:2;67061:4;67058:8;;;;;;;;;;67067:1;67058:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67058:11:0;-1:-1:-1;;;;;67058:18:0;;-1:-1:-1;;;67058:18:0;67034:68;;67091:2;67094:4;67091:8;;;;;;;;;;67100:1;67091:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67091:11:0;67082:1;67084:3;;;;;;67082:6;;;;;;;;;;;:20;-1:-1:-1;;;;;67082:20:0;;;;;;;;-1:-1:-1;67077:3:0;;67034:68;;66803:1166;67124:2;67120:1;:6;;;67116:853;;;67158:33;;;;;;;;;;;;-1:-1:-1;;;67158:33:0;;;;-1:-1:-1;67200:47:0;67216:3;:10;67214:1;:12;67200:47;;;67241:3;67245:1;67241:6;;;;;;;;;;;;;;;;67232:1;67234:3;;;;;;67232:6;;;;;;;;;;;:15;-1:-1:-1;;;;;67232:15:0;;;;;;;;-1:-1:-1;67227:3:0;;67200:47;;;-1:-1:-1;67297:8:0;;;67289:4;;;67263:2;;-1:-1:-1;67297:8:0;-1:-1:-1;;;67297:8:0;;;;;;67285:3;;:9;;;;;;;;;;;;:20;;;;;;;;67274:32;;67320:6;67327:2;67330:4;67327:8;;;;;;;;;;;;67336:1;67327:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67320:18;;;;67315:68;67339:2;67342:4;67339:8;;;;;;;;;;67348:1;67339:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67339:11:0;-1:-1:-1;;;;;67339:18:0;;-1:-1:-1;;;67339:18:0;67315:68;;67372:2;67375:4;67372:8;;;;;;;;;;67381:1;67372:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67372:11:0;67363:1;67365:3;;;;;;67363:6;;;;;;;;;;;:20;-1:-1:-1;;;;;67363:20:0;;;;;;;;-1:-1:-1;67358:3:0;;67315:68;;67116:853;67405:3;67401:1;:7;;;67397:572;;;67419:35;;;;;;;;;;;;-1:-1:-1;;;67419:35:0;;;;-1:-1:-1;67463:47:0;67479:3;:10;67477:1;:12;67463:47;;;67504:3;67508:1;67504:6;;;;;;;;;;;;;;;;67495:1;67497:3;;;;;;67495:6;;;;;;;;;;;:15;-1:-1:-1;;;;;67495:15:0;;;;;;;;-1:-1:-1;67490:3:0;;67463:47;;;-1:-1:-1;67569:2:0;:8;67561:4;;;;67534:2;;-1:-1:-1;67569:8:0;-1:-1:-1;;;67569:8:0;;;;;;67557:3;;:9;;;;;;;;;;;;:20;;;;;;;;67546:32;;67592:6;67599:2;67602:4;67599:8;;;;;;;;;;;;67608:1;67599:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67592:18;;;;67587:68;67611:2;67614:4;67611:8;;;;;;;;;;67620:1;67611:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67611:11:0;-1:-1:-1;;;;;67611:18:0;;-1:-1:-1;;;67611:18:0;67587:68;;67644:2;67647:4;67644:8;;;;;;;;;;67653:1;67644:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67644:11:0;67635:1;67637:3;;;;;;67635:6;;;;;;;;;;;:20;-1:-1:-1;;;;;67635:20:0;;;;;;;;-1:-1:-1;67630:3:0;;67587:68;;;;67666:9;67697:3;67685;67689:4;;;;;;67685:9;;;;;;;;;;;;;:15;;;;;;;;67666:35;;67719:2;67714;:7;;;67710:246;;;67728:41;;;;;;;;;;;;-1:-1:-1;;;67728:41:0;;;;-1:-1:-1;67773:49:0;67789:4;:11;67787:1;:13;67773:49;;;67815:4;67820:1;67815:7;;;;;;;;;;;;;;;;67806:1;67808:3;;;;;;67806:6;;;;;;;;;;;:16;-1:-1:-1;;;;;67806:16:0;;;;;;;;-1:-1:-1;67801:3:0;;67773:49;;;;67710:246;;;;67847:2;67842;:7;;;67838:118;;;67856:37;;;;;;;;;;;;-1:-1:-1;;;67856:37:0;;;;-1:-1:-1;67897:49:0;67913:4;:11;67911:1;:13;67897:49;;;67939:4;67944:1;67939:7;;;;;;;;;;;;;;;;67930:1;67932:3;;;;;;67930:6;;;;;;;;;;;:16;-1:-1:-1;;;;;67930:16:0;;;;;;;;-1:-1:-1;67925:3:0;;67897:49;;;;67838:118;;67397:572;;;-1:-1:-1;;;67977:1:0;67981;67979;:3;67977:6;;;;;;;;;;;:12;-1:-1:-1;;;;;67977:12:0;;;;;;;;;-1:-1:-1;;;67996:1:0;67998;67996:4;;;;;;;;;;;:10;-1:-1:-1;;;;;67996:10:0;;;;;;;;;68015:15;68043:1;68033:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68033:12:0;;68015:30;;68057:6;68052:35;68068:1;68066;:3;68052:35;;;68083:1;68085;68083:4;;;;;;;;;;;;;;;;68075:2;68078:1;68075:5;;;;;;;;;;;:12;-1:-1:-1;;;;;68075:12:0;;;;;;;;-1:-1:-1;68070:3:0;;68052:35;;;-1:-1:-1;68101:2:0;60601:7508;-1:-1:-1;;;;;;;;;;;;60601:7508:0:o;45436:172::-;45511:7;;45553:22;:12;45569:5;45553:15;:22::i;:::-;-1:-1:-1;45531:44:0;45436:172;-1:-1:-1;;;45436:172:0:o;59117:18::-;;;-1:-1:-1;;;59117:18:0;;;;;:::o;43068:177::-;43140:7;43167:70;43184:7;43167:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;59240:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44729:97::-;44810:8;44803:15;;;;;;;;-1:-1:-1;;44803:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44777:13;;44803:15;;44810:8;;44803:15;;44810:8;44803:15;;;;;;;;;;;;;;;;;;;;;;;;42785:221;42857:7;-1:-1:-1;;;;;42885:19:0;;42877:74;;;;-1:-1:-1;;;42877:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42969:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;59211:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59821:88::-;59890:13;;-1:-1:-1;;;;;59890:13:0;59821:88;:::o;43481:104::-;43570:7;43563:14;;;;;;;;-1:-1:-1;;43563:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43537:13;;43563:14;;43570:7;;43563:14;;43570:7;43563:14;;;;;;;;;;;;;;;;;;;;;;;;59144:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59144:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59144:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46433:295::-;46548:12;:10;:12::i;:::-;-1:-1:-1;;;;;46536:24:0;:8;-1:-1:-1;;;;;46536:24:0;;;46528:62;;;;;-1:-1:-1;;;46528:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46648:8;46603:18;:32;46622:12;:10;:12::i;:::-;-1:-1:-1;;;;;46603:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;46603:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;46603:53:0;;;;;;;;;;;46687:12;:10;:12::i;:::-;-1:-1:-1;;;;;46672:48:0;;46711:8;46672:48;;;;;;;;;;;;;;;;;;;;46433:295;;:::o;58918:24::-;;;-1:-1:-1;;;58918:24:0;;;;;:::o;60413:107::-;60465:13;60501:12;60510:2;60501:8;:12::i;47628:285::-;47760:41;47779:12;:10;:12::i;:::-;47793:7;47760:18;:41::i;:::-;47752:103;;;;-1:-1:-1;;;47752:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47866:39;47880:4;47886:2;47890:7;47899:5;47866:13;:39::i;:::-;47628:285;;;;:::o;68355:1543::-;68420:13;68442:20;:251;;;;;;;;;;;;;;;;;;-1:-1:-1;68718:2:0;68727:14;68744:17;68753:7;68744:8;:17::i;:::-;68727:34;-1:-1:-1;68800:6:0;;68848:2;68889:518;68919:2;68915:1;:6;68911:10;;68939:1;:8;68934:1;:13;68930:101;;68957:1;:8;68953:12;;68930:101;;;68992:1;68994;68992:4;;;;;;;;;;;;;-1:-1:-1;;;;;;68992:4:0;-1:-1:-1;;;68992:11:0;;;;:20;;;69011:1;69007;:5;68992:20;68985:37;;;-1:-1:-1;;69016:3:0;;;;68985:37;;;69067:17;69099:1;69097;:3;69087:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69087:14:0;-1:-1:-1;69067:34:0;-1:-1:-1;69124:1:0;69110:59;69131:1;69127;:5;69110:59;;;69155:1;69157;69155:4;;;;;;;;;;;;;;;;69143;69150:1;69148;:3;69143:9;;;;;;;;;;;:16;-1:-1:-1;;;;;69143:16:0;;;;;;;;-1:-1:-1;69134:3:0;;69110:59;;;;69212:6;69253:11;69262:1;69253:8;:11::i;:::-;69270:4;69195:90;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69195:90:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69195:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69195:90:0;;;;;;;;;;;;;-1:-1:-1;;69195:90:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69195:90:0;;;;;;;;;;;-1:-1:-1;;;69195:90:0;;;;;;;;;;;;;;;;;-1:-1:-1;69195:90:0;;;;;;;;;;;;;-1:-1:-1;;69195:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69195:90:0;;;;;;;;;;;;;;;;;;;;;;69179:107;;69303:3;69299:1;:7;69295:18;;;69308:5;;;69295:18;69335:2;69330:7;;;;69355:1;:8;69350:1;:13;69346:24;;69365:5;;;69346:24;69394:1;69398;69394:5;69390:9;;68889:518;;;;69452:6;69435:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69435:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69435:33:0;;;;;;;;;;;;;;;;;;;;69419:50;;69478:18;69499:292;69568:17;69577:7;69568:8;:17::i;:::-;69753:28;69773:6;69753:13;:28::i;:::-;69526:262;;;;;;-1:-1:-1;;;69526:262:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69526:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69526:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69526:262:0;;;;;;;;;;;;;;;;;;;;;69499:13;:292::i;:::-;69478:313;;69864:4;69814:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69814:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69798:72;;69886:6;69879:13;;;;;;;;;68355:1543;;;:::o;59094:18::-;;;-1:-1:-1;;;59094:18:0;;;;;:::o;46799:164::-;-1:-1:-1;;;;;46920:25:0;;;46896:4;46920:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46799:164::o;59439:142::-;59309:13;;-1:-1:-1;;;;;59309:13:0;59326:10;59309:27;59301:64;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;;;;59492:83:::1;::::0;59500:42:::1;::::0;59553:21:::1;59492:83:::0;::::1;;;::::0;::::1;::::0;;;59553:21;59500:42;59492:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;59439:142::o:0;60171:60::-;59309:13;;-1:-1:-1;;;;;59309:13:0;59326:10;59309:27;59301:64;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;-1:-1:-1;;;59301:64:0;;;;;;;;;;;;;;;60214:6:::1;:11:::0;;-1:-1:-1;;;;60214:11:0::1;-1:-1:-1::0;;;60214:11:0::1;::::0;;60171:60::o;59589:226::-;59641:8;59671:1;59658:2;59661:3;59658:7;;;;;;;;;;;;59666:1;59658:10;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;;;;;;;;;;59684:6;59679:113;59695:2;59698:3;59695:7;;;;;;;;;;:14;;-1:-1:-1;;59695:14:0;;;;;;;;;;;59693:16;;59679:113;;;59728:2;59731:3;59728:7;;;;;;;;;;59736:1;59728:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59728:10:0;-1:-1:-1;;;;;59728:15:0;;-1:-1:-1;;;59728:15:0;59724:61;;;59771:1;59773;59771:3;59749:2;59752:3;59749:7;;;;;;;;;;;;59757:3;;;;;;59749:12;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;59724:61;59710:3;;59679:113;;;;59808:1;59798:2;59801:3;59798:7;;;;;;;;;;;;;;;;;;;;:11;;;;;;;;;;;;;;;;;;59589:226;;:::o;49376:127::-;49441:4;49465:30;:12;49487:7;49465:21;:30::i;18354:106::-;18442:10;18354:106;:::o;54749:183::-;54815:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;54815:29:0;-1:-1:-1;;;;;54815:29:0;;;;;;;;:24;;54869:23;54815:24;54869:14;:23::i;:::-;-1:-1:-1;;;;;54860:46:0;;;;;;;;;;;54749:183;;:::o;36271:123::-;36340:7;36367:19;36375:3;36367:7;:19::i;49670:355::-;49763:4;49788:16;49796:7;49788;:16::i;:::-;49780:73;;;;-1:-1:-1;;;49780:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49864:13;49880:23;49895:7;49880:14;:23::i;:::-;49864:39;;49933:5;-1:-1:-1;;;;;49922:16:0;:7;-1:-1:-1;;;;;49922:16:0;;:51;;;;49966:7;-1:-1:-1;;;;;49942:31:0;:20;49954:7;49942:11;:20::i;:::-;-1:-1:-1;;;;;49942:31:0;;49922:51;:94;;;;49977:39;50001:5;50008:7;49977:23;:39::i;:::-;49914:103;49670:355;-1:-1:-1;;;;49670:355:0:o;52809:599::-;52934:4;-1:-1:-1;;;;;52907:31:0;:23;52922:7;52907:14;:23::i;:::-;-1:-1:-1;;;;;52907:31:0;;52899:85;;;;-1:-1:-1;;;52899:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53021:16:0;;53013:65;;;;-1:-1:-1;;;53013:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53091:39;53112:4;53118:2;53122:7;53091:20;:39::i;:::-;53195:29;53212:1;53216:7;53195:8;:29::i;:::-;-1:-1:-1;;;;;53237:19:0;;;;;;:13;:19;;;;;:35;;53264:7;53237:26;:35::i;:::-;-1:-1:-1;;;;;;53283:17:0;;;;;;:13;:17;;;;;:30;;53305:7;53283:21;:30::i;:::-;-1:-1:-1;53326:29:0;:12;53343:7;53352:2;53326:16;:29::i;:::-;;53392:7;53388:2;-1:-1:-1;;;;;53373:27:0;53382:4;-1:-1:-1;;;;;53373:27:0;;;;;;;;;;;52809:599;;;:::o;9657:137::-;9728:7;9763:22;9767:3;9779:5;9763:3;:22::i;51294:404::-;-1:-1:-1;;;;;51374:16:0;;51366:61;;;;;-1:-1:-1;;;51366:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51447:16;51455:7;51447;:16::i;:::-;51446:17;51438:58;;;;;-1:-1:-1;;;51438:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51509:45;51538:1;51542:2;51546:7;51509:20;:45::i;:::-;-1:-1:-1;;;;;51567:17:0;;;;;;:13;:17;;;;;:30;;51589:7;51567:21;:30::i;:::-;-1:-1:-1;51610:29:0;:12;51627:7;51636:2;51610:16;:29::i;:::-;-1:-1:-1;51657:33:0;;51682:7;;-1:-1:-1;;;;;51657:33:0;;;51674:1;;51657:33;;51674:1;;51657:33;51294:404;;:::o;36733:236::-;36813:7;;;;36873:22;36877:3;36889:5;36873:3;:22::i;:::-;36842:53;;;;-1:-1:-1;36733:236:0;-1:-1:-1;;;;;36733:236:0:o;38019:213::-;38126:7;38177:44;38182:3;38202;38208:12;38177:4;:44::i;:::-;38169:53;-1:-1:-1;38019:213:0;;;;;;:::o;48795:268::-;48909:28;48919:4;48925:2;48929:7;48909:9;:28::i;70425:715::-;70481:13;70694:10;70690:53;;-1:-1:-1;70721:10:0;;;;;;;;;;;;-1:-1:-1;;;70721:10:0;;;;;;70690:53;70768:5;70753:12;70809:78;70816:9;;70809:78;;70842:8;;70873:2;70865:10;;;;70809:78;;;70897:19;70929:6;70919:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70919:17:0;;70897:39;;70947:154;70954:10;;70947:154;;-1:-1:-1;;70981:11:0;;;;71058:2;71050:5;:10;71037:2;:24;71024:39;;71007:6;71014;71007:14;;;;;;;;;;;:56;-1:-1:-1;;;;;71007:56:0;;;;;;;;-1:-1:-1;71087:2:0;71078:11;;;;70947:154;;71496:1607;71594:11;;71554:13;;71620:8;71616:23;;-1:-1:-1;;71630:9:0;;;;;;;;;-1:-1:-1;71630:9:0;;;;71616:23;71712:1;71729;71724;71718:7;;71717:13;71712:19;71789;71834:2;71821:15;;71811:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71811:26:0;;71789:48;;71850:18;71871:5;;;;;;;;;;;;;;;;;71850:26;;71940:1;71933:5;71929:13;71985:2;71977:6;71973:15;72036:1;72004:777;72059:3;72056:1;72053:10;72004:777;;;72114:1;72157:12;;;;;72151:19;72252:4;72240:2;72236:14;;;;;72218:40;;72212:47;72361:2;72357:14;;;72353:25;;72339:40;;72333:47;72490:1;72486:13;;;72482:24;;72468:39;;72462:46;72610:16;;;;72596:31;;72590:38;72288:1;72284:11;;;72382:4;72329:58;;;72320:68;72413:11;;72458:57;;;72449:67;;;;72541:11;;72586:49;;72577:59;72665:3;72661:13;72694:22;;72764:1;72749:17;;;;72107:9;72004:777;;;72008:44;72813:1;72808:3;72804:11;72834:1;72829:84;;;;72932:1;72927:82;;;;72797:212;;72829:84;-1:-1:-1;;;;;72862:17:0;;72855:43;72829:84;;72927:82;-1:-1:-1;;;;;72960:17:0;;72953:41;72797:212;-1:-1:-1;;;73025:26:0;;;;71496:1607;-1:-1:-1;;;;71496:1607:0:o;36032:151::-;36116:4;36140:35;36150:3;36170;36140:9;:35::i;32850:110::-;32933:19;;32850:110::o;8744:137::-;8814:4;8838:35;8846:3;8866:5;8838:7;:35::i;8437:131::-;8504:4;8528:32;8533:3;8553:5;8528:4;:32::i;35455:185::-;35544:4;35568:64;35573:3;35593;-1:-1:-1;;;;;35607:23:0;;35568:4;:64::i;4695:204::-;4790:18;;4762:7;;4790:26;-1:-1:-1;4782:73:0;;;;-1:-1:-1;;;4782:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4873:3;:11;;4885:5;4873:18;;;;;;;;;;;;;;;;4866:25;;4695:204;;;;:::o;33315:279::-;33419:19;;33382:7;;;;33419:27;-1:-1:-1;33411:74:0;;;;-1:-1:-1;;;33411:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:22;33523:3;:12;;33536:5;33523:19;;;;;;;;;;;;;;;;;;33498:44;;33561:5;:10;;;33573:5;:12;;;33553:33;;;;;33315:279;;;;;:::o;34812:319::-;34906:7;34945:17;;;:12;;;:17;;;;;;34996:12;34981:13;34973:36;;;;-1:-1:-1;;;34973:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35063:3;:12;;35087:1;35076:8;:12;35063:26;;;;;;;;;;;;;;;;;;:33;;;35056:40;;;34812:319;;;;;:::o;32630:125::-;32701:4;32725:17;;;:12;;;;;:17;;;;;;:22;;;32630:125::o;2397:1544::-;2463:4;2602:19;;;:12;;;:19;;;;;;2638:15;;2634:1300;;3073:18;;-1:-1:-1;;3024:14:0;;;;3073:22;;;;3000:21;;3073:3;;:22;;3360;;;;;;;;;;;;;;3340:42;;3506:9;3477:3;:11;;3489:13;3477:26;;;;;;;;;;;;;;;;;;;:38;;;;3583:23;;;3625:1;3583:12;;;:23;;;;;;3609:17;;;3583:43;;3735:17;;3583:3;;3735:17;;;;;;;;;;;;;;;;;;;;;;3830:3;:12;;:19;3843:5;3830:19;;;;;;;;;;;3823:26;;;3873:4;3866:11;;;;;;;;2634:1300;3917:5;3910:12;;;;;1807:414;1870:4;1892:21;1902:3;1907:5;1892:9;:21::i;:::-;1887:327;;-1:-1:-1;1930:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;2113:18;;2091:19;;;:12;;;:19;;;;;;:40;;;;2146:11;;1887:327;-1:-1:-1;2197:5:0;2190:12;;30130:692;30206:4;30341:17;;;:12;;;:17;;;;;;30375:13;30371:444;;-1:-1:-1;;30460:38:0;;;;;;;;;;;;;;;;;;30442:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;30657:19;;30637:17;;;:12;;;:17;;;;;;;:39;30691:11;;30371:444;30771:5;30735:3;:12;;30759:1;30748:8;:12;30735:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;30798:5;30791:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://cc930c597bed7e7f19a79561ee2875949cb9c79c270ec02030aa240e0d535562
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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