ETH Price: $3,269.43 (-4.29%)
Gas: 8 Gwei

Token

oraand (oraand)
 

Overview

Max Total Supply

1,024 oraand

Holders

300

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
9 oraand
0x7F13810Ae0e2f0895F96E8E8Ee9C502723Fafa6f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ORAAND

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-22
*/

/**********************************************************************************************************
      ___           ___           ___           ___           ___          _____    
     /  /\         /  /\         /  /\         /  /\         /__/\        /  /::\   
    /  /::\       /  /::\       /  /::\       /  /::\        \  \:\      /  /:/\:\  
   /  /:/\:\     /  /:/\:\     /  /:/\:\     /  /:/\:\        \  \:\    /  /:/  \:\ 
  /  /:/  \:\   /  /:/~/:/    /  /:/~/::\   /  /:/~/::\   _____\__\:\  /__/:/ \__\:|
 /__/:/ \__\:\ /__/:/ /:/___ /__/:/ /:/\:\ /__/:/ /:/\:\ /__/::::::::\ \  \:\ /  /:/
 \  \:\ /  /:/ \  \:\/:::::/ \  \:\/:/__\/ \  \:\/:/__\/ \  \:\~~\~~\/  \  \:\  /:/ 
  \  \:\  /:/   \  \::/~~~~   \  \::/       \  \::/       \  \:\         \  \:\/:/  
   \  \:\/:/     \  \:\        \  \:\        \  \:\        \  \:\         \  \::/   
    \  \::/       \  \:\        \  \:\        \  \:\        \  \:\         \__\/    
     \__\/         \__\/         \__\/         \__\/         \__\/                  


To obtain a Base64 encoded version of a Token's PRG you can call the function:

function getTokenPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume)

where:

  tokenId                - the id of the token
  pal                    - true for a pal version, false for ntsc
  filterResonanceRouting - 0 for default, otherwise a byte value in the format the SID register $d417 expects:
                             bit 0:    set to 1 to filter voice 1
                             bit 1:    set to 1 to filter voice 2
                             bit 2:    set to 1 to filter voice 3
                             bit 3:    set to 1 to filter external voice (not used)
                             bits 4-7: filter resonance (0-15)

  filterModeVolume       - 0 for default, otherwise a byte value in the format the SID register $d418 expects:
                             bits 0-3: volume (0-15)
                             bit 4:    set to 1 to enable the low pass filter
                             bit 5:    set to 1 to enable the band pass filter
                             bit 6:    set to 1 to enable the high pass filter
                             bit 7:    set to 1 to disable voice 3

The filters in some older model C64s may produce excessive distortion. If you intend to run the PRG
on one of these models, a value of 240 for filterResonanceRouting may produce a better output than
the default value.

**********************************************************************************************************/

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: oraand.sol

pragma solidity ^0.8.4;





interface IOraandURI {
  function tokenURI(IOraandPRGToken tokenContract, uint256 tokenId) external view returns (string memory);
}

interface IOraandPRGToken {
  function getTokenPRGBase64(uint256 tokenId, bool patchedVersion) external view returns (string memory);
  function getTokenPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) external view returns (bytes memory);
  function getTokenPatchedPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) external view returns (bytes memory);
  function getTokenAttributes(uint256 tokenId) external view returns (string memory);
  function getTokenParams(uint256 tokenId) external view returns (uint64);
  function getTokenModes(uint256 tokenId) external view returns (uint8);
  function getTokenPatchUnlocked(uint256 tokenId) external view returns (bool);
}

// ORAAND contract
contract ORAAND is ERC721, ERC721Enumerable, Ownable, IOraandPRGToken {
  using Strings for uint256;

  string constant tokenName   = "oraand";
  string constant tokenSymbol = "oraand";

  string private description = "2048 byte on chain PRG for the Commodore 64";

  uint256 constant MAX_NUMBER_TOKENS = 1024;

  uint256 public mintPrice = .0256e18;

  uint256 constant DAY_SECONDS = 24 * 60 * 60;

  string private imageBaseURI     = "https://nopsta.com/oraand/i/";
  string private animationBaseURI = "https://nopsta.com/oraand/v/";
  string private externalBaseURI  = "https://nopsta.com/oraand/";

  bytes constant basePRGData = hex"01080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc";

  uint constant FILTERRESONANCEROUTINGPOSITION = 0x18a;
  uint constant FILTERMODEVOLUMEPOSITION       = 0x186;

  // prg data 1
  uint constant PRGDATA1SEGMENTLENGTH = 56;
  uint constant PRGDATA1POSITION      = 0x7c8;
  bytes constant prgData1 = hex"a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e060";
  
  // prg data 2
  uint constant PRGDATA2SEGMENTLENGTH = 239;
  uint constant PRGDATA2POSITION      = 0x711;
  bytes constant prgData2 = hex"207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef6000000000000000";

  // prg data 3
  uint constant PRGDATA3LENGTH   = 457;
  uint constant PRGDATA3POSITION = 0x548;
  bytes constant prgData3 = hex"4c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60";

  // prg data 4
  uint constant PRGDATA4LENGTH   = 457;
  uint constant PRGDATA4POSITION = 0x548;
  bytes constant prgData4 = hex"4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930";

  // prg data 5
  uint constant PRGDATA5POSITION      = 0x518;
  uint constant PRGDATA5SEGMENTLENGTH = 24;
  bytes constant prgData5 = hex"1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a0";

  // prg data 6
  uint constant PRGDATA6POSITION = 0x530;
  bytes constant prgData6 = hex"0101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e";

  // prg data 7
  uint constant PRGDATA7POSITION = 0x56;
  bytes constant prgData7 = hex"000b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06";

  // prg data 8
  uint constant PRGDATA8POSITION = 0x17e;
  bytes constant prgData8 = hex"010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e";

  // prg data 9
  uint constant PRGDATA9POSITION = 0x287;
  bytes constant prgData9 = hex"1d2b2d4d5f63656971878da9c3cfe7f5";

  // prg data 10
  uint constant PRGDATA10SEGMENTLENGTH = 3;
  uint constant PRGDATA10POSITION      = 0x4b1;
  bytes constant prgData10 = hex"08000014000a14005014281478785050505060500a020408";

  // increment prob
  // length 16
  uint constant PRGDATA11SEGMENTLENGTH = 4;
  uint constant PRGDATA11POSITION      = 0x4bc;

  // prg data 11
  bytes constant prgData11 = hex"320000141400001e0a00001420000020";

  // prg data 12
  uint constant PRGDATA12SEGMENTLENGTH = 4;
  uint constant PRGDATA12POSITION      = 0x4b8; 
  bytes constant prgData12 = hex"1ea05050325050a0";

  // prg data 13
  uint constant PRGDATA13SEGMENTLENGTH = 56;
  uint constant PRGDATA13POSITION      = 0x4c0;
  bytes constant prgData13 = hex"8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080";

  // prg data 14
  bytes constant prgData14 = hex"0c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a243339362130";

  // prg data 15
  uint constant PRGDATA15LENGTH   = 4;
  uint constant PRGDATA15POSITION = 0x4a9;
  bytes constant prgData15 = hex"00300C06";

  // prg data 16
  uint constant PRGDATA16POSITION = 0x4ad;
  bytes constant prgData16 = hex"000C0C06";

  // prg data 17
  uint constant PRGDATA17POSITION = 0x64d;
  bytes constant prgData17 = hex"c0c0c00c18";

  // patch data 1
  uint constant PATCHDATA1LENGTH   = 13;
  uint constant PATCHDATA1POSITION = 0x2c2;
  bytes constant patchData1 = hex"18ad18d06902290e09e08d18d0";
  
  // patch data 2
  uint constant PATCHDATA2LENGTH   = 6;
  uint constant PATCHDATA2POSITION = 0x2b7;
  bytes constant patchData2 = hex"a9e88d18d060";

  // patch data 3
  uint constant PATCHDATA3LENGTH   = 8;
  uint constant PATCHDATA3POSITION = 0x2a0;
  bytes constant patchData3 = hex"207d0a29019150ea";

  // patch data 4
  uint constant PATCHDATA4LENGTH   = 13;
  uint constant PATCHDATA4POSITION = 0x28c;
  bytes constant patchData4 = hex"207d0a8d0020207d0a8d042060";

  // patch data 5
  uint constant PATCHDATA5LENGTH    = 6;
  uint constant PATCHDATA5POSITION1 = 0x2f3;
  uint constant PATCHDATA5POSITION2 = 0x33a;
  bytes constant patchData5 = hex"ee21d0ee20d0";

  // TokenData has the values specific to each token
  struct TokenData {
    uint64 params;

    uint8 modes;
    uint8 defaultMode;

    bool patchUnlocked;

    uint256 lastTransfer;
  }

  // mapping of tokenIds to the token's data
  mapping(uint256 => TokenData) tokenData;

  // the number of tokens minted
  uint256 _tokenIdCounter;

  IOraandURI public tokenURIContract;

  constructor() ERC721(tokenName, tokenSymbol) {
  }


  // ----------------------------- mint ----------------------------- //

  function mintToken()
    public
    payable
    returns (uint256)
  {
    require (_tokenIdCounter < MAX_NUMBER_TOKENS, "Mint over");

    require (balanceOf(msg.sender) < 16, "Limit 16");
    require (msg.value >= mintPrice, "Mint price");

    uint256 tokenId = _tokenIdCounter;

    unchecked {
      _tokenIdCounter = _tokenIdCounter + 1;
    }

    _safeMint(msg.sender, tokenId);

    tokenData[tokenId].params = uint64(bytes8(keccak256(abi.encodePacked(block.timestamp, msg.sender, tokenId.toString()))));

    tokenData[tokenId].lastTransfer = block.timestamp;

    return tokenId;
  }

  // ---------------------- token information ----------------------- //

  function tokenURI(uint256 tokenId) 
    override 
    public 
    view 
    returns (string memory) 
  {
    checkTokenId(tokenId);

    if (address(tokenURIContract) != address(0)) {
      return tokenURIContract.tokenURI(IOraandPRGToken(this), tokenId);
    }    

    string memory tokenIdString = Strings.toString(tokenId);

    string memory json = base64Encode(bytes(string(abi.encodePacked(
      '{"name":"oraand ', tokenIdString,
      '","description":"', description, '",',
      getTokenURIs(tokenIdString),
      ',"attributes":', getTokenAttributes(tokenId),
      ',"prg":"data:application/x-c64-program;base64,', getTokenPRGBase64(tokenId, false), 
      '"}'
    ))));

    return string(abi.encodePacked('data:application/json;base64,', json));
  }


  function getTokenURIs(string memory tokenIdString) 
    internal
    view 
    returns (string memory) 
  {
    string memory uriString = string(abi.encodePacked(
      '"image":"', imageBaseURI, tokenIdString,
      '.png","animation_url":"', animationBaseURI, tokenIdString,
      '","external_url":"', externalBaseURI, tokenIdString, '"'
    ));

    return uriString;
  }

  function getTokenAttributes(uint256 tokenId) 
    override(IOraandPRGToken)
    public
    view 
    returns (string memory) 
  {
    checkTokenId(tokenId);

    uint8 param = uint8((tokenData[tokenId].params >> 8) & 0x1f);

    string memory patch = "No";
    if(tokenData[tokenId].patchUnlocked) {
      patch = "Yes";
    }

    return string(
      abi.encodePacked('[{"trait_type":"Type","value":"', 
        Strings.toString(tokenData[tokenId].params & 7 ) ,'"},{"trait_type":"FG","value":"', 
        Strings.toString(uint8(prgData7[param])) ,'"},{"trait_type":"BG","value":"', 
        Strings.toString(uint8(prgData8[param])) ,'"}, {"trait_type":"Charset","value":"', 
        Strings.toString((tokenData[tokenId].params >> 32) & 0x1f) ,'"},{"trait_type":"Modes","value":"', 
        Strings.toString(tokenData[tokenId].modes),     
        '"}, {"trait_type":"Patch","value":"',patch,
        '"}]'
    ));
  }

  function getTokenSecondsSinceLastTransfer(uint256 tokenId)
    external
    view
    returns (uint256)
  {
    checkTokenId(tokenId);

    return block.timestamp - tokenData[tokenId].lastTransfer;
  }

  function getTokenParams(uint256 tokenId) 
    override(IOraandPRGToken)
    external
    view
    returns (uint64) 
  {
    checkTokenId(tokenId);
    
    return tokenData[tokenId].params;
  }

  function getTokenModes(uint256 tokenId) 
    override(IOraandPRGToken)
    external 
    view
    returns (uint8) 
  {
    checkTokenId(tokenId);
    
    return tokenData[tokenId].modes;
  }

  function getTokenPatchUnlocked(uint256 tokenId) 
    override(IOraandPRGToken)
    external
    view
    returns (bool)
  {
    checkTokenId(tokenId);
    
    return tokenData[tokenId].patchUnlocked;
  }

  function getTokenPRGBase64(uint256 tokenId, bool patchedVersion) 
    override(IOraandPRGToken)
    public
    view
    returns (string memory)
  {
    checkTokenId(tokenId);

    if (patchedVersion) {
      return getTokenPatchedPRGBase64(tokenId, true, 0, 0);
    } else {
      return getTokenPRGBase64(tokenId, true, 0, 0);
    }
  }

  function getTokenPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume)
    public
    view
    returns (string memory)
  {
    return base64Encode(getTokenPRG(tokenId, pal, filterResonanceRouting, filterModeVolume));
  }

  function getTokenPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume)
    override(IOraandPRGToken)
    public
    view
    returns (bytes memory)
  {
    checkTokenId(tokenId);

    bytes memory tokenPRG = basePRGData;

    unchecked {

      uint i;
      uint offset = 0;

      uint param = uint(tokenData[tokenId].params & 0x7);

      if (param > 0 && param < 4) {
        offset = uint((param - 1) * 56);
        for (i = 0; i < PRGDATA1SEGMENTLENGTH; i++) {
          tokenPRG[PRGDATA1POSITION + i] = prgData1[i + offset];
        }
      } else if (param > 3) {
        offset = uint((param - 4) * 239);

        for (i = 0; i < PRGDATA2SEGMENTLENGTH; i++) {
          tokenPRG[PRGDATA2POSITION + i] = prgData2[i + offset];
        }
      } 

      if (param > 3) {
        for (i = 0; i < PRGDATA3LENGTH; i++) {
          tokenPRG[PRGDATA3POSITION + i] = prgData3[i];
        }
        tokenPRG[0xa5] = bytes1(0x10);
        tokenPRG[0xa6] = bytes1(0x0f);
      } else {

        if ((tokenData[tokenId].params >> 3) & 0x1 > 0) {
          tokenPRG[0x651] = hex"0a";
        }
      }

      if (filterResonanceRouting != 0) {
        tokenPRG[FILTERRESONANCEROUTINGPOSITION] = bytes1(filterResonanceRouting);
      }

      if (filterModeVolume != 0) {
        tokenPRG[FILTERMODEVOLUMEPOSITION] = bytes1(filterModeVolume); 
      }

      offset = uint((tokenData[tokenId].params >> 16) & 0x7) * 24;

      uint noteOffset = uint((tokenData[tokenId].params >> 24) & 0xf);

      if (!pal) {
        noteOffset += 84;

        for (i = 0; i < PRGDATA15LENGTH; i++) {
          tokenPRG[PRGDATA15POSITION + i] = prgData15[i];
          tokenPRG[PRGDATA16POSITION + i] = prgData16[i];
        }

        if (param < 4) {
          for (i = 0; i < 4; i++) {
            tokenPRG[PRGDATA17POSITION + i] = prgData17[i];
          }

          if ((tokenData[tokenId].params >> 3) & 0x1 > 0) {
            tokenPRG[0x651] = hex"0c";
          } else {
            tokenPRG[0x651] = hex"18";
          }

          tokenPRG[0x696] = hex"04";
          tokenPRG[0x57f] = hex"5f";
          tokenPRG[0x6ae] = hex"30";
          tokenPRG[0x75d] = hex"30";
          tokenPRG[0x763] = hex"90";
        }
      }


      for (i = 0; i < PRGDATA5SEGMENTLENGTH; i++) {
        param = uint(uint8(prgData14[i + offset])) + noteOffset;
        tokenPRG[PRGDATA5POSITION + i] = prgData5[param];
        tokenPRG[PRGDATA6POSITION + i] = prgData6[param];
      }

      param = uint((tokenData[tokenId].params >> 8) & 0x1f);

      tokenPRG[PRGDATA8POSITION] = prgData8[param];
      tokenPRG[PRGDATA7POSITION] = prgData7[param];

      offset = uint((tokenData[tokenId].params >> 32) & 0x1f) * 56;

      if (offset < 1736) {
        for (i = 0; i < PRGDATA13SEGMENTLENGTH; i++) {
          tokenPRG[PRGDATA13POSITION + i] = prgData13[offset + i];
        }
      }

      param = uint((tokenData[tokenId].params >> 40) & 0xff);
      tokenPRG[0xca7 - 0x7ff] = bytes1(uint8(param));

      param = uint((tokenData[tokenId].params >> 48) & 0xf );
      tokenPRG[PRGDATA9POSITION] = prgData9[param];

      param = uint(((tokenData[tokenId].params >> 56) & 0x7) * 3);
      for (i = 0; i < PRGDATA10SEGMENTLENGTH; i++) {
        tokenPRG[PRGDATA10POSITION + i] = prgData10[i + param];
      }

      param = uint(((tokenData[tokenId].params >> 59) & 0x3) * 4);
      for (i = 0; i < PRGDATA11SEGMENTLENGTH; i++) {
        tokenPRG[PRGDATA11POSITION + i] = prgData11[i + param];
      }

      param = uint(((tokenData[tokenId].params >> 61) & 0x1) * 4);
      for (i = 0; i < PRGDATA12SEGMENTLENGTH; i++) {
        tokenPRG[PRGDATA12POSITION + i] = prgData12[i + param];
      }

      tokenPRG[0x1c6] = bytes1(tokenData[tokenId].modes + 1);

      if (tokenData[tokenId].defaultMode != 0) {
        tokenPRG[0x10e] = bytes1(tokenData[tokenId].defaultMode);
      }
    }

    return tokenPRG;
  }

  // Returns the patched PRG as base64 encoded data, requires patch to be unlocked
  function getTokenPatchedPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume)
    public
    view
    returns (string memory)
  {
    return base64Encode(getTokenPatchedPRG(tokenId, pal, filterResonanceRouting, filterModeVolume));
  }

  // Returns the patched PRG as bytes, requires patch to be unlocked
  function getTokenPatchedPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume)
    override(IOraandPRGToken)
    public
    view
    returns (bytes memory)
  {
    checkTokenId( tokenId );

    require (tokenData[tokenId].patchUnlocked, "Locked");
    
    bytes memory tokenPRG = getTokenPRG(tokenId, pal, filterResonanceRouting, filterModeVolume);

    uint256 i = 0;

    unchecked {
      // apply patches

      for (i = 0; i < PRGDATA4LENGTH; i++) {
        tokenPRG[PRGDATA4POSITION + i] = prgData4[i];
      }

      if (uint8((tokenData[tokenId].params >> 1) & 3) == 3) {
        tokenPRG[0x6ce] = hex"0f";
      }

      if (!pal) {
        tokenPRG[0x6ce] = hex"0c";
        tokenPRG[0x66d] = hex"0a";
        tokenPRG[0x675] = hex"08";
        tokenPRG[0x676] = hex"0c";
        tokenPRG[0x677] = hex"0a";
      }

      uint param = uint((tokenData[tokenId].params >> 2) & 7);

      if (param > 3) {
        tokenPRG[0x35e] = 0xee;
        tokenPRG[0x360] = 0xd0;

        if (param == 4) {
          tokenPRG[0x54d] = 0xd0;  

          param = uint((tokenData[tokenId].params >> 7) & 0x2);     

          tokenPRG[0x35f] = bytes1(0x16 + uint8(param));
        } else if (param == 5) {
          tokenPRG[0x35f] = 0x21;
        } else if (param == 6) {
          tokenPRG[0x360] = 0x20;
          tokenPRG[0x35f] = 0x00;
        } else {
          tokenPRG[0x35f] = 0x16;
        }
      } else if (param == 3) {
        tokenPRG[0x330] = 0xa5;
        tokenPRG[0x331] = 0x70; // or other sid shado
      } else if (param == 2) {
        tokenPRG[0x347] = bytes1(uint8(tokenData[tokenId].params & 0xff));
      } else if(param == 1) {
        if (uint((tokenData[tokenId].params) >> 6 & 1) == 0) {
          for (i = 0; i < PATCHDATA5LENGTH; i++) {
            tokenPRG[PATCHDATA5POSITION1 + i] = patchData5[i];
          }
        } else {
          for (i = 0; i < PATCHDATA5LENGTH; i++) {
            tokenPRG[PATCHDATA5POSITION2 + i] = patchData5[i];
          }
        }
      } else {
        tokenPRG[0x2ff] = 0xa4;
        tokenPRG[0x300] = 0x81;
      }

      if (((tokenData[tokenId].params >> 8) & 0xff) > 190) {
        tokenPRG[0x55]   = 0x8a;
        tokenPRG[0x56] = 0xea;
      }

      if (((tokenData[tokenId].params >> 14) & 0xff) > 60) {
        for (i = 0; i < PATCHDATA1LENGTH; i++) {
          tokenPRG[PATCHDATA1POSITION + i] = patchData1[i];
        } 

        for(i = 0; i < PATCHDATA2LENGTH; i++) {
          tokenPRG[PATCHDATA2POSITION + i] = patchData2[i];
        }
      } else {
        tokenPRG[0x304] = 0xea;
        tokenPRG[0x305] = 0xea;
      }

      if (((tokenData[tokenId].params >> 22) & 0xff) > 127) {
        for(i = 0; i < 8; i++) {
          tokenPRG[PATCHDATA3POSITION + i] = patchData3[i];
        }
      } else {
        for(i = 0; i < 13; i++) {
          tokenPRG[PATCHDATA4POSITION + i] = patchData4[i];      
        }
      }
    }

    return tokenPRG;
  }

  // ------------------------ check criteria ------------------------ //

  // Check tokenId is less than the total number of tokens
  function checkTokenId(uint256 tokenId) 
    public
    view
  {
    require (tokenId < _tokenIdCounter, "Invalid id");
  }

  // Check tokenId is valid and sender is the owner of the token
  function checkIsTokenOwner(address sender, uint256 tokenId) 
    public
    view
  {
    checkTokenId(tokenId);
    require (ERC721.ownerOf(tokenId) == sender, "Not owner");
  }

  // Check tokenId is valid and the token has been held for the time requirement
  function checkHoldTime(address sender, uint256 tokenId, uint256 timeRequirement) 
    public
    view
  {
    checkIsTokenOwner(sender, tokenId);

    string memory message = string(abi.encodePacked("Req time ", timeRequirement.toString()));
    require ((block.timestamp - tokenData[tokenId].lastTransfer) >= timeRequirement, message);
  }

  // Check if modes can be unlocked 
  function checkCanUnlockModes(address sender, uint256 tokenId, uint8 modes)
    public
    view
  {
    require (modes < 4, "Invalid");

    uint256[4] memory timeReq = [0, 8 * DAY_SECONDS, 16 * DAY_SECONDS, 32 * DAY_SECONDS];
    uint256 timeRequirement = timeReq[modes];
    checkHoldTime(sender, tokenId, timeRequirement);
  }

  // Check if meet requirements to unlock the patch (held for 64 days)
  function checkCanUnlockPatch(address sender, uint256 tokenId)
    public
    view
  {
    uint256 timeRequirement = 64 * DAY_SECONDS;
    checkHoldTime(sender, tokenId, timeRequirement);
  }


  // ------------------------ token modify  ------------------------- //

  // Set the maximum mode for the token
  function unlockModes(uint256 tokenId, uint8 modes)
    external
  {
    checkCanUnlockModes(msg.sender, tokenId, modes);

    tokenData[tokenId].modes = modes;
  }

  // Set the default mode for the token
  function setDefaultMode(uint256 tokenId, uint8 defaultMode)
    external
  {
    checkIsTokenOwner(msg.sender, tokenId);

    require (defaultMode <= tokenData[tokenId].modes, "Locked");

    tokenData[tokenId].defaultMode = defaultMode;
  }

  // Unlock the patch
  function unlockPatch(uint256 tokenId)
    external
  {
    checkCanUnlockPatch(msg.sender, tokenId);

    tokenData[tokenId].patchUnlocked = true;
  }

  // --------------- ERC721, ERC721Enumerable overrides --------------//

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

  function _beforeTokenTransfer(address from, address to, uint256 tokenId)
    internal
    override(ERC721, ERC721Enumerable)
  {
    super._beforeTokenTransfer(from, to, tokenId);

    if (tokenId < _tokenIdCounter) {
      tokenData[tokenId].lastTransfer = block.timestamp;
    }
  }

  // ------------------------ contract owner ------------------------ //

  function setMintPrice(uint256 price)
    external
    Ownable.onlyOwner
  {
    mintPrice = price;
  }

  function withdraw(uint256 amount)
    external
    Ownable.onlyOwner
  {
    require (amount <= address(this).balance, "Amt");

    payable(msg.sender).transfer(amount);
  }

  function setImageBaseURI(string memory baseURI) //, string memory extension )
    external
    Ownable.onlyOwner
  {
    imageBaseURI = baseURI;
  }

  function setAnimationBaseURI(string memory baseURI) //, string memory extension )
    external
    Ownable.onlyOwner 
  {
    animationBaseURI = baseURI;
  }

  function setExternalBaseURI(string memory baseURI)
    external
    Ownable.onlyOwner 
  {
    externalBaseURI = baseURI;
  }

  function setDescription(string memory desc)
    external
    Ownable.onlyOwner 
  {
    description = desc;
  }

  function setTokenURIContract(IOraandURI uriContract)
    external
    onlyOwner
  {
    tokenURIContract = uriContract;
  }

  // ---------------------------- base64 ---------------------------- //

  // From OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) - MIT Licence
  // @dev Base64 Encoding/Decoding Table
  string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

  //@dev Converts a `bytes` to its Bytes64 `string` representation.

  function base64Encode(bytes memory data) internal pure returns (string memory) {

      // Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
      // https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
      if (data.length == 0) return "";

      // Loads the table into memory
      string memory table = _TABLE;

      // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
      // and split into 4 numbers of 6 bits.
      // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
      // - `data.length + 2`  -> Round up
      // - `/ 3`              -> Number of 3-bytes chunks
      // - `4 *`              -> 4 characters for each chunk
      string memory result = new string(4 * ((data.length + 2) / 3));

      /// @solidity memory-safe-assembly
      assembly {
          // Prepare the lookup table (skip the first "length" byte)
          let tablePtr := add(table, 1)

          // Prepare result pointer, jump over length
          let resultPtr := add(result, 32)

          // Run over the input, 3 bytes at a time
          for {
              let dataPtr := data
              let endPtr := add(data, mload(data))
          } lt(dataPtr, endPtr) {

          } {
              // Advance 3 bytes
              dataPtr := add(dataPtr, 3)
              let input := mload(dataPtr)

              // To write each character, shift the 3 bytes (18 bits) chunk
              // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
              // and apply logical AND with 0x3F which is the number of
              // the previous character in the ASCII table prior to the Base64 Table
              // The result is then added to the table to get the character to write,
              // and finally write it in the result pointer but with a left shift
              // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

              mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
              resultPtr := add(resultPtr, 1) // Advance

              mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
              resultPtr := add(resultPtr, 1) // Advance

              mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
              resultPtr := add(resultPtr, 1) // Advance

              mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
              resultPtr := add(resultPtr, 1) // Advance
          }

          // When data `bytes` is not exactly 3 bytes long
          // it is padded with `=` characters at the end
          switch mod(mload(data), 3)
          case 1 {
              mstore8(sub(resultPtr, 1), 0x3d)
              mstore8(sub(resultPtr, 2), 0x3d)
          }
          case 2 {
              mstore8(sub(resultPtr, 1), 0x3d)
          }
      }
      return 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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"modes","type":"uint8"}],"name":"checkCanUnlockModes","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkCanUnlockPatch","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"timeRequirement","type":"uint256"}],"name":"checkHoldTime","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkIsTokenOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkTokenId","outputs":[],"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":"tokenId","type":"uint256"}],"name":"getTokenAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenModes","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPRG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"patchedVersion","type":"bool"}],"name":"getTokenPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenParams","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenPatchUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPatchedPRG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPatchedPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenSecondsSinceLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setAnimationBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"defaultMode","type":"uint8"}],"name":"setDefaultMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"desc","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setExternalBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setImageBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOraandURI","name":"uriContract","type":"address"}],"name":"setTokenURIContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIContract","outputs":[{"internalType":"contract IOraandURI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"modes","type":"uint8"}],"name":"unlockModes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unlockPatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052602b6080818152906200620260a03980516200002991600b91602090910190620001e8565b50665af3107a400000600c5560408051808201909152601c8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f692f0000000060209092019182526200007b91600d91620001e8565b5060408051808201909152601c8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f762f000000006020909201918252620000c291600e91620001e8565b5060408051808201909152601a8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f00000000000060209092019182526200010991600f91620001e8565b503480156200011757600080fd5b506040805180820182526006808252651bdc98585b9960d21b6020808401828152855180870190965292855284015281519192916200015991600091620001e8565b5080516200016f906001906020840190620001e8565b5050506200018c620001866200019260201b60201c565b62000196565b620002cb565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f6906200028e565b90600052602060002090601f0160209004810192826200021a576000855562000265565b82601f106200023557805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026557825182559160200191906001019062000248565b506200027392915062000277565b5090565b5b8082111562000273576000815560010162000278565b600181811c90821680620002a357607f821691505b60208210811415620002c557634e487b7160e01b600052602260045260246000fd5b50919050565b615f2780620002db6000396000f3fe6080604052600436106102885760003560e01c80636cfa24cc1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107ce578063f0f49ef514610817578063f2fde38b14610837578063f4a0a52814610857578063f8654e8214610877578063fd7cbad61461089757600080fd5b8063b88d4fde1461070e578063bdcf2f0e1461072e578063c87b56dd1461074e578063d18434151461076e578063d71a7a301461078e578063e34cb05d146107ae57600080fd5b80638da5cb5b116101135780638da5cb5b1461065b57806390c3f38f1461067957806395d89b4114610699578063a22cb465146106ae578063a2c6e888146106ce578063aa28d67d146106ee57600080fd5b80636cfa24cc146105a65780636f790d2c146105c657806370a08231146105e6578063715018a6146106065780637ec1d1b11461061b57806382fc31471461063b57600080fd5b80633f109376116101fe5780636352211e116101b75780636352211e146104c557806367da849d146104e55780636817c76c14610505578063698f87be1461051b5780636a37d7d31461053b5780636be636691461056d57600080fd5b80633f1093761461040557806340bb4abb1461042557806342842e0e1461044557806342bbf40a146104655780634f6ccce7146104855780636071862d146104a557600080fd5b80631f4f5a23116102505780631f4f5a231461035d5780632004ffd91461037d57806321af8ed91461038557806323b872dd146103a55780632e1a7d4d146103c55780632f745c59146103e557600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613c4c565b6108b7565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c8565b6040516102b99190614346565b3480156102f057600080fd5b506103046102ff366004613d3d565b61095a565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004613bad565b610981565b005b34801561034a57600080fd5b506008545b6040519081526020016102b9565b34801561036957600080fd5b506102d7610378366004613d3d565b610a9c565b61034f610c3a565b34801561039157600080fd5b5061033c6103a0366004613dc6565b610d78565b3480156103b157600080fd5b5061033c6103c0366004613ab7565b610e0a565b3480156103d157600080fd5b5061033c6103e0366004613d3d565b610e3b565b3480156103f157600080fd5b5061034f610400366004613bad565b610eaa565b34801561041157600080fd5b5061034f610420366004613d3d565b610f40565b34801561043157600080fd5b506102d7610440366004613d79565b610f67565b34801561045157600080fd5b5061033c610460366004613ab7565b61188d565b34801561047157600080fd5b5061033c610480366004613bad565b6118a8565b34801561049157600080fd5b5061034f6104a0366004613d3d565b611906565b3480156104b157600080fd5b506102ad6104c0366004613d3d565b611999565b3480156104d157600080fd5b506103046104e0366004613d3d565b6119c1565b3480156104f157600080fd5b506102d7610500366004613d79565b611a21565b34801561051157600080fd5b5061034f600c5481565b34801561052757600080fd5b50601254610304906001600160a01b031681565b34801561054757600080fd5b5061055b610556366004613d3d565b611a40565b60405160ff90911681526020016102b9565b34801561057957600080fd5b5061058d610588366004613d3d565b611a68565b60405167ffffffffffffffff90911681526020016102b9565b3480156105b257600080fd5b5061033c6105c1366004613c86565b611a90565b3480156105d257600080fd5b5061033c6105e1366004613d3d565b611aab565b3480156105f257600080fd5b5061034f610601366004613a5a565b611aec565b34801561061257600080fd5b5061033c611b72565b34801561062757600080fd5b506102d7610636366004613d79565b611b86565b34801561064757600080fd5b5061033c610656366004613a5a565b612848565b34801561066757600080fd5b50600a546001600160a01b0316610304565b34801561068557600080fd5b5061033c610694366004613c86565b612872565b3480156106a557600080fd5b506102d761288d565b3480156106ba57600080fd5b5061033c6106c9366004613b78565b61289c565b3480156106da57600080fd5b5061033c6106e9366004613c86565b6128a7565b3480156106fa57600080fd5b5061033c610709366004613dc6565b6128c2565b34801561071a57600080fd5b5061033c610729366004613af8565b6128ff565b34801561073a57600080fd5b5061033c610749366004613c0e565b612937565b34801561075a57600080fd5b506102d7610769366004613d3d565b6129f4565b34801561077a57600080fd5b506102d7610789366004613d56565b612b03565b34801561079a57600080fd5b5061033c6107a9366004613bd9565b612b37565b3480156107ba57600080fd5b5061033c6107c9366004613bad565b612bab565b3480156107da57600080fd5b506102ad6107e9366004613a7e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082357600080fd5b506102d7610832366004613d79565b612bc8565b34801561084357600080fd5b5061033c610852366004613a5a565b612bd9565b34801561086357600080fd5b5061033c610872366004613d3d565b612c4f565b34801561088357600080fd5b5061033c610892366004613c86565b612c5c565b3480156108a357600080fd5b5061033c6108b2366004613d3d565b612c77565b60006108c282612ca2565b92915050565b6060600080546108d7906144e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610903906144e0565b80156109505780601f1061092557610100808354040283529160200191610950565b820191906000526020600020905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b600061096582612cc7565b506000908152600460205260409020546001600160a01b031690565b600061098c826119c1565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a1b5750610a1b81336107e9565b610a8d5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109f6565b610a978383612d26565b505050565b6060610aa782611aab565b600082815260106020818152604080842054815180830190925260028252614e6f60f01b8284015293869052919052600882901c601f1691600160501b900460ff1615610b0a575060408051808201909152600381526259657360e81b60208201525b600084815260106020526040902054610b2590600716612d94565b610b7e6040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e068152508460ff1681518110610b7157610b7161458c565b016020015160f81c612d94565b610bcb6040518060400160405280602081526020017f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8152508560ff1681518110610b7157610b7161458c565b600087815260106020908152604090912054610bea911c601f16612d94565b600088815260106020526040902054610c0c90600160401b900460ff16612d94565b85604051602001610c2296959493929190613ecb565b60405160208183030381529060405292505050919050565b600061040060115410610c7b5760405162461bcd60e51b815260206004820152600960248201526826b4b73a1037bb32b960b91b60448201526064016109f6565b6010610c8633611aec565b10610cbe5760405162461bcd60e51b81526020600482015260086024820152672634b6b4ba10189b60c11b60448201526064016109f6565b600c54341015610cfd5760405162461bcd60e51b815260206004820152600a6024820152694d696e7420707269636560b01b60448201526064016109f6565b6011805460018101909155610d123382612e92565b4233610d1d83612d94565b604051602001610d2f939291906142ca565b60408051601f198184030181529181528151602092830120600084815260109093529120805467ffffffffffffffff191660c09290921c91909117815542600190910155919050565b610d8233836118a8565b60008281526010602052604090205460ff600160401b90910481169082161115610dd75760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b600091825260106020526040909120805460ff909216600160481b0269ff00000000000000000019909216919091179055565b610e143382612eac565b610e305760405162461bcd60e51b81526004016109f6906143ab565b610a97838383612f2a565b610e436130d1565b47811115610e795760405162461bcd60e51b8152602060048201526003602482015262105b5d60ea1b60448201526064016109f6565b604051339082156108fc029083906000818181858888f19350505050158015610ea6573d6000803e3d6000fd5b5050565b6000610eb583611aec565b8210610f175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109f6565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f4b82611aab565b6000828152601060205260409020600101546108c2904261449d565b6060610f7285611aab565b600085815260106020526040902054600160501b900460ff16610fc05760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b6000610fce86868686611b86565b905060005b6101c981101561104a576040518061020001604052806101c981526020016145e46101c99139818151811061100a5761100a61458c565b602001015160f81c60f81b8282610548018151811061102b5761102b61458c565b60200101906001600160f81b031916908160001a905350600101610fd3565b60008781526010602052604090205460011c6003908116141561109857600f60f81b826106ce815181106110805761108061458c565b60200101906001600160f81b031916908160001a9053505b8561118e57600360fa1b826106ce815181106110b6576110b661458c565b60200101906001600160f81b031916908160001a905350600560f91b8261066d815181106110e6576110e661458c565b60200101906001600160f81b031916908160001a905350600160fb1b82610675815181106111165761111661458c565b60200101906001600160f81b031916908160001a905350600360fa1b82610676815181106111465761114661458c565b60200101906001600160f81b031916908160001a905350600560f91b82610677815181106111765761117661458c565b60200101906001600160f81b031916908160001a9053505b60008781526010602052604090205460021c600716600381111561132b5760ee60f81b8361035e815181106111c5576111c561458c565b60200101906001600160f81b031916908160001a90535060d060f81b83610360815181106111f5576111f561458c565b60200101906001600160f81b031916908160001a90535080600414156112995760d060f81b8361054d8151811061122e5761122e61458c565b60200101906001600160f81b031916908160001a90535050600087815260106020526040902054825160079190911c600216906016820160f81b90849061035f90811061127d5761127d61458c565b60200101906001600160f81b031916908160001a905350611541565b80600514156112bb57602160f81b8361035f8151811061127d5761127d61458c565b806006141561130d57602060f81b83610360815181106112dd576112dd61458c565b60200101906001600160f81b031916908160001a905350600060f81b8361035f8151811061127d5761127d61458c565b601660f81b8361035f8151811061127d5761127d61458c565b611541565b806003141561137d5760a560f81b836103308151811061134d5761134d61458c565b60200101906001600160f81b031916908160001a905350607060f81b836103318151811061127d5761127d61458c565b80600214156113bc57600088815260106020526040902054835160f89190911b6001600160f81b03191690849061034790811061127d5761127d61458c565b80600114156114e05760008881526010602052604090205460061c60011661145f57600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061141c5761141c61458c565b602001015160f81c60f81b83836102f3018151811061143d5761143d61458c565b60200101906001600160f81b031916908160001a9053506001909101906113e3565b600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061149d5761149d61458c565b602001015160f81c60f81b838361033a01815181106114be576114be61458c565b60200101906001600160f81b031916908160001a905350600190910190611464565b60a460f81b836102ff815181106114f9576114f961458c565b60200101906001600160f81b031916908160001a905350608160f81b83610300815181106115295761152961458c565b60200101906001600160f81b031916908160001a9053505b60008881526010602052604090205460be60089190911c60ff1611156115c057608a60f81b836055815181106115795761157961458c565b60200101906001600160f81b031916908160001a90535060ea60f81b836056815181106115a8576115a861458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054603c600e9190911c60ff1611156116ee57600091505b600d821015611668576040518060400160405280600d81526020016c018ad18d06902290e09e08d18d609c1b81525082815181106116255761162561458c565b602001015160f81c60f81b83836102c201815181106116465761164661458c565b60200101906001600160f81b031916908160001a9053506001909101906115e5565b600091505b60068210156116e95760405180604001604052806006815260200165054f4468c68360d51b81525082815181106116a6576116a661458c565b602001015160f81c60f81b83836102b701815181106116c7576116c761458c565b60200101906001600160f81b031916908160001a90535060019091019061166d565b61174f565b60ea60f81b83610304815181106117075761170761458c565b60200101906001600160f81b031916908160001a90535060ea60f81b83610305815181106117375761173761458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054607f60169190911c60ff1611156117f757600091505b60088210156117f25760405180604001604052806008815260200167103e851480c8a87560c11b81525082815181106117af576117af61458c565b602001015160f81c60f81b83836102a001815181106117d0576117d061458c565b60200101906001600160f81b031916908160001a905350600190910190611774565b61187f565b600091505b600d82101561187f576040518060400160405280600d81526020016c0103e85468010103e854682103609d1b815250828151811061183c5761183c61458c565b602001015160f81c60f81b838361028c018151811061185d5761185d61458c565b60200101906001600160f81b031916908160001a9053506001909101906117fc565b50909150505b949350505050565b610a97838383604051806020016040528060008152506128ff565b6118b181611aab565b816001600160a01b03166118c4826119c1565b6001600160a01b031614610ea65760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016109f6565b600061191160085490565b82106119745760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109f6565b600882815481106119875761198761458c565b90600052602060002001549050919050565b60006119a482611aab565b50600090815260106020526040902054600160501b900460ff1690565b6000818152600260205260408120546001600160a01b0316806108c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b6060611a37611a3286868686610f67565b61312b565b95945050505050565b6000611a4b82611aab565b50600090815260106020526040902054600160401b900460ff1690565b6000611a7382611aab565b5060009081526010602052604090205467ffffffffffffffff1690565b611a986130d1565b8051610ea690600d90602084019061395d565b6011548110611ae95760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a59081a5960b21b60448201526064016109f6565b50565b60006001600160a01b038216611b565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109f6565b506001600160a01b031660009081526003602052604090205490565b611b7a6130d1565b611b84600061327f565b565b6060611b9185611aab565b60006040518061082001604052806108008152602001614e9a61080091396000878152601060205260408120549192509081906007168015801590611bd65750600481105b15611c6657600181036038029150600092505b6038831015611c61576040518060e0016040528060a88152602001614df260a8913982840181518110611c1e57611c1e61458c565b602001015160f81c60f81b84846107c80181518110611c3f57611c3f61458c565b60200101906001600160f81b031916908160001a905350600190920191611be9565b611cf8565b6003811115611cf8576004810360ef029150600092505b60ef831015611cf857604051806103e001604052806103bc81526020016147ad6103bc913982840181518110611cb557611cb561458c565b602001015160f81c60f81b84846107110181518110611cd657611cd661458c565b60200101906001600160f81b031916908160001a905350600190920191611c7d565b6003811115611de357600092505b6101c9831015611d80576040518061020001604052806101c98152602001614c296101c991398381518110611d3d57611d3d61458c565b602001015160f81c60f81b84846105480181518110611d5e57611d5e61458c565b60200101906001600160f81b031916908160001a905350600190920191611d06565b601060f81b8460a581518110611d9857611d9861458c565b60200101906001600160f81b031916908160001a905350600f60f81b8460a681518110611dc757611dc761458c565b60200101906001600160f81b031916908160001a905350611e2e565b60008981526010602052604090205460031c60011615611e2e57600560f91b8461065181518110611e1657611e1661458c565b60200101906001600160f81b031916908160001a9053505b60ff871615611e67578660f81b8461018a81518110611e4f57611e4f61458c565b60200101906001600160f81b031916908160001a9053505b60ff861615611ea0578560f81b8461018681518110611e8857611e8861458c565b60200101906001600160f81b031916908160001a9053505b6000898152601060208190526040909120549081901c600716601890810293501c600f16886121a957600093506054015b6004841015611faf576040518060400160405280600481526020016218060360e11b8152508481518110611f0757611f0761458c565b602001015160f81c60f81b85856104a90181518110611f2857611f2861458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280600481526020016206060360e11b8152508481518110611f6c57611f6c61458c565b602001015160f81c60f81b85856104ad0181518110611f8d57611f8d61458c565b60200101906001600160f81b031916908160001a905350600190930192611ed1565b60048210156121a957600093505b60048410156120385760405180604001604052806005815260200164181818018360db1b8152508481518110611ff557611ff561458c565b602001015160f81c60f81b858561064d01815181106120165761201661458c565b60200101906001600160f81b031916908160001a905350600190930192611fbd565b60008a81526010602052604090205460031c6001161561208757600360fa1b856106518151811061206b5761206b61458c565b60200101906001600160f81b031916908160001a9053506120b8565b600360fb1b85610651815181106120a0576120a061458c565b60200101906001600160f81b031916908160001a9053505b600160fa1b85610696815181106120d1576120d161458c565b60200101906001600160f81b031916908160001a905350605f60f81b8561057f815181106121015761210161458c565b60200101906001600160f81b031916908160001a905350600360fc1b856106ae815181106121315761213161458c565b60200101906001600160f81b031916908160001a905350600360fc1b8561075d815181106121615761216161458c565b60200101906001600160f81b031916908160001a905350600960fc1b85610763815181106121915761219161458c565b60200101906001600160f81b031916908160001a9053505b600093505b60188410156122c757806040518060e0016040528060c08152602001614b6960c09139848601815181106121e4576121e461458c565b602001015160f81c60f81b60f81c60ff160191506040518060e0016040528060a881526020016156da60a8913982815181106122225761222261458c565b602001015160f81c60f81b858561051801815181106122435761224361458c565b60200101906001600160f81b031916908160001a9053506040518060e0016040528060a8815260200161578260a8913982815181106122845761228461458c565b602001015160f81c60f81b858561053001815181106122a5576122a561458c565b60200101906001600160f81b031916908160001a9053506001909301926121ae565b60008a8152601060209081526040918290205482518084019093528183527f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8383015260081c601f169350839081106123225761232261458c565b602001015160f81c60f81b8561017e815181106123415761234161458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06815250828151811061239e5761239e61458c565b602001015160f81c60f81b856056815181106123bc576123bc61458c565b60200101906001600160f81b031916908160001a90535060008a815260106020908152604090912054901c601f1660380292506106c883101561247957600093505b6038841015612479576040518061070001604052806106c8815260200161582a6106c89139848401815181106124365761243661458c565b602001015160f81c60f81b85856104c001815181106124575761245761458c565b60200101906001600160f81b031916908160001a9053506001909301926123fe565b60008a8152601060205260409020548551602882901c60ff16935060d09190911b6001600160f81b0319169086906104a89081106124b9576124b961458c565b60200101906001600160f81b031916908160001a90535060008a8152601060208181526040928390205483518085019094528284526f1d2b2d4d5f63656971878da9c3cfe7f560801b9184019190915260301c600f169350839081106125215761252161458c565b602001015160f81c60f81b85610287815181106125405761254061458c565b60200101906001600160f81b031916908160001a90535060008a81526010602052604081205490945067ffffffffffffffff60389190911c6007166003021691505b6003841015612617576040518060400160405280601881526020017f08000014000a14005014281478785050505060500a0204080000000000000000815250828501815181106125d4576125d461458c565b602001015160f81c60f81b85856104b101815181106125f5576125f561458c565b60200101906001600160f81b031916908160001a905350600190930192612582565b60008a81526010602052604081205490945067ffffffffffffffff603b9190911c6003166004021691505b60048410156126ca576040518060400160405280601081526020016f01900000a0a00000f0500000a100000160851b815250828501815181106126875761268761458c565b602001015160f81c60f81b85856104bc01815181106126a8576126a861458c565b60200101906001600160f81b031916908160001a905350600190930192612642565b60008a8152601060205260408120549094506004603d9190911c6001160267ffffffffffffffff1691505b60048410156127745760405180604001604052806008815260200166f502828192828560c51b815250828501815181106127315761273161458c565b602001015160f81c60f81b85856104b801815181106127525761275261458c565b60200101906001600160f81b031916908160001a9053506001909301926126f5565b601060008b815260200190815260200160002060000160089054906101000a900460ff1660010160f81b856101c6815181106127b2576127b261458c565b60200101906001600160f81b031916908160001a90535060008a815260106020526040902054600160481b900460ff161561283a5760008a8152601060205260409020548551600160481b90910460f81b6001600160f81b03191690869061010e9081106128225761282261458c565b60200101906001600160f81b031916908160001a9053505b509298975050505050505050565b6128506130d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61287a6130d1565b8051610ea690600b90602084019061395d565b6060600180546108d7906144e0565b610ea63383836132d1565b6128af6130d1565b8051610ea690600e90602084019061395d565b6128cd338383612937565b600091825260106020526040909120805460ff909216600160401b0268ff000000000000000019909216919091179055565b6129093383612eac565b6129255760405162461bcd60e51b81526004016109f6906143ab565b612931848484846133a0565b50505050565b60048160ff16106129745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016109f6565b6000604051806080016040528060008152602001620151806008612998919061447e565b81526020016129ab62015180601061447e565b81526020016201518060206129c0919061447e565b9052905060008160ff8416600481106129db576129db61458c565b602002015190506129ed858583612b37565b5050505050565b60606129ff82611aab565b6012546001600160a01b031615612a965760125460405163e9dc637560e01b8152306004820152602481018490526001600160a01b039091169063e9dc63759060440160006040518083038186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c29190810190613ccf565b6000612aa183612d94565b90506000612af082600b612ab4856133d3565b612abd88610a9c565b612ac8896000612b03565b604051602001612adc959493929190614137565b60405160208183030381529060405261312b565b905080604051602001610c229190614254565b6060612b0e83611aab565b8115612b2957612b22836001600080611a21565b90506108c2565b612b22836001600080612bc8565b612b4183836118a8565b6000612b4c82612d94565b604051602001612b5c9190614299565b60408051601f198184030181529181526000858152601060205220600101549091508290612b8a904261449d565b101581906129ed5760405162461bcd60e51b81526004016109f69190614346565b6000612bbb62015180604061447e565b9050610a97838383612b37565b6060611a37611a3286868686611b86565b612be16130d1565b6001600160a01b038116612c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f6565b611ae98161327f565b612c576130d1565b600c55565b612c646130d1565b8051610ea690600f90602084019061395d565b612c813382612bab565b6000908152601060205260409020805460ff60501b1916600160501b179055565b60006001600160e01b0319821663780e9d6360e01b14806108c257506108c28261340c565b6000818152600260205260409020546001600160a01b0316611ae95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d5b826119c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081612db85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612de25780612dcc8161451b565b9150612ddb9050600a8361446a565b9150612dbc565b60008167ffffffffffffffff811115612dfd57612dfd6145a2565b6040519080825280601f01601f191660200182016040528015612e27576020820181803683370190505b5090505b841561188557612e3c60018361449d565b9150612e49600a86614536565b612e54906030614452565b60f81b818381518110612e6957612e6961458c565b60200101906001600160f81b031916908160001a905350612e8b600a8661446a565b9450612e2b565b610ea682826040518060200160405280600081525061345c565b600080612eb8836119c1565b9050806001600160a01b0316846001600160a01b03161480612eff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118855750836001600160a01b0316612f188461095a565b6001600160a01b031614949350505050565b826001600160a01b0316612f3d826119c1565b6001600160a01b031614612fa15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109f6565b6001600160a01b0382166130035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f6565b61300e83838361348f565b613019600082612d26565b6001600160a01b038316600090815260036020526040812080546001929061304290849061449d565b90915550506001600160a01b0382166000908152600360205260408120805460019290613070908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314611b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b606081516000141561314b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161569a604091399050600060038451600261317a9190614452565b613184919061446a565b61318f90600461447e565b67ffffffffffffffff8111156131a7576131a76145a2565b6040519080825280601f01601f1916602001820160405280156131d1576020820181803683370190505b509050600182016020820185865187015b8082101561323d576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506131e2565b5050600386510660018114613259576002811461326c57613274565b603d6001830353603d6002830353613274565b603d60018303535b509195945050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f6565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133ab848484612f2a565b6133b7848484846134bd565b6129315760405162461bcd60e51b81526004016109f690614359565b60606000600d83600e85600f876040516020016133f596959493929190614071565b60408051601f198184030181529190529392505050565b60006001600160e01b031982166380ac58cd60e01b148061343d57506001600160e01b03198216635b5e139f60e01b145b806108c257506301ffc9a760e01b6001600160e01b03198316146108c2565b61346683836135c7565b61347360008484846134bd565b610a975760405162461bcd60e51b81526004016109f690614359565b61349a838383613715565b601154811015610a97576000908152601060205260409020426001909101555050565b60006001600160a01b0384163b156135bf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613501903390899088908890600401614309565b602060405180830381600087803b15801561351b57600080fd5b505af192505050801561354b575060408051601f3d908101601f1916820190925261354891810190613c69565b60015b6135a5573d808015613579576040519150601f19603f3d011682016040523d82523d6000602084013e61357e565b606091505b50805161359d5760405162461bcd60e51b81526004016109f690614359565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611885565b506001611885565b6001600160a01b03821661361d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f6565b6000818152600260205260409020546001600160a01b0316156136825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f6565b61368e6000838361348f565b6001600160a01b03821660009081526003602052604081208054600192906136b7908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137705761376b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613793565b816001600160a01b0316836001600160a01b0316146137935761379383826137cd565b6001600160a01b0382166137aa57610a978161386a565b826001600160a01b0316826001600160a01b031614610a9757610a978282613919565b600060016137da84611aec565b6137e4919061449d565b600083815260076020526040902054909150808214613837576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061387c9060019061449d565b600083815260096020526040812054600880549394509092849081106138a4576138a461458c565b9060005260206000200154905080600883815481106138c5576138c561458c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138fd576138fd614576565b6001900381819060005260206000200160009055905550505050565b600061392483611aec565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613969906144e0565b90600052602060002090601f01602090048101928261398b57600085556139d1565b82601f106139a457805160ff19168380011785556139d1565b828001600101855582156139d1579182015b828111156139d15782518255916020019190600101906139b6565b506139dd9291506139e1565b5090565b5b808211156139dd57600081556001016139e2565b6000613a09613a048461442a565b6143f9565b9050828152838383011115613a1d57600080fd5b828260208301376000602084830101529392505050565b80358015158114613a4457600080fd5b919050565b803560ff81168114613a4457600080fd5b600060208284031215613a6c57600080fd5b8135613a77816145b8565b9392505050565b60008060408385031215613a9157600080fd5b8235613a9c816145b8565b91506020830135613aac816145b8565b809150509250929050565b600080600060608486031215613acc57600080fd5b8335613ad7816145b8565b92506020840135613ae7816145b8565b929592945050506040919091013590565b60008060008060808587031215613b0e57600080fd5b8435613b19816145b8565b93506020850135613b29816145b8565b925060408501359150606085013567ffffffffffffffff811115613b4c57600080fd5b8501601f81018713613b5d57600080fd5b613b6c878235602084016139f6565b91505092959194509250565b60008060408385031215613b8b57600080fd5b8235613b96816145b8565b9150613ba460208401613a34565b90509250929050565b60008060408385031215613bc057600080fd5b8235613bcb816145b8565b946020939093013593505050565b600080600060608486031215613bee57600080fd5b8335613bf9816145b8565b95602085013595506040909401359392505050565b600080600060608486031215613c2357600080fd5b8335613c2e816145b8565b925060208401359150613c4360408501613a49565b90509250925092565b600060208284031215613c5e57600080fd5b8135613a77816145cd565b600060208284031215613c7b57600080fd5b8151613a77816145cd565b600060208284031215613c9857600080fd5b813567ffffffffffffffff811115613caf57600080fd5b8201601f81018413613cc057600080fd5b611885848235602084016139f6565b600060208284031215613ce157600080fd5b815167ffffffffffffffff811115613cf857600080fd5b8201601f81018413613d0957600080fd5b8051613d17613a048261442a565b818152856020838501011115613d2c57600080fd5b611a378260208301602086016144b4565b600060208284031215613d4f57600080fd5b5035919050565b60008060408385031215613d6957600080fd5b82359150613ba460208401613a34565b60008060008060808587031215613d8f57600080fd5b84359350613d9f60208601613a34565b9250613dad60408601613a49565b9150613dbb60608601613a49565b905092959194509250565b60008060408385031215613dd957600080fd5b82359150613ba460208401613a49565b60008151808452613e018160208601602086016144b4565b601f01601f19169290920160200192915050565b60008151613e278185602086016144b4565b9290920192915050565b8054600090600181811c9080831680613e4b57607f831692505b6020808410821415613e6d57634e487b7160e01b600052602260045260246000fd5b818015613e815760018114613e9257613ebf565b60ff19861689528489019650613ebf565b60008881526020902060005b86811015613eb75781548b820152908501908301613e9e565b505084890196505b50505050505092915050565b7f5b7b2274726169745f74797065223a2254797065222c2276616c7565223a2200815260008751613f0381601f850160208c016144b4565b7f227d2c7b2274726169745f74797065223a224647222c2276616c7565223a2200601f918401918201528751613f4081603e840160208c016144b4565b7f227d2c7b2274726169745f74797065223a224247222c2276616c7565223a2200603e92909101918201528651613f7e81605d840160208b016144b4565b7f227d2c207b2274726169745f74797065223a2243686172736574222c2276616c605d9290910191820152643ab2911d1160d91b607d8201528551613fca816082840160208a016144b4565b61406361405461404e6140196140136082868801017f227d2c7b2274726169745f74797065223a224d6f646573222c2276616c7565228152611d1160f11b602082015260220190565b8a613e15565b7f227d2c207b2274726169745f74797065223a225061746368222c2276616c7565815262111d1160e91b602082015260230190565b87613e15565b62227d5d60e81b815260030190565b9a9950505050505050505050565b681134b6b0b3b2911d1160b91b8152600061408f6009830189613e31565b875161409f818360208c016144b4565b7f2e706e67222c22616e696d6174696f6e5f75726c223a2200000000000000000091019081526140d26017820188613e31565b905085516140e4818360208a016144b4565b7111161132bc3a32b93730b62fbab936111d1160711b910190815261410c6012820186613e31565b9050835161411e8183602088016144b4565b601160f91b910190815260010198975050505050505050565b6f03d913730b6b2911d1137b930b0b732160851b81528551600090614163816010850160208b016144b4565b701116113232b9b1b934b83a34b7b7111d1160791b60109184019182015261418e6021820188613e31565b61088b60f21b815286519091506141ac816002840160208a016144b4565b6d161130ba3a3934b13aba32b9911d60911b6002929091019182015284516141db8160108401602089016144b4565b7f2c22707267223a22646174613a6170706c69636174696f6e2f782d6336342d70601092909101918201526d1c9bd9dc985b4ed8985cd94d8d0b60921b6030820152835161423081603e8401602088016144b4565b614247603e8284010161227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161428c81601d8501602087016144b4565b91909101601d0192915050565b6802932b8903a34b6b2960bd1b8152600082516142bd8160098501602087016144b4565b9190910160090192915050565b8381526bffffffffffffffffffffffff198360601b166020820152600082516142fa8160348501602087016144b4565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061433c90830184613de9565b9695505050505050565b602081526000613a776020830184613de9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614422576144226145a2565b604052919050565b600067ffffffffffffffff821115614444576144446145a2565b50601f01601f191660200190565b600082198211156144655761446561454a565b500190565b60008261447957614479614560565b500490565b60008160001904831182151516156144985761449861454a565b500290565b6000828210156144af576144af61454a565b500390565b60005b838110156144cf5781810151838201526020016144b7565b838111156129315750506000910152565b600181811c908216806144f457607f821691505b6020821081141561451557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561452f5761452f61454a565b5060010190565b60008261454557614545614560565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ae957600080fd5b6001600160e01b031981168114611ae957600080fdfe4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef60000000000000000c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a2433393621304c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e06001080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a00101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080a264697066735822122006731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac64736f6c63430008070033323034382062797465206f6e20636861696e2050524720666f722074686520436f6d6d6f646f7265203634

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636cfa24cc1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107ce578063f0f49ef514610817578063f2fde38b14610837578063f4a0a52814610857578063f8654e8214610877578063fd7cbad61461089757600080fd5b8063b88d4fde1461070e578063bdcf2f0e1461072e578063c87b56dd1461074e578063d18434151461076e578063d71a7a301461078e578063e34cb05d146107ae57600080fd5b80638da5cb5b116101135780638da5cb5b1461065b57806390c3f38f1461067957806395d89b4114610699578063a22cb465146106ae578063a2c6e888146106ce578063aa28d67d146106ee57600080fd5b80636cfa24cc146105a65780636f790d2c146105c657806370a08231146105e6578063715018a6146106065780637ec1d1b11461061b57806382fc31471461063b57600080fd5b80633f109376116101fe5780636352211e116101b75780636352211e146104c557806367da849d146104e55780636817c76c14610505578063698f87be1461051b5780636a37d7d31461053b5780636be636691461056d57600080fd5b80633f1093761461040557806340bb4abb1461042557806342842e0e1461044557806342bbf40a146104655780634f6ccce7146104855780636071862d146104a557600080fd5b80631f4f5a23116102505780631f4f5a231461035d5780632004ffd91461037d57806321af8ed91461038557806323b872dd146103a55780632e1a7d4d146103c55780632f745c59146103e557600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613c4c565b6108b7565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c8565b6040516102b99190614346565b3480156102f057600080fd5b506103046102ff366004613d3d565b61095a565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004613bad565b610981565b005b34801561034a57600080fd5b506008545b6040519081526020016102b9565b34801561036957600080fd5b506102d7610378366004613d3d565b610a9c565b61034f610c3a565b34801561039157600080fd5b5061033c6103a0366004613dc6565b610d78565b3480156103b157600080fd5b5061033c6103c0366004613ab7565b610e0a565b3480156103d157600080fd5b5061033c6103e0366004613d3d565b610e3b565b3480156103f157600080fd5b5061034f610400366004613bad565b610eaa565b34801561041157600080fd5b5061034f610420366004613d3d565b610f40565b34801561043157600080fd5b506102d7610440366004613d79565b610f67565b34801561045157600080fd5b5061033c610460366004613ab7565b61188d565b34801561047157600080fd5b5061033c610480366004613bad565b6118a8565b34801561049157600080fd5b5061034f6104a0366004613d3d565b611906565b3480156104b157600080fd5b506102ad6104c0366004613d3d565b611999565b3480156104d157600080fd5b506103046104e0366004613d3d565b6119c1565b3480156104f157600080fd5b506102d7610500366004613d79565b611a21565b34801561051157600080fd5b5061034f600c5481565b34801561052757600080fd5b50601254610304906001600160a01b031681565b34801561054757600080fd5b5061055b610556366004613d3d565b611a40565b60405160ff90911681526020016102b9565b34801561057957600080fd5b5061058d610588366004613d3d565b611a68565b60405167ffffffffffffffff90911681526020016102b9565b3480156105b257600080fd5b5061033c6105c1366004613c86565b611a90565b3480156105d257600080fd5b5061033c6105e1366004613d3d565b611aab565b3480156105f257600080fd5b5061034f610601366004613a5a565b611aec565b34801561061257600080fd5b5061033c611b72565b34801561062757600080fd5b506102d7610636366004613d79565b611b86565b34801561064757600080fd5b5061033c610656366004613a5a565b612848565b34801561066757600080fd5b50600a546001600160a01b0316610304565b34801561068557600080fd5b5061033c610694366004613c86565b612872565b3480156106a557600080fd5b506102d761288d565b3480156106ba57600080fd5b5061033c6106c9366004613b78565b61289c565b3480156106da57600080fd5b5061033c6106e9366004613c86565b6128a7565b3480156106fa57600080fd5b5061033c610709366004613dc6565b6128c2565b34801561071a57600080fd5b5061033c610729366004613af8565b6128ff565b34801561073a57600080fd5b5061033c610749366004613c0e565b612937565b34801561075a57600080fd5b506102d7610769366004613d3d565b6129f4565b34801561077a57600080fd5b506102d7610789366004613d56565b612b03565b34801561079a57600080fd5b5061033c6107a9366004613bd9565b612b37565b3480156107ba57600080fd5b5061033c6107c9366004613bad565b612bab565b3480156107da57600080fd5b506102ad6107e9366004613a7e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082357600080fd5b506102d7610832366004613d79565b612bc8565b34801561084357600080fd5b5061033c610852366004613a5a565b612bd9565b34801561086357600080fd5b5061033c610872366004613d3d565b612c4f565b34801561088357600080fd5b5061033c610892366004613c86565b612c5c565b3480156108a357600080fd5b5061033c6108b2366004613d3d565b612c77565b60006108c282612ca2565b92915050565b6060600080546108d7906144e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610903906144e0565b80156109505780601f1061092557610100808354040283529160200191610950565b820191906000526020600020905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b600061096582612cc7565b506000908152600460205260409020546001600160a01b031690565b600061098c826119c1565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a1b5750610a1b81336107e9565b610a8d5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109f6565b610a978383612d26565b505050565b6060610aa782611aab565b600082815260106020818152604080842054815180830190925260028252614e6f60f01b8284015293869052919052600882901c601f1691600160501b900460ff1615610b0a575060408051808201909152600381526259657360e81b60208201525b600084815260106020526040902054610b2590600716612d94565b610b7e6040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e068152508460ff1681518110610b7157610b7161458c565b016020015160f81c612d94565b610bcb6040518060400160405280602081526020017f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8152508560ff1681518110610b7157610b7161458c565b600087815260106020908152604090912054610bea911c601f16612d94565b600088815260106020526040902054610c0c90600160401b900460ff16612d94565b85604051602001610c2296959493929190613ecb565b60405160208183030381529060405292505050919050565b600061040060115410610c7b5760405162461bcd60e51b815260206004820152600960248201526826b4b73a1037bb32b960b91b60448201526064016109f6565b6010610c8633611aec565b10610cbe5760405162461bcd60e51b81526020600482015260086024820152672634b6b4ba10189b60c11b60448201526064016109f6565b600c54341015610cfd5760405162461bcd60e51b815260206004820152600a6024820152694d696e7420707269636560b01b60448201526064016109f6565b6011805460018101909155610d123382612e92565b4233610d1d83612d94565b604051602001610d2f939291906142ca565b60408051601f198184030181529181528151602092830120600084815260109093529120805467ffffffffffffffff191660c09290921c91909117815542600190910155919050565b610d8233836118a8565b60008281526010602052604090205460ff600160401b90910481169082161115610dd75760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b600091825260106020526040909120805460ff909216600160481b0269ff00000000000000000019909216919091179055565b610e143382612eac565b610e305760405162461bcd60e51b81526004016109f6906143ab565b610a97838383612f2a565b610e436130d1565b47811115610e795760405162461bcd60e51b8152602060048201526003602482015262105b5d60ea1b60448201526064016109f6565b604051339082156108fc029083906000818181858888f19350505050158015610ea6573d6000803e3d6000fd5b5050565b6000610eb583611aec565b8210610f175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109f6565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f4b82611aab565b6000828152601060205260409020600101546108c2904261449d565b6060610f7285611aab565b600085815260106020526040902054600160501b900460ff16610fc05760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b6000610fce86868686611b86565b905060005b6101c981101561104a576040518061020001604052806101c981526020016145e46101c99139818151811061100a5761100a61458c565b602001015160f81c60f81b8282610548018151811061102b5761102b61458c565b60200101906001600160f81b031916908160001a905350600101610fd3565b60008781526010602052604090205460011c6003908116141561109857600f60f81b826106ce815181106110805761108061458c565b60200101906001600160f81b031916908160001a9053505b8561118e57600360fa1b826106ce815181106110b6576110b661458c565b60200101906001600160f81b031916908160001a905350600560f91b8261066d815181106110e6576110e661458c565b60200101906001600160f81b031916908160001a905350600160fb1b82610675815181106111165761111661458c565b60200101906001600160f81b031916908160001a905350600360fa1b82610676815181106111465761114661458c565b60200101906001600160f81b031916908160001a905350600560f91b82610677815181106111765761117661458c565b60200101906001600160f81b031916908160001a9053505b60008781526010602052604090205460021c600716600381111561132b5760ee60f81b8361035e815181106111c5576111c561458c565b60200101906001600160f81b031916908160001a90535060d060f81b83610360815181106111f5576111f561458c565b60200101906001600160f81b031916908160001a90535080600414156112995760d060f81b8361054d8151811061122e5761122e61458c565b60200101906001600160f81b031916908160001a90535050600087815260106020526040902054825160079190911c600216906016820160f81b90849061035f90811061127d5761127d61458c565b60200101906001600160f81b031916908160001a905350611541565b80600514156112bb57602160f81b8361035f8151811061127d5761127d61458c565b806006141561130d57602060f81b83610360815181106112dd576112dd61458c565b60200101906001600160f81b031916908160001a905350600060f81b8361035f8151811061127d5761127d61458c565b601660f81b8361035f8151811061127d5761127d61458c565b611541565b806003141561137d5760a560f81b836103308151811061134d5761134d61458c565b60200101906001600160f81b031916908160001a905350607060f81b836103318151811061127d5761127d61458c565b80600214156113bc57600088815260106020526040902054835160f89190911b6001600160f81b03191690849061034790811061127d5761127d61458c565b80600114156114e05760008881526010602052604090205460061c60011661145f57600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061141c5761141c61458c565b602001015160f81c60f81b83836102f3018151811061143d5761143d61458c565b60200101906001600160f81b031916908160001a9053506001909101906113e3565b600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061149d5761149d61458c565b602001015160f81c60f81b838361033a01815181106114be576114be61458c565b60200101906001600160f81b031916908160001a905350600190910190611464565b60a460f81b836102ff815181106114f9576114f961458c565b60200101906001600160f81b031916908160001a905350608160f81b83610300815181106115295761152961458c565b60200101906001600160f81b031916908160001a9053505b60008881526010602052604090205460be60089190911c60ff1611156115c057608a60f81b836055815181106115795761157961458c565b60200101906001600160f81b031916908160001a90535060ea60f81b836056815181106115a8576115a861458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054603c600e9190911c60ff1611156116ee57600091505b600d821015611668576040518060400160405280600d81526020016c018ad18d06902290e09e08d18d609c1b81525082815181106116255761162561458c565b602001015160f81c60f81b83836102c201815181106116465761164661458c565b60200101906001600160f81b031916908160001a9053506001909101906115e5565b600091505b60068210156116e95760405180604001604052806006815260200165054f4468c68360d51b81525082815181106116a6576116a661458c565b602001015160f81c60f81b83836102b701815181106116c7576116c761458c565b60200101906001600160f81b031916908160001a90535060019091019061166d565b61174f565b60ea60f81b83610304815181106117075761170761458c565b60200101906001600160f81b031916908160001a90535060ea60f81b83610305815181106117375761173761458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054607f60169190911c60ff1611156117f757600091505b60088210156117f25760405180604001604052806008815260200167103e851480c8a87560c11b81525082815181106117af576117af61458c565b602001015160f81c60f81b83836102a001815181106117d0576117d061458c565b60200101906001600160f81b031916908160001a905350600190910190611774565b61187f565b600091505b600d82101561187f576040518060400160405280600d81526020016c0103e85468010103e854682103609d1b815250828151811061183c5761183c61458c565b602001015160f81c60f81b838361028c018151811061185d5761185d61458c565b60200101906001600160f81b031916908160001a9053506001909101906117fc565b50909150505b949350505050565b610a97838383604051806020016040528060008152506128ff565b6118b181611aab565b816001600160a01b03166118c4826119c1565b6001600160a01b031614610ea65760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016109f6565b600061191160085490565b82106119745760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109f6565b600882815481106119875761198761458c565b90600052602060002001549050919050565b60006119a482611aab565b50600090815260106020526040902054600160501b900460ff1690565b6000818152600260205260408120546001600160a01b0316806108c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b6060611a37611a3286868686610f67565b61312b565b95945050505050565b6000611a4b82611aab565b50600090815260106020526040902054600160401b900460ff1690565b6000611a7382611aab565b5060009081526010602052604090205467ffffffffffffffff1690565b611a986130d1565b8051610ea690600d90602084019061395d565b6011548110611ae95760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a59081a5960b21b60448201526064016109f6565b50565b60006001600160a01b038216611b565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109f6565b506001600160a01b031660009081526003602052604090205490565b611b7a6130d1565b611b84600061327f565b565b6060611b9185611aab565b60006040518061082001604052806108008152602001614e9a61080091396000878152601060205260408120549192509081906007168015801590611bd65750600481105b15611c6657600181036038029150600092505b6038831015611c61576040518060e0016040528060a88152602001614df260a8913982840181518110611c1e57611c1e61458c565b602001015160f81c60f81b84846107c80181518110611c3f57611c3f61458c565b60200101906001600160f81b031916908160001a905350600190920191611be9565b611cf8565b6003811115611cf8576004810360ef029150600092505b60ef831015611cf857604051806103e001604052806103bc81526020016147ad6103bc913982840181518110611cb557611cb561458c565b602001015160f81c60f81b84846107110181518110611cd657611cd661458c565b60200101906001600160f81b031916908160001a905350600190920191611c7d565b6003811115611de357600092505b6101c9831015611d80576040518061020001604052806101c98152602001614c296101c991398381518110611d3d57611d3d61458c565b602001015160f81c60f81b84846105480181518110611d5e57611d5e61458c565b60200101906001600160f81b031916908160001a905350600190920191611d06565b601060f81b8460a581518110611d9857611d9861458c565b60200101906001600160f81b031916908160001a905350600f60f81b8460a681518110611dc757611dc761458c565b60200101906001600160f81b031916908160001a905350611e2e565b60008981526010602052604090205460031c60011615611e2e57600560f91b8461065181518110611e1657611e1661458c565b60200101906001600160f81b031916908160001a9053505b60ff871615611e67578660f81b8461018a81518110611e4f57611e4f61458c565b60200101906001600160f81b031916908160001a9053505b60ff861615611ea0578560f81b8461018681518110611e8857611e8861458c565b60200101906001600160f81b031916908160001a9053505b6000898152601060208190526040909120549081901c600716601890810293501c600f16886121a957600093506054015b6004841015611faf576040518060400160405280600481526020016218060360e11b8152508481518110611f0757611f0761458c565b602001015160f81c60f81b85856104a90181518110611f2857611f2861458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280600481526020016206060360e11b8152508481518110611f6c57611f6c61458c565b602001015160f81c60f81b85856104ad0181518110611f8d57611f8d61458c565b60200101906001600160f81b031916908160001a905350600190930192611ed1565b60048210156121a957600093505b60048410156120385760405180604001604052806005815260200164181818018360db1b8152508481518110611ff557611ff561458c565b602001015160f81c60f81b858561064d01815181106120165761201661458c565b60200101906001600160f81b031916908160001a905350600190930192611fbd565b60008a81526010602052604090205460031c6001161561208757600360fa1b856106518151811061206b5761206b61458c565b60200101906001600160f81b031916908160001a9053506120b8565b600360fb1b85610651815181106120a0576120a061458c565b60200101906001600160f81b031916908160001a9053505b600160fa1b85610696815181106120d1576120d161458c565b60200101906001600160f81b031916908160001a905350605f60f81b8561057f815181106121015761210161458c565b60200101906001600160f81b031916908160001a905350600360fc1b856106ae815181106121315761213161458c565b60200101906001600160f81b031916908160001a905350600360fc1b8561075d815181106121615761216161458c565b60200101906001600160f81b031916908160001a905350600960fc1b85610763815181106121915761219161458c565b60200101906001600160f81b031916908160001a9053505b600093505b60188410156122c757806040518060e0016040528060c08152602001614b6960c09139848601815181106121e4576121e461458c565b602001015160f81c60f81b60f81c60ff160191506040518060e0016040528060a881526020016156da60a8913982815181106122225761222261458c565b602001015160f81c60f81b858561051801815181106122435761224361458c565b60200101906001600160f81b031916908160001a9053506040518060e0016040528060a8815260200161578260a8913982815181106122845761228461458c565b602001015160f81c60f81b858561053001815181106122a5576122a561458c565b60200101906001600160f81b031916908160001a9053506001909301926121ae565b60008a8152601060209081526040918290205482518084019093528183527f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8383015260081c601f169350839081106123225761232261458c565b602001015160f81c60f81b8561017e815181106123415761234161458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06815250828151811061239e5761239e61458c565b602001015160f81c60f81b856056815181106123bc576123bc61458c565b60200101906001600160f81b031916908160001a90535060008a815260106020908152604090912054901c601f1660380292506106c883101561247957600093505b6038841015612479576040518061070001604052806106c8815260200161582a6106c89139848401815181106124365761243661458c565b602001015160f81c60f81b85856104c001815181106124575761245761458c565b60200101906001600160f81b031916908160001a9053506001909301926123fe565b60008a8152601060205260409020548551602882901c60ff16935060d09190911b6001600160f81b0319169086906104a89081106124b9576124b961458c565b60200101906001600160f81b031916908160001a90535060008a8152601060208181526040928390205483518085019094528284526f1d2b2d4d5f63656971878da9c3cfe7f560801b9184019190915260301c600f169350839081106125215761252161458c565b602001015160f81c60f81b85610287815181106125405761254061458c565b60200101906001600160f81b031916908160001a90535060008a81526010602052604081205490945067ffffffffffffffff60389190911c6007166003021691505b6003841015612617576040518060400160405280601881526020017f08000014000a14005014281478785050505060500a0204080000000000000000815250828501815181106125d4576125d461458c565b602001015160f81c60f81b85856104b101815181106125f5576125f561458c565b60200101906001600160f81b031916908160001a905350600190930192612582565b60008a81526010602052604081205490945067ffffffffffffffff603b9190911c6003166004021691505b60048410156126ca576040518060400160405280601081526020016f01900000a0a00000f0500000a100000160851b815250828501815181106126875761268761458c565b602001015160f81c60f81b85856104bc01815181106126a8576126a861458c565b60200101906001600160f81b031916908160001a905350600190930192612642565b60008a8152601060205260408120549094506004603d9190911c6001160267ffffffffffffffff1691505b60048410156127745760405180604001604052806008815260200166f502828192828560c51b815250828501815181106127315761273161458c565b602001015160f81c60f81b85856104b801815181106127525761275261458c565b60200101906001600160f81b031916908160001a9053506001909301926126f5565b601060008b815260200190815260200160002060000160089054906101000a900460ff1660010160f81b856101c6815181106127b2576127b261458c565b60200101906001600160f81b031916908160001a90535060008a815260106020526040902054600160481b900460ff161561283a5760008a8152601060205260409020548551600160481b90910460f81b6001600160f81b03191690869061010e9081106128225761282261458c565b60200101906001600160f81b031916908160001a9053505b509298975050505050505050565b6128506130d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61287a6130d1565b8051610ea690600b90602084019061395d565b6060600180546108d7906144e0565b610ea63383836132d1565b6128af6130d1565b8051610ea690600e90602084019061395d565b6128cd338383612937565b600091825260106020526040909120805460ff909216600160401b0268ff000000000000000019909216919091179055565b6129093383612eac565b6129255760405162461bcd60e51b81526004016109f6906143ab565b612931848484846133a0565b50505050565b60048160ff16106129745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016109f6565b6000604051806080016040528060008152602001620151806008612998919061447e565b81526020016129ab62015180601061447e565b81526020016201518060206129c0919061447e565b9052905060008160ff8416600481106129db576129db61458c565b602002015190506129ed858583612b37565b5050505050565b60606129ff82611aab565b6012546001600160a01b031615612a965760125460405163e9dc637560e01b8152306004820152602481018490526001600160a01b039091169063e9dc63759060440160006040518083038186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c29190810190613ccf565b6000612aa183612d94565b90506000612af082600b612ab4856133d3565b612abd88610a9c565b612ac8896000612b03565b604051602001612adc959493929190614137565b60405160208183030381529060405261312b565b905080604051602001610c229190614254565b6060612b0e83611aab565b8115612b2957612b22836001600080611a21565b90506108c2565b612b22836001600080612bc8565b612b4183836118a8565b6000612b4c82612d94565b604051602001612b5c9190614299565b60408051601f198184030181529181526000858152601060205220600101549091508290612b8a904261449d565b101581906129ed5760405162461bcd60e51b81526004016109f69190614346565b6000612bbb62015180604061447e565b9050610a97838383612b37565b6060611a37611a3286868686611b86565b612be16130d1565b6001600160a01b038116612c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f6565b611ae98161327f565b612c576130d1565b600c55565b612c646130d1565b8051610ea690600f90602084019061395d565b612c813382612bab565b6000908152601060205260409020805460ff60501b1916600160501b179055565b60006001600160e01b0319821663780e9d6360e01b14806108c257506108c28261340c565b6000818152600260205260409020546001600160a01b0316611ae95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d5b826119c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081612db85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612de25780612dcc8161451b565b9150612ddb9050600a8361446a565b9150612dbc565b60008167ffffffffffffffff811115612dfd57612dfd6145a2565b6040519080825280601f01601f191660200182016040528015612e27576020820181803683370190505b5090505b841561188557612e3c60018361449d565b9150612e49600a86614536565b612e54906030614452565b60f81b818381518110612e6957612e6961458c565b60200101906001600160f81b031916908160001a905350612e8b600a8661446a565b9450612e2b565b610ea682826040518060200160405280600081525061345c565b600080612eb8836119c1565b9050806001600160a01b0316846001600160a01b03161480612eff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118855750836001600160a01b0316612f188461095a565b6001600160a01b031614949350505050565b826001600160a01b0316612f3d826119c1565b6001600160a01b031614612fa15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109f6565b6001600160a01b0382166130035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f6565b61300e83838361348f565b613019600082612d26565b6001600160a01b038316600090815260036020526040812080546001929061304290849061449d565b90915550506001600160a01b0382166000908152600360205260408120805460019290613070908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314611b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b606081516000141561314b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161569a604091399050600060038451600261317a9190614452565b613184919061446a565b61318f90600461447e565b67ffffffffffffffff8111156131a7576131a76145a2565b6040519080825280601f01601f1916602001820160405280156131d1576020820181803683370190505b509050600182016020820185865187015b8082101561323d576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506131e2565b5050600386510660018114613259576002811461326c57613274565b603d6001830353603d6002830353613274565b603d60018303535b509195945050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f6565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133ab848484612f2a565b6133b7848484846134bd565b6129315760405162461bcd60e51b81526004016109f690614359565b60606000600d83600e85600f876040516020016133f596959493929190614071565b60408051601f198184030181529190529392505050565b60006001600160e01b031982166380ac58cd60e01b148061343d57506001600160e01b03198216635b5e139f60e01b145b806108c257506301ffc9a760e01b6001600160e01b03198316146108c2565b61346683836135c7565b61347360008484846134bd565b610a975760405162461bcd60e51b81526004016109f690614359565b61349a838383613715565b601154811015610a97576000908152601060205260409020426001909101555050565b60006001600160a01b0384163b156135bf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613501903390899088908890600401614309565b602060405180830381600087803b15801561351b57600080fd5b505af192505050801561354b575060408051601f3d908101601f1916820190925261354891810190613c69565b60015b6135a5573d808015613579576040519150601f19603f3d011682016040523d82523d6000602084013e61357e565b606091505b50805161359d5760405162461bcd60e51b81526004016109f690614359565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611885565b506001611885565b6001600160a01b03821661361d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f6565b6000818152600260205260409020546001600160a01b0316156136825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f6565b61368e6000838361348f565b6001600160a01b03821660009081526003602052604081208054600192906136b7908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137705761376b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613793565b816001600160a01b0316836001600160a01b0316146137935761379383826137cd565b6001600160a01b0382166137aa57610a978161386a565b826001600160a01b0316826001600160a01b031614610a9757610a978282613919565b600060016137da84611aec565b6137e4919061449d565b600083815260076020526040902054909150808214613837576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061387c9060019061449d565b600083815260096020526040812054600880549394509092849081106138a4576138a461458c565b9060005260206000200154905080600883815481106138c5576138c561458c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138fd576138fd614576565b6001900381819060005260206000200160009055905550505050565b600061392483611aec565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613969906144e0565b90600052602060002090601f01602090048101928261398b57600085556139d1565b82601f106139a457805160ff19168380011785556139d1565b828001600101855582156139d1579182015b828111156139d15782518255916020019190600101906139b6565b506139dd9291506139e1565b5090565b5b808211156139dd57600081556001016139e2565b6000613a09613a048461442a565b6143f9565b9050828152838383011115613a1d57600080fd5b828260208301376000602084830101529392505050565b80358015158114613a4457600080fd5b919050565b803560ff81168114613a4457600080fd5b600060208284031215613a6c57600080fd5b8135613a77816145b8565b9392505050565b60008060408385031215613a9157600080fd5b8235613a9c816145b8565b91506020830135613aac816145b8565b809150509250929050565b600080600060608486031215613acc57600080fd5b8335613ad7816145b8565b92506020840135613ae7816145b8565b929592945050506040919091013590565b60008060008060808587031215613b0e57600080fd5b8435613b19816145b8565b93506020850135613b29816145b8565b925060408501359150606085013567ffffffffffffffff811115613b4c57600080fd5b8501601f81018713613b5d57600080fd5b613b6c878235602084016139f6565b91505092959194509250565b60008060408385031215613b8b57600080fd5b8235613b96816145b8565b9150613ba460208401613a34565b90509250929050565b60008060408385031215613bc057600080fd5b8235613bcb816145b8565b946020939093013593505050565b600080600060608486031215613bee57600080fd5b8335613bf9816145b8565b95602085013595506040909401359392505050565b600080600060608486031215613c2357600080fd5b8335613c2e816145b8565b925060208401359150613c4360408501613a49565b90509250925092565b600060208284031215613c5e57600080fd5b8135613a77816145cd565b600060208284031215613c7b57600080fd5b8151613a77816145cd565b600060208284031215613c9857600080fd5b813567ffffffffffffffff811115613caf57600080fd5b8201601f81018413613cc057600080fd5b611885848235602084016139f6565b600060208284031215613ce157600080fd5b815167ffffffffffffffff811115613cf857600080fd5b8201601f81018413613d0957600080fd5b8051613d17613a048261442a565b818152856020838501011115613d2c57600080fd5b611a378260208301602086016144b4565b600060208284031215613d4f57600080fd5b5035919050565b60008060408385031215613d6957600080fd5b82359150613ba460208401613a34565b60008060008060808587031215613d8f57600080fd5b84359350613d9f60208601613a34565b9250613dad60408601613a49565b9150613dbb60608601613a49565b905092959194509250565b60008060408385031215613dd957600080fd5b82359150613ba460208401613a49565b60008151808452613e018160208601602086016144b4565b601f01601f19169290920160200192915050565b60008151613e278185602086016144b4565b9290920192915050565b8054600090600181811c9080831680613e4b57607f831692505b6020808410821415613e6d57634e487b7160e01b600052602260045260246000fd5b818015613e815760018114613e9257613ebf565b60ff19861689528489019650613ebf565b60008881526020902060005b86811015613eb75781548b820152908501908301613e9e565b505084890196505b50505050505092915050565b7f5b7b2274726169745f74797065223a2254797065222c2276616c7565223a2200815260008751613f0381601f850160208c016144b4565b7f227d2c7b2274726169745f74797065223a224647222c2276616c7565223a2200601f918401918201528751613f4081603e840160208c016144b4565b7f227d2c7b2274726169745f74797065223a224247222c2276616c7565223a2200603e92909101918201528651613f7e81605d840160208b016144b4565b7f227d2c207b2274726169745f74797065223a2243686172736574222c2276616c605d9290910191820152643ab2911d1160d91b607d8201528551613fca816082840160208a016144b4565b61406361405461404e6140196140136082868801017f227d2c7b2274726169745f74797065223a224d6f646573222c2276616c7565228152611d1160f11b602082015260220190565b8a613e15565b7f227d2c207b2274726169745f74797065223a225061746368222c2276616c7565815262111d1160e91b602082015260230190565b87613e15565b62227d5d60e81b815260030190565b9a9950505050505050505050565b681134b6b0b3b2911d1160b91b8152600061408f6009830189613e31565b875161409f818360208c016144b4565b7f2e706e67222c22616e696d6174696f6e5f75726c223a2200000000000000000091019081526140d26017820188613e31565b905085516140e4818360208a016144b4565b7111161132bc3a32b93730b62fbab936111d1160711b910190815261410c6012820186613e31565b9050835161411e8183602088016144b4565b601160f91b910190815260010198975050505050505050565b6f03d913730b6b2911d1137b930b0b732160851b81528551600090614163816010850160208b016144b4565b701116113232b9b1b934b83a34b7b7111d1160791b60109184019182015261418e6021820188613e31565b61088b60f21b815286519091506141ac816002840160208a016144b4565b6d161130ba3a3934b13aba32b9911d60911b6002929091019182015284516141db8160108401602089016144b4565b7f2c22707267223a22646174613a6170706c69636174696f6e2f782d6336342d70601092909101918201526d1c9bd9dc985b4ed8985cd94d8d0b60921b6030820152835161423081603e8401602088016144b4565b614247603e8284010161227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161428c81601d8501602087016144b4565b91909101601d0192915050565b6802932b8903a34b6b2960bd1b8152600082516142bd8160098501602087016144b4565b9190910160090192915050565b8381526bffffffffffffffffffffffff198360601b166020820152600082516142fa8160348501602087016144b4565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061433c90830184613de9565b9695505050505050565b602081526000613a776020830184613de9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614422576144226145a2565b604052919050565b600067ffffffffffffffff821115614444576144446145a2565b50601f01601f191660200190565b600082198211156144655761446561454a565b500190565b60008261447957614479614560565b500490565b60008160001904831182151516156144985761449861454a565b500290565b6000828210156144af576144af61454a565b500390565b60005b838110156144cf5781810151838201526020016144b7565b838111156129315750506000910152565b600181811c908216806144f457607f821691505b6020821081141561451557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561452f5761452f61454a565b5060010190565b60008261454557614545614560565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ae957600080fd5b6001600160e01b031981168114611ae957600080fdfe4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef60000000000000000c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a2433393621304c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e06001080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a00101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080a264697066735822122006731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac64736f6c63430008070033

Deployed Bytecode Sourcemap

49847:36615:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81518:192;;;;;;;;;;-1:-1:-1;81518:192:0;;;;;:::i;:::-;;:::i;:::-;;;17285:14:1;;17278:22;17260:41;;17248:2;17233:18;81518:192:0;;;;;;;;29460:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30973:171::-;;;;;;;;;;-1:-1:-1;30973:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;16583:32:1;;;16565:51;;16553:2;16538:18;30973:171:0;16419:203:1;30490:417:0;;;;;;;;;;-1:-1:-1;30490:417:0;;;;;:::i;:::-;;:::i;:::-;;43372:113;;;;;;;;;;-1:-1:-1;43460:10:0;:17;43372:113;;;27028:25:1;;;27016:2;27001:18;43372:113:0;26882:177:1;69063:945:0;;;;;;;;;;-1:-1:-1;69063:945:0;;;;;:::i;:::-;;:::i;67174:616::-;;;:::i;81002:249::-;;;;;;;;;;-1:-1:-1;81002:249:0;;;;;:::i;:::-;;:::i;31673:336::-;;;;;;;;;;-1:-1:-1;31673:336:0;;;;;:::i;:::-;;:::i;82204:180::-;;;;;;;;;;-1:-1:-1;82204:180:0;;;;;:::i;:::-;;:::i;43040:256::-;;;;;;;;;;-1:-1:-1;43040:256:0;;;;;:::i;:::-;;:::i;70014:208::-;;;;;;;;;;-1:-1:-1;70014:208:0;;;;;:::i;:::-;;:::i;75981:3065::-;;;;;;;;;;-1:-1:-1;75981:3065:0;;;;;:::i;:::-;;:::i;32080:185::-;;;;;;;;;;-1:-1:-1;32080:185:0;;;;;:::i;:::-;;:::i;79387:183::-;;;;;;;;;;-1:-1:-1;79387:183:0;;;;;:::i;:::-;;:::i;43562:233::-;;;;;;;;;;-1:-1:-1;43562:233:0;;;;;:::i;:::-;;:::i;70642:213::-;;;;;;;;;;-1:-1:-1;70642:213:0;;;;;:::i;:::-;;:::i;29171:222::-;;;;;;;;;;-1:-1:-1;29171:222:0;;;;;:::i;:::-;;:::i;75628:277::-;;;;;;;;;;-1:-1:-1;75628:277:0;;;;;:::i;:::-;;:::i;50171:35::-;;;;;;;;;;;;;;;;66998:34;;;;;;;;;;-1:-1:-1;66998:34:0;;;;-1:-1:-1;;;;;66998:34:0;;;70436:200;;;;;;;;;;-1:-1:-1;70436:200:0;;;;;:::i;:::-;;:::i;:::-;;;27441:4:1;27429:17;;;27411:36;;27399:2;27384:18;70436:200:0;27269:184:1;70228:202:0;;;;;;;;;;-1:-1:-1;70228:202:0;;;;;:::i;:::-;;:::i;:::-;;;27238:18:1;27226:31;;;27208:50;;27196:2;27181:18;70228:202:0;27064:200:1;82390:153:0;;;;;;;;;;-1:-1:-1;82390:153:0;;;;;:::i;:::-;;:::i;79188:127::-;;;;;;;;;;-1:-1:-1;79188:127:0;;;;;:::i;:::-;;:::i;28902:207::-;;;;;;;;;;-1:-1:-1;28902:207:0;;;;;:::i;:::-;;:::i;7941:103::-;;;;;;;;;;;;;:::i;71486:4052::-;;;;;;;;;;-1:-1:-1;71486:4052:0;;;;;:::i;:::-;;:::i;82975:128::-;;;;;;;;;;-1:-1:-1;82975:128:0;;;;;:::i;:::-;;:::i;7293:87::-;;;;;;;;;;-1:-1:-1;7366:6:0;;-1:-1:-1;;;;;7366:6:0;7293:87;;82853:116;;;;;;;;;;-1:-1:-1;82853:116:0;;;;;:::i;:::-;;:::i;29629:104::-;;;;;;;;;;;;;:::i;31216:155::-;;;;;;;;;;-1:-1:-1;31216:155:0;;;;;:::i;:::-;;:::i;82549:162::-;;;;;;;;;;-1:-1:-1;82549:162:0;;;;;:::i;:::-;;:::i;80786:169::-;;;;;;;;;;-1:-1:-1;80786:169:0;;;;;:::i;:::-;;:::i;32336:323::-;;;;;;;;;;-1:-1:-1;32336:323:0;;;;;:::i;:::-;;:::i;80050:337::-;;;;;;;;;;-1:-1:-1;80050:337:0;;;;;:::i;:::-;;:::i;67872:790::-;;;;;;;;;;-1:-1:-1;67872:790:0;;;;;:::i;:::-;;:::i;70861:350::-;;;;;;;;;;-1:-1:-1;70861:350:0;;;;;:::i;:::-;;:::i;79658:348::-;;;;;;;;;;-1:-1:-1;79658:348:0;;;;;:::i;:::-;;:::i;80465:196::-;;;;;;;;;;-1:-1:-1;80465:196:0;;;;;:::i;:::-;;:::i;31442:164::-;;;;;;;;;;-1:-1:-1;31442:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31563:25:0;;;31539:4;31563:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31442:164;71217:263;;;;;;;;;;-1:-1:-1;71217:263:0;;;;;:::i;:::-;;:::i;8199:201::-;;;;;;;;;;-1:-1:-1;8199:201:0;;;;;:::i;:::-;;:::i;82091:107::-;;;;;;;;;;-1:-1:-1;82091:107:0;;;;;:::i;:::-;;:::i;82717:130::-;;;;;;;;;;-1:-1:-1;82717:130:0;;;;;:::i;:::-;;:::i;81280:156::-;;;;;;;;;;-1:-1:-1;81280:156:0;;;;;:::i;:::-;;:::i;81518:192::-;81641:4;81666:38;81691:11;81666:23;:38::i;:::-;81659:45;81518:192;-1:-1:-1;;81518:192:0:o;29460:100::-;29514:13;29547:5;29540:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29460:100;:::o;30973:171::-;31049:7;31069:23;31084:7;31069:14;:23::i;:::-;-1:-1:-1;31112:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31112:24:0;;30973:171::o;30490:417::-;30571:13;30587:23;30602:7;30587:14;:23::i;:::-;30571:39;;30635:5;-1:-1:-1;;;;;30629:11:0;:2;-1:-1:-1;;;;;30629:11:0;;;30621:57;;;;-1:-1:-1;;;30621:57:0;;24846:2:1;30621:57:0;;;24828:21:1;24885:2;24865:18;;;24858:30;24924:34;24904:18;;;24897:62;-1:-1:-1;;;24975:18:1;;;24968:31;25016:19;;30621:57:0;;;;;;;;;5918:10;-1:-1:-1;;;;;30713:21:0;;;;:62;;-1:-1:-1;30738:37:0;30755:5;5918:10;31442:164;:::i;30738:37::-;30691:174;;;;-1:-1:-1;;;30691:174:0;;22670:2:1;30691:174:0;;;22652:21:1;22709:2;22689:18;;;22682:30;22748:34;22728:18;;;22721:62;22819:32;22799:18;;;22792:60;22869:19;;30691:174:0;22468:426:1;30691:174:0;30878:21;30887:2;30891:7;30878:8;:21::i;:::-;30560:347;30490:417;;:::o;69063:945::-;69177:13;69203:21;69216:7;69203:12;:21::i;:::-;69233:11;69254:18;;;:9;:18;;;;;;;;:25;69302:26;;;;;;;;;;;-1:-1:-1;;;69302:26:0;;;;69338:18;;;;;;;69283:1;69254:30;;;69288:4;69253:39;;-1:-1:-1;;;69338:32:0;;;;69335:67;;;-1:-1:-1;69381:13:0;;;;;;;;;;;;-1:-1:-1;;;69381:13:0;;;;69335:67;69511:18;;;;:9;:18;;;;;:25;69494:48;;69539:1;69511:29;69494:16;:48::i;:::-;69589:40;69612:8;;;;;;;;;;;;;;;;;69621:5;69612:15;;;;;;;;;;:::i;:::-;;;;;;;69589:16;:40::i;:::-;69676;69699:8;;;;;;;;;;;;;;;;;69708:5;69699:15;;;;;;;;;;:::i;69676:40::-;69787:18;;;;:9;69816:2;69787:18;;;;;;;:25;69769:58;;69787:31;69822:4;69786:40;69769:16;:58::i;:::-;69894:18;;;;:9;:18;;;;;:24;69877:42;;-1:-1:-1;;;69894:24:0;;;;69877:16;:42::i;:::-;69973:5;69432:569;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69410:592;;;;69063:945;;;:::o;67174:616::-;67234:7;50160:4;67262:15;;:35;67253:58;;;;-1:-1:-1;;;67253:58:0;;21923:2:1;67253:58:0;;;21905:21:1;21962:1;21942:18;;;21935:29;-1:-1:-1;;;21980:18:1;;;21973:39;22029:18;;67253:58:0;21721:332:1;67253:58:0;67353:2;67329:21;67339:10;67329:9;:21::i;:::-;:26;67320:48;;;;-1:-1:-1;;;67320:48:0;;25585:2:1;67320:48:0;;;25567:21:1;25624:1;25604:18;;;25597:29;-1:-1:-1;;;25642:18:1;;;25635:38;25690:18;;67320:48:0;25383:331:1;67320:48:0;67397:9;;67384;:22;;67375:46;;;;-1:-1:-1;;;67375:46:0;;24154:2:1;67375:46:0;;;24136:21:1;24193:2;24173:18;;;24166:30;-1:-1:-1;;;24212:18:1;;;24205:40;24262:18;;67375:46:0;23952:334:1;67375:46:0;67448:15;;;67527:1;67509:19;;67491:37;;;67544:30;67554:10;67448:15;67544:9;:30::i;:::-;67652:15;67669:10;67681:18;:7;:16;:18::i;:::-;67635:65;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67635:65:0;;;;;;;;;67625:76;;67635:65;67625:76;;;;67583:18;;;;:9;:18;;;;;:120;;-1:-1:-1;;67583:120:0;67611:92;;;;;67583:120;;;;;;67746:15;67583:120;67712:31;;;:49;67593:7;67174:616;-1:-1:-1;67174:616:0:o;81002:249::-;81086:38;81104:10;81116:7;81086:17;:38::i;:::-;81157:18;;;;:9;:18;;;;;:24;;-1:-1:-1;;;81157:24:0;;;;;81142:39;;;;;81133:59;;;;-1:-1:-1;;;81133:59:0;;18490:2:1;81133:59:0;;;18472:21:1;18529:1;18509:18;;;18502:29;-1:-1:-1;;;18547:18:1;;;18540:36;18593:18;;81133:59:0;18288:329:1;81133:59:0;81201:18;;;;:9;:18;;;;;;:44;;;;;;-1:-1:-1;;;81201:44:0;-1:-1:-1;;81201:44:0;;;;;;;;;81002:249::o;31673:336::-;31868:41;5918:10;31901:7;31868:18;:41::i;:::-;31860:100;;;;-1:-1:-1;;;31860:100:0;;;;;;;:::i;:::-;31973:28;31983:4;31989:2;31993:7;31973:9;:28::i;82204:180::-;7179:13;:11;:13::i;:::-;82304:21:::1;82294:6;:31;;82285:48;;;::::0;-1:-1:-1;;;82285:48:0;;23462:2:1;82285:48:0::1;::::0;::::1;23444:21:1::0;23501:1;23481:18;;;23474:29;-1:-1:-1;;;23519:18:1;;;23512:33;23562:18;;82285:48:0::1;23260:326:1::0;82285:48:0::1;82342:36;::::0;82350:10:::1;::::0;82342:36;::::1;;;::::0;82371:6;;82342:36:::1;::::0;;;82371:6;82350:10;82342:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;82204:180:::0;:::o;43040:256::-;43137:7;43173:23;43190:5;43173:16;:23::i;:::-;43165:5;:31;43157:87;;;;-1:-1:-1;;;43157:87:0;;18824:2:1;43157:87:0;;;18806:21:1;18863:2;18843:18;;;18836:30;18902:34;18882:18;;;18875:62;-1:-1:-1;;;18953:18:1;;;18946:41;19004:19;;43157:87:0;18622:407:1;43157:87:0;-1:-1:-1;;;;;;43262:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43040:256::o;70014:208::-;70111:7;70130:21;70143:7;70130:12;:21::i;:::-;70185:18;;;;:9;:18;;;;;:31;;;70167:49;;:15;:49;:::i;75981:3065::-;76157:12;76181:23;76195:7;76181:12;:23::i;:::-;76222:18;;;;:9;:18;;;;;:32;-1:-1:-1;;;76222:32:0;;;;76213:52;;;;-1:-1:-1;;;76213:52:0;;18490:2:1;76213:52:0;;;18472:21:1;18529:1;18509:18;;;18502:29;-1:-1:-1;;;18547:18:1;;;18540:36;18593:18;;76213:52:0;18288:329:1;76213:52:0;76278:21;76302:67;76314:7;76323:3;76328:22;76352:16;76302:11;:67::i;:::-;76278:91;;76378:9;76445:102;58373:3;76457:1;:18;76445:102;;;76526:8;;;;;;;;;;;;;;;;;76535:1;76526:11;;;;;;;;:::i;:::-;;;;;;;;;76493:8;76521:1;58414:5;76502:20;76493:30;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;76493:44:0;;;;;;;;-1:-1:-1;76477:3:0;;76445:102;;;76568:18;;;;:9;:18;;;;;:25;76597:1;76568:30;76602:1;76567:36;;;76561:48;76557:100;;;-1:-1:-1;;;76622:8:0;76631:5;76622:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76622:25:0;;;;;;;;;76557:100;76672:3;76667:200;;-1:-1:-1;;;76688:8:0;76697:5;76688:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76688:25:0;;;;;;;;;-1:-1:-1;;;76724:8:0;76733:5;76724:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76724:25:0;;;;;;;;;-1:-1:-1;;;76760:8:0;76769:5;76760:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76760:25:0;;;;;;;;;-1:-1:-1;;;76796:8:0;76805:5;76796:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76796:25:0;;;;;;;;;-1:-1:-1;;;76832:8:0;76841:5;76832:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76832:25:0;;;;;;;;;76667:200;76877:10;76896:18;;;:9;:18;;;;;:25;76925:1;76896:30;76930:1;76895:36;76955:1;76947:9;;76943:1218;;;76987:4;76969:22;;:8;76978:5;76969:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;76969:22:0;;;;;;;;;77020:4;77002:22;;:8;77011:5;77002:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77002:22:0;;;;;;;;;77041:5;77050:1;77041:10;77037:423;;;77084:4;77066:22;;:8;77075:5;77066:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77066:22:0;;;;;;;;-1:-1:-1;;77119:18:0;;;;:9;:18;;;;;:25;77177:15;;77148:1;77119:30;;;;77153:3;77118:38;;77202:4;:19;;77195:27;;;77177:15;;77186:5;;77177:15;;;;;;:::i;:::-;;;;:45;-1:-1:-1;;;;;77177:45:0;;;;;;;;;76943:1218;;77037:423;77244:5;77253:1;77244:10;77240:220;;;77287:4;77269:22;;:8;77278:5;77269:15;;;;;;;;:::i;77240:220::-;77313:5;77322:1;77313:10;77309:151;;;77356:4;77338:22;;:8;77347:5;77338:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77338:22:0;;;;;;;;;77391:4;77373:22;;:8;77382:5;77373:15;;;;;;;;:::i;77309:151::-;77444:4;77426:22;;:8;77435:5;77426:15;;;;;;;;:::i;77309:151::-;76943:1218;;;77479:5;77488:1;77479:10;77475:686;;;77520:4;77502:22;;:8;77511:5;77502:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77502:22:0;;;;;;;;;77553:4;77535:22;;:8;77544:5;77535:15;;;;;;;;:::i;77475:686::-;77599:5;77608:1;77599:10;77595:566;;;77653:18;;;;:9;:18;;;;;:25;77622:15;;77640:47;;;;;-1:-1:-1;;;;;;77640:47:0;;77622:15;;77631:5;;77622:15;;;;;;:::i;77595:566::-;77706:5;77715:1;77706:10;77703:458;;;77739:18;;;;:9;:18;;;;;:25;77769:1;77738:32;77739:25;77738:36;77729:341;;77804:1;77800:5;;77795:117;66489:1;77807;:20;77795:117;;;77885:10;;;;;;;;;;;;;-1:-1:-1;;;77885:10:0;;;77896:1;77885:13;;;;;;;;:::i;:::-;;;;;;;;;77849:8;77880:1;66531:5;77858:23;77849:33;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;77849:49:0;;;;;;;;-1:-1:-1;77829:3:0;;;;;77795:117;;77729:341;77951:1;77947:5;;77942:117;66489:1;77954;:20;77942:117;;;78032:10;;;;;;;;;;;;;-1:-1:-1;;;78032:10:0;;;78043:1;78032:13;;;;;;;;:::i;:::-;;;;;;;;;77996:8;78027:1;66577:5;78005:23;77996:33;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;77996:49:0;;;;;;;;-1:-1:-1;77976:3:0;;;;;77942:117;;77703:458;78114:4;78096:22;;:8;78105:5;78096:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78096:22:0;;;;;;;;;78147:4;78129:22;;:8;78138:5;78129:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78129:22:0;;;;;;;;;77703:458;78177:18;;;;:9;:18;;;;;:25;78219:3;78206:1;78177:30;;;;78211:4;78176:39;78175:47;78171:129;;;78254:4;78235:23;;:8;78244:4;78235:14;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;78235:23:0;;;;;;;;;78286:4;78269:21;;:8;78278:4;78269:14;;;;;;;;:::i;:::-;;;;:21;-1:-1:-1;;;;;78269:21:0;;;;;;;;;78171:129;78316:18;;;;:9;:18;;;;;:25;78359:2;78345;78316:31;;;;78351:4;78315:40;78314:47;78310:391;;;78383:1;78379:5;;78374:112;65824:2;78386:1;:20;78374:112;;;78461:10;;;;;;;;;;;;;-1:-1:-1;;;78461:10:0;;;78472:1;78461:13;;;;;;;;:::i;:::-;;;;;;;;;78426:8;78456:1;65866:5;78435:22;78426:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78426:48:0;;;;;;;;-1:-1:-1;78408:3:0;;;;;78374:112;;;78507:1;78503:5;;78499:111;65998:1;78510;:20;78499:111;;;78585:10;;;;;;;;;;;;;-1:-1:-1;;;78585:10:0;;;78596:1;78585:13;;;;;;;;:::i;:::-;;;;;;;;;78550:8;78580:1;66039:5;78559:22;78550:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78550:48:0;;;;;;;;-1:-1:-1;78532:3:0;;;;;78499:111;;;78310:391;;;78654:4;78636:22;;:8;78645:5;78636:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78636:22:0;;;;;;;;;78687:4;78669:22;;:8;78678:5;78669:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78669:22:0;;;;;;;;;78310:391;78717:18;;;;:9;:18;;;;;:25;78760:3;78746:2;78717:31;;;;78752:4;78716:40;78715:48;78711:299;;;78784:1;78780:5;;78776:96;78791:1;78787;:5;78776:96;;;78847:10;;;;;;;;;;;;;-1:-1:-1;;;78847:10:0;;;78858:1;78847:13;;;;;;;;:::i;:::-;;;;;;;;;78812:8;78842:1;66196:5;78821:22;78812:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78812:48:0;;;;;;;;-1:-1:-1;78794:3:0;;;;;78776:96;;;78711:299;;;78906:1;78902:5;;78898:103;78913:2;78909:1;:6;78898:103;;;78970:10;;;;;;;;;;;;;-1:-1:-1;;;78970:10:0;;;78981:1;78970:13;;;;;;;;:::i;:::-;;;;;;;;;78935:8;78965:1;66358:5;78944:22;78935:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78935:48:0;;;;;;;;-1:-1:-1;78917:3:0;;;;;78898:103;;;-1:-1:-1;79032:8:0;;-1:-1:-1;;75981:3065:0;;;;;;;:::o;32080:185::-;32218:39;32235:4;32241:2;32245:7;32218:39;;;;;;;;;;;;:16;:39::i;79387:183::-;79480:21;79493:7;79480:12;:21::i;:::-;79544:6;-1:-1:-1;;;;;79517:33:0;:23;79532:7;79517:14;:23::i;:::-;-1:-1:-1;;;;;79517:33:0;;79508:56;;;;-1:-1:-1;;;79508:56:0;;25248:2:1;79508:56:0;;;25230:21:1;25287:1;25267:18;;;25260:29;-1:-1:-1;;;25305:18:1;;;25298:39;25354:18;;79508:56:0;25046:332:1;43562:233:0;43637:7;43673:30;43460:10;:17;;43372:113;43673:30;43665:5;:38;43657:95;;;;-1:-1:-1;;;43657:95:0;;26256:2:1;43657:95:0;;;26238:21:1;26295:2;26275:18;;;26268:30;26334:34;26314:18;;;26307:62;-1:-1:-1;;;26385:18:1;;;26378:42;26437:19;;43657:95:0;26054:408:1;43657:95:0;43770:10;43781:5;43770:17;;;;;;;;:::i;:::-;;;;;;;;;43763:24;;43562:233;;;:::o;70642:213::-;70760:4;70776:21;70789:7;70776:12;:21::i;:::-;-1:-1:-1;70817:18:0;;;;:9;:18;;;;;:32;-1:-1:-1;;;70817:32:0;;;;;70642:213::o;29171:222::-;29243:7;29279:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29279:16:0;29314:19;29306:56;;;;-1:-1:-1;;;29306:56:0;;24493:2:1;29306:56:0;;;24475:21:1;24532:2;24512:18;;;24505:30;-1:-1:-1;;;24551:18:1;;;24544:54;24615:18;;29306:56:0;24291:348:1;75628:277:0;75779:13;75811:88;75824:74;75843:7;75852:3;75857:22;75881:16;75824:18;:74::i;:::-;75811:12;:88::i;:::-;75804:95;75628:277;-1:-1:-1;;;;;75628:277:0:o;70436:200::-;70547:5;70565:21;70578:7;70565:12;:21::i;:::-;-1:-1:-1;70606:18:0;;;;:9;:18;;;;;:24;-1:-1:-1;;;70606:24:0;;;;;70436:200::o;70228:202::-;70339:6;70358:21;70371:7;70358:12;:21::i;:::-;-1:-1:-1;70399:18:0;;;;:9;:18;;;;;:25;;;;70228:202::o;82390:153::-;7179:13;:11;:13::i;:::-;82515:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;79188:127::-:0;79279:15;;79269:7;:25;79260:49;;;;-1:-1:-1;;;79260:49:0;;21584:2:1;79260:49:0;;;21566:21:1;21623:2;21603:18;;;21596:30;-1:-1:-1;;;21642:18:1;;;21635:40;21692:18;;79260:49:0;21382:334:1;79260:49:0;79188:127;:::o;28902:207::-;28974:7;-1:-1:-1;;;;;29002:19:0;;28994:73;;;;-1:-1:-1;;;28994:73:0;;22260:2:1;28994:73:0;;;22242:21:1;22299:2;22279:18;;;22272:30;22338:34;22318:18;;;22311:62;-1:-1:-1;;;22389:18:1;;;22382:39;22438:19;;28994:73:0;22058:405:1;28994:73:0;-1:-1:-1;;;;;;29085:16:0;;;;;:9;:16;;;;;;;28902:207::o;7941:103::-;7179:13;:11;:13::i;:::-;8006:30:::1;8033:1;8006:18;:30::i;:::-;7941:103::o:0;71486:4052::-;71655:12;71679:21;71692:7;71679:12;:21::i;:::-;71709;71733:11;;;;;;;;;;;;;;;;;71774:6;71833:18;;;:9;:18;;;;;:25;71709:35;;-1:-1:-1;71774:6:0;;;71861:3;71833:31;71880:9;;;;;:22;;;71901:1;71893:5;:9;71880:22;71876:420;;;71938:1;71930:5;:9;71943:2;71929:16;71915:31;;71966:1;71962:5;;71957:122;54778:2;71969:1;:25;71957:122;;;72047:8;;;;;;;;;;;;;;;;;72060:6;72056:1;:10;72047:20;;;;;;;;:::i;:::-;;;;;;;;;72014:8;72042:1;54823:5;72023:20;72014:30;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;72014:53:0;;;;;;;;-1:-1:-1;71996:3:0;;;;;71957:122;;;71876:420;;;72106:1;72098:5;:9;72094:202;;;72143:1;72135:5;:9;72148:3;72134:17;72120:32;;72174:1;72170:5;;72165:122;55264:3;72177:1;:25;72165:122;;;72255:8;;;;;;;;;;;;;;;;;72268:6;72264:1;:10;72255:20;;;;;;;;:::i;:::-;;;;;;;;;72222:8;72250:1;55310:5;72231:20;72222:30;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;72222:53:0;;;;;;;;-1:-1:-1;72204:3:0;;;;;72165:122;;;72319:1;72311:5;:9;72307:347;;;72342:1;72338:5;;72333:106;57320:3;72345:1;:18;72333:106;;;72416:8;;;;;;;;;;;;;;;;;72425:1;72416:11;;;;;;;;:::i;:::-;;;;;;;;;72383:8;72411:1;57361:5;72392:20;72383:30;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;72383:44:0;;;;;;;;-1:-1:-1;72365:3:0;;;;;72333:106;;;72473:4;72466:12;;72449:8;72458:4;72449:14;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;72449:29:0;;;;;;;;;72513:4;72506:12;;72489:8;72498:4;72489:14;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;72489:29:0;;;;;;;;;72307:347;;;72592:1;72552:18;;;:9;:18;;;;;:25;72581:1;72552:30;:25;72551:38;:42;72547:98;;-1:-1:-1;;;72608:8:0;72617:5;72608:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;72608:25:0;;;;;;;;;72547:98;72668:27;;;;72664:127;;72758:22;72751:30;;72708:8;54654:5;72708:40;;;;;;;;:::i;:::-;;;;:73;-1:-1:-1;;;;;72708:73:0;;;;;;;;;72664:127;72805:21;;;;72801:110;;72883:16;72876:24;;72839:8;54711:5;72839:34;;;;;;;;:::i;:::-;;;;:61;-1:-1:-1;;;;;72839:61:0;;;;;;;;;72801:110;72936:18;;;;72965:2;72936:18;;;;;;;;:25;:31;;;;72971:3;72935:39;72978:2;72930:50;;;;-1:-1:-1;73015:31:0;73050:3;73014:39;73070:3;73065:745;;73124:1;;-1:-1:-1;73100:2:0;73086:16;73115:168;65453:1;73127;:19;73115:168;;;73200:9;;;;;;;;;;;;;-1:-1:-1;;;73200:9:0;;;73210:1;73200:12;;;;;;;;:::i;:::-;;;;;;;;;73166:8;73195:1;65493:5;73175:21;73166:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73166:46:0;;;;;;;;;73259:9;;;;;;;;;;;;;-1:-1:-1;;;73259:9:0;;;73269:1;73259:12;;;;;;;;:::i;:::-;;;;;;;;;73225:8;73254:1;65602:5;73234:21;73225:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73225:46:0;;;;;;;;-1:-1:-1;73148:3:0;;;;;73115:168;;;73307:1;73299:5;:9;73295:506;;;73332:1;73328:5;;73323:99;73339:1;73335;:5;73323:99;;;73396:9;;;;;;;;;;;;;-1:-1:-1;;;73396:9:0;;;73406:1;73396:12;;;;;;;;:::i;:::-;;;;;;;;;73362:8;73391:1;65711:5;73371:21;73362:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73362:46:0;;;;;;;;-1:-1:-1;73342:3:0;;;;;73323:99;;;73481:1;73441:18;;;:9;:18;;;;;:25;73470:1;73441:30;:25;73440:38;:42;73436:162;;-1:-1:-1;;;73499:8:0;73508:5;73499:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73499:25:0;;;;;;;;;73436:162;;;-1:-1:-1;;;73559:8:0;73568:5;73559:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73559:25:0;;;;;;;;;73436:162;-1:-1:-1;;;73612:8:0;73621:5;73612:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73612:25:0;;;;;;;;;-1:-1:-1;;;73650:8:0;73659:5;73650:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73650:25:0;;;;;;;;;-1:-1:-1;;;73688:8:0;73697:5;73688:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73688:25:0;;;;;;;;;-1:-1:-1;;;73726:8:0;73735:5;73726:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73726:25:0;;;;;;;;;-1:-1:-1;;;73764:8:0;73773:5;73764:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73764:25:0;;;;;;;;;73295:506;73831:1;73827:5;;73822:238;59479:2;73834:1;:25;73822:238;;;73922:10;73896:9;;;;;;;;;;;;;;;;;73910:6;73906:1;:10;73896:21;;;;;;;;:::i;:::-;;;;;;;;;73890:28;;73885:34;;:47;73877:55;;73976:8;;;;;;;;;;;;;;;;;73985:5;73976:15;;;;;;;;:::i;:::-;;;;;;;;;73943:8;73971:1;59431:5;73952:20;73943:30;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;73943:48:0;;;;;;;;;74035:8;;;;;;;;;;;;;;;;;74044:5;74035:15;;;;;;;;:::i;:::-;;;;;;;;;74002:8;74030:1;59910:5;74011:20;74002:30;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;74002:48:0;;;;;;;;-1:-1:-1;73861:3:0;;;;;73822:238;;;74084:18;;;;:9;:18;;;;;;;;;:25;74163:8;;;;;;;;;;;;;;;;74113:1;74084:30;74118:4;74083:39;;-1:-1:-1;74083:39:0;;74163:15;;;;;;:::i;:::-;;;;;;;;;74134:8;60505:5;74134:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74134:44:0;;;;;;;;;74216:8;;;;;;;;;;;;;;;;;74225:5;74216:15;;;;;;;;:::i;:::-;;;;;;;;;74187:8;60344:4;74187:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74187:44:0;;;;;;;;-1:-1:-1;74257:18:0;;;;:9;74286:2;74257:18;;;;;;;:25;:31;;74292:4;74256:40;74300:2;74251:51;;-1:-1:-1;74326:4:0;74317:13;;74313:164;;;74352:1;74348:5;;74343:125;61393:2;74355:1;:26;74343:125;;;74435:9;;;;;;;;;;;;;;;;;74454:1;74445:6;:10;74435:21;;;;;;;;:::i;:::-;;;;;;;;;74401:8;74430:1;61439:5;74410:21;74401:31;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;74401:55:0;;;;;;;;-1:-1:-1;74383:3:0;;;;;74343:125;;;74501:18;;;;:9;:18;;;;;:25;74550:23;;74530:2;74501:31;;;74536:4;74500:40;;-1:-1:-1;74576:20:0;;;;;-1:-1:-1;;;;;;74576:20:0;;74550:23;;74559:13;;74550:23;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;74550:46:0;;;;;;;;-1:-1:-1;74621:18:0;;;;:9;:18;;;;;;;;;:25;74699:8;;;;;;;;;;;-1:-1:-1;;;74699:8:0;;;;;;;74650:2;74621:31;74656:3;74620:39;;-1:-1:-1;74620:39:0;;74699:15;;;;;;:::i;:::-;;;;;;;;;74670:8;60667:5;74670:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74670:44:0;;;;;;;;-1:-1:-1;74740:18:0;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;74740:25:0;74769:2;74740:31;;;;74775:3;74739:39;74782:1;74738:45;74733:51;;-1:-1:-1;74793:120:0;60804:1;74805;:26;74793:120;;;74883:9;;;;;;;;;;;;;;;;;74897:5;74893:1;:9;74883:20;;;;;;;;:::i;:::-;;;;;;;;;74849:8;74878:1;60849:5;74858:21;74849:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;74849:54:0;;;;;;;;-1:-1:-1;74833:3:0;;;;;74793:120;;;74938:18;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;74938:25:0;74967:2;74938:31;;;;74973:3;74937:39;74980:1;74936:45;74931:51;;-1:-1:-1;74991:120:0;61022:1;75003;:26;74991:120;;;75081:9;;;;;;;;;;;;;-1:-1:-1;;;75081:9:0;;;75095:5;75091:1;:9;75081:20;;;;;;;;:::i;:::-;;;;;;;;;75047:8;75076:1;61067:5;75056:21;75047:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75047:54:0;;;;;;;;-1:-1:-1;75031:3:0;;;;;74991:120;;;75136:18;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;75178:1:0;75165:2;75136:31;;;;:25;75135:39;75134:45;75136:25;75129:51;;-1:-1:-1;75189:120:0;61225:1;75201;:26;75189:120;;;75279:9;;;;;;;;;;;;;-1:-1:-1;;;75279:9:0;;;75293:5;75289:1;:9;75279:20;;;;;;;;:::i;:::-;;;;;;;;;75245:8;75274:1;61270:5;75254:21;75245:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75245:54:0;;;;;;;;-1:-1:-1;75229:3:0;;;;;75189:120;;;75344:9;:18;75354:7;75344:18;;;;;;;;;;;:24;;;;;;;;;;;;75371:1;75344:28;75337:36;;75319:8;75328:5;75319:15;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75319:54:0;;;;;;;;-1:-1:-1;75388:18:0;;;;:9;:18;;;;;:30;-1:-1:-1;;;75388:30:0;;;;:35;75384:118;;75461:18;;;;:9;:18;;;;;:30;75436:15;;-1:-1:-1;;;75461:30:0;;;75454:38;;-1:-1:-1;;;;;;75454:38:0;;75436:15;;75445:5;;75436:15;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;75436:56:0;;;;;;;;;75384:118;-1:-1:-1;75524:8:0;;71486:4052;-1:-1:-1;;;;;;;;71486:4052:0:o;82975:128::-;7179:13;:11;:13::i;:::-;83067:16:::1;:30:::0;;-1:-1:-1;;;;;;83067:30:0::1;-1:-1:-1::0;;;;;83067:30:0;;;::::1;::::0;;;::::1;::::0;;82975:128::o;82853:116::-;7179:13;:11;:13::i;:::-;82945:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;29629:104::-:0;29685:13;29718:7;29711:14;;;;;:::i;31216:155::-;31311:52;5918:10;31344:8;31354;31311:18;:52::i;82549:162::-;7179:13;:11;:13::i;:::-;82679:26;;::::1;::::0;:16:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;80786:169::-:0;80861:47;80881:10;80893:7;80902:5;80861:19;:47::i;:::-;80917:18;;;;:9;:18;;;;;;:32;;;;;;-1:-1:-1;;;80917:32:0;-1:-1:-1;;80917:32:0;;;;;;;;;80786:169::o;32336:323::-;32510:41;5918:10;32543:7;32510:18;:41::i;:::-;32502:100;;;;-1:-1:-1;;;32502:100:0;;;;;;;:::i;:::-;32613:38;32627:4;32633:2;32637:7;32646:4;32613:13;:38::i;:::-;32336:323;;;;:::o;80050:337::-;80174:1;80166:5;:9;;;80157:30;;;;-1:-1:-1;;;80157:30:0;;25921:2:1;80157:30:0;;;25903:21:1;25960:1;25940:18;;;25933:29;-1:-1:-1;;;25978:18:1;;;25971:37;26025:18;;80157:30:0;25719:330:1;80157:30:0;80196:25;:84;;;;;;;;80225:1;80196:84;;;;50244:12;80228:1;:15;;;;:::i;:::-;80196:84;;;;80245:16;50244:12;80245:2;:16;:::i;:::-;80196:84;;;;50244:12;80263:2;:16;;;;:::i;:::-;80196:84;;;-1:-1:-1;80287:23:0;80196:84;80313:14;;;;;;;;;;:::i;:::-;;;;;80287:40;;80334:47;80348:6;80356:7;80365:15;80334:13;:47::i;:::-;80150:237;;80050:337;;;:::o;67872:790::-;67961:13;67987:21;68000:7;67987:12;:21::i;:::-;68029:16;;-1:-1:-1;;;;;68029:16:0;68021:39;68017:126;;68078:16;;:57;;-1:-1:-1;;;68078:57:0;;68120:4;68078:57;;;17732:51:1;17799:18;;;17792:34;;;-1:-1:-1;;;;;68078:16:0;;;;:25;;17705:18:1;;68078:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68078:57:0;;;;;;;;;;;;:::i;68017:126::-;68155:27;68185:25;68202:7;68185:16;:25::i;:::-;68155:55;;68219:18;68240:337;68311:13;68354:11;68380:27;68393:13;68380:12;:27::i;:::-;68434;68453:7;68434:18;:27::i;:::-;68520:33;68538:7;68547:5;68520:17;:33::i;:::-;68266:308;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68240:12;:337::i;:::-;68219:358;;68650:4;68600:55;;;;;;;;:::i;70861:350::-;70994:13;71019:21;71032:7;71019:12;:21::i;:::-;71053:14;71049:157;;;71085:45;71110:7;71119:4;71125:1;71128;71085:24;:45::i;:::-;71078:52;;;;71049:157;71160:38;71178:7;71187:4;71193:1;71196;71160:17;:38::i;79658:348::-;79772:34;79790:6;79798:7;79772:17;:34::i;:::-;79815:21;79876:26;:15;:24;:26::i;:::-;79846:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;79846:57:0;;;;;;;;;79939:18;;;;:9;79846:57;79939:18;;:31;;;79846:57;;-1:-1:-1;79975:15:0;;79921:49;;:15;:49;:::i;:::-;79920:70;;79992:7;79911:89;;;;;-1:-1:-1;;;79911:89:0;;;;;;;;:::i;80465:196::-;80559:23;80585:16;50244:12;80585:2;:16;:::i;:::-;80559:42;;80608:47;80622:6;80630:7;80639:15;80608:13;:47::i;71217:263::-;71361:13;71393:81;71406:67;71418:7;71427:3;71432:22;71456:16;71406:11;:67::i;8199:201::-;7179:13;:11;:13::i;:::-;-1:-1:-1;;;;;8288:22:0;::::1;8280:73;;;::::0;-1:-1:-1;;;8280:73:0;;19655:2:1;8280:73:0::1;::::0;::::1;19637:21:1::0;19694:2;19674:18;;;19667:30;19733:34;19713:18;;;19706:62;-1:-1:-1;;;19784:18:1;;;19777:36;19830:19;;8280:73:0::1;19453:402:1::0;8280:73:0::1;8364:28;8383:8;8364:18;:28::i;82091:107::-:0;7179:13;:11;:13::i;:::-;82175:9:::1;:17:::0;82091:107::o;82717:130::-;7179:13;:11;:13::i;:::-;82816:25;;::::1;::::0;:15:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;81280:156::-:0;81342:40;81362:10;81374:7;81342:19;:40::i;:::-;81391:18;;;;:9;:18;;;;;:39;;-1:-1:-1;;;;81391:39:0;-1:-1:-1;;;81391:39:0;;;81280:156::o;42732:224::-;42834:4;-1:-1:-1;;;;;;42858:50:0;;-1:-1:-1;;;42858:50:0;;:90;;;42912:36;42936:11;42912:23;:36::i;38948:135::-;34231:4;34255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34255:16:0;39022:53;;;;-1:-1:-1;;;39022:53:0;;24493:2:1;39022:53:0;;;24475:21:1;24532:2;24512:18;;;24505:30;-1:-1:-1;;;24551:18:1;;;24544:54;24615:18;;39022:53:0;24291:348:1;38227:174:0;38302:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38302:29:0;-1:-1:-1;;;;;38302:29:0;;;;;;;;:24;;38356:23;38302:24;38356:14;:23::i;:::-;-1:-1:-1;;;;;38347:46:0;;;;;;;;;;;38227:174;;:::o;3086:723::-;3142:13;3363:10;3359:53;;-1:-1:-1;;3390:10:0;;;;;;;;;;;;-1:-1:-1;;;3390:10:0;;;;;3086:723::o;3359:53::-;3437:5;3422:12;3478:78;3485:9;;3478:78;;3511:8;;;;:::i;:::-;;-1:-1:-1;3534:10:0;;-1:-1:-1;3542:2:0;3534:10;;:::i;:::-;;;3478:78;;;3566:19;3598:6;3588:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3588:17:0;;3566:39;;3616:154;3623:10;;3616:154;;3650:11;3660:1;3650:11;;:::i;:::-;;-1:-1:-1;3719:10:0;3727:2;3719:5;:10;:::i;:::-;3706:24;;:2;:24;:::i;:::-;3693:39;;3676:6;3683;3676:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3676:56:0;;;;;;;;-1:-1:-1;3747:11:0;3756:2;3747:11;;:::i;:::-;;;3616:154;;35066:110;35142:26;35152:2;35156:7;35142:26;;;;;;;;;;;;:9;:26::i;34460:264::-;34553:4;34570:13;34586:23;34601:7;34586:14;:23::i;:::-;34570:39;;34639:5;-1:-1:-1;;;;;34628:16:0;:7;-1:-1:-1;;;;;34628:16:0;;:52;;;-1:-1:-1;;;;;;31563:25:0;;;31539:4;31563:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34648:32;34628:87;;;;34708:7;-1:-1:-1;;;;;34684:31:0;:20;34696:7;34684:11;:20::i;:::-;-1:-1:-1;;;;;34684:31:0;;34620:96;34460:264;-1:-1:-1;;;;34460:264:0:o;37483:625::-;37642:4;-1:-1:-1;;;;;37615:31:0;:23;37630:7;37615:14;:23::i;:::-;-1:-1:-1;;;;;37615:31:0;;37607:81;;;;-1:-1:-1;;;37607:81:0;;20062:2:1;37607:81:0;;;20044:21:1;20101:2;20081:18;;;20074:30;20140:34;20120:18;;;20113:62;-1:-1:-1;;;20191:18:1;;;20184:35;20236:19;;37607:81:0;19860:401:1;37607:81:0;-1:-1:-1;;;;;37707:16:0;;37699:65;;;;-1:-1:-1;;;37699:65:0;;20825:2:1;37699:65:0;;;20807:21:1;20864:2;20844:18;;;20837:30;20903:34;20883:18;;;20876:62;-1:-1:-1;;;20954:18:1;;;20947:34;20998:19;;37699:65:0;20623:400:1;37699:65:0;37777:39;37798:4;37804:2;37808:7;37777:20;:39::i;:::-;37881:29;37898:1;37902:7;37881:8;:29::i;:::-;-1:-1:-1;;;;;37923:15:0;;;;;;:9;:15;;;;;:20;;37942:1;;37923:15;:20;;37942:1;;37923:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37954:13:0;;;;;;:9;:13;;;;;:18;;37971:1;;37954:13;:18;;37971:1;;37954:18;:::i;:::-;;;;-1:-1:-1;;37983:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37983:21:0;-1:-1:-1;;;;;37983:21:0;;;;;;;;;38022:27;;37983:16;;38022:27;;;;;;;30560:347;30490:417;;:::o;7458:132::-;7366:6;;-1:-1:-1;;;;;7366:6:0;5918:10;7522:23;7514:68;;;;-1:-1:-1;;;7514:68:0;;23793:2:1;7514:68:0;;;23775:21:1;;;23812:18;;;23805:30;23871:34;23851:18;;;23844:62;23923:18;;7514:68:0;23591:356:1;83494:2965:0;83558:13;83765:4;:11;83780:1;83765:16;83761:31;;;-1:-1:-1;;83783:9:0;;;;;;;;;-1:-1:-1;83783:9:0;;;83494:2965::o;83761:31::-;83841:19;83863:6;;;;;;;;;;;;;;;;;83841:28;;84266:20;84325:1;84306:4;:11;84320:1;84306:15;;;;:::i;:::-;84305:21;;;;:::i;:::-;84300:27;;:1;:27;:::i;:::-;84289:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84289:39:0;;84266:62;;84500:1;84493:5;84489:13;84600:2;84592:6;84588:15;84705:4;84755;84749:11;84743:4;84739:22;84669:1386;84787:6;84778:7;84775:19;84669:1386;;;84887:1;84878:7;84874:15;84863:26;;84924:7;84918:14;85561:4;85553:5;85549:2;85545:14;85541:25;85531:8;85527:40;85521:47;85510:9;85502:67;85613:1;85602:9;85598:17;85585:30;;85703:4;85695:5;85691:2;85687:14;85683:25;85673:8;85669:40;85663:47;85652:9;85644:67;85755:1;85744:9;85740:17;85727:30;;85844:4;85836:5;85833:1;85829:13;85825:24;85815:8;85811:39;85805:46;85794:9;85786:66;85896:1;85885:9;85881:17;85868:30;;85977:4;85970:5;85966:16;85956:8;85952:31;85946:38;85935:9;85927:58;;86029:1;86018:9;86014:17;86001:30;;84669:1386;;;84673:101;;86211:1;86204:4;86198:11;86194:19;86230:1;86225:117;;;;86359:1;86354:69;;;;86187:236;;86225:117;86276:4;86272:1;86261:9;86257:17;86249:32;86324:4;86320:1;86309:9;86305:17;86297:32;86225:117;;86354:69;86405:4;86401:1;86390:9;86386:17;86378:32;86187:236;-1:-1:-1;86447:6:0;;83494:2965;-1:-1:-1;;;;;83494:2965:0:o;8560:191::-;8653:6;;;-1:-1:-1;;;;;8670:17:0;;;-1:-1:-1;;;;;;8670:17:0;;;;;;;8703:40;;8653:6;;;8670:17;8653:6;;8703:40;;8634:16;;8703:40;8623:128;8560:191;:::o;38544:315::-;38699:8;-1:-1:-1;;;;;38690:17:0;:5;-1:-1:-1;;;;;38690:17:0;;;38682:55;;;;-1:-1:-1;;;38682:55:0;;21230:2:1;38682:55:0;;;21212:21:1;21269:2;21249:18;;;21242:30;21308:27;21288:18;;;21281:55;21353:18;;38682:55:0;21028:349:1;38682:55:0;-1:-1:-1;;;;;38748:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38748:46:0;;;;;;;;;;38810:41;;17260::1;;;38810::0;;17233:18:1;38810:41:0;;;;;;;38544:315;;;:::o;33540:313::-;33696:28;33706:4;33712:2;33716:7;33696:9;:28::i;:::-;33743:47;33766:4;33772:2;33776:7;33785:4;33743:22;:47::i;:::-;33735:110;;;;-1:-1:-1;;;33735:110:0;;;;;;;:::i;68670:387::-;68761:13;68787:23;68858:12;68872:13;68921:16;68939:13;68983:15;69000:13;68820:205;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68820:205:0;;;;;;;;;;68670:387;-1:-1:-1;;;68670:387:0:o;28533:305::-;28635:4;-1:-1:-1;;;;;;28672:40:0;;-1:-1:-1;;;28672:40:0;;:105;;-1:-1:-1;;;;;;;28729:48:0;;-1:-1:-1;;;28729:48:0;28672:105;:158;;;-1:-1:-1;;;;;;;;;;20280:40:0;;;28794:36;20171:157;35403:319;35532:18;35538:2;35542:7;35532:5;:18::i;:::-;35583:53;35614:1;35618:2;35622:7;35631:4;35583:22;:53::i;:::-;35561:153;;;;-1:-1:-1;;;35561:153:0;;;;;;;:::i;81716:293::-;81853:45;81880:4;81886:2;81890:7;81853:26;:45::i;:::-;81921:15;;81911:7;:25;81907:97;;;81947:18;;;;:9;:18;;;;;81981:15;81947:31;;;;:49;-1:-1:-1;;81716:293:0:o;39647:853::-;39801:4;-1:-1:-1;;;;;39822:13:0;;10292:19;:23;39818:675;;39858:71;;-1:-1:-1;;;39858:71:0;;-1:-1:-1;;;;;39858:36:0;;;;;:71;;5918:10;;39909:4;;39915:7;;39924:4;;39858:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39858:71:0;;;;;;;;-1:-1:-1;;39858:71:0;;;;;;;;;;;;:::i;:::-;;;39854:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40099:13:0;;40095:328;;40142:60;;-1:-1:-1;;;40142:60:0;;;;;;;:::i;40095:328::-;40373:6;40367:13;40358:6;40354:2;40350:15;40343:38;39854:584;-1:-1:-1;;;;;;39980:51:0;-1:-1:-1;;;39980:51:0;;-1:-1:-1;39973:58:0;;39818:675;-1:-1:-1;40477:4:0;40470:11;;36058:439;-1:-1:-1;;;;;36138:16:0;;36130:61;;;;-1:-1:-1;;;36130:61:0;;23101:2:1;36130:61:0;;;23083:21:1;;;23120:18;;;23113:30;23179:34;23159:18;;;23152:62;23231:18;;36130:61:0;22899:356:1;36130:61:0;34231:4;34255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34255:16:0;:30;36202:58;;;;-1:-1:-1;;;36202:58:0;;20468:2:1;36202:58:0;;;20450:21:1;20507:2;20487:18;;;20480:30;20546;20526:18;;;20519:58;20594:18;;36202:58:0;20266:352:1;36202:58:0;36273:45;36302:1;36306:2;36310:7;36273:20;:45::i;:::-;-1:-1:-1;;;;;36331:13:0;;;;;;:9;:13;;;;;:18;;36348:1;;36331:13;:18;;36348:1;;36331:18;:::i;:::-;;;;-1:-1:-1;;36360:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36360:21:0;-1:-1:-1;;;;;36360:21:0;;;;;;;;36399:33;;36360:16;;;36399:33;;36360:16;;36399:33;82342:36:::1;82204:180:::0;:::o;44408:589::-;-1:-1:-1;;;;;44614:18:0;;44610:187;;44649:40;44681:7;45824:10;:17;;45797:24;;;;:15;:24;;;;;:44;;;45852:24;;;;;;;;;;;;45720:164;44649:40;44610:187;;;44719:2;-1:-1:-1;;;;;44711:10:0;:4;-1:-1:-1;;;;;44711:10:0;;44707:90;;44738:47;44771:4;44777:7;44738:32;:47::i;:::-;-1:-1:-1;;;;;44811:16:0;;44807:183;;44844:45;44881:7;44844:36;:45::i;44807:183::-;44917:4;-1:-1:-1;;;;;44911:10:0;:2;-1:-1:-1;;;;;44911:10:0;;44907:83;;44938:40;44966:2;44970:7;44938:27;:40::i;46511:988::-;46777:22;46827:1;46802:22;46819:4;46802:16;:22::i;:::-;:26;;;;:::i;:::-;46839:18;46860:26;;;:17;:26;;;;;;46777:51;;-1:-1:-1;46993:28:0;;;46989:328;;-1:-1:-1;;;;;47060:18:0;;47038:19;47060:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47111:30;;;;;;:44;;;47228:30;;:17;:30;;;;;:43;;;46989:328;-1:-1:-1;47413:26:0;;;;:17;:26;;;;;;;;47406:33;;;-1:-1:-1;;;;;47457:18:0;;;;;:12;:18;;;;;:34;;;;;;;47450:41;46511:988::o;47794:1079::-;48072:10;:17;48047:22;;48072:21;;48092:1;;48072:21;:::i;:::-;48104:18;48125:24;;;:15;:24;;;;;;48498:10;:26;;48047:46;;-1:-1:-1;48125:24:0;;48047:46;;48498:26;;;;;;:::i;:::-;;;;;;;;;48476:48;;48562:11;48537:10;48548;48537:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48642:28;;;:15;:28;;;;;;;:41;;;48814:24;;;;;48807:31;48849:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47865:1008;;;47794:1079;:::o;45298:221::-;45383:14;45400:20;45417:2;45400:16;:20::i;:::-;-1:-1:-1;;;;;45431:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45476:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45298:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:160::-;420:20;;476:13;;469:21;459:32;;449:60;;505:1;502;495:12;449:60;355:160;;;:::o;520:156::-;586:20;;646:4;635:16;;625:27;;615:55;;666:1;663;656:12;681:247;740:6;793:2;781:9;772:7;768:23;764:32;761:52;;;809:1;806;799:12;761:52;848:9;835:23;867:31;892:5;867:31;:::i;:::-;917:5;681:247;-1:-1:-1;;;681:247:1:o;933:388::-;1001:6;1009;1062:2;1050:9;1041:7;1037:23;1033:32;1030:52;;;1078:1;1075;1068:12;1030:52;1117:9;1104:23;1136:31;1161:5;1136:31;:::i;:::-;1186:5;-1:-1:-1;1243:2:1;1228:18;;1215:32;1256:33;1215:32;1256:33;:::i;:::-;1308:7;1298:17;;;933:388;;;;;:::o;1326:456::-;1403:6;1411;1419;1472:2;1460:9;1451:7;1447:23;1443:32;1440:52;;;1488:1;1485;1478:12;1440:52;1527:9;1514:23;1546:31;1571:5;1546:31;:::i;:::-;1596:5;-1:-1:-1;1653:2:1;1638:18;;1625:32;1666:33;1625:32;1666:33;:::i;:::-;1326:456;;1718:7;;-1:-1:-1;;;1772:2:1;1757:18;;;;1744:32;;1326:456::o;1787:794::-;1882:6;1890;1898;1906;1959:3;1947:9;1938:7;1934:23;1930:33;1927:53;;;1976:1;1973;1966:12;1927:53;2015:9;2002:23;2034:31;2059:5;2034:31;:::i;:::-;2084:5;-1:-1:-1;2141:2:1;2126:18;;2113:32;2154:33;2113:32;2154:33;:::i;:::-;2206:7;-1:-1:-1;2260:2:1;2245:18;;2232:32;;-1:-1:-1;2315:2:1;2300:18;;2287:32;2342:18;2331:30;;2328:50;;;2374:1;2371;2364:12;2328:50;2397:22;;2450:4;2442:13;;2438:27;-1:-1:-1;2428:55:1;;2479:1;2476;2469:12;2428:55;2502:73;2567:7;2562:2;2549:16;2544:2;2540;2536:11;2502:73;:::i;:::-;2492:83;;;1787:794;;;;;;;:::o;2586:315::-;2651:6;2659;2712:2;2700:9;2691:7;2687:23;2683:32;2680:52;;;2728:1;2725;2718:12;2680:52;2767:9;2754:23;2786:31;2811:5;2786:31;:::i;:::-;2836:5;-1:-1:-1;2860:35:1;2891:2;2876:18;;2860:35;:::i;:::-;2850:45;;2586:315;;;;;:::o;2906:::-;2974:6;2982;3035:2;3023:9;3014:7;3010:23;3006:32;3003:52;;;3051:1;3048;3041:12;3003:52;3090:9;3077:23;3109:31;3134:5;3109:31;:::i;:::-;3159:5;3211:2;3196:18;;;;3183:32;;-1:-1:-1;;;2906:315:1:o;3226:383::-;3303:6;3311;3319;3372:2;3360:9;3351:7;3347:23;3343:32;3340:52;;;3388:1;3385;3378:12;3340:52;3427:9;3414:23;3446:31;3471:5;3446:31;:::i;:::-;3496:5;3548:2;3533:18;;3520:32;;-1:-1:-1;3599:2:1;3584:18;;;3571:32;;3226:383;-1:-1:-1;;;3226:383:1:o;3614:385::-;3689:6;3697;3705;3758:2;3746:9;3737:7;3733:23;3729:32;3726:52;;;3774:1;3771;3764:12;3726:52;3813:9;3800:23;3832:31;3857:5;3832:31;:::i;:::-;3882:5;-1:-1:-1;3934:2:1;3919:18;;3906:32;;-1:-1:-1;3957:36:1;3989:2;3974:18;;3957:36;:::i;:::-;3947:46;;3614:385;;;;;:::o;4004:245::-;4062:6;4115:2;4103:9;4094:7;4090:23;4086:32;4083:52;;;4131:1;4128;4121:12;4083:52;4170:9;4157:23;4189:30;4213:5;4189:30;:::i;4254:249::-;4323:6;4376:2;4364:9;4355:7;4351:23;4347:32;4344:52;;;4392:1;4389;4382:12;4344:52;4424:9;4418:16;4443:30;4467:5;4443:30;:::i;4779:450::-;4848:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:52;;;4917:1;4914;4907:12;4869:52;4957:9;4944:23;4990:18;4982:6;4979:30;4976:50;;;5022:1;5019;5012:12;4976:50;5045:22;;5098:4;5090:13;;5086:27;-1:-1:-1;5076:55:1;;5127:1;5124;5117:12;5076:55;5150:73;5215:7;5210:2;5197:16;5192:2;5188;5184:11;5150:73;:::i;5234:635::-;5314:6;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;5416:9;5410:16;5449:18;5441:6;5438:30;5435:50;;;5481:1;5478;5471:12;5435:50;5504:22;;5557:4;5549:13;;5545:27;-1:-1:-1;5535:55:1;;5586:1;5583;5576:12;5535:55;5615:2;5609:9;5640:48;5656:31;5684:2;5656:31;:::i;5640:48::-;5711:2;5704:5;5697:17;5751:7;5746:2;5741;5737;5733:11;5729:20;5726:33;5723:53;;;5772:1;5769;5762:12;5723:53;5785:54;5836:2;5831;5824:5;5820:14;5815:2;5811;5807:11;5785:54;:::i;5874:180::-;5933:6;5986:2;5974:9;5965:7;5961:23;5957:32;5954:52;;;6002:1;5999;5992:12;5954:52;-1:-1:-1;6025:23:1;;5874:180;-1:-1:-1;5874:180:1:o;6059:248::-;6124:6;6132;6185:2;6173:9;6164:7;6160:23;6156:32;6153:52;;;6201:1;6198;6191:12;6153:52;6237:9;6224:23;6214:33;;6266:35;6297:2;6286:9;6282:18;6266:35;:::i;6312:389::-;6391:6;6399;6407;6415;6468:3;6456:9;6447:7;6443:23;6439:33;6436:53;;;6485:1;6482;6475:12;6436:53;6521:9;6508:23;6498:33;;6550:35;6581:2;6570:9;6566:18;6550:35;:::i;:::-;6540:45;;6604:36;6636:2;6625:9;6621:18;6604:36;:::i;:::-;6594:46;;6659:36;6691:2;6680:9;6676:18;6659:36;:::i;:::-;6649:46;;6312:389;;;;;;;:::o;6706:250::-;6772:6;6780;6833:2;6821:9;6812:7;6808:23;6804:32;6801:52;;;6849:1;6846;6839:12;6801:52;6885:9;6872:23;6862:33;;6914:36;6946:2;6935:9;6931:18;6914:36;:::i;6961:257::-;7002:3;7040:5;7034:12;7067:6;7062:3;7055:19;7083:63;7139:6;7132:4;7127:3;7123:14;7116:4;7109:5;7105:16;7083:63;:::i;:::-;7200:2;7179:15;-1:-1:-1;;7175:29:1;7166:39;;;;7207:4;7162:50;;6961:257;-1:-1:-1;;6961:257:1:o;7223:185::-;7265:3;7303:5;7297:12;7318:52;7363:6;7358:3;7351:4;7344:5;7340:16;7318:52;:::i;:::-;7386:16;;;;;7223:185;-1:-1:-1;;7223:185:1:o;7413:973::-;7498:12;;7463:3;;7553:1;7573:18;;;;7626;;;;7653:61;;7707:4;7699:6;7695:17;7685:27;;7653:61;7733:2;7781;7773:6;7770:14;7750:18;7747:38;7744:161;;;7827:10;7822:3;7818:20;7815:1;7808:31;7862:4;7859:1;7852:15;7890:4;7887:1;7880:15;7744:161;7921:18;7948:104;;;;8066:1;8061:319;;;;7914:466;;7948:104;-1:-1:-1;;7981:24:1;;7969:37;;8026:16;;;;-1:-1:-1;7948:104:1;;8061:319;28002:1;27995:14;;;28039:4;28026:18;;8155:1;8169:165;8183:6;8180:1;8177:13;8169:165;;;8261:14;;8248:11;;;8241:35;8304:16;;;;8198:10;;8169:165;;;8173:3;;8363:6;8358:3;8354:16;8347:23;;7914:466;;;;;;;7413:973;;;;:::o;9113:2257::-;10221:66;10216:3;10209:79;10191:3;10317:6;10311:13;10333:62;10388:6;10383:2;10378:3;10374:12;10367:4;10359:6;10355:17;10333:62;:::i;:::-;10459:66;10454:2;10414:16;;;10446:11;;;10439:87;10551:13;;10573:63;10551:13;10622:2;10614:11;;10607:4;10595:17;;10573:63;:::i;:::-;10701:66;10696:2;10655:17;;;;10688:11;;;10681:87;10793:13;;10815:63;10793:13;10864:2;10856:11;;10849:4;10837:17;;10815:63;:::i;:::-;10943:66;10938:2;10897:17;;;;10930:11;;;10923:87;-1:-1:-1;;;11034:3:1;11026:12;;11019:44;11088:13;;11110:64;11088:13;11159:3;11151:12;;11144:4;11132:17;;11110:64;:::i;:::-;11190:174;11220:143;11246:116;11276:85;11302:58;11355:3;11344:8;11340:2;11336:17;11332:27;8601:66;8589:79;;-1:-1:-1;;;8693:2:1;8684:12;;8677:36;8738:2;8729:12;;8524:223;11302:58;11294:6;11276:85;:::i;:::-;8959:66;8947:79;;-1:-1:-1;;;9051:2:1;9042:12;;9035:39;9099:2;9090:12;;8882:226;11246:116;11238:6;11220:143;:::i;:::-;-1:-1:-1;;;8456:30:1;;8511:1;8502:11;;8391:128;11190:174;11183:181;9113:2257;-1:-1:-1;;;;;;;;;;9113:2257:1:o;11375:1675::-;-1:-1:-1;;;12159:43:1;;12141:3;12221:46;12264:1;12255:11;;12247:6;12221:46;:::i;:::-;12296:6;12290:13;12312:52;12357:6;12353:2;12346:4;12338:6;12334:17;12312:52;:::i;:::-;12424:66;12386:15;;12410:81;;;12510:49;12555:2;12544:14;;12536:6;12510:49;:::i;:::-;12500:59;;12590:6;12584:13;12606:54;12651:8;12647:2;12640:4;12632:6;12628:17;12606:54;:::i;:::-;-1:-1:-1;;;12682:17:1;;12708:63;;;12790:49;12835:2;12824:14;;12816:6;12790:49;:::i;:::-;12780:59;;12870:6;12864:13;12886:54;12931:8;12927:2;12920:4;12912:6;12908:17;12886:54;:::i;:::-;-1:-1:-1;;;12962:17:1;;12988:27;;;13042:1;13031:13;;11375:1675;-1:-1:-1;;;;;;;;11375:1675:1:o;13055:2010::-;-1:-1:-1;;;13999:57:1;;14079:13;;13981:3;;14101:62;14079:13;14151:2;14142:12;;14135:4;14123:17;;14101:62;:::i;:::-;-1:-1:-1;;;14222:2:1;14182:16;;;14214:11;;;14207:67;14293:46;14335:2;14327:11;;14319:6;14293:46;:::i;:::-;-1:-1:-1;;;14348:26:1;;14399:13;;14283:56;;-1:-1:-1;14421:62:1;14399:13;14470:1;14462:10;;14455:4;14443:17;;14421:62;:::i;:::-;-1:-1:-1;;;14543:1:1;14502:17;;;;14535:10;;;14528:60;14613:13;;14635:63;14613:13;14684:2;14676:11;;14669:4;14657:17;;14635:63;:::i;:::-;14763:66;14758:2;14717:17;;;;14750:11;;;14743:87;-1:-1:-1;;;14854:2:1;14846:11;;14839:37;14901:13;;14923:63;14901:13;14972:2;14964:11;;14957:4;14945:17;;14923:63;:::i;:::-;15002:57;15055:2;15044:8;15040:2;15036:17;15032:26;-1:-1:-1;;;8817:27:1;;8869:1;8860:11;;8752:125;15002:57;14995:64;13055:2010;-1:-1:-1;;;;;;;;;13055:2010:1:o;15070:448::-;15332:31;15327:3;15320:44;15302:3;15393:6;15387:13;15409:62;15464:6;15459:2;15454:3;15450:12;15443:4;15435:6;15431:17;15409:62;:::i;:::-;15491:16;;;;15509:2;15487:25;;15070:448;-1:-1:-1;;15070:448:1:o;15523:426::-;-1:-1:-1;;;15780:3:1;15773:24;15755:3;15826:6;15820:13;15842:61;15896:6;15892:1;15887:3;15883:11;15876:4;15868:6;15864:17;15842:61;:::i;:::-;15923:16;;;;15941:1;15919:24;;15523:426;-1:-1:-1;;15523:426:1:o;15954:460::-;16171:6;16166:3;16159:19;16233:26;16229:31;16220:6;16216:2;16212:15;16208:53;16203:2;16198:3;16194:12;16187:75;16141:3;16291:6;16285:13;16307:60;16360:6;16355:2;16350:3;16346:12;16341:2;16333:6;16329:15;16307:60;:::i;:::-;16387:16;;;;16405:2;16383:25;;15954:460;-1:-1:-1;;;;15954:460:1:o;16627:488::-;-1:-1:-1;;;;;16896:15:1;;;16878:34;;16948:15;;16943:2;16928:18;;16921:43;16995:2;16980:18;;16973:34;;;17043:3;17038:2;17023:18;;17016:31;;;16821:4;;17064:45;;17089:19;;17081:6;17064:45;:::i;:::-;17056:53;16627:488;-1:-1:-1;;;;;;16627:488:1:o;17312:217::-;17459:2;17448:9;17441:21;17422:4;17479:44;17519:2;17508:9;17504:18;17496:6;17479:44;:::i;19034:414::-;19236:2;19218:21;;;19275:2;19255:18;;;19248:30;19314:34;19309:2;19294:18;;19287:62;-1:-1:-1;;;19380:2:1;19365:18;;19358:48;19438:3;19423:19;;19034:414::o;26467:410::-;26669:2;26651:21;;;26708:2;26688:18;;;26681:30;26747:34;26742:2;26727:18;;26720:62;-1:-1:-1;;;26813:2:1;26798:18;;26791:44;26867:3;26852:19;;26467:410::o;27458:275::-;27529:2;27523:9;27594:2;27575:13;;-1:-1:-1;;27571:27:1;27559:40;;27629:18;27614:34;;27650:22;;;27611:62;27608:88;;;27676:18;;:::i;:::-;27712:2;27705:22;27458:275;;-1:-1:-1;27458:275:1:o;27738:186::-;27786:4;27819:18;27811:6;27808:30;27805:56;;;27841:18;;:::i;:::-;-1:-1:-1;27907:2:1;27886:15;-1:-1:-1;;27882:29:1;27913:4;27878:40;;27738:186::o;28055:128::-;28095:3;28126:1;28122:6;28119:1;28116:13;28113:39;;;28132:18;;:::i;:::-;-1:-1:-1;28168:9:1;;28055:128::o;28188:120::-;28228:1;28254;28244:35;;28259:18;;:::i;:::-;-1:-1:-1;28293:9:1;;28188:120::o;28313:168::-;28353:7;28419:1;28415;28411:6;28407:14;28404:1;28401:21;28396:1;28389:9;28382:17;28378:45;28375:71;;;28426:18;;:::i;:::-;-1:-1:-1;28466:9:1;;28313:168::o;28486:125::-;28526:4;28554:1;28551;28548:8;28545:34;;;28559:18;;:::i;:::-;-1:-1:-1;28596:9:1;;28486:125::o;28616:258::-;28688:1;28698:113;28712:6;28709:1;28706:13;28698:113;;;28788:11;;;28782:18;28769:11;;;28762:39;28734:2;28727:10;28698:113;;;28829:6;28826:1;28823:13;28820:48;;;-1:-1:-1;;28864:1:1;28846:16;;28839:27;28616:258::o;28879:380::-;28958:1;28954:12;;;;29001;;;29022:61;;29076:4;29068:6;29064:17;29054:27;;29022:61;29129:2;29121:6;29118:14;29098:18;29095:38;29092:161;;;29175:10;29170:3;29166:20;29163:1;29156:31;29210:4;29207:1;29200:15;29238:4;29235:1;29228:15;29092:161;;28879:380;;;:::o;29264:135::-;29303:3;-1:-1:-1;;29324:17:1;;29321:43;;;29344:18;;:::i;:::-;-1:-1:-1;29391:1:1;29380:13;;29264:135::o;29404:112::-;29436:1;29462;29452:35;;29467:18;;:::i;:::-;-1:-1:-1;29501:9:1;;29404:112::o;29521:127::-;29582:10;29577:3;29573:20;29570:1;29563:31;29613:4;29610:1;29603:15;29637:4;29634:1;29627:15;29653:127;29714:10;29709:3;29705:20;29702:1;29695:31;29745:4;29742:1;29735:15;29769:4;29766:1;29759:15;29785:127;29846:10;29841:3;29837:20;29834:1;29827:31;29877:4;29874:1;29867:15;29901:4;29898:1;29891:15;29917:127;29978:10;29973:3;29969:20;29966:1;29959:31;30009:4;30006:1;29999:15;30033:4;30030:1;30023:15;30049:127;30110:10;30105:3;30101:20;30098:1;30091:31;30141:4;30138:1;30131:15;30165:4;30162:1;30155:15;30181:131;-1:-1:-1;;;;;30256:31:1;;30246:42;;30236:70;;30302:1;30299;30292:12;30317:131;-1:-1:-1;;;;;;30391:32:1;;30381:43;;30371:71;;30438:1;30435;30428:12

Swarm Source

ipfs://06731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac
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.