ETH Price: $3,880.90 (-1.17%)

Token

AltNouns (ALTNOUNS)
 

Overview

Max Total Supply

129 ALTNOUNS

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
IMF: Deployer
Balance
1 ALTNOUNS
0x387a161C6b25aA854100aBaED39274e51aaffffd
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:
AltNouns

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-30
*/

//SPDX-License-Identifier: GPL-3.0
/// @title The Alt Nouns ERC-721 token


/*********************************
 * █████████████████████████████ *
 * █████████████████████████████ *
 * ██████░░░░░░░░░██░░░░░░░░░███ *
 * ██████░░███░░░░██░░███░░░░███ *
 * ██░░░░░░███░░░░░░░░███░░░░███ *
 * ██░░██░░███░░░░██░░███░░░░███ *
 * ██░░██░░███░░░░██░░███░░░░███ *
 * ██████░░░░░░░░░██░░░░░░░░░███ *
 * █████████████████████████████ *
 * ██ ALT NOUNS ████████████████ *
 * ██ by @onChainCo ████████████ *
 * █████████████████████████████ *
 *********************************/


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






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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

    /**
     * Length
     * 
     * Returns the length of the specified string
     * 
     * @param _base When being used for a data type this is the extended object
     *              otherwise this is the string to be measured
     * @return uint The length of the passed string
     */
    function length(string memory _base)
        internal
        pure
        returns (uint) {
        bytes memory _baseBytes = bytes(_base);
        return _baseBytes.length;
    }

    /**
     * Sub String
     * 
     * Extracts the part of a string based on the desired length and offset. The
     * offset and length must not exceed the lenth of the base string.
     * 
     * @param _base When being used for a data type this is the extended object
     *              otherwise this is the string that will be used for 
     *              extracting the sub string from
     * @param _length The length of the sub string to be extracted from the base
     * @param _offset The starting point to extract the sub string from
     * @return string The extracted sub string
     */
    function _substring(string memory _base, int _length, int _offset)
        internal
        pure
        returns (string memory) {
        bytes memory _baseBytes = bytes(_base);

        assert(uint(_offset + _length) <= _baseBytes.length);

        string memory _tmp = new string(uint(_length));
        bytes memory _tmpBytes = bytes(_tmp);

        uint j = 0;
        for (uint i = uint(_offset); i < uint(_offset + _length); i++) {
            _tmpBytes[j++] = _baseBytes[i];
        }

        return string(_tmpBytes);
    }

    /**
     * Index Of
     *
     * Locates and returns the position of a character within a string
     * 
     * @param _base When being used for a data type this is the extended object
     *              otherwise this is the string acting as the haystack to be
     *              searched
     * @param _value The needle to search for, at present this is currently
     *               limited to one character
     * @return int The position of the needle starting from 0 and returning -1
     *             in the case of no matches found
     */
    function indexOf(string memory _base, string memory _value)
        internal
        pure
        returns (int) {
        return _indexOf(_base, _value, 0);
    }

    /**
     * Index Of
     *
     * Locates and returns the position of a character within a string starting
     * from a defined offset
     * 
     * @param _base When being used for a data type this is the extended object
     *              otherwise this is the string acting as the haystack to be
     *              searched
     * @param _value The needle to search for, at present this is currently
     *               limited to one character
     * @param _offset The starting point to start searching from which can start
     *                from 0, but must not exceed the length of the string
     * @return int The position of the needle starting from 0 and returning -1
     *             in the case of no matches found
     */
    function _indexOf(string memory _base, string memory _value, uint _offset)
        internal
        pure
        returns (int) {
        bytes memory _baseBytes = bytes(_base);
        bytes memory _valueBytes = bytes(_value);

        assert(_valueBytes.length == 1);

        for (uint i = _offset; i < _baseBytes.length; i++) {
            if (_baseBytes[i] == _valueBytes[0]) {
                return int(i);
            }
        }

        return -1;
    }
}




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









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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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







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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







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

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

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


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

/// @title Interface for NounsToken

/*********************************
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░██░░░████░░██░░░████░░░ *
 * ░░██████░░░████████░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 *********************************/

interface INounsToken {
    function dataURI(uint256 tokenId) external view returns (string memory);
}



/*

Behold, an infinite (derivative) work of art.

By On Chain Collective

 ______   __       ______     __   __   ______   __  __   __   __   ______             
/\  __ \ /\ \     /\__  _\   /\ "-.\ \ /\  __ \ /\ \/\ \ /\ "-.\ \ /\  ___\            
\ \  __ \\ \ \____\/_/\ \/   \ \ \-.  \\ \ \/\ \\ \ \_\ \\ \ \-.  \\ \___  \           
 \ \_\ \_\\ \_____\  \ \_\    \ \_\\"\_\\ \_____\\ \_____\\ \_\\"\_\\/\_____\          
  \/_/\/_/ \/_____/   \/_/     \/_/ \/_/ \/_____/ \/_____/ \/_/ \/_/ \/_____/          
                                                                                       
                                     ______   __  __       ______   ______   ______    
                                    /\  == \ /\ \_\ \     /\  __ \ /\  ___\ /\  ___\   
                                    \ \  __< \ \____ \    \ \ \/\ \\ \ \____\ \ \____  
                                     \ \_____\\/\_____\    \ \_____\\ \_____\\ \_____\ 
                                      \/_____/ \/_____/     \/_____/ \/_____/ \/_____/ 
                                                                                       
 */

contract AltNouns is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint256 private price = 0.25 ether;
    uint256 public priceIncrement = 0.75 ether;
    uint256 public numTokensMinted;
    uint256 public maxPerAddress = 2;

    bool public allSalesPaused = true;
    bool public priceChangesLocked = false;
    bool public dynamicPriceEnabled = true;
    bool public reservedMintsLocked = false;

    mapping(address => uint256) private _mintPerAddress;
    mapping(uint256 => uint256) private _altForId;

    address public nounsTokenContract = 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03;
    uint256 public nounsTokenIndexOffset;

    /*
     ______  ______   ______   __  __   _____    ______       ______   ______   __   __   _____    ______   __    __   __   __   ______   ______   ______    
    /\  == \/\  ___\ /\  ___\ /\ \/\ \ /\  __-. /\  __ \     /\  == \ /\  __ \ /\ "-.\ \ /\  __-. /\  __ \ /\ "-./  \ /\ "-.\ \ /\  ___\ /\  ___\ /\  ___\   
    \ \  _-/\ \___  \\ \  __\ \ \ \_\ \\ \ \/\ \\ \ \/\ \    \ \  __< \ \  __ \\ \ \-.  \\ \ \/\ \\ \ \/\ \\ \ \-./\ \\ \ \-.  \\ \  __\ \ \___  \\ \___  \  
     \ \_\   \/\_____\\ \_____\\ \_____\\ \____- \ \_____\    \ \_\ \_\\ \_\ \_\\ \_\\"\_\\ \____- \ \_____\\ \_\ \ \_\\ \_\\"\_\\ \_____\\/\_____\\/\_____\ 
      \/_/    \/_____/ \/_____/ \/_____/ \/____/  \/_____/     \/_/ /_/ \/_/\/_/ \/_/ \/_/ \/____/  \/_____/ \/_/  \/_/ \/_/ \/_/ \/_____/ \/_____/ \/_____/ 

     */

    // The almighty pseudo random number generator
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    // Uses blockhash, tokenId, etc. as inputs for random(), and returns a random number between minNum & maxNum
    function pluckNum(uint256 tokenId, string memory keyPrefix, uint256 minNum, uint256 maxNum) internal view returns (uint256) {
        uint256 rand = random(string(abi.encodePacked(blockhash(block.number - 1), keyPrefix, toString(tokenId), minNum, maxNum,_msgSender())));
        uint256 num = rand % (maxNum - minNum + 1) + minNum;
        return num;
    }

    // Uses blockhash and tokenId as inputs for random() for new Alt Nouns, or returns stored Alt Type for existing Alt Nouns
    function getAltType(uint256 tokenId) private view returns (uint256) {
        if (_altForId[tokenId] == 0) {
            uint256 rand = random(string(abi.encodePacked(blockhash(block.number - 1), toString(tokenId))));
            uint256 altType = rand % 19;

            return altType;
        } else {
            return _altForId[tokenId] - 1;
        }
    }

    /*
     ______   __       ______     ______  ______   ______   __   ______  ______    
    /\  __ \ /\ \     /\__  _\   /\__  _\/\  == \ /\  __ \ /\ \ /\__  _\/\  ___\   
    \ \  __ \\ \ \____\/_/\ \/   \/_/\ \/\ \  __< \ \  __ \\ \ \\/_/\ \/\ \___  \  
     \ \_\ \_\\ \_____\  \ \_\      \ \_\ \ \_\ \_\\ \_\ \_\\ \_\  \ \_\ \/\_____\ 
      \/_/\/_/ \/_____/   \/_/       \/_/  \/_/ /_/ \/_/\/_/ \/_/   \/_/  \/_____/ 

     */

    string[19] altNames = ['Jittery','Wavy','Uhhhhh','Glitching','Static','Immobilized','Snapped','?????','Anti-noun','Wall','Warped','Totem','Outta Focus','Spirit','Collapsing','Exploding','Nether-noun','Distorted','Fractionalize'];

    function getTraits(uint256 tokenId) private view returns (string memory) {

        uint256 altType = getAltType(tokenId);
        string[3] memory parts;

        parts[0] = ', "attributes": [{"trait_type": "Alteration","value": "';
        parts[1] = altNames[altType];
        parts[2] = '"}], ';

        string memory result = string(abi.encodePacked(parts[0], parts[1], parts[2]));

        return result;
    }

    /*
     ______   __   __ ______       __    __   ______   __   __   __   ______  __  __   __       ______   ______  __   ______   __   __    
    /\  ___\ /\ \ / //\  ___\     /\ "-./  \ /\  __ \ /\ "-.\ \ /\ \ /\  == \/\ \/\ \ /\ \     /\  __ \ /\__  _\/\ \ /\  __ \ /\ "-.\ \   
    \ \___  \\ \ \'/ \ \ \__ \    \ \ \-./\ \\ \  __ \\ \ \-.  \\ \ \\ \  _-/\ \ \_\ \\ \ \____\ \  __ \\/_/\ \/\ \ \\ \ \/\ \\ \ \-.  \  
     \/\_____\\ \__|  \ \_____\    \ \_\ \ \_\\ \_\ \_\\ \_\\"\_\\ \_\\ \_\   \ \_____\\ \_____\\ \_\ \_\  \ \_\ \ \_\\ \_____\\ \_\\"\_\ 
      \/_____/ \/_/    \/_____/     \/_/  \/_/ \/_/\/_/ \/_/ \/_/ \/_/ \/_/    \/_____/ \/_____/ \/_/\/_/   \/_/  \/_/ \/_____/ \/_/ \/_/ 

     */

    // Returns alterations
    function getAlteration(uint256 tokenId) private view returns (string memory) {
        string memory feTurbulence;
        string memory feDisplacementMap;
        string memory feTurbulenceAnim;
        string memory feDisplacementMapAnim;

        uint256 altType = getAltType(tokenId);

        if (altType == 0) {
            // Jittery
            feTurbulence = '0.035';
            feDisplacementMap = '9';
            feTurbulenceAnim = '<animate attributeName="baseFrequency" begin="0s" dur="0.15s" values="0.0812;0.0353;0.0041;0.0424;0.0010;0.0934" repeatCount="indefinite"/>';
        } else if (altType == 1) {
            // Wavy
            feTurbulence = string(abi.encodePacked('0.0',toString(pluckNum(tokenId, "Way", 1, 99)),' ','0.0',toString(pluckNum(tokenId, "Vee", 1, 99))));
            feDisplacementMap = '50';
        } else if (altType == 2) {
            // Uhhhhh
            feTurbulence = string(abi.encodePacked('0.0',toString(pluckNum(tokenId, "Uhhhhh", 15, 20))));
            feDisplacementMap = toString(pluckNum(tokenId, "Uhhhhh", 100, 300));
        } else if (altType == 3) {
            // Glitching
            return '<feDisplacementMap in="SourceGraphic" scale="0"><animate attributeName="scale" begin="0s" dur="10s" values="18.51;16.14;-7.81;4.40;-5.97;5.83;-4.63;8.88;-6.38;11.70;9.35;-14.77;-18.40;8.72;-12.61;14.69;6.56;11.47;-5.59;13.16;19.81;3.56;-1.47;3.95;-16.19;-8.11;-3.04;-10.54;-2.04;-14.23;2.00;-12.81;16.28;-0.54;7.18;-1.52;-10.86;-9.92;-7.48;-0.47;-15.37;17.88;19.83;-10.57;5.75;5.67;-1.84;10.87;1.80;8.13;15.44;-11.35;7.77;-15.39;-18.19;14.66;-7.26;-14.34;-14.41;-3.52;-13.27;-7.34;-19.83;17.63;-14.66;-13.68;-18.70;10.14;0.93;-17.23;15.29;2.20;-0.94;-16.04;-0.55;15.80;-7.77;-12.51;-1.13;-11.18;-15.50;5.72;-13.99;-7.17;-2.19;10.36;-11.09;5.68;-15.20;3.09;-6.79;13.58;-12.04;-10.05;17.14;1.32;-15.67;-14.96;-1.01;-3.94;-11.90;-13.77;-2.27;14.63;12.37;-19.31;-3.99;-13.19;14.06;-15.91;-5.03;-6.54;19.74;-5.67;15.57;-6.80;14.24;2.03;-19.11;-14.10;0.35;-19.23;-13.11;12.04;9.69;13.88;5.13;11.94" repeatCount="indefinite"/></feDisplacementMap>';
        } else if (altType == 4) {
            // Static
            return '<feTurbulence numOctaves="3" seed="2" baseFrequency="0.02 0.05" type="fractalNoise"><animate attributeName="baseFrequency" begin="0s" dur="60s" values="0.002 0.06;0.004 0.08;0.002 0.06" repeatCount="indefinite"/></feTurbulence><feDisplacementMap scale="20" in="SourceGraphic"></feDisplacementMap>';
        } else if (altType == 5) {
            // Immobilized
            feTurbulence = '0.5';
            feDisplacementMap = '0';
            feDisplacementMapAnim = '<animate attributeName="scale" begin="0s" dur="0.5s" values="36.72;58.84;36.90;14.99;13.26;47.30;58.24;21.58;46.51;40.17;35.83;36.08;42.74;32.16;46.57;33.67;17.31;52.09;30.80;40.37;43.99;36.21;16.18;20.04;15.72;50.92;41.35;26.12;31.38;30.41;59.51;10.51;45.48;19.59;58.88;33.92;26.88;13.50;31.85;43.88;33.05;22.82;56.26;27.90;51.95;26.47;27.13;32.41;18.12;52.98;50.04;17.62;27.43;52.81;21.61;15.11;25.89;27.39;39.35;51.29" repeatCount="indefinite"/>';
        } else if (altType == 6) {
            // Snapped
            feTurbulence = string(abi.encodePacked('0.',toString(pluckNum(tokenId, "Snapped", 100, 500))));
            feDisplacementMap = toString(pluckNum(tokenId, "Snapped", 100, 500));
        } else if (altType == 7) {
            // ?????
            feTurbulence = string(abi.encodePacked('0.0',toString(pluckNum(tokenId, "?????", 100, 500)),'" numOctaves="10'));
            feDisplacementMap = toString(pluckNum(tokenId, "?????", 200, 300));
        } else if (altType == 8) {
            // Anti-noun
            return '<feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>';
        } else if (altType == 9) {
            // Wall
            return '<feTile in="SourceGraphic" x="90" y="100" width="140" height="100" /><feTile/>';
        } else if (altType == 10) {
            // Warped
            return '<feTile in="SourceGraphic" x="0" y="140" width="320" height="20" /><feTile/>';
        } else if (altType == 11) {
            // Totem
            return '<feTile in="SourceGraphic" x="0" y="100" width="320" height="80" /><feTile/>';
        } else if (altType == 12) {
            // Outta Focus
            return '<feGaussianBlur in="SourceGraphic" stdDeviation="3"><animate attributeName="stdDeviation" begin="0s" dur="4s" values="0;4;3;5;3;2;5;7;8;10;15;0;0;0;0;0;0;0;0" repeatCount="indefinite"/></feGaussianBlur>';
        } else if (altType == 13) {
            // Spirit
            return '<feColorMatrix type="matrix" values=".33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0  0 0 0 0.2 0"></feColorMatrix>';
        } else if (altType == 14) {
            // Collapsing
            return '<feTurbulence baseFrequency="0.05" type="fractalNoise" numOctaves="9"></feTurbulence><feDisplacementMap in="SourceGraphic" scale="200"><animate attributeName="scale" begin="0s" dur="16s" values="40;550;1;40" fill="freeze" repeatCount="indefinite"/></feDisplacementMap><feMorphology operator="erode" radius="25"><animate attributeName="radius" begin="0s" dur="16s" values="1;25;1;1" fill="freeze" repeatCount="indefinite"/></feMorphology>';
        } else if (altType == 15) {
            // Exploding
            return string(abi.encodePacked('<feMorphology operator="dilate" radius="',toString(pluckNum(tokenId, "Explode", 5, 40)),'"></feMorphology>'));
        } else if (altType == 16) {
            // Nether-noun
            return '<feTile in="SourceGraphic" x="90" y="100" width="140" height="100" /><feTile x="0" y="0" width="320" height="320"/><feBlend in2="SourceGraphic" mode="color-burn"/><feTile x="0" y="0" width="320" height="320"/><feBlend in2="SourceGraphic" mode="color-burn"/><feTile x="0" y="0" width="320" height="320"/><feBlend in2="SourceGraphic" mode="color-burn"/>';
        } else if (altType == 17) {
            // Distorted
            return '<feTile id="eye" in="SourceGraphic" x="142.5" y="110" width="45" height="50" /><feTile/><feTile in2="strip" x="0" y="0" width="320" height="320"/><feBlend in2="SourceGraphic" mode="exclusion"/>';
        } else if (altType == 18) {
            // Fractionalize
            return '<feTurbulence baseFrequency="0.01 0.01" type="fractalNoise" numOctaves="5" seed="12453"><animate attributeName="seed" begin="0s" dur="16s" values="1;20;160" repeatCount="indefinite" /></feTurbulence><feDisplacementMap in="SourceGraphic" scale="300"><animate attributeName="scale" begin="0s" dur="16s" values="1;200;1000;1;1" repeatCount="indefinite" /></feDisplacementMap>';
        }

        string memory result = string(abi.encodePacked('<feTurbulence baseFrequency="',feTurbulence,'" type="fractalNoise">',feTurbulenceAnim,'</feTurbulence><feDisplacementMap in="SourceGraphic" scale="',feDisplacementMap,'">',feDisplacementMapAnim,'</feDisplacementMap>'));

        return result;
    }

    function altNoun(string memory noun, uint256 tokenId) private view returns (string memory) {

        // Decoding the noun tokenURI
        string memory decodedNoun = string(Base64.decode(Strings._substring(noun, int256(Strings.length(noun) - 29), 29)));

        // Finds the index of ';' in decoded tokenURI & adds 8 to it (for 'base64,') to set the starting index for the encoded SVG
        uint256 index = uint256(Strings.indexOf(decodedNoun, ';'));
        index = index+8;

        // Substring subtracts 2 from (length - index) to skip the last two characters, i.e. '"}'
        string memory nounSVG = Strings._substring(decodedNoun, int256(Strings.length(decodedNoun) - index - 2), int256(index));

        // Decoding the noun encoded SVG
        bytes memory SVG = Base64.decode(nounSVG);

        // Opening SVG tag
        string memory openingTag = '<svg width="320" height="320" viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges">';

        // Grabbing the Noun inside the SVG tag
        string memory innerSVG = getInnerSVG(SVG);

        // Opening <g> tag for filters
        string memory openingGTag = '<g filter="url(#alteration)">';

        // Closing <g> tag and alteration filter
        string memory alterationAndClosingTag = string(abi.encodePacked('</g><defs><filter id="alteration" x="-50%" y="-50%" width="200%" height="200%">',getAlteration(tokenId),'</filter></defs></svg>'));

        // Concatenating everything to get the final Alt Noun SVG
        return string(abi.encodePacked(openingTag,openingGTag,innerSVG,alterationAndClosingTag));
    }

    function getInnerSVG(bytes memory svgBytes) internal pure returns (string memory) {
        bytes memory result = new bytes(svgBytes.length - 122);
        for(uint i = 0; i < result.length; i++) {
            result[i] = svgBytes[i+116];
        }
        return string(result);
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        require(_exists(tokenId), "URI query for nonexistent token");
        string memory noun = INounsToken(nounsTokenContract).dataURI(tokenId);
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Alt Noun ', toString(tokenId), '", "description": "Hmmm... Something is up with Alt Noun ', toString(tokenId), '"',getTraits(tokenId),'"image": "data:image/svg+xml;base64,', Base64.encode(bytes(altNoun(noun, tokenId))), '"}'))));
        json = string(abi.encodePacked('data:application/json;base64,', json));
        return json;
    }

    /*
     __    __   __   __   __   ______  __   __   __   ______       ______  __  __   __   __   ______   ______  __   ______   __   __   ______    
    /\ "-./  \ /\ \ /\ "-.\ \ /\__  _\/\ \ /\ "-.\ \ /\  ___\     /\  ___\/\ \/\ \ /\ "-.\ \ /\  ___\ /\__  _\/\ \ /\  __ \ /\ "-.\ \ /\  ___\   
    \ \ \-./\ \\ \ \\ \ \-.  \\/_/\ \/\ \ \\ \ \-.  \\ \ \__ \    \ \  __\\ \ \_\ \\ \ \-.  \\ \ \____\/_/\ \/\ \ \\ \ \/\ \\ \ \-.  \\ \___  \  
     \ \_\ \ \_\\ \_\\ \_\\"\_\  \ \_\ \ \_\\ \_\\"\_\\ \_____\    \ \_\   \ \_____\\ \_\\"\_\\ \_____\  \ \_\ \ \_\\ \_____\\ \_\\"\_\\/\_____\ 
      \/_/  \/_/ \/_/ \/_/ \/_/   \/_/  \/_/ \/_/ \/_/ \/_____/     \/_/    \/_____/ \/_/ \/_/ \/_____/   \/_/  \/_/ \/_____/ \/_/ \/_/ \/_____/ 
                                                                                                                                             
    */

    // Checks if a supplied tokenId is a valid noun
    function isNounValid(uint256 tokenId) private view returns (bool) {
        bool isValid = (tokenId + nounsTokenIndexOffset == IERC721Enumerable(nounsTokenContract).tokenByIndex(tokenId));
        return isValid;
    }

    // Updates nounsTokenIndexOffset. Default value is 0 (since indexOf(tokenId) check should match tokenId), but in case a Noun is burned, the offset may require a manual update to allow Alt Nouns to be minted again
    function setNounsTokenIndexOffset(uint256 newOffset) public onlyOwner {
        nounsTokenIndexOffset = newOffset;
    }

    // Mint function that saves the Alt Type (for future tokenURI reads), mints the supplied tokenId and increments counters
    function mint(address destination, uint256 tokenId) private {
        require(isNounValid(tokenId), "This noun does not exist (yet). So its Alt Noun cannot exist either.");
        
        _altForId[tokenId] = getAltType(tokenId) + 1;
        _safeMint(destination, tokenId);
        numTokensMinted += 1;
        _mintPerAddress[msg.sender] += 1;
    }
    
    // Public minting for a supplied tokenId, except for every 10th Alt Noun
    function publicMint(uint256 tokenId) public payable virtual {
        require(!allSalesPaused, "Sales are currently paused");
        require(tokenId%10 != 0, "Every 10th Alt Noun is reserved for Noun holders and Alt Nounders, in perpetuity");
        require(getCurrentPrice() == msg.value, "ETH amount is incorrect");
        require(_mintPerAddress[msg.sender] < maxPerAddress,  "You can't exceed the minting limit for your wallet");
        mint(_msgSender(),tokenId);
    }
    
    // Allows Noun holders to mint any Alt Noun for a supplied tokenId, including every 10th Alt Noun
    function nounHolderMint(uint256 tokenId) public payable virtual {
        require(!allSalesPaused, "Sales are currently paused");
        require(IERC721Enumerable(nounsTokenContract).balanceOf(_msgSender()) > 0, "Every 10th Alt Noun is reserved for Noun holders and Alt Nounders, in perpetuity");
        require(getCurrentPrice() == msg.value, "ETH amount is incorrect");
        require(_mintPerAddress[msg.sender] < maxPerAddress,  "You can't exceed this wallet's minting limit");
        mint(_msgSender(),tokenId);
    }
    
    // Allows owner to mint any available tokenId. To be used with discretion & lockable via lockReservedMints()
    function reservedMint(uint256 tokenId) public payable onlyOwner {
        require(!reservedMintsLocked, "Reserved mints locked. Oops lol");
        mint(_msgSender(),tokenId);
    }

    /*
     ______   ______   __       ______       __  __   ______  __   __       __   ______  __  __       ______  __  __   __   __   ______   ______  __   ______   __   __   ______    
    /\  ___\ /\  __ \ /\ \     /\  ___\     /\ \/\ \ /\__  _\/\ \ /\ \     /\ \ /\__  _\/\ \_\ \     /\  ___\/\ \/\ \ /\ "-.\ \ /\  ___\ /\__  _\/\ \ /\  __ \ /\ "-.\ \ /\  ___\   
    \ \___  \\ \  __ \\ \ \____\ \  __\     \ \ \_\ \\/_/\ \/\ \ \\ \ \____\ \ \\/_/\ \/\ \____ \    \ \  __\\ \ \_\ \\ \ \-.  \\ \ \____\/_/\ \/\ \ \\ \ \/\ \\ \ \-.  \\ \___  \  
     \/\_____\\ \_\ \_\\ \_____\\ \_____\    \ \_____\  \ \_\ \ \_\\ \_____\\ \_\  \ \_\ \/\_____\    \ \_\   \ \_____\\ \_\\"\_\\ \_____\  \ \_\ \ \_\\ \_____\\ \_\\"\_\\/\_____\ 
      \/_____/ \/_/\/_/ \/_____/ \/_____/     \/_____/   \/_/  \/_/ \/_____/ \/_/   \/_/  \/_____/     \/_/    \/_____/ \/_/ \/_/ \/_____/   \/_/  \/_/ \/_____/ \/_/ \/_/ \/_____/ 
                                                                                                                                                                                
     */

    // Returns the current price per mint
    function getCurrentPrice() public view returns (uint256 dynamicPrice) {

        // Since solidity doesn't support floats, supplyDiv will be 0 for <100, 1 for 100 to 200 etc.
        uint256 supplyDiv = totalSupply() / 100;

        // If dynamic pricing disabled or <100 minted, return price
        if (supplyDiv == 0 || !dynamicPriceEnabled) {
            return price;
        }

        // Otherwise, price = priceIncrement added to itself, once for every 100 Alt Noun mints

        dynamicPrice = 0 ether;

        for (uint256 index = 0; index < supplyDiv; index++) {
            dynamicPrice = dynamicPrice + priceIncrement;
        }

        return dynamicPrice;
    }

    // Pauses all sales, except reserved mints
    function toggleAllSalesPaused() public onlyOwner {
        allSalesPaused = !allSalesPaused;
    }
    
    // Locks all pricing states, forever
    function lockPriceChanges() public onlyOwner {
        priceChangesLocked = true;
    }

    // Locks owners ability to use reservedMints()
    function lockReservedMints() public onlyOwner {
        reservedMintsLocked = true;
    }
    
    // Sets mint price
    function setPrice(uint256 newPrice) public onlyOwner {
        require(!priceChangesLocked, "Price changes are now locked");
        price = newPrice;
    }
    
    // Toggles dynamic pricing
    function toggleDynamicPrice() public onlyOwner {
        require(!priceChangesLocked, "Price changes are now locked");
        dynamicPriceEnabled = !dynamicPriceEnabled;
    }
    
    // Sets dynamic pricing increment that gets added to the price after ever 100 mints
    function setPriceIncrement(uint256 newPriceIncrement) public onlyOwner {
        require(!priceChangesLocked, "Price changes are now locked");
        priceIncrement = newPriceIncrement;
    }

    // Withdraws contract balance to contract owners account
    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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



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

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

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

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

        bytes memory table = TABLE;

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

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

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

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

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
    
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";
    
    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

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

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        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":[],"name":"allSalesPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicPriceEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"dynamicPrice","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":"lockPriceChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockReservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"nounHolderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nounsTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nounsTokenIndexOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceChangesLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reservedMintsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOffset","type":"uint256"}],"name":"setNounsTokenIndexOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceIncrement","type":"uint256"}],"name":"setPriceIncrement","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":[],"name":"toggleAllSalesPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleDynamicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6703782dace9d90000600c55670a688906bd8b0000600d9081556002600f556010805463ff0000001962ffff001960ff19909216600117919091166201000017169055601380546001600160a01b031916739c8ff314c9bc7f6e59a9d9225fb22946427edc0317815560076102e0818152664a69747465727960c81b6103005260809081526004610320818152635761767960e01b6103405260a0526006610360818152650aad0d0d0d0d60d31b6103805260c05260096103a081815268476c69746368696e6760b81b6103c05260e0526103e08281526553746174696360d01b6104005261010052600b6104208181526a125b5b5bd89a5b1a5e995960aa1b61044052610120526104609586526614db985c1c195960ca1b610480526101409590955260056104a0818152643f3f3f3f3f60d81b6104c052610160526104e08281526820b73a3496b737bab760b91b61050052610180526105209384526315d85b1b60e21b610540526101a0939093526105608281526515d85c9c195960d21b610580526101c0526105a092835264546f74656d60d81b6105c0526101e0929092526105e08481526a4f7574746120466f63757360a81b61060052610200526106209081526514dc1a5c9a5d60d21b6106405261022052600a61066090815269436f6c6c617073696e6760b01b61068052610240526106a0818152684578706c6f64696e6760b81b6106c052610260526106e09283526a2732ba3432b916b737bab760a91b610700526102809290925261072091825268111a5cdd1bdc9d195960ba1b610740526102a0919091526107a06040526107609283526c4672616374696f6e616c697a6560981b610780526102c09290925262000284916015916200037b565b503480156200029257600080fd5b5060405180604001604052806008815260200167416c744e6f756e7360c01b81525060405180604001604052806008815260200167414c544e4f554e5360c01b8152508160009080519060200190620002ed929190620003d2565b50805162000303906001906020840190620003d2565b50506001600a55506200031f6200031962000325565b62000329565b62000517565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8260138101928215620003c0579160200282015b82811115620003c05782518051620003af918491602090910190620003d2565b50916020019190600101906200038f565b50620003ce9291506200045d565b5090565b828054620003e090620004da565b90600052602060002090601f0160209004810192826200040457600085556200044f565b82601f106200041f57805160ff19168380011785556200044f565b828001600101855582156200044f579182015b828111156200044f57825182559160200191906001019062000432565b50620003ce9291506200047e565b80821115620003ce57600062000474828262000495565b506001016200045d565b5b80821115620003ce57600081556001016200047f565b508054620004a390620004da565b6000825580601f10620004b75750620004d7565b601f016020900490600052602060002090810190620004d791906200047e565b50565b600281046001821680620004ef57607f821691505b602082108114156200051157634e487b7160e01b600052602260045260246000fd5b50919050565b61503680620005276000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063dd4bb07b1161006f578063dd4bb07b146105f0578063e82f511314610605578063e985e9c51461061a578063eb91d37e1461063a578063f2fde38b1461064f5761023b565b8063b88d4fde14610566578063bae614cf14610586578063c824e98e146105a6578063c87b56dd146105bb578063d82a0dec146105db5761023b565b80638da5cb5b116100f25780638da5cb5b146104e757806391b7f5ed146104fc57806395d89b411461051c578063a22cb46514610531578063b6f00dbd146105515761023b565b8063715018a61461048d578063853828b6146104a25780638ad8f390146104aa5780638bbf4e8b146104bf5780638c74bf0e146104d45761023b565b80632f745c59116101bc5780634bc6501e116101805780634bc6501e146104035780634f6ccce7146104185780636352211e14610438578063639814e01461045857806370a082311461046d5761023b565b80632f745c5914610379578063343aa674146103995780634230baee146103ae57806342842e0e146103c35780634905269c146103e35761023b565b80632089885011610203578063208988501461030957806323b872dd1461031c578063280d62ac1461033c57806328bcd1ff146103515780632db11544146103665761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc14610298578063095ea7b3146102c557806318160ddd146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612efa565b61066f565b60405161026d9190613626565b60405180910390f35b34801561028257600080fd5b5061028b61069c565b60405161026d9190613631565b3480156102a457600080fd5b506102b86102b3366004612fa5565b61072f565b60405161026d91906135d5565b3480156102d157600080fd5b506102e56102e0366004612ed1565b61077b565b005b3480156102f357600080fd5b506102fc610813565b60405161026d9190613dba565b6102e5610317366004612fa5565b610819565b34801561032857600080fd5b506102e5610337366004612db9565b61094b565b34801561034857600080fd5b506102fc610983565b34801561035d57600080fd5b50610260610989565b6102e5610374366004612fa5565b610997565b34801561038557600080fd5b506102fc610394366004612ed1565b610a37565b3480156103a557600080fd5b506102b8610a89565b3480156103ba57600080fd5b506102fc610a98565b3480156103cf57600080fd5b506102e56103de366004612db9565b610a9e565b3480156103ef57600080fd5b506102e56103fe366004612fa5565b610ab9565b34801561040f57600080fd5b506102e5610b25565b34801561042457600080fd5b506102fc610433366004612fa5565b610b75565b34801561044457600080fd5b506102b8610453366004612fa5565b610bd0565b34801561046457600080fd5b506102fc610c05565b34801561047957600080fd5b506102fc610488366004612d6d565b610c0b565b34801561049957600080fd5b506102e5610c4f565b6102e5610c9a565b3480156104b657600080fd5b506102e5610d11565b3480156104cb57600080fd5b50610260610d64565b6102e56104e2366004612fa5565b610d73565b3480156104f357600080fd5b506102b8610ddc565b34801561050857600080fd5b506102e5610517366004612fa5565b610deb565b34801561052857600080fd5b5061028b610e57565b34801561053d57600080fd5b506102e561054c366004612e97565b610e66565b34801561055d57600080fd5b50610260610f34565b34801561057257600080fd5b506102e5610581366004612df4565b610f3d565b34801561059257600080fd5b506102e56105a1366004612fa5565b610f7c565b3480156105b257600080fd5b506102e5610fc0565b3480156105c757600080fd5b5061028b6105d6366004612fa5565b611014565b3480156105e757600080fd5b50610260611146565b3480156105fc57600080fd5b506102fc611156565b34801561061157600080fd5b506102e561115c565b34801561062657600080fd5b50610260610635366004612d87565b6111e2565b34801561064657600080fd5b506102fc611210565b34801561065b57600080fd5b506102e561066a366004612d6d565b611283565b60006001600160e01b0319821663780e9d6360e01b14806106945750610694826112f1565b90505b919050565b6060600080546106ab90613ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790613ee4565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b505050505090505b90565b600061073a82611331565b61075f5760405162461bcd60e51b815260040161075690613b21565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078682610bd0565b9050806001600160a01b0316836001600160a01b031614156107ba5760405162461bcd60e51b815260040161075690613beb565b806001600160a01b03166107cc61134e565b6001600160a01b031614806107e857506107e88161063561134e565b6108045760405162461bcd60e51b815260040161075690613924565b61080e8383611352565b505050565b60085490565b60105460ff161561083c5760405162461bcd60e51b815260040161075690613a14565b6013546000906001600160a01b03166370a0823161085861134e565b6040518263ffffffff1660e01b815260040161087491906135d5565b60206040518083038186803b15801561088c57600080fd5b505afa1580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190612fbd565b116108e15760405162461bcd60e51b81526004016107569061376a565b346108ea611210565b146109075760405162461bcd60e51b815260040161075690613a80565b600f5433600090815260116020526040902054106109375760405162461bcd60e51b815260040161075690613d6e565b61094861094261134e565b826113c0565b50565b61095c61095661134e565b82611453565b6109785760405162461bcd60e51b815260040161075690613c9a565b61080e8383836114d8565b600d5481565b601054610100900460ff1681565b60105460ff16156109ba5760405162461bcd60e51b815260040161075690613a14565b6109c5600a82613f3a565b6109e15760405162461bcd60e51b81526004016107569061376a565b346109ea611210565b14610a075760405162461bcd60e51b815260040161075690613a80565b600f5433600090815260116020526040902054106109375760405162461bcd60e51b815260040161075690613644565b6000610a4283610c0b565b8210610a605760405162461bcd60e51b8152600401610756906136cd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6013546001600160a01b031681565b600e5481565b61080e83838360405180602001604052806000815250610f3d565b610ac161134e565b6001600160a01b0316610ad2610ddc565b6001600160a01b031614610af85760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff1615610b205760405162461bcd60e51b815260040161075690613c63565b600d55565b610b2d61134e565b6001600160a01b0316610b3e610ddc565b6001600160a01b031614610b645760405162461bcd60e51b815260040161075690613b6d565b6010805461ff001916610100179055565b6000610b7f610813565b8210610b9d5760405162461bcd60e51b815260040161075690613ceb565b60088281548110610bbe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106945760405162461bcd60e51b8152600401610756906139cb565b600f5481565b60006001600160a01b038216610c335760405162461bcd60e51b815260040161075690613981565b506001600160a01b031660009081526003602052604090205490565b610c5761134e565b6001600160a01b0316610c68610ddc565b6001600160a01b031614610c8e5760405162461bcd60e51b815260040161075690613b6d565b610c986000611605565b565b610ca261134e565b6001600160a01b0316610cb3610ddc565b6001600160a01b031614610cd95760405162461bcd60e51b815260040161075690613b6d565b610ce161134e565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050610c9857600080fd5b610d1961134e565b6001600160a01b0316610d2a610ddc565b6001600160a01b031614610d505760405162461bcd60e51b815260040161075690613b6d565b6010805460ff19811660ff90911615179055565b60105462010000900460ff1681565b610d7b61134e565b6001600160a01b0316610d8c610ddc565b6001600160a01b031614610db25760405162461bcd60e51b815260040161075690613b6d565b6010546301000000900460ff16156109375760405162461bcd60e51b815260040161075690613d37565b600b546001600160a01b031690565b610df361134e565b6001600160a01b0316610e04610ddc565b6001600160a01b031614610e2a5760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff1615610e525760405162461bcd60e51b815260040161075690613c63565b600c55565b6060600180546106ab90613ee4565b610e6e61134e565b6001600160a01b0316826001600160a01b03161415610e9f5760405162461bcd60e51b8152600401610756906138a1565b8060056000610eac61134e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610ef061134e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f289190613626565b60405180910390a35050565b60105460ff1681565b610f4e610f4861134e565b83611453565b610f6a5760405162461bcd60e51b815260040161075690613c9a565b610f7684848484611657565b50505050565b610f8461134e565b6001600160a01b0316610f95610ddc565b6001600160a01b031614610fbb5760405162461bcd60e51b815260040161075690613b6d565b601455565b610fc861134e565b6001600160a01b0316610fd9610ddc565b6001600160a01b031614610fff5760405162461bcd60e51b815260040161075690613b6d565b6010805463ff00000019166301000000179055565b606061101f82611331565b61103b5760405162461bcd60e51b815260040161075690613696565b601354604051635ac1e3bb60e01b81526000916001600160a01b031690635ac1e3bb9061106c908690600401613dba565b60006040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c09190810190612f32565b9050600061111b6110d08561168a565b6110d98661168a565b6110e2876117a5565b6110f46110ef878a611933565b611a91565b6040516020016111079493929190613150565b604051602081830303815290604052611a91565b90508060405160200161112e919061347c565b60408051808303601f19018152919052949350505050565b6010546301000000900460ff1681565b60145481565b61116461134e565b6001600160a01b0316611175610ddc565b6001600160a01b03161461119b5760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff16156111c35760405162461bcd60e51b815260040161075690613c63565b6010805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600080606461121d610813565b6112279190613e6e565b905080158061123f575060105462010000900460ff16155b1561124e575050600c5461072c565b6000915060005b8181101561127e57600d5461126a9084613e56565b92508061127681613f1f565b915050611255565b505090565b61128b61134e565b6001600160a01b031661129c610ddc565b6001600160a01b0316146112c25760405162461bcd60e51b815260040161075690613b6d565b6001600160a01b0381166112e85760405162461bcd60e51b8152600401610756906137e0565b61094881611605565b60006001600160e01b031982166380ac58cd60e01b148061132257506001600160e01b03198216635b5e139f60e01b145b80610694575061069482611c05565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061138782610bd0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113c981611c1e565b6113e55760405162461bcd60e51b815260040161075690613ab7565b6113ee81611cb8565b6113f9906001613e56565b6000828152601260205260409020556114128282611d45565b6001600e60008282546114259190613e56565b909155505033600090815260116020526040812080546001929061144a908490613e56565b90915550505050565b600061145e82611331565b61147a5760405162461bcd60e51b8152600401610756906138d8565b600061148583610bd0565b9050806001600160a01b0316846001600160a01b031614806114c05750836001600160a01b03166114b58461072f565b6001600160a01b0316145b806114d057506114d081856111e2565b949350505050565b826001600160a01b03166114eb82610bd0565b6001600160a01b0316146115115760405162461bcd60e51b815260040161075690613ba2565b6001600160a01b0382166115375760405162461bcd60e51b81526004016107569061385d565b611542838383611d63565b61154d600082611352565b6001600160a01b0383166000908152600360205260408120805460019290611576908490613ea1565b90915550506001600160a01b03821660009081526003602052604081208054600192906115a4908490613e56565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6116628484846114d8565b61166e84848484611dec565b610f765760405162461bcd60e51b815260040161075690613718565b6060816116af57506040805180820190915260018152600360fc1b6020820152610697565b8160005b81156116d957806116c381613f1f565b91506116d29050600a83613e6e565b91506116b3565b60008167ffffffffffffffff81111561170257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561172c576020820181803683370190505b5090505b84156114d057611741600183613ea1565b915061174e600a86613f3a565b611759906030613e56565b60f81b81838151811061177c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061179e600a86613e6e565b9450611730565b606060006117b283611cb8565b90506117bc612d2f565b6040518060600160405280603781526020016145f9603791398152601582601381106117f857634e487b7160e01b600052603260045260246000fd5b01805461180490613ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461183090613ee4565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b5050505050816001600381106118a357634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060058152602001640113eae96160dd1b815250816002600381106118ea57634e487b7160e01b600052603260045260246000fd5b60200201526000818160200201518260016020020151836002602002015160405160200161191a939291906130b6565b60408051808303601f1901815291905295945050505050565b6060600061195f61195a85601d61194988611f07565b6119539190613ea1565b601d611f0b565b612036565b9050600061198682604051806040016040528060018152602001603b60f81b8152506121c5565b9050611993816008613e56565b905060006119c1836002846119a787611f07565b6119b19190613ea1565b6119bb9190613ea1565b84611f0b565b905060006119ce82612036565b905060006040518060a0016040528060748152602001614cea60749139905060006119f8836121d3565b60408051808201909152601d81527f3c672066696c7465723d2275726c2823616c7465726174696f6e29223e00000060208201529091506000611a3a8a6122c9565b604051602001611a4a9190613532565b604051602081830303815290604052905083828483604051602001611a7294939291906130f9565b6040516020818303038152906040529850505050505050505092915050565b805160609080611ab1575050604080516020810190915260008152610697565b60006003611ac0836002613e56565b611aca9190613e6e565b611ad5906004613e82565b90506000611ae4826020613e56565b67ffffffffffffffff811115611b0a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b34576020820181803683370190505b509050600060405180606001604052806040815260200161467e604091399050600181016020830160005b86811015611bc0576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611b5f565b506003860660018114611bda5760028114611beb57611bf7565b613d3d60f01b600119830152611bf7565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b601354604051634f6ccce760e01b815260009182916001600160a01b0390911690634f6ccce790611c53908690600401613dba565b60206040518083038186803b158015611c6b57600080fd5b505afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190612fbd565b601454611cb09085613e56565b149392505050565b600081815260126020526040812054611d23576000611d0a611cdb600143613ea1565b40611ce58561168a565b604051602001611cf692919061300f565b6040516020818303038152906040526128ae565b90506000611d19601383613f3a565b9250610697915050565b600082815260126020526040902054611d3e90600190613ea1565b9050610697565b611d5f8282604051806020016040528060008152506128df565b5050565b611d6e83838361080e565b6001600160a01b038316611d8a57611d8581612912565b611dad565b816001600160a01b0316836001600160a01b031614611dad57611dad8382612956565b6001600160a01b038216611dc957611dc4816129f3565b61080e565b826001600160a01b0316826001600160a01b03161461080e5761080e8282612acc565b6000611e00846001600160a01b0316612b10565b15611efc57836001600160a01b031663150b7a02611e1c61134e565b8786866040518563ffffffff1660e01b8152600401611e3e94939291906135e9565b602060405180830381600087803b158015611e5857600080fd5b505af1925050508015611e88575060408051601f3d908101601f19168201909252611e8591810190612f16565b60015b611ee2573d808015611eb6576040519150601f19603f3d011682016040523d82523d6000602084013e611ebb565b606091505b508051611eda5760405162461bcd60e51b815260040161075690613718565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114d0565b506001949350505050565b5190565b82516060908490611f1c8585613e15565b1115611f3857634e487b7160e01b600052600160045260246000fd5b60008467ffffffffffffffff811115611f6157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f8b576020820181803683370190505b509050806000855b611f9d8888613e15565b81101561202757848181518110611fc457634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168383611fde81613f1f565b945081518110611ffe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061201f81613f1f565b915050611f93565b509093505050505b9392505050565b80516060908290612057575050604080516000815260208101909152610697565b600481516120659190613f3a565b156120825760405162461bcd60e51b815260040161075690613c2c565b60006040518060a0016040528060808152602001614c6a6080913990506000600483516120af9190613e6e565b6120ba906003613e82565b905060006120c9826020613e56565b67ffffffffffffffff8111156120ef57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612119576020820181803683370190505b5090508351840151603d60ff8216141561214857600183039250613d3d61ffff82161415612148576001830392505b50818152600183018485518101602084015b818310156121b757600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b82525060038101905061215a565b509298975050505050505050565b600061202f83836000612b16565b60606000607a83516121e59190613ea1565b67ffffffffffffffff81111561220b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612235576020820181803683370190505b50905060005b81518110156122c25783612250826074613e56565b8151811061226e57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b82828151811061229957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806122ba81613f1f565b91505061223b565b5092915050565b606080606080606060006122dc87611cb8565b90508061233f5760405180604001604052806005815260200164302e30333560d81b8152509450604051806040016040528060018152602001603960f81b81525093506040518060c00160405280608b81526020016144fb608b91399250612879565b80600114156123e157612379612374886040518060400160405280600381526020016257617960e81b81525060016063612bdc565b61168a565b6123a5612374896040518060400160405280600381526020016256656560e81b81525060016063612bdc565b6040516020016123b69291906133e2565b60408051601f198184030181528282019091526002825261035360f41b602083015295509350612879565b806002141561246c5761241961237488604051806040016040528060068152602001650aad0d0d0d0d60d31b815250600f6014612bdc565b60405160200161242991906133b7565b60408051601f1981840301815282820190915260068252650aad0d0d0d0d60d31b6020830152955061246590612374908990606461012c612bdc565b9350612879565b806003141561249d57604051806103e001604052806103ab81526020016148736103ab913995505050505050610697565b80600414156124ce5760405180610160016040528061012881526020016143d3610128913995505050505050610697565b80600514156125345760405180604001604052806003815260200162302e3560e81b8152509450604051806040016040528060018152602001600360fc1b8152509350604051806101e001604052806101c081526020016140686101c091399150612879565b80600614156125bb5761256e612374886040518060400160405280600781526020016614db985c1c195960ca1b81525060646101f4612bdc565b60405160200161257e919061338d565b60408051601f19818403018152828201909152600782526614db985c1c195960ca1b602083015295506124659061237490899060646101f4612bdc565b806007141561263e576125f361237488604051806040016040528060058152602001643f3f3f3f3f60d81b81525060646101f4612bdc565b6040516020016126039190613437565b60408051601f1981840301815282820190915260058252643f3f3f3f3f60d81b602083015295506124659061237490899060c861012c612bdc565b806008141561266c576040518060a0016040528060658152602001614f9c6065913995505050505050610697565b806009141561269a576040518060800160405280604e8152602001614630604e913995505050505050610697565b80600a14156126c8576040518060800160405280604c8152602001614c1e604c913995505050505050610697565b80600b14156126f6576040518060800160405280604c8152602001614228604c913995505050505050610697565b80600c14156127255760405180610100016040528060ca8152602001614d5e60ca913995505050505050610697565b80600d1415612753576040518060a00160405280607381526020016145866073913995505050505050610697565b80600e141561278457604051806101e001604052806101b581526020016146be6101b5913995505050505050610697565b80600f14156127e8576127bd61237488604051806040016040528060078152602001664578706c6f646560c81b81525060056028612bdc565b6040516020016127cd91906134c1565b60405160208183030381529060405295505050505050610697565b80601014156128195760405180610180016040528061015f815260200161427461015f913995505050505050610697565b80601114156128485760405180610100016040528060c18152602001613fa760c1913995505050505050610697565b806012141561287957604051806101a001604052806101748152602001614e28610174913995505050505050610697565b6000858486856040516020016128929493929190613269565b60408051808303601f1901815291905298975050505050505050565b6000816040516020016128c1919061309a565b60408051601f19818403018152919052805160209091012092915050565b6128e98383612c50565b6128f66000848484611dec565b61080e5760405162461bcd60e51b815260040161075690613718565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161296384610c0b565b61296d9190613ea1565b6000838152600760205260409020549091508082146129c0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a0590600190613ea1565b60008381526009602052604081205460088054939450909284908110612a3b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612a6a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ab057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ad783610c0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b815160009084908490600114612b3c57634e487b7160e01b600052600160045260246000fd5b835b8251811015612bce5781600081518110612b6857634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b031916838281518110612b9d57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319161415612bbc57925061202f915050565b80612bc681613f1f565b915050612b3e565b506000199695505050505050565b600080612c17612bed600143613ea1565b4086612bf88961168a565b8787612c0261134e565b604051602001611cf696959493929190613035565b9050600084612c268186613ea1565b612c31906001613e56565b612c3b9084613f3a565b612c459190613e56565b979650505050505050565b6001600160a01b038216612c765760405162461bcd60e51b815260040161075690613a4b565b612c7f81611331565b15612c9c5760405162461bcd60e51b815260040161075690613826565b612ca860008383611d63565b6001600160a01b0382166000908152600360205260408120805460019290612cd1908490613e56565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180606001604052806003905b6060815260200190600190039081612d3e5790505090565b80356001600160a01b038116811461069757600080fd5b600060208284031215612d7e578081fd5b61202f82612d56565b60008060408385031215612d99578081fd5b612da283612d56565b9150612db060208401612d56565b90509250929050565b600080600060608486031215612dcd578081fd5b612dd684612d56565b9250612de460208501612d56565b9150604084013590509250925092565b60008060008060808587031215612e09578081fd5b612e1285612d56565b9350612e2060208601612d56565b925060408501359150606085013567ffffffffffffffff811115612e42578182fd5b8501601f81018713612e52578182fd5b8035612e65612e6082613ded565b613dc3565b818152886020838501011115612e79578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215612ea9578182fd5b612eb283612d56565b915060208301358015158114612ec6578182fd5b809150509250929050565b60008060408385031215612ee3578182fd5b612eec83612d56565b946020939093013593505050565b600060208284031215612f0b578081fd5b813561202f81613f90565b600060208284031215612f27578081fd5b815161202f81613f90565b600060208284031215612f43578081fd5b815167ffffffffffffffff811115612f59578182fd5b8201601f81018413612f69578182fd5b8051612f77612e6082613ded565b818152856020838501011115612f8b578384fd5b612f9c826020830160208601613eb8565b95945050505050565b600060208284031215612fb6578081fd5b5035919050565b600060208284031215612fce578081fd5b5051919050565b60008151808452612fed816020860160208601613eb8565b601f01601f19169290920160200192915050565b61227d60f01b815260020190565b60008382528251613027816020850160208701613eb8565b919091016020019392505050565b6000878252865161304d816020850160208b01613eb8565b80830190508651613065816020840160208b01613eb8565b016020810195909552505060408301919091526bffffffffffffffffffffffff19606091821b16908201526074019392505050565b600082516130ac818460208701613eb8565b9190910192915050565b600084516130c8818460208901613eb8565b8451908301906130dc818360208901613eb8565b84519101906130ef818360208801613eb8565b0195945050505050565b6000855161310b818460208a01613eb8565b85519083019061311f818360208a01613eb8565b8551910190613132818360208901613eb8565b8451910190613145818360208801613eb8565b019695505050505050565b7203d913730b6b2911d101120b63a102737bab71606d1b8152845160009061317f816013850160208a01613eb8565b7f222c20226465736372697074696f6e223a2022486d6d6d2e2e2e20536f6d65746013918401918201527f68696e67206973207570207769746820416c74204e6f756e2000000000000000603382015285516131e281604c840160208a01613eb8565b601160f91b604c9290910191820152845161320481604d840160208901613eb8565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173604d929091019182015263194d8d0b60e21b606d820152835161324f816071840160208801613eb8565b61325d607182840101613001565b98975050505050505050565b60007f3c666554757262756c656e636520626173654672657175656e63793d22000000825285516132a181601d850160208a01613eb8565b7511103a3cb8329e91333930b1ba30b62737b4b9b2911f60511b601d9184019182015285516132d7816033840160208a01613eb8565b7f3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d61603392909101918201527f7020696e3d22536f757263654772617068696322207363616c653d22000000006053820152845161333b81606f840160208901613eb8565b61111f60f11b606f9290910191820152835161335e816071840160208801613eb8565b731e17b332a234b9b83630b1b2b6b2b73a26b0b81f60611b607192909101918201526085019695505050505050565b600061181760f11b825282516133aa816002850160208701613eb8565b9190910160020192915050565b6000620302e360ec1b825282516133d5816003850160208701613eb8565b9190910160030192915050565b6000620302e360ec1b8083528451613401816003860160208901613eb8565b8084019050600160fd1b60038201528160048201528451915061342b826007830160208801613eb8565b01600701949350505050565b6000620302e360ec1b82528251613455816003850160208701613eb8565b6f022206e756d4f6374617665733d2231360841b6003939091019283015250601301919050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000825282516134b481601d850160208701613eb8565b91909101601d0192915050565b60007f3c66654d6f7270686f6c6f6779206f70657261746f723d2264696c61746522208252673930b234bab99e9160c11b6020830152825161350a816028850160208701613eb8565b70111f1e17b332a6b7b9383437b637b3bc9f60791b6028939091019283015250603901919050565b60007f3c2f673e3c646566733e3c66696c7465722069643d22616c7465726174696f6e82527f2220783d222d3530252220793d222d353025222077696474683d22323030252260208301526e103432b4b3b43a1e9119181812911f60891b604083015282516135a881604f850160208701613eb8565b751e17b334b63a32b91f1e17b232b3399f1e17b9bb339f60511b604f939091019283015250606501919050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361c90830184612fd5565b9695505050505050565b901515815260200190565b60006020825261202f6020830184612fd5565b60208082526032908201527f596f752063616e27742065786365656420746865206d696e74696e67206c696d6040820152711a5d08199bdc881e5bdd5c881dd85b1b195d60721b606082015260800190565b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526050908201527f4576657279203130746820416c74204e6f756e2069732072657365727665642060408201527f666f72204e6f756e20686f6c6465727320616e6420416c74204e6f756e64657260608201526f732c20696e207065727065747569747960801b608082015260a00190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601a908201527f53616c6573206172652063757272656e746c7920706175736564000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b60208082526044908201527f54686973206e6f756e20646f6573206e6f742065786973742028796574292e2060408201527f536f2069747320416c74204e6f756e2063616e6e6f74206578697374206569746060820152633432b91760e11b608082015260a00190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601c908201527f696e76616c696420626173653634206465636f64657220696e70757400000000604082015260600190565b6020808252601c908201527f5072696365206368616e67657320617265206e6f77206c6f636b656400000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265736572766564206d696e7473206c6f636b65642e204f6f7073206c6f6c00604082015260600190565b6020808252602c908201527f596f752063616e27742065786365656420746869732077616c6c65742773206d60408201526b1a5b9d1a5b99c81b1a5b5a5d60a21b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff81118282101715613de557613de5613f7a565b604052919050565b600067ffffffffffffffff821115613e0757613e07613f7a565b50601f01601f191660200190565b600080821280156001600160ff1b0384900385131615613e3757613e37613f4e565b600160ff1b8390038412811615613e5057613e50613f4e565b50500190565b60008219821115613e6957613e69613f4e565b500190565b600082613e7d57613e7d613f64565b500490565b6000816000190483118215151615613e9c57613e9c613f4e565b500290565b600082821015613eb357613eb3613f4e565b500390565b60005b83811015613ed3578181015183820152602001613ebb565b83811115610f765750506000910152565b600281046001821680613ef857607f821691505b60208210811415613f1957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f3357613f33613f4e565b5060010190565b600082613f4957613f49613f64565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461094857600080fdfe3c666554696c652069643d226579652220696e3d22536f75726365477261706869632220783d223134322e352220793d22313130222077696474683d22343522206865696768743d22353022202f3e3c666554696c652f3e3c666554696c6520696e323d2273747269702220783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d226578636c7573696f6e222f3e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22302e3573222076616c7565733d2233362e37323b35382e38343b33362e39303b31342e39393b31332e32363b34372e33303b35382e32343b32312e35383b34362e35313b34302e31373b33352e38333b33362e30383b34322e37343b33322e31363b34362e35373b33332e36373b31372e33313b35322e30393b33302e38303b34302e33373b34332e39393b33362e32313b31362e31383b32302e30343b31352e37323b35302e39323b34312e33353b32362e31323b33312e33383b33302e34313b35392e35313b31302e35313b34352e34383b31392e35393b35382e38383b33332e39323b32362e38383b31332e35303b33312e38353b34332e38383b33332e30353b32322e38323b35362e32363b32372e39303b35312e39353b32362e34373b32372e31333b33322e34313b31382e31323b35322e39383b35302e30343b31372e36323b32372e34333b35322e38313b32312e36313b31352e31313b32352e38393b32372e33393b33392e33353b35312e32392220726570656174436f756e743d22696e646566696e697465222f3e3c666554696c6520696e3d22536f75726365477261706869632220783d22302220793d22313030222077696474683d2233323022206865696768743d22383022202f3e3c666554696c652f3e3c666554696c6520696e3d22536f75726365477261706869632220783d2239302220793d22313030222077696474683d2231343022206865696768743d2231303022202f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554757262756c656e6365206e756d4f6374617665733d22332220736565643d22322220626173654672657175656e63793d22302e303220302e30352220747970653d226672616374616c4e6f697365223e3c616e696d617465206174747269627574654e616d653d22626173654672657175656e63792220626567696e3d22307322206475723d22363073222076616c7565733d22302e30303220302e30363b302e30303420302e30383b302e30303220302e30362220726570656174436f756e743d22696e646566696e697465222f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d6170207363616c653d2232302220696e3d22536f7572636547726170686963223e3c2f6665446973706c6163656d656e744d61703e3c616e696d617465206174747269627574654e616d653d22626173654672657175656e63792220626567696e3d22307322206475723d22302e313573222076616c7565733d22302e303831323b302e303335333b302e303034313b302e303432343b302e303031303b302e303933342220726570656174436f756e743d22696e646566696e697465222f3e3c6665436f6c6f724d617472697820747970653d226d6174726978222076616c7565733d222e3333202e3333202e333320302030202e3333202e3333202e333320302030202e3333202e3333202e3333203020302020302030203020302e322030223e3c2f6665436f6c6f724d61747269783e2c202261747472696275746573223a205b7b2274726169745f74797065223a2022416c7465726174696f6e222c2276616c7565223a20223c666554696c6520696e3d22536f75726365477261706869632220783d2239302220793d22313030222077696474683d2231343022206865696768743d2231303022202f3e3c666554696c652f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c666554757262756c656e636520626173654672657175656e63793d22302e30352220747970653d226672616374616c4e6f69736522206e756d4f6374617665733d2239223e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d22323030223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313673222076616c7565733d2234303b3535303b313b3430222066696c6c3d22667265657a652220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665446973706c6163656d656e744d61703e3c66654d6f7270686f6c6f6779206f70657261746f723d2265726f646522207261646975733d223235223e3c616e696d617465206174747269627574654e616d653d227261646975732220626567696e3d22307322206475723d22313673222076616c7565733d22313b32353b313b31222066696c6c3d22667265657a652220726570656174436f756e743d22696e646566696e697465222f3e3c2f66654d6f7270686f6c6f67793e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d2230223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313073222076616c7565733d2231382e35313b31362e31343b2d372e38313b342e34303b2d352e39373b352e38333b2d342e36333b382e38383b2d362e33383b31312e37303b392e33353b2d31342e37373b2d31382e34303b382e37323b2d31322e36313b31342e36393b362e35363b31312e34373b2d352e35393b31332e31363b31392e38313b332e35363b2d312e34373b332e39353b2d31362e31393b2d382e31313b2d332e30343b2d31302e35343b2d322e30343b2d31342e32333b322e30303b2d31322e38313b31362e32383b2d302e35343b372e31383b2d312e35323b2d31302e38363b2d392e39323b2d372e34383b2d302e34373b2d31352e33373b31372e38383b31392e38333b2d31302e35373b352e37353b352e36373b2d312e38343b31302e38373b312e38303b382e31333b31352e34343b2d31312e33353b372e37373b2d31352e33393b2d31382e31393b31342e36363b2d372e32363b2d31342e33343b2d31342e34313b2d332e35323b2d31332e32373b2d372e33343b2d31392e38333b31372e36333b2d31342e36363b2d31332e36383b2d31382e37303b31302e31343b302e39333b2d31372e32333b31352e32393b322e32303b2d302e39343b2d31362e30343b2d302e35353b31352e38303b2d372e37373b2d31322e35313b2d312e31333b2d31312e31383b2d31352e35303b352e37323b2d31332e39393b2d372e31373b2d322e31393b31302e33363b2d31312e30393b352e36383b2d31352e32303b332e30393b2d362e37393b31332e35383b2d31322e30343b2d31302e30353b31372e31343b312e33323b2d31352e36373b2d31342e39363b2d312e30313b2d332e39343b2d31312e39303b2d31332e37373b2d322e32373b31342e36333b31322e33373b2d31392e33313b2d332e39393b2d31332e31393b31342e30363b2d31352e39313b2d352e30333b2d362e35343b31392e37343b2d352e36373b31352e35373b2d362e38303b31342e32343b322e30333b2d31392e31313b2d31342e31303b302e33353b2d31392e32333b2d31332e31313b31322e30343b392e36393b31332e38383b352e31333b31312e39342220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665446973706c6163656d656e744d61703e3c666554696c6520696e3d22536f75726365477261706869632220783d22302220793d22313430222077696474683d2233323022206865696768743d22323022202f3e3c666554696c652f3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323300000000003c7376672077696474683d2233323022206865696768743d22333230222076696577426f783d2230203020333230203332302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222073686170652d72656e646572696e673d2263726973704564676573223e3c6665476175737369616e426c757220696e3d22536f75726365477261706869632220737464446576696174696f6e3d2233223e3c616e696d617465206174747269627574654e616d653d22737464446576696174696f6e2220626567696e3d22307322206475723d223473222076616c7565733d22303b343b333b353b333b323b353b373b383b31303b31353b303b303b303b303b303b303b303b302220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665476175737369616e426c75723e3c666554757262756c656e636520626173654672657175656e63793d22302e303120302e30312220747970653d226672616374616c4e6f69736522206e756d4f6374617665733d22352220736565643d223132343533223e3c616e696d617465206174747269627574654e616d653d22736565642220626567696e3d22307322206475723d22313673222076616c7565733d22313b32303b3136302220726570656174436f756e743d22696e646566696e69746522202f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d22333030223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313673222076616c7565733d22313b3230303b313030303b313b312220726570656174436f756e743d22696e646566696e69746522202f3e3c2f6665446973706c6163656d656e744d61703e3c6665436f6c6f724d617472697820696e3d22536f75726365477261706869632220747970653d226d6174726978222076616c7565733d222d3120302030203020312030202d3120302030203120302030202d312030203120302030203020312030222f3ea26469706673582212202c612d8aee24d932c300895b977b3c44794162cdf4f308a69f1fee87d343915864736f6c63430008000033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063dd4bb07b1161006f578063dd4bb07b146105f0578063e82f511314610605578063e985e9c51461061a578063eb91d37e1461063a578063f2fde38b1461064f5761023b565b8063b88d4fde14610566578063bae614cf14610586578063c824e98e146105a6578063c87b56dd146105bb578063d82a0dec146105db5761023b565b80638da5cb5b116100f25780638da5cb5b146104e757806391b7f5ed146104fc57806395d89b411461051c578063a22cb46514610531578063b6f00dbd146105515761023b565b8063715018a61461048d578063853828b6146104a25780638ad8f390146104aa5780638bbf4e8b146104bf5780638c74bf0e146104d45761023b565b80632f745c59116101bc5780634bc6501e116101805780634bc6501e146104035780634f6ccce7146104185780636352211e14610438578063639814e01461045857806370a082311461046d5761023b565b80632f745c5914610379578063343aa674146103995780634230baee146103ae57806342842e0e146103c35780634905269c146103e35761023b565b80632089885011610203578063208988501461030957806323b872dd1461031c578063280d62ac1461033c57806328bcd1ff146103515780632db11544146103665761023b565b806301ffc9a71461024057806306fdde0314610276578063081812fc14610298578063095ea7b3146102c557806318160ddd146102e7575b600080fd5b34801561024c57600080fd5b5061026061025b366004612efa565b61066f565b60405161026d9190613626565b60405180910390f35b34801561028257600080fd5b5061028b61069c565b60405161026d9190613631565b3480156102a457600080fd5b506102b86102b3366004612fa5565b61072f565b60405161026d91906135d5565b3480156102d157600080fd5b506102e56102e0366004612ed1565b61077b565b005b3480156102f357600080fd5b506102fc610813565b60405161026d9190613dba565b6102e5610317366004612fa5565b610819565b34801561032857600080fd5b506102e5610337366004612db9565b61094b565b34801561034857600080fd5b506102fc610983565b34801561035d57600080fd5b50610260610989565b6102e5610374366004612fa5565b610997565b34801561038557600080fd5b506102fc610394366004612ed1565b610a37565b3480156103a557600080fd5b506102b8610a89565b3480156103ba57600080fd5b506102fc610a98565b3480156103cf57600080fd5b506102e56103de366004612db9565b610a9e565b3480156103ef57600080fd5b506102e56103fe366004612fa5565b610ab9565b34801561040f57600080fd5b506102e5610b25565b34801561042457600080fd5b506102fc610433366004612fa5565b610b75565b34801561044457600080fd5b506102b8610453366004612fa5565b610bd0565b34801561046457600080fd5b506102fc610c05565b34801561047957600080fd5b506102fc610488366004612d6d565b610c0b565b34801561049957600080fd5b506102e5610c4f565b6102e5610c9a565b3480156104b657600080fd5b506102e5610d11565b3480156104cb57600080fd5b50610260610d64565b6102e56104e2366004612fa5565b610d73565b3480156104f357600080fd5b506102b8610ddc565b34801561050857600080fd5b506102e5610517366004612fa5565b610deb565b34801561052857600080fd5b5061028b610e57565b34801561053d57600080fd5b506102e561054c366004612e97565b610e66565b34801561055d57600080fd5b50610260610f34565b34801561057257600080fd5b506102e5610581366004612df4565b610f3d565b34801561059257600080fd5b506102e56105a1366004612fa5565b610f7c565b3480156105b257600080fd5b506102e5610fc0565b3480156105c757600080fd5b5061028b6105d6366004612fa5565b611014565b3480156105e757600080fd5b50610260611146565b3480156105fc57600080fd5b506102fc611156565b34801561061157600080fd5b506102e561115c565b34801561062657600080fd5b50610260610635366004612d87565b6111e2565b34801561064657600080fd5b506102fc611210565b34801561065b57600080fd5b506102e561066a366004612d6d565b611283565b60006001600160e01b0319821663780e9d6360e01b14806106945750610694826112f1565b90505b919050565b6060600080546106ab90613ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790613ee4565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b505050505090505b90565b600061073a82611331565b61075f5760405162461bcd60e51b815260040161075690613b21565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078682610bd0565b9050806001600160a01b0316836001600160a01b031614156107ba5760405162461bcd60e51b815260040161075690613beb565b806001600160a01b03166107cc61134e565b6001600160a01b031614806107e857506107e88161063561134e565b6108045760405162461bcd60e51b815260040161075690613924565b61080e8383611352565b505050565b60085490565b60105460ff161561083c5760405162461bcd60e51b815260040161075690613a14565b6013546000906001600160a01b03166370a0823161085861134e565b6040518263ffffffff1660e01b815260040161087491906135d5565b60206040518083038186803b15801561088c57600080fd5b505afa1580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190612fbd565b116108e15760405162461bcd60e51b81526004016107569061376a565b346108ea611210565b146109075760405162461bcd60e51b815260040161075690613a80565b600f5433600090815260116020526040902054106109375760405162461bcd60e51b815260040161075690613d6e565b61094861094261134e565b826113c0565b50565b61095c61095661134e565b82611453565b6109785760405162461bcd60e51b815260040161075690613c9a565b61080e8383836114d8565b600d5481565b601054610100900460ff1681565b60105460ff16156109ba5760405162461bcd60e51b815260040161075690613a14565b6109c5600a82613f3a565b6109e15760405162461bcd60e51b81526004016107569061376a565b346109ea611210565b14610a075760405162461bcd60e51b815260040161075690613a80565b600f5433600090815260116020526040902054106109375760405162461bcd60e51b815260040161075690613644565b6000610a4283610c0b565b8210610a605760405162461bcd60e51b8152600401610756906136cd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6013546001600160a01b031681565b600e5481565b61080e83838360405180602001604052806000815250610f3d565b610ac161134e565b6001600160a01b0316610ad2610ddc565b6001600160a01b031614610af85760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff1615610b205760405162461bcd60e51b815260040161075690613c63565b600d55565b610b2d61134e565b6001600160a01b0316610b3e610ddc565b6001600160a01b031614610b645760405162461bcd60e51b815260040161075690613b6d565b6010805461ff001916610100179055565b6000610b7f610813565b8210610b9d5760405162461bcd60e51b815260040161075690613ceb565b60088281548110610bbe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106945760405162461bcd60e51b8152600401610756906139cb565b600f5481565b60006001600160a01b038216610c335760405162461bcd60e51b815260040161075690613981565b506001600160a01b031660009081526003602052604090205490565b610c5761134e565b6001600160a01b0316610c68610ddc565b6001600160a01b031614610c8e5760405162461bcd60e51b815260040161075690613b6d565b610c986000611605565b565b610ca261134e565b6001600160a01b0316610cb3610ddc565b6001600160a01b031614610cd95760405162461bcd60e51b815260040161075690613b6d565b610ce161134e565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050610c9857600080fd5b610d1961134e565b6001600160a01b0316610d2a610ddc565b6001600160a01b031614610d505760405162461bcd60e51b815260040161075690613b6d565b6010805460ff19811660ff90911615179055565b60105462010000900460ff1681565b610d7b61134e565b6001600160a01b0316610d8c610ddc565b6001600160a01b031614610db25760405162461bcd60e51b815260040161075690613b6d565b6010546301000000900460ff16156109375760405162461bcd60e51b815260040161075690613d37565b600b546001600160a01b031690565b610df361134e565b6001600160a01b0316610e04610ddc565b6001600160a01b031614610e2a5760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff1615610e525760405162461bcd60e51b815260040161075690613c63565b600c55565b6060600180546106ab90613ee4565b610e6e61134e565b6001600160a01b0316826001600160a01b03161415610e9f5760405162461bcd60e51b8152600401610756906138a1565b8060056000610eac61134e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610ef061134e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f289190613626565b60405180910390a35050565b60105460ff1681565b610f4e610f4861134e565b83611453565b610f6a5760405162461bcd60e51b815260040161075690613c9a565b610f7684848484611657565b50505050565b610f8461134e565b6001600160a01b0316610f95610ddc565b6001600160a01b031614610fbb5760405162461bcd60e51b815260040161075690613b6d565b601455565b610fc861134e565b6001600160a01b0316610fd9610ddc565b6001600160a01b031614610fff5760405162461bcd60e51b815260040161075690613b6d565b6010805463ff00000019166301000000179055565b606061101f82611331565b61103b5760405162461bcd60e51b815260040161075690613696565b601354604051635ac1e3bb60e01b81526000916001600160a01b031690635ac1e3bb9061106c908690600401613dba565b60006040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c09190810190612f32565b9050600061111b6110d08561168a565b6110d98661168a565b6110e2876117a5565b6110f46110ef878a611933565b611a91565b6040516020016111079493929190613150565b604051602081830303815290604052611a91565b90508060405160200161112e919061347c565b60408051808303601f19018152919052949350505050565b6010546301000000900460ff1681565b60145481565b61116461134e565b6001600160a01b0316611175610ddc565b6001600160a01b03161461119b5760405162461bcd60e51b815260040161075690613b6d565b601054610100900460ff16156111c35760405162461bcd60e51b815260040161075690613c63565b6010805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600080606461121d610813565b6112279190613e6e565b905080158061123f575060105462010000900460ff16155b1561124e575050600c5461072c565b6000915060005b8181101561127e57600d5461126a9084613e56565b92508061127681613f1f565b915050611255565b505090565b61128b61134e565b6001600160a01b031661129c610ddc565b6001600160a01b0316146112c25760405162461bcd60e51b815260040161075690613b6d565b6001600160a01b0381166112e85760405162461bcd60e51b8152600401610756906137e0565b61094881611605565b60006001600160e01b031982166380ac58cd60e01b148061132257506001600160e01b03198216635b5e139f60e01b145b80610694575061069482611c05565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061138782610bd0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113c981611c1e565b6113e55760405162461bcd60e51b815260040161075690613ab7565b6113ee81611cb8565b6113f9906001613e56565b6000828152601260205260409020556114128282611d45565b6001600e60008282546114259190613e56565b909155505033600090815260116020526040812080546001929061144a908490613e56565b90915550505050565b600061145e82611331565b61147a5760405162461bcd60e51b8152600401610756906138d8565b600061148583610bd0565b9050806001600160a01b0316846001600160a01b031614806114c05750836001600160a01b03166114b58461072f565b6001600160a01b0316145b806114d057506114d081856111e2565b949350505050565b826001600160a01b03166114eb82610bd0565b6001600160a01b0316146115115760405162461bcd60e51b815260040161075690613ba2565b6001600160a01b0382166115375760405162461bcd60e51b81526004016107569061385d565b611542838383611d63565b61154d600082611352565b6001600160a01b0383166000908152600360205260408120805460019290611576908490613ea1565b90915550506001600160a01b03821660009081526003602052604081208054600192906115a4908490613e56565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6116628484846114d8565b61166e84848484611dec565b610f765760405162461bcd60e51b815260040161075690613718565b6060816116af57506040805180820190915260018152600360fc1b6020820152610697565b8160005b81156116d957806116c381613f1f565b91506116d29050600a83613e6e565b91506116b3565b60008167ffffffffffffffff81111561170257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561172c576020820181803683370190505b5090505b84156114d057611741600183613ea1565b915061174e600a86613f3a565b611759906030613e56565b60f81b81838151811061177c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061179e600a86613e6e565b9450611730565b606060006117b283611cb8565b90506117bc612d2f565b6040518060600160405280603781526020016145f9603791398152601582601381106117f857634e487b7160e01b600052603260045260246000fd5b01805461180490613ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461183090613ee4565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b5050505050816001600381106118a357634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060058152602001640113eae96160dd1b815250816002600381106118ea57634e487b7160e01b600052603260045260246000fd5b60200201526000818160200201518260016020020151836002602002015160405160200161191a939291906130b6565b60408051808303601f1901815291905295945050505050565b6060600061195f61195a85601d61194988611f07565b6119539190613ea1565b601d611f0b565b612036565b9050600061198682604051806040016040528060018152602001603b60f81b8152506121c5565b9050611993816008613e56565b905060006119c1836002846119a787611f07565b6119b19190613ea1565b6119bb9190613ea1565b84611f0b565b905060006119ce82612036565b905060006040518060a0016040528060748152602001614cea60749139905060006119f8836121d3565b60408051808201909152601d81527f3c672066696c7465723d2275726c2823616c7465726174696f6e29223e00000060208201529091506000611a3a8a6122c9565b604051602001611a4a9190613532565b604051602081830303815290604052905083828483604051602001611a7294939291906130f9565b6040516020818303038152906040529850505050505050505092915050565b805160609080611ab1575050604080516020810190915260008152610697565b60006003611ac0836002613e56565b611aca9190613e6e565b611ad5906004613e82565b90506000611ae4826020613e56565b67ffffffffffffffff811115611b0a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b34576020820181803683370190505b509050600060405180606001604052806040815260200161467e604091399050600181016020830160005b86811015611bc0576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611b5f565b506003860660018114611bda5760028114611beb57611bf7565b613d3d60f01b600119830152611bf7565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b601354604051634f6ccce760e01b815260009182916001600160a01b0390911690634f6ccce790611c53908690600401613dba565b60206040518083038186803b158015611c6b57600080fd5b505afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190612fbd565b601454611cb09085613e56565b149392505050565b600081815260126020526040812054611d23576000611d0a611cdb600143613ea1565b40611ce58561168a565b604051602001611cf692919061300f565b6040516020818303038152906040526128ae565b90506000611d19601383613f3a565b9250610697915050565b600082815260126020526040902054611d3e90600190613ea1565b9050610697565b611d5f8282604051806020016040528060008152506128df565b5050565b611d6e83838361080e565b6001600160a01b038316611d8a57611d8581612912565b611dad565b816001600160a01b0316836001600160a01b031614611dad57611dad8382612956565b6001600160a01b038216611dc957611dc4816129f3565b61080e565b826001600160a01b0316826001600160a01b03161461080e5761080e8282612acc565b6000611e00846001600160a01b0316612b10565b15611efc57836001600160a01b031663150b7a02611e1c61134e565b8786866040518563ffffffff1660e01b8152600401611e3e94939291906135e9565b602060405180830381600087803b158015611e5857600080fd5b505af1925050508015611e88575060408051601f3d908101601f19168201909252611e8591810190612f16565b60015b611ee2573d808015611eb6576040519150601f19603f3d011682016040523d82523d6000602084013e611ebb565b606091505b508051611eda5760405162461bcd60e51b815260040161075690613718565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114d0565b506001949350505050565b5190565b82516060908490611f1c8585613e15565b1115611f3857634e487b7160e01b600052600160045260246000fd5b60008467ffffffffffffffff811115611f6157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f8b576020820181803683370190505b509050806000855b611f9d8888613e15565b81101561202757848181518110611fc457634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168383611fde81613f1f565b945081518110611ffe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061201f81613f1f565b915050611f93565b509093505050505b9392505050565b80516060908290612057575050604080516000815260208101909152610697565b600481516120659190613f3a565b156120825760405162461bcd60e51b815260040161075690613c2c565b60006040518060a0016040528060808152602001614c6a6080913990506000600483516120af9190613e6e565b6120ba906003613e82565b905060006120c9826020613e56565b67ffffffffffffffff8111156120ef57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612119576020820181803683370190505b5090508351840151603d60ff8216141561214857600183039250613d3d61ffff82161415612148576001830392505b50818152600183018485518101602084015b818310156121b757600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b82525060038101905061215a565b509298975050505050505050565b600061202f83836000612b16565b60606000607a83516121e59190613ea1565b67ffffffffffffffff81111561220b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612235576020820181803683370190505b50905060005b81518110156122c25783612250826074613e56565b8151811061226e57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b82828151811061229957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806122ba81613f1f565b91505061223b565b5092915050565b606080606080606060006122dc87611cb8565b90508061233f5760405180604001604052806005815260200164302e30333560d81b8152509450604051806040016040528060018152602001603960f81b81525093506040518060c00160405280608b81526020016144fb608b91399250612879565b80600114156123e157612379612374886040518060400160405280600381526020016257617960e81b81525060016063612bdc565b61168a565b6123a5612374896040518060400160405280600381526020016256656560e81b81525060016063612bdc565b6040516020016123b69291906133e2565b60408051601f198184030181528282019091526002825261035360f41b602083015295509350612879565b806002141561246c5761241961237488604051806040016040528060068152602001650aad0d0d0d0d60d31b815250600f6014612bdc565b60405160200161242991906133b7565b60408051601f1981840301815282820190915260068252650aad0d0d0d0d60d31b6020830152955061246590612374908990606461012c612bdc565b9350612879565b806003141561249d57604051806103e001604052806103ab81526020016148736103ab913995505050505050610697565b80600414156124ce5760405180610160016040528061012881526020016143d3610128913995505050505050610697565b80600514156125345760405180604001604052806003815260200162302e3560e81b8152509450604051806040016040528060018152602001600360fc1b8152509350604051806101e001604052806101c081526020016140686101c091399150612879565b80600614156125bb5761256e612374886040518060400160405280600781526020016614db985c1c195960ca1b81525060646101f4612bdc565b60405160200161257e919061338d565b60408051601f19818403018152828201909152600782526614db985c1c195960ca1b602083015295506124659061237490899060646101f4612bdc565b806007141561263e576125f361237488604051806040016040528060058152602001643f3f3f3f3f60d81b81525060646101f4612bdc565b6040516020016126039190613437565b60408051601f1981840301815282820190915260058252643f3f3f3f3f60d81b602083015295506124659061237490899060c861012c612bdc565b806008141561266c576040518060a0016040528060658152602001614f9c6065913995505050505050610697565b806009141561269a576040518060800160405280604e8152602001614630604e913995505050505050610697565b80600a14156126c8576040518060800160405280604c8152602001614c1e604c913995505050505050610697565b80600b14156126f6576040518060800160405280604c8152602001614228604c913995505050505050610697565b80600c14156127255760405180610100016040528060ca8152602001614d5e60ca913995505050505050610697565b80600d1415612753576040518060a00160405280607381526020016145866073913995505050505050610697565b80600e141561278457604051806101e001604052806101b581526020016146be6101b5913995505050505050610697565b80600f14156127e8576127bd61237488604051806040016040528060078152602001664578706c6f646560c81b81525060056028612bdc565b6040516020016127cd91906134c1565b60405160208183030381529060405295505050505050610697565b80601014156128195760405180610180016040528061015f815260200161427461015f913995505050505050610697565b80601114156128485760405180610100016040528060c18152602001613fa760c1913995505050505050610697565b806012141561287957604051806101a001604052806101748152602001614e28610174913995505050505050610697565b6000858486856040516020016128929493929190613269565b60408051808303601f1901815291905298975050505050505050565b6000816040516020016128c1919061309a565b60408051601f19818403018152919052805160209091012092915050565b6128e98383612c50565b6128f66000848484611dec565b61080e5760405162461bcd60e51b815260040161075690613718565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161296384610c0b565b61296d9190613ea1565b6000838152600760205260409020549091508082146129c0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a0590600190613ea1565b60008381526009602052604081205460088054939450909284908110612a3b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612a6a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ab057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ad783610c0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b815160009084908490600114612b3c57634e487b7160e01b600052600160045260246000fd5b835b8251811015612bce5781600081518110612b6857634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b031916838281518110612b9d57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319161415612bbc57925061202f915050565b80612bc681613f1f565b915050612b3e565b506000199695505050505050565b600080612c17612bed600143613ea1565b4086612bf88961168a565b8787612c0261134e565b604051602001611cf696959493929190613035565b9050600084612c268186613ea1565b612c31906001613e56565b612c3b9084613f3a565b612c459190613e56565b979650505050505050565b6001600160a01b038216612c765760405162461bcd60e51b815260040161075690613a4b565b612c7f81611331565b15612c9c5760405162461bcd60e51b815260040161075690613826565b612ca860008383611d63565b6001600160a01b0382166000908152600360205260408120805460019290612cd1908490613e56565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180606001604052806003905b6060815260200190600190039081612d3e5790505090565b80356001600160a01b038116811461069757600080fd5b600060208284031215612d7e578081fd5b61202f82612d56565b60008060408385031215612d99578081fd5b612da283612d56565b9150612db060208401612d56565b90509250929050565b600080600060608486031215612dcd578081fd5b612dd684612d56565b9250612de460208501612d56565b9150604084013590509250925092565b60008060008060808587031215612e09578081fd5b612e1285612d56565b9350612e2060208601612d56565b925060408501359150606085013567ffffffffffffffff811115612e42578182fd5b8501601f81018713612e52578182fd5b8035612e65612e6082613ded565b613dc3565b818152886020838501011115612e79578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215612ea9578182fd5b612eb283612d56565b915060208301358015158114612ec6578182fd5b809150509250929050565b60008060408385031215612ee3578182fd5b612eec83612d56565b946020939093013593505050565b600060208284031215612f0b578081fd5b813561202f81613f90565b600060208284031215612f27578081fd5b815161202f81613f90565b600060208284031215612f43578081fd5b815167ffffffffffffffff811115612f59578182fd5b8201601f81018413612f69578182fd5b8051612f77612e6082613ded565b818152856020838501011115612f8b578384fd5b612f9c826020830160208601613eb8565b95945050505050565b600060208284031215612fb6578081fd5b5035919050565b600060208284031215612fce578081fd5b5051919050565b60008151808452612fed816020860160208601613eb8565b601f01601f19169290920160200192915050565b61227d60f01b815260020190565b60008382528251613027816020850160208701613eb8565b919091016020019392505050565b6000878252865161304d816020850160208b01613eb8565b80830190508651613065816020840160208b01613eb8565b016020810195909552505060408301919091526bffffffffffffffffffffffff19606091821b16908201526074019392505050565b600082516130ac818460208701613eb8565b9190910192915050565b600084516130c8818460208901613eb8565b8451908301906130dc818360208901613eb8565b84519101906130ef818360208801613eb8565b0195945050505050565b6000855161310b818460208a01613eb8565b85519083019061311f818360208a01613eb8565b8551910190613132818360208901613eb8565b8451910190613145818360208801613eb8565b019695505050505050565b7203d913730b6b2911d101120b63a102737bab71606d1b8152845160009061317f816013850160208a01613eb8565b7f222c20226465736372697074696f6e223a2022486d6d6d2e2e2e20536f6d65746013918401918201527f68696e67206973207570207769746820416c74204e6f756e2000000000000000603382015285516131e281604c840160208a01613eb8565b601160f91b604c9290910191820152845161320481604d840160208901613eb8565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173604d929091019182015263194d8d0b60e21b606d820152835161324f816071840160208801613eb8565b61325d607182840101613001565b98975050505050505050565b60007f3c666554757262756c656e636520626173654672657175656e63793d22000000825285516132a181601d850160208a01613eb8565b7511103a3cb8329e91333930b1ba30b62737b4b9b2911f60511b601d9184019182015285516132d7816033840160208a01613eb8565b7f3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d61603392909101918201527f7020696e3d22536f757263654772617068696322207363616c653d22000000006053820152845161333b81606f840160208901613eb8565b61111f60f11b606f9290910191820152835161335e816071840160208801613eb8565b731e17b332a234b9b83630b1b2b6b2b73a26b0b81f60611b607192909101918201526085019695505050505050565b600061181760f11b825282516133aa816002850160208701613eb8565b9190910160020192915050565b6000620302e360ec1b825282516133d5816003850160208701613eb8565b9190910160030192915050565b6000620302e360ec1b8083528451613401816003860160208901613eb8565b8084019050600160fd1b60038201528160048201528451915061342b826007830160208801613eb8565b01600701949350505050565b6000620302e360ec1b82528251613455816003850160208701613eb8565b6f022206e756d4f6374617665733d2231360841b6003939091019283015250601301919050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000825282516134b481601d850160208701613eb8565b91909101601d0192915050565b60007f3c66654d6f7270686f6c6f6779206f70657261746f723d2264696c61746522208252673930b234bab99e9160c11b6020830152825161350a816028850160208701613eb8565b70111f1e17b332a6b7b9383437b637b3bc9f60791b6028939091019283015250603901919050565b60007f3c2f673e3c646566733e3c66696c7465722069643d22616c7465726174696f6e82527f2220783d222d3530252220793d222d353025222077696474683d22323030252260208301526e103432b4b3b43a1e9119181812911f60891b604083015282516135a881604f850160208701613eb8565b751e17b334b63a32b91f1e17b232b3399f1e17b9bb339f60511b604f939091019283015250606501919050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361c90830184612fd5565b9695505050505050565b901515815260200190565b60006020825261202f6020830184612fd5565b60208082526032908201527f596f752063616e27742065786365656420746865206d696e74696e67206c696d6040820152711a5d08199bdc881e5bdd5c881dd85b1b195d60721b606082015260800190565b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526050908201527f4576657279203130746820416c74204e6f756e2069732072657365727665642060408201527f666f72204e6f756e20686f6c6465727320616e6420416c74204e6f756e64657260608201526f732c20696e207065727065747569747960801b608082015260a00190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601a908201527f53616c6573206172652063757272656e746c7920706175736564000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b60208082526044908201527f54686973206e6f756e20646f6573206e6f742065786973742028796574292e2060408201527f536f2069747320416c74204e6f756e2063616e6e6f74206578697374206569746060820152633432b91760e11b608082015260a00190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601c908201527f696e76616c696420626173653634206465636f64657220696e70757400000000604082015260600190565b6020808252601c908201527f5072696365206368616e67657320617265206e6f77206c6f636b656400000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265736572766564206d696e7473206c6f636b65642e204f6f7073206c6f6c00604082015260600190565b6020808252602c908201527f596f752063616e27742065786365656420746869732077616c6c65742773206d60408201526b1a5b9d1a5b99c81b1a5b5a5d60a21b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff81118282101715613de557613de5613f7a565b604052919050565b600067ffffffffffffffff821115613e0757613e07613f7a565b50601f01601f191660200190565b600080821280156001600160ff1b0384900385131615613e3757613e37613f4e565b600160ff1b8390038412811615613e5057613e50613f4e565b50500190565b60008219821115613e6957613e69613f4e565b500190565b600082613e7d57613e7d613f64565b500490565b6000816000190483118215151615613e9c57613e9c613f4e565b500290565b600082821015613eb357613eb3613f4e565b500390565b60005b83811015613ed3578181015183820152602001613ebb565b83811115610f765750506000910152565b600281046001821680613ef857607f821691505b60208210811415613f1957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f3357613f33613f4e565b5060010190565b600082613f4957613f49613f64565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461094857600080fdfe3c666554696c652069643d226579652220696e3d22536f75726365477261706869632220783d223134322e352220793d22313130222077696474683d22343522206865696768743d22353022202f3e3c666554696c652f3e3c666554696c6520696e323d2273747269702220783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d226578636c7573696f6e222f3e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22302e3573222076616c7565733d2233362e37323b35382e38343b33362e39303b31342e39393b31332e32363b34372e33303b35382e32343b32312e35383b34362e35313b34302e31373b33352e38333b33362e30383b34322e37343b33322e31363b34362e35373b33332e36373b31372e33313b35322e30393b33302e38303b34302e33373b34332e39393b33362e32313b31362e31383b32302e30343b31352e37323b35302e39323b34312e33353b32362e31323b33312e33383b33302e34313b35392e35313b31302e35313b34352e34383b31392e35393b35382e38383b33332e39323b32362e38383b31332e35303b33312e38353b34332e38383b33332e30353b32322e38323b35362e32363b32372e39303b35312e39353b32362e34373b32372e31333b33322e34313b31382e31323b35322e39383b35302e30343b31372e36323b32372e34333b35322e38313b32312e36313b31352e31313b32352e38393b32372e33393b33392e33353b35312e32392220726570656174436f756e743d22696e646566696e697465222f3e3c666554696c6520696e3d22536f75726365477261706869632220783d22302220793d22313030222077696474683d2233323022206865696768743d22383022202f3e3c666554696c652f3e3c666554696c6520696e3d22536f75726365477261706869632220783d2239302220793d22313030222077696474683d2231343022206865696768743d2231303022202f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554696c6520783d22302220793d2230222077696474683d2233323022206865696768743d22333230222f3e3c6665426c656e6420696e323d22536f757263654772617068696322206d6f64653d22636f6c6f722d6275726e222f3e3c666554757262756c656e6365206e756d4f6374617665733d22332220736565643d22322220626173654672657175656e63793d22302e303220302e30352220747970653d226672616374616c4e6f697365223e3c616e696d617465206174747269627574654e616d653d22626173654672657175656e63792220626567696e3d22307322206475723d22363073222076616c7565733d22302e30303220302e30363b302e30303420302e30383b302e30303220302e30362220726570656174436f756e743d22696e646566696e697465222f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d6170207363616c653d2232302220696e3d22536f7572636547726170686963223e3c2f6665446973706c6163656d656e744d61703e3c616e696d617465206174747269627574654e616d653d22626173654672657175656e63792220626567696e3d22307322206475723d22302e313573222076616c7565733d22302e303831323b302e303335333b302e303034313b302e303432343b302e303031303b302e303933342220726570656174436f756e743d22696e646566696e697465222f3e3c6665436f6c6f724d617472697820747970653d226d6174726978222076616c7565733d222e3333202e3333202e333320302030202e3333202e3333202e333320302030202e3333202e3333202e3333203020302020302030203020302e322030223e3c2f6665436f6c6f724d61747269783e2c202261747472696275746573223a205b7b2274726169745f74797065223a2022416c7465726174696f6e222c2276616c7565223a20223c666554696c6520696e3d22536f75726365477261706869632220783d2239302220793d22313030222077696474683d2231343022206865696768743d2231303022202f3e3c666554696c652f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c666554757262756c656e636520626173654672657175656e63793d22302e30352220747970653d226672616374616c4e6f69736522206e756d4f6374617665733d2239223e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d22323030223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313673222076616c7565733d2234303b3535303b313b3430222066696c6c3d22667265657a652220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665446973706c6163656d656e744d61703e3c66654d6f7270686f6c6f6779206f70657261746f723d2265726f646522207261646975733d223235223e3c616e696d617465206174747269627574654e616d653d227261646975732220626567696e3d22307322206475723d22313673222076616c7565733d22313b32353b313b31222066696c6c3d22667265657a652220726570656174436f756e743d22696e646566696e697465222f3e3c2f66654d6f7270686f6c6f67793e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d2230223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313073222076616c7565733d2231382e35313b31362e31343b2d372e38313b342e34303b2d352e39373b352e38333b2d342e36333b382e38383b2d362e33383b31312e37303b392e33353b2d31342e37373b2d31382e34303b382e37323b2d31322e36313b31342e36393b362e35363b31312e34373b2d352e35393b31332e31363b31392e38313b332e35363b2d312e34373b332e39353b2d31362e31393b2d382e31313b2d332e30343b2d31302e35343b2d322e30343b2d31342e32333b322e30303b2d31322e38313b31362e32383b2d302e35343b372e31383b2d312e35323b2d31302e38363b2d392e39323b2d372e34383b2d302e34373b2d31352e33373b31372e38383b31392e38333b2d31302e35373b352e37353b352e36373b2d312e38343b31302e38373b312e38303b382e31333b31352e34343b2d31312e33353b372e37373b2d31352e33393b2d31382e31393b31342e36363b2d372e32363b2d31342e33343b2d31342e34313b2d332e35323b2d31332e32373b2d372e33343b2d31392e38333b31372e36333b2d31342e36363b2d31332e36383b2d31382e37303b31302e31343b302e39333b2d31372e32333b31352e32393b322e32303b2d302e39343b2d31362e30343b2d302e35353b31352e38303b2d372e37373b2d31322e35313b2d312e31333b2d31312e31383b2d31352e35303b352e37323b2d31332e39393b2d372e31373b2d322e31393b31302e33363b2d31312e30393b352e36383b2d31352e32303b332e30393b2d362e37393b31332e35383b2d31322e30343b2d31302e30353b31372e31343b312e33323b2d31352e36373b2d31342e39363b2d312e30313b2d332e39343b2d31312e39303b2d31332e37373b2d322e32373b31342e36333b31322e33373b2d31392e33313b2d332e39393b2d31332e31393b31342e30363b2d31352e39313b2d352e30333b2d362e35343b31392e37343b2d352e36373b31352e35373b2d362e38303b31342e32343b322e30333b2d31392e31313b2d31342e31303b302e33353b2d31392e32333b2d31332e31313b31322e30343b392e36393b31332e38383b352e31333b31312e39342220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665446973706c6163656d656e744d61703e3c666554696c6520696e3d22536f75726365477261706869632220783d22302220793d22313430222077696474683d2233323022206865696768743d22323022202f3e3c666554696c652f3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323300000000003c7376672077696474683d2233323022206865696768743d22333230222076696577426f783d2230203020333230203332302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222073686170652d72656e646572696e673d2263726973704564676573223e3c6665476175737369616e426c757220696e3d22536f75726365477261706869632220737464446576696174696f6e3d2233223e3c616e696d617465206174747269627574654e616d653d22737464446576696174696f6e2220626567696e3d22307322206475723d223473222076616c7565733d22303b343b333b353b333b323b353b373b383b31303b31353b303b303b303b303b303b303b303b302220726570656174436f756e743d22696e646566696e697465222f3e3c2f6665476175737369616e426c75723e3c666554757262756c656e636520626173654672657175656e63793d22302e303120302e30312220747970653d226672616374616c4e6f69736522206e756d4f6374617665733d22352220736565643d223132343533223e3c616e696d617465206174747269627574654e616d653d22736565642220626567696e3d22307322206475723d22313673222076616c7565733d22313b32303b3136302220726570656174436f756e743d22696e646566696e69746522202f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d22333030223e3c616e696d617465206174747269627574654e616d653d227363616c652220626567696e3d22307322206475723d22313673222076616c7565733d22313b3230303b313030303b313b312220726570656174436f756e743d22696e646566696e69746522202f3e3c2f6665446973706c6163656d656e744d61703e3c6665436f6c6f724d617472697820696e3d22536f75726365477261706869632220747970653d226d6174726978222076616c7565733d222d3120302030203020312030202d3120302030203120302030202d312030203120302030203020312030222f3ea26469706673582212202c612d8aee24d932c300895b977b3c44794162cdf4f308a69f1fee87d343915864736f6c63430008000033

Deployed Bytecode Sourcemap

50657:21783:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42187:224;;;;;;;;;;-1:-1:-1;42187:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29301:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30860:221::-;;;;;;;;;;-1:-1:-1;30860:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30383:411::-;;;;;;;;;;-1:-1:-1;30383:411:0;;;;;:::i;:::-;;:::i;:::-;;42827:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67576:532::-;;;;;;:::i;:::-;;:::i;31750:339::-;;;;;;;;;;-1:-1:-1;31750:339:0;;;;;:::i;:::-;;:::i;50771:42::-;;;;;;;;;;;;;:::i;50938:38::-;;;;;;;;;;;;;:::i;66977:484::-;;;;;;:::i;:::-;;:::i;42495:256::-;;;;;;;;;;-1:-1:-1;42495:256:0;;;;;:::i;:::-;;:::i;51188:78::-;;;;;;;;;;;;;:::i;50820:30::-;;;;;;;;;;;;;:::i;32160:185::-;;;;;;;;;;-1:-1:-1;32160:185:0;;;;;:::i;:::-;;:::i;71243:195::-;;;;;;;;;;-1:-1:-1;71243:195:0;;;;;:::i;:::-;;:::i;70484:89::-;;;;;;;;;;;;;:::i;43017:233::-;;;;;;;;;;-1:-1:-1;43017:233:0;;;;;:::i;:::-;;:::i;28995:239::-;;;;;;;;;;-1:-1:-1;28995:239:0;;;;;:::i;:::-;;:::i;50857:32::-;;;;;;;;;;;;;:::i;28725:208::-;;;;;;;;;;-1:-1:-1;28725:208:0;;;;;:::i;:::-;;:::i;13693:94::-;;;;;;;;;;;;;:::i;71508:125::-;;;:::i;70330:100::-;;;;;;;;;;;;;:::i;50983:38::-;;;;;;;;;;;;;:::i;68234:184::-;;;;;;:::i;:::-;;:::i;13042:87::-;;;;;;;;;;;;;:::i;70760:159::-;;;;;;;;;;-1:-1:-1;70760:159:0;;;;;:::i;:::-;;:::i;29470:104::-;;;;;;;;;;;;;:::i;31153:295::-;;;;;;;;;;-1:-1:-1;31153:295:0;;;;;:::i;:::-;;:::i;50898:33::-;;;;;;;;;;;;;:::i;32416:328::-;;;;;;;;;;-1:-1:-1;32416:328:0;;;;;:::i;:::-;;:::i;66270:122::-;;;;;;;;;;-1:-1:-1;66270:122:0;;;;;:::i;:::-;;:::i;70633:91::-;;;;;;;;;;;;;:::i;64209:657::-;;;;;;;;;;-1:-1:-1;64209:657:0;;;;;:::i;:::-;;:::i;51028:39::-;;;;;;;;;;;;;:::i;51273:36::-;;;;;;;;;;;;;:::i;70963:179::-;;;;;;;;;;;;;:::i;31519:164::-;;;;;;;;;;-1:-1:-1;31519:164:0;;;;;:::i;:::-;;:::i;69576:698::-;;;;;;;;;;;;;:::i;13942:192::-;;;;;;;;;;-1:-1:-1;13942:192:0;;;;;:::i;:::-;;:::i;42187:224::-;42289:4;-1:-1:-1;;;;;;42313:50:0;;-1:-1:-1;;;42313:50:0;;:90;;;42367:36;42391:11;42367:23;:36::i;:::-;42306:97;;42187:224;;;;:::o;29301:100::-;29355:13;29388:5;29381:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29301:100;;:::o;30860:221::-;30936:7;30964:16;30972:7;30964;:16::i;:::-;30956:73;;;;-1:-1:-1;;;30956:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;31049:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31049:24:0;;30860:221::o;30383:411::-;30464:13;30480:23;30495:7;30480:14;:23::i;:::-;30464:39;;30528:5;-1:-1:-1;;;;;30522:11:0;:2;-1:-1:-1;;;;;30522:11:0;;;30514:57;;;;-1:-1:-1;;;30514:57:0;;;;;;;:::i;:::-;30622:5;-1:-1:-1;;;;;30606:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;30606:21:0;;:62;;;;30631:37;30648:5;30655:12;:10;:12::i;30631:37::-;30584:168;;;;-1:-1:-1;;;30584:168:0;;;;;;;:::i;:::-;30765:21;30774:2;30778:7;30765:8;:21::i;:::-;30383:411;;;:::o;42827:113::-;42915:10;:17;42827:113;:::o;67576:532::-;67660:14;;;;67659:15;67651:54;;;;-1:-1:-1;;;67651:54:0;;;;;;;:::i;:::-;67742:18;;67788:1;;-1:-1:-1;;;;;67742:18:0;67724:47;67772:12;:10;:12::i;:::-;67724:61;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;67716:158;;;;-1:-1:-1;;;67716:158:0;;;;;;;:::i;:::-;67914:9;67893:17;:15;:17::i;:::-;:30;67885:66;;;;-1:-1:-1;;;67885:66:0;;;;;;;:::i;:::-;68000:13;;67986:10;67970:27;;;;:15;:27;;;;;;:43;67962:101;;;;-1:-1:-1;;;67962:101:0;;;;;;;:::i;:::-;68074:26;68079:12;:10;:12::i;:::-;68092:7;68074:4;:26::i;:::-;67576:532;:::o;31750:339::-;31945:41;31964:12;:10;:12::i;:::-;31978:7;31945:18;:41::i;:::-;31937:103;;;;-1:-1:-1;;;31937:103:0;;;;;;;:::i;:::-;32053:28;32063:4;32069:2;32073:7;32053:9;:28::i;50771:42::-;;;;:::o;50938:38::-;;;;;;;;;:::o;66977:484::-;67057:14;;;;67056:15;67048:54;;;;-1:-1:-1;;;67048:54:0;;;;;;;:::i;:::-;67121:10;67129:2;67121:7;:10;:::i;:::-;67113:108;;;;-1:-1:-1;;;67113:108:0;;;;;;;:::i;:::-;67261:9;67240:17;:15;:17::i;:::-;:30;67232:66;;;;-1:-1:-1;;;67232:66:0;;;;;;;:::i;:::-;67347:13;;67333:10;67317:27;;;;:15;:27;;;;;;:43;67309:107;;;;-1:-1:-1;;;67309:107:0;;;;;;;:::i;42495:256::-;42592:7;42628:23;42645:5;42628:16;:23::i;:::-;42620:5;:31;42612:87;;;;-1:-1:-1;;;42612:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;42717:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42495:256::o;51188:78::-;;;-1:-1:-1;;;;;51188:78:0;;:::o;50820:30::-;;;;:::o;32160:185::-;32298:39;32315:4;32321:2;32325:7;32298:39;;;;;;;;;;;;:16;:39::i;71243:195::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;71334:18:::1;::::0;::::1;::::0;::::1;;;71333:19;71325:60;;;;-1:-1:-1::0;;;71325:60:0::1;;;;;;;:::i;:::-;71396:14;:34:::0;71243:195::o;70484:89::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;70540:18:::1;:25:::0;;-1:-1:-1;;70540:25:0::1;;;::::0;;70484:89::o;43017:233::-;43092:7;43128:30;:28;:30::i;:::-;43120:5;:38;43112:95;;;;-1:-1:-1;;;43112:95:0;;;;;;;:::i;:::-;43225:10;43236:5;43225:17;;;;;;-1:-1:-1;;;43225:17:0;;;;;;;;;;;;;;;;;43218:24;;43017:233;;;:::o;28995:239::-;29067:7;29103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29103:16:0;29138:19;29130:73;;;;-1:-1:-1;;;29130:73:0;;;;;;;:::i;50857:32::-;;;;:::o;28725:208::-;28797:7;-1:-1:-1;;;;;28825:19:0;;28817:74;;;;-1:-1:-1;;;28817:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28909:16:0;;;;;:9;:16;;;;;;;28725:208::o;13693:94::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;13758:21:::1;13776:1;13758:9;:21::i;:::-;13693:94::o:0;71508:125::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;71583:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;71575:26:0::1;:49;71602:21;71575:49;;;;;;;;;;;;;;;;;;;;;;;71567:58;;;::::0;::::1;70330:100:::0;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;70408:14:::1;::::0;;-1:-1:-1;;70390:32:0;::::1;70408:14;::::0;;::::1;70407:15;70390:32;::::0;;70330:100::o;50983:38::-;;;;;;;;;:::o;68234:184::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;68318:19:::1;::::0;;;::::1;;;68317:20;68309:64;;;;-1:-1:-1::0;;;68309:64:0::1;;;;;;;:::i;13042:87::-:0;13115:6;;-1:-1:-1;;;;;13115:6:0;13042:87;:::o;70760:159::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;70833:18:::1;::::0;::::1;::::0;::::1;;;70832:19;70824:60;;;;-1:-1:-1::0;;;70824:60:0::1;;;;;;;:::i;:::-;70895:5;:16:::0;70760:159::o;29470:104::-;29526:13;29559:7;29552:14;;;;;:::i;31153:295::-;31268:12;:10;:12::i;:::-;-1:-1:-1;;;;;31256:24:0;:8;-1:-1:-1;;;;;31256:24:0;;;31248:62;;;;-1:-1:-1;;;31248:62:0;;;;;;;:::i;:::-;31368:8;31323:18;:32;31342:12;:10;:12::i;:::-;-1:-1:-1;;;;;31323:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;31323:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;31323:53:0;;;;;;;;;;;31407:12;:10;:12::i;:::-;-1:-1:-1;;;;;31392:48:0;;31431:8;31392:48;;;;;;:::i;:::-;;;;;;;;31153:295;;:::o;50898:33::-;;;;;;:::o;32416:328::-;32591:41;32610:12;:10;:12::i;:::-;32624:7;32591:18;:41::i;:::-;32583:103;;;;-1:-1:-1;;;32583:103:0;;;;;;;:::i;:::-;32697:39;32711:4;32717:2;32721:7;32730:5;32697:13;:39::i;:::-;32416:328;;;;:::o;66270:122::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;66351:21:::1;:33:::0;66270:122::o;70633:91::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;70690:19:::1;:26:::0;;-1:-1:-1;;70690:26:0::1;::::0;::::1;::::0;;70633:91::o;64209:657::-;64274:13;64308:16;64316:7;64308;:16::i;:::-;64300:60;;;;-1:-1:-1;;;64300:60:0;;;;;;;:::i;:::-;64404:18;;64392:48;;-1:-1:-1;;;64392:48:0;;64371:18;;-1:-1:-1;;;;;64404:18:0;;64392:39;;:48;;64432:7;;64392:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64392:48:0;;;;;;;;;;;;:::i;:::-;64371:69;;64451:18;64472:283;64539:17;64548:7;64539:8;:17::i;:::-;64619;64628:7;64619:8;:17::i;:::-;64642:18;64652:7;64642:9;:18::i;:::-;64701:44;64721:22;64729:4;64735:7;64721;:22::i;:::-;64701:13;:44::i;:::-;64499:253;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64472:13;:283::i;:::-;64451:304;;64830:4;64780:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;64780:55:0;;;;;;;64209:657;-1:-1:-1;;;;64209:657:0:o;51028:39::-;;;;;;;;;:::o;51273:36::-;;;;:::o;70963:179::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;71030:18:::1;::::0;::::1;::::0;::::1;;;71029:19;71021:60;;;;-1:-1:-1::0;;;71021:60:0::1;;;;;;;:::i;:::-;71115:19;::::0;;-1:-1:-1;;71092:42:0;::::1;71115:19:::0;;;;::::1;;;71114:20;71092:42:::0;;::::1;;::::0;;70963:179::o;31519:164::-;-1:-1:-1;;;;;31640:25:0;;;31616:4;31640:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31519:164::o;69576:698::-;69624:20;69762:17;69798:3;69782:13;:11;:13::i;:::-;:19;;;;:::i;:::-;69762:39;-1:-1:-1;69887:14:0;;;:38;;-1:-1:-1;69906:19:0;;;;;;;69905:20;69887:38;69883:83;;;-1:-1:-1;;69949:5:0;;69942:12;;69883:83;70092:7;70077:22;;70117:13;70112:123;70144:9;70136:5;:17;70112:123;;;70209:14;;70194:29;;:12;:29;:::i;:::-;70179:44;-1:-1:-1;70155:7:0;;;;:::i;:::-;;;;70112:123;;;;70247:19;69576:698;:::o;13942:192::-;13273:12;:10;:12::i;:::-;-1:-1:-1;;;;;13262:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13262:23:0;;13254:68;;;;-1:-1:-1;;;13254:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14031:22:0;::::1;14023:73;;;;-1:-1:-1::0;;;14023:73:0::1;;;;;;;:::i;:::-;14107:19;14117:8;14107:9;:19::i;28356:305::-:0;28458:4;-1:-1:-1;;;;;;28495:40:0;;-1:-1:-1;;;28495:40:0;;:105;;-1:-1:-1;;;;;;;28552:48:0;;-1:-1:-1;;;28552:48:0;28495:105;:158;;;;28617:36;28641:11;28617:23;:36::i;34254:127::-;34319:4;34343:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34343:16:0;:30;;;34254:127::o;11902:98::-;11982:10;11902:98;:::o;38236:174::-;38311:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38311:29:0;-1:-1:-1;;;;;38311:29:0;;;;;;;;:24;;38365:23;38311:24;38365:14;:23::i;:::-;-1:-1:-1;;;;;38356:46:0;;;;;;;;;;;38236:174;;:::o;66526:361::-;66605:20;66617:7;66605:11;:20::i;:::-;66597:101;;;;-1:-1:-1;;;66597:101:0;;;;;;;:::i;:::-;66740:19;66751:7;66740:10;:19::i;:::-;:23;;66762:1;66740:23;:::i;:::-;66719:18;;;;:9;:18;;;;;:44;66774:31;66784:11;66729:7;66774:9;:31::i;:::-;66835:1;66816:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;66863:10:0;66847:27;;;;:15;:27;;;;;:32;;66878:1;;66847:27;:32;;66878:1;;66847:32;:::i;:::-;;;;-1:-1:-1;;;;66526:361:0:o;34548:348::-;34641:4;34666:16;34674:7;34666;:16::i;:::-;34658:73;;;;-1:-1:-1;;;34658:73:0;;;;;;;:::i;:::-;34742:13;34758:23;34773:7;34758:14;:23::i;:::-;34742:39;;34811:5;-1:-1:-1;;;;;34800:16:0;:7;-1:-1:-1;;;;;34800:16:0;;:51;;;;34844:7;-1:-1:-1;;;;;34820:31:0;:20;34832:7;34820:11;:20::i;:::-;-1:-1:-1;;;;;34820:31:0;;34800:51;:87;;;;34855:32;34872:5;34879:7;34855:16;:32::i;:::-;34792:96;34548:348;-1:-1:-1;;;;34548:348:0:o;37540:578::-;37699:4;-1:-1:-1;;;;;37672:31:0;:23;37687:7;37672:14;:23::i;:::-;-1:-1:-1;;;;;37672:31:0;;37664:85;;;;-1:-1:-1;;;37664:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37768:16:0;;37760:65;;;;-1:-1:-1;;;37760:65:0;;;;;;;:::i;:::-;37838:39;37859:4;37865:2;37869:7;37838:20;:39::i;:::-;37942:29;37959:1;37963:7;37942:8;:29::i;:::-;-1:-1:-1;;;;;37984:15:0;;;;;;:9;:15;;;;;:20;;38003:1;;37984:15;:20;;38003:1;;37984:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38015:13:0;;;;;;:9;:13;;;;;:18;;38032:1;;38015:13;:18;;38032:1;;38015:18;:::i;:::-;;;;-1:-1:-1;;38044:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38044:21:0;-1:-1:-1;;;;;38044:21:0;;;;;;;;;38083:27;;38044:16;;38083:27;;;;;;;37540:578;;;:::o;14142:173::-;14217:6;;;-1:-1:-1;;;;;14234:17:0;;;-1:-1:-1;;;;;;14234:17:0;;;;;;;14267:40;;14217:6;;;14234:17;14217:6;;14267:40;;14198:16;;14267:40;14142:173;;:::o;33626:315::-;33783:28;33793:4;33799:2;33803:7;33783:9;:28::i;:::-;33830:48;33853:4;33859:2;33863:7;33872:5;33830:22;:48::i;:::-;33822:111;;;;-1:-1:-1;;;33822:111:0;;;;;;;:::i;71645:723::-;71701:13;71922:10;71918:53;;-1:-1:-1;71949:10:0;;;;;;;;;;;;-1:-1:-1;;;71949:10:0;;;;;;71918:53;71996:5;71981:12;72037:78;72044:9;;72037:78;;72070:8;;;;:::i;:::-;;-1:-1:-1;72093:10:0;;-1:-1:-1;72101:2:0;72093:10;;:::i;:::-;;;72037:78;;;72125:19;72157:6;72147:17;;;;;;-1:-1:-1;;;72147:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72147:17:0;;72125:39;;72175:154;72182:10;;72175:154;;72209:11;72219:1;72209:11;;:::i;:::-;;-1:-1:-1;72278:10:0;72286:2;72278:5;:10;:::i;:::-;72265:24;;:2;:24;:::i;:::-;72252:39;;72235:6;72242;72235:14;;;;;;-1:-1:-1;;;72235:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;72235:56:0;;;;;;;;-1:-1:-1;72306:11:0;72315:2;72306:11;;:::i;:::-;;;72175:154;;54009:429;54067:13;54095:15;54113:19;54124:7;54113:10;:19::i;:::-;54095:37;;54143:22;;:::i;:::-;54178:68;;;;;;;;;;;;;;;;;;;54268:8;54277:7;54268:17;;;;;-1:-1:-1;;;54268:17:0;;;;;;;;;;54257:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;54263:1;54257:8;;;;;-1:-1:-1;;;54257:8:0;;;;;;;;;;;;:28;;;;54296:18;;;;;;;;;;;;;-1:-1:-1;;;54296:18:0;;;:5;54302:1;54296:8;;;;;-1:-1:-1;;;54296:8:0;;;;;;;;;;;;:18;54327:20;54374:5;54327:20;54374:8;;;;54384:5;54390:1;54384:8;;;;54394:5;54400:1;54394:8;;;;54357:46;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;54357:46:0;;;;;;;54009:429;-1:-1:-1;;;;;54009:429:0:o;62254:1648::-;62330:13;62397:25;62432:78;62446:63;62465:4;62501:2;62478:20;62493:4;62478:14;:20::i;:::-;:25;;;;:::i;:::-;62506:2;62446:18;:63::i;:::-;62432:13;:78::i;:::-;62397:114;;62656:13;62680:33;62696:11;62680:33;;;;;;;;;;;;;-1:-1:-1;;;62680:33:0;;;:15;:33::i;:::-;62656:58;-1:-1:-1;62733:7:0;62656:58;62739:1;62733:7;:::i;:::-;62725:15;;62852:21;62876:95;62895:11;62953:1;62945:5;62915:27;62930:11;62915:14;:27::i;:::-;:35;;;;:::i;:::-;:39;;;;:::i;:::-;62964:5;62876:18;:95::i;:::-;62852:119;;63026:16;63045:22;63059:7;63045:13;:22::i;:::-;63026:41;;63108:24;:145;;;;;;;;;;;;;;;;;;;63315:22;63340:16;63352:3;63340:11;:16::i;:::-;63409:59;;;;;;;;;;;;;;;;;63315:41;;-1:-1:-1;63409:25:0;63677:22;63691:7;63677:13;:22::i;:::-;63578:147;;;;;;;;:::i;:::-;;;;;;;;;;;;;63531:195;;63837:10;63848:11;63860:8;63869:23;63820:73;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63806:88;;;;;;;;;;62254:1648;;;;:::o;72795:1607::-;72893:11;;72853:13;;72919:8;72915:23;;-1:-1:-1;;72929:9:0;;;;;;;;;-1:-1:-1;72929:9:0;;;;72915:23;72990:18;73028:1;73017:7;:3;73023:1;73017:7;:::i;:::-;73016:13;;;;:::i;:::-;73011:19;;:1;:19;:::i;:::-;72990:40;-1:-1:-1;73088:19:0;73120:15;72990:40;73133:2;73120:15;:::i;:::-;73110:26;;;;;;-1:-1:-1;;;73110:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73110:26:0;;73088:48;;73149:18;73170:5;;;;;;;;;;;;;;;;;73149:26;;73239:1;73232:5;73228:13;73284:2;73276:6;73272:15;73335:1;73303:777;73358:3;73355:1;73352:10;73303:777;;;73413:1;73456:12;;;;;73450:19;73551:4;73539:2;73535:14;;;;;73517:40;;73511:47;73660:2;73656:14;;;73652:25;;73638:40;;73632:47;73789:1;73785:13;;;73781:24;;73767:39;;73761:46;73909:16;;;;73895:31;;73889:38;73587:1;73583:11;;;73681:4;73628:58;;;73619:68;73712:11;;73757:57;;;73748:67;;;;73840:11;;73885:49;;73876:59;73964:3;73960:13;73993:22;;74063:1;74048:17;;;;73406:9;73303:777;;;73307:44;74112:1;74107:3;74103:11;74133:1;74128:84;;;;74231:1;74226:82;;;;74096:212;;74128:84;-1:-1:-1;;;;;74161:17:0;;74154:43;74128:84;;74226:82;-1:-1:-1;;;;;74259:17:0;;74252:41;74096:212;-1:-1:-1;;;74324:26:0;;;;72795:1607;-1:-1:-1;;;;72795:1607:0:o;26963:157::-;-1:-1:-1;;;;;;27072:40:0;;-1:-1:-1;;;27072:40:0;26963:157;;;:::o;65823:221::-;65969:18;;65951:59;;-1:-1:-1;;;65951:59:0;;65883:4;;;;-1:-1:-1;;;;;65969:18:0;;;;65951:50;;:59;;66002:7;;65951:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65926:21;;65916:31;;:7;:31;:::i;:::-;:94;;65823:221;-1:-1:-1;;;65823:221:0:o;52946:372::-;53005:7;53029:18;;;:9;:18;;;;;;53025:286;;53069:12;53084:80;53125:16;53140:1;53125:12;:16;:::i;:::-;53115:27;53144:17;53153:7;53144:8;:17::i;:::-;53098:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53084:6;:80::i;:::-;53069:95;-1:-1:-1;53179:15:0;53197:9;53204:2;53069:95;53197:9;:::i;:::-;53179:27;-1:-1:-1;53223:14:0;;-1:-1:-1;;53223:14:0;53025:286;53277:18;;;;:9;:18;;;;;;:22;;53298:1;;53277:22;:::i;:::-;53270:29;;;;35238:110;35314:26;35324:2;35328:7;35314:26;;;;;;;;;;;;:9;:26::i;:::-;35238:110;;:::o;43863:589::-;44007:45;44034:4;44040:2;44044:7;44007:26;:45::i;:::-;-1:-1:-1;;;;;44069:18:0;;44065:187;;44104:40;44136:7;44104:31;:40::i;:::-;44065:187;;;44174:2;-1:-1:-1;;;;;44166:10:0;:4;-1:-1:-1;;;;;44166:10:0;;44162:90;;44193:47;44226:4;44232:7;44193:32;:47::i;:::-;-1:-1:-1;;;;;44266:16:0;;44262:183;;44299:45;44336:7;44299:36;:45::i;:::-;44262:183;;;44372:4;-1:-1:-1;;;;;44366:10:0;:2;-1:-1:-1;;;;;44366:10:0;;44362:83;;44393:40;44421:2;44425:7;44393:27;:40::i;38975:803::-;39130:4;39151:15;:2;-1:-1:-1;;;;;39151:13:0;;:15::i;:::-;39147:624;;;39203:2;-1:-1:-1;;;;;39187:36:0;;39224:12;:10;:12::i;:::-;39238:4;39244:7;39253:5;39187:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39187:72:0;;;;;;;;-1:-1:-1;;39187:72:0;;;;;;;;;;;;:::i;:::-;;;39183:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39433:13:0;;39429:272;;39476:60;;-1:-1:-1;;;39476:60:0;;;;;;;:::i;39429:272::-;39651:6;39645:13;39636:6;39632:2;39628:15;39621:38;39183:533;-1:-1:-1;;;;;;39310:55:0;-1:-1:-1;;;39310:55:0;;-1:-1:-1;39303:62:0;;39147:624;-1:-1:-1;39755:4:0;38975:803;;;;;;:::o;7991:185::-;8151:17;;7991:185::o;8802:550::-;9030:17;;8919:13;;8977:5;;9008:17;9018:7;9008;:17;:::i;:::-;9003:44;;8996:52;;-1:-1:-1;;;8996:52:0;;;;;;;;;9061:18;9098:7;9082:25;;;;;;-1:-1:-1;;;9082:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9082:25:0;-1:-1:-1;9061:46:0;-1:-1:-1;9061:46:0;9118:22;9207:7;9188:120;9226:17;9236:7;9226;:17;:::i;:::-;9217:1;:27;9188:120;;;9283:10;9294:1;9283:13;;;;;;-1:-1:-1;;;9283:13:0;;;;;;;;;;;;;-1:-1:-1;;;;;;9283:13:0;9266:9;9276:3;;;;:::i;:::-;;;9266:14;;;;;;-1:-1:-1;;;9266:14:0;;;;;;;;;;;;:30;-1:-1:-1;;;;;9266:30:0;;;;;;;;-1:-1:-1;9246:3:0;;;;:::i;:::-;;;;9188:120;;;-1:-1:-1;9334:9:0;;-1:-1:-1;;;;8802:550:0;;;;;;:::o;74881:2239::-;75015:11;;74941:12;;74992:5;;75011:41;;-1:-1:-1;;75040:12:0;;;75050:1;75040:12;;;;;;;;75033:19;;75011:41;75085:1;75071:4;:11;:15;;;;:::i;:::-;:20;75063:61;;;;-1:-1:-1;;;75063:61:0;;;;;;;:::i;:::-;75176:18;75197:12;;;;;;;;;;;;;;;;;75176:33;;75271:18;75307:1;75293:4;:11;:15;;;;:::i;:::-;75292:21;;75312:1;75292:21;:::i;:::-;75271:42;-1:-1:-1;75396:19:0;75428:15;75271:42;75441:2;75428:15;:::i;:::-;75418:26;;;;;;-1:-1:-1;;;75418:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75418:26:0;;75396:48;;75553:4;75547:11;75541:4;75537:22;75531:29;75602:4;75595;75584:9;75580:20;75577:30;75574:2;;;75657:1;75645:10;75641:18;75627:32;;75707:6;75698;75687:9;75683:22;75680:34;75677:2;;;75768:1;75756:10;75752:18;75738:32;;75677:2;75574;75880:10;75872:6;75865:26;75975:1;75968:5;75964:13;76034:4;76085;76079:11;76070:7;76066:25;76181:2;76173:6;76169:15;76259:817;76278:6;76269:7;76266:19;76259:817;;;76381:1;76372:7;76368:15;76357:26;;76419:7;76413:14;76913:4;76904;76896:5;76884:25;76874:8;76870:40;76864:47;76860:58;76820:4;76811;76803:5;76800:1;76795:14;76791:25;76781:8;76777:40;76771:47;76767:58;76764:1;76759:67;76730:211;76701:4;76692;76684:5;76680:2;76676:14;76672:25;76662:8;76658:40;76652:47;76648:58;76644:2;76640:67;76608:4;76599;76591:5;76587:2;76583:14;76579:25;76569:8;76565:40;76559:47;76555:58;76551:2;76547:67;76518:190;76493:467;76479:481;;77005:6;77000:3;76996:16;76985:9;76978:35;;77059:1;77048:9;77044:17;77031:30;;76259:817;;;-1:-1:-1;77106:6:0;;74881:2239;-1:-1:-1;;;;;;;;74881:2239:0:o;9930:167::-;10040:3;10063:26;10072:5;10079:6;10087:1;10063:8;:26::i;63910:291::-;63977:13;64003:19;64053:3;64035:8;:15;:21;;;;:::i;:::-;64025:32;;;;;;-1:-1:-1;;;64025:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64025:32:0;;64003:54;;64072:6;64068:94;64088:6;:13;64084:1;:17;64068:94;;;64135:8;64144:5;:1;64146:3;64144:5;:::i;:::-;64135:15;;;;;;-1:-1:-1;;;64135:15:0;;;;;;;;;;;;;;;;;64123:6;64130:1;64123:9;;;;;;-1:-1:-1;;;64123:9:0;;;;;;;;;;;;:27;-1:-1:-1;;;;;64123:27:0;;;;;;;;-1:-1:-1;64103:3:0;;;;:::i;:::-;;;;64068:94;;;-1:-1:-1;64186:6:0;63910:291;-1:-1:-1;;63910:291:0:o;55195:7051::-;55257:13;55283:26;55320:31;55362:30;55403:35;55451:15;55469:19;55480:7;55469:10;:19::i;:::-;55451:37;-1:-1:-1;55505:12:0;55501:6433;;55558:22;;;;;;;;;;;;;-1:-1:-1;;;55558:22:0;;;;;55595:23;;;;;;;;;;;;;-1:-1:-1;;;55595:23:0;;;;;55633:160;;;;;;;;;;;;;;;;;;;55501:6433;;;55815:7;55826:1;55815:12;55811:6123;;;55910:41;55919:31;55928:7;55919:31;;;;;;;;;;;;;-1:-1:-1;;;55919:31:0;;;55944:1;55947:2;55919:8;:31::i;:::-;55910:8;:41::i;:::-;55962;55971:31;55980:7;55971:31;;;;;;;;;;;;;-1:-1:-1;;;55971:31:0;;;55996:1;55999:2;55971:8;:31::i;55962:41::-;55887:117;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55887:117:0;;;;;;56020:24;;;;;;;;;-1:-1:-1;;;55887:117:0;56020:24;;;55887:117;-1:-1:-1;55887:117:0;-1:-1:-1;55811:6123:0;;;56066:7;56077:1;56066:12;56062:5872;;;56163:45;56172:35;56181:7;56172:35;;;;;;;;;;;;;-1:-1:-1;;;56172:35:0;;;56200:2;56204;56172:8;:35::i;56163:45::-;56140:69;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56140:69:0;;;;;;56254:37;;;;;;;;;-1:-1:-1;;;56140:69:0;56254:37;;;56140:69;-1:-1:-1;56245:47:0;;56254:37;;56263:7;;56282:3;56287;56254:8;:37::i;56245:47::-;56225:67;;56062:5872;;;56314:7;56325:1;56314:12;56310:5624;;;56369:948;;;;;;;;;;;;;;;;;;;;;;;;;;56310:5624;57339:7;57350:1;57339:12;57335:4599;;;57391:305;;;;;;;;;;;;;;;;;;;;;;;;;;57335:4599;57718:7;57729:1;57718:12;57714:4220;;;57775:20;;;;;;;;;;;;;-1:-1:-1;;;57775:20:0;;;;;57810:23;;;;;;;;;;;;;-1:-1:-1;;;57810:23:0;;;;;57848:474;;;;;;;;;;;;;;;;;;;57714:4220;;;58344:7;58355:1;58344:12;58340:3594;;;58441:48;58450:38;58459:7;58450:38;;;;;;;;;;;;;-1:-1:-1;;;58450:38:0;;;58479:3;58484;58450:8;:38::i;58441:48::-;58419:71;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58419:71:0;;;;;;58535:38;;;;;;;;;-1:-1:-1;;;58419:71:0;58535:38;;;58419:71;-1:-1:-1;58526:48:0;;58535:38;;58544:7;;58564:3;58569;58535:8;:38::i;58340:3594::-;58596:7;58607:1;58596:12;58592:3342;;;58692:46;58701:36;58710:7;58701:36;;;;;;;;;;;;;-1:-1:-1;;;58701:36:0;;;58728:3;58733;58701:8;:36::i;58692:46::-;58669:89;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58669:89:0;;;;;;58803:36;;;;;;;;;-1:-1:-1;;;58669:89:0;58803:36;;;58669:89;-1:-1:-1;58794:46:0;;58803:36;;58812:7;;58830:3;58835;58803:8;:36::i;58592:3342::-;58862:7;58873:1;58862:12;58858:3076;;;58917:110;;;;;;;;;;;;;;;;;;;;;;;;;;58858:3076;59049:7;59060:1;59049:12;59045:2889;;;59099:87;;;;;;;;;;;;;;;;;;;;;;;;;;59045:2889;59208:7;59219:2;59208:13;59204:2730;;;59261:85;;;;;;;;;;;;;;;;;;;;;;;;;;59204:2730;59368:7;59379:2;59368:13;59364:2570;;;59420:85;;;;;;;;;;;;;;;;;;;;;;;;;;59364:2570;59527:7;59538:2;59527:13;59523:2411;;;59585:211;;;;;;;;;;;;;;;;;;;;;;;;;;59523:2411;59818:7;59829:2;59818:13;59814:2120;;;59871:124;;;;;;;;;;;;;;;;;;;;;;;;;;59814:2120;60017:7;60028:2;60017:13;60013:1921;;;60074:446;;;;;;;;;;;;;;;;;;;;;;;;;;60013:1921;60542:7;60553:2;60542:13;60538:1396;;;60672:45;60681:35;60690:7;60681:35;;;;;;;;;;;;;-1:-1:-1;;;60681:35:0;;;60710:1;60713:2;60681:8;:35::i;60672:45::-;60612:126;;;;;;;;:::i;:::-;;;;;;;;;;;;;60598:141;;;;;;;;;60538:1396;60761:7;60772:2;60761:13;60757:1177;;;60819:360;;;;;;;;;;;;;;;;;;;;;;;;;;60757:1177;61201:7;61212:2;61201:13;61197:737;;;61257:202;;;;;;;;;;;;;;;;;;;;;;;;;;61197:737;61481:7;61492:2;61481:13;61477:457;;;61541:381;;;;;;;;;;;;;;;;;;;;;;;;;;61477:457;61946:20;62025:12;62063:16;62143:17;62166:21;61976:235;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;61976:235:0;;;;;;;55195:7051;-1:-1:-1;;;;;;;;55195:7051:0:o;52186:138::-;52246:7;52308:5;52291:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52291:23:0;;;;;;;;;52281:34;;52291:23;52281:34;;;;;52186:138;-1:-1:-1;;52186:138:0:o;35575:321::-;35705:18;35711:2;35715:7;35705:5;:18::i;:::-;35756:54;35787:1;35791:2;35795:7;35804:5;35756:22;:54::i;:::-;35734:154;;;;-1:-1:-1;;;35734:154:0;;;;;;;:::i;45175:164::-;45279:10;:17;;45252:24;;;;:15;:24;;;;;:44;;;45307:24;;;;;;;;;;;;45175:164::o;45966:988::-;46232:22;46282:1;46257:22;46274:4;46257:16;:22::i;:::-;:26;;;;:::i;:::-;46294:18;46315:26;;;:17;:26;;;;;;46232:51;;-1:-1:-1;46448:28:0;;;46444:328;;-1:-1:-1;;;;;46515:18:0;;46493:19;46515:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46566:30;;;;;;:44;;;46683:30;;:17;:30;;;;;:43;;;46444:328;-1:-1:-1;46868:26:0;;;;:17;:26;;;;;;;;46861:33;;;-1:-1:-1;;;;;46912:18:0;;;;;:12;:18;;;;;:34;;;;;;;46905:41;45966:988::o;47249:1079::-;47527:10;:17;47502:22;;47527:21;;47547:1;;47527:21;:::i;:::-;47559:18;47580:24;;;:15;:24;;;;;;47953:10;:26;;47502:46;;-1:-1:-1;47580:24:0;;47502:46;;47953:26;;;;-1:-1:-1;;;47953:26:0;;;;;;;;;;;;;;;;;47931:48;;48017:11;47992:10;48003;47992:22;;;;;;-1:-1:-1;;;47992:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;48097:28;;;:15;:28;;;;;;;:41;;;48269:24;;;;;48262:31;48304:10;:16;;;;;-1:-1:-1;;;48304:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;47249:1079;;;;:::o;44753:221::-;44838:14;44855:20;44872:2;44855:16;:20::i;:::-;-1:-1:-1;;;;;44886:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44931:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44753:221:0:o;19135:387::-;19458:20;19506:8;;;19135:387::o;10872:478::-;11122:18;;10997:3;;11045:5;;11095:6;;11144:1;11122:23;11115:31;;-1:-1:-1;;;11115:31:0;;;;;;;;;11173:7;11159:162;11186:10;:17;11182:1;:21;11159:162;;;11246:11;11258:1;11246:14;;;;;;-1:-1:-1;;;11246:14:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11229:31:0;;:10;11240:1;11229:13;;;;;;-1:-1:-1;;;11229:13:0;;;;;;;;;;;;;-1:-1:-1;;;;;;11229:13:0;:31;11225:85;;;11292:1;-1:-1:-1;11281:13:0;;-1:-1:-1;;11281:13:0;11225:85;11205:3;;;;:::i;:::-;;;;11159:162;;;-1:-1:-1;;;11340:2:0;10872:478;-1:-1:-1;;;;;;10872:478:0:o;52450:361::-;52565:7;;52600:120;52641:16;52656:1;52641:12;:16;:::i;:::-;52631:27;52660:9;52671:17;52680:7;52671:8;:17::i;:::-;52690:6;52698;52705:12;:10;:12::i;:::-;52614:104;;;;;;;;;;;;;:::i;52600:120::-;52585:135;-1:-1:-1;52731:11:0;52776:6;52753:15;52776:6;52753;:15;:::i;:::-;:19;;52771:1;52753:19;:::i;:::-;52745:28;;:4;:28;:::i;:::-;:37;;;;:::i;:::-;52731:51;52450:361;-1:-1:-1;;;;;;;52450:361:0:o;36232:382::-;-1:-1:-1;;;;;36312:16:0;;36304:61;;;;-1:-1:-1;;;36304:61:0;;;;;;;:::i;:::-;36385:16;36393:7;36385;:16::i;:::-;36384:17;36376:58;;;;-1:-1:-1;;;36376:58:0;;;;;;;:::i;:::-;36447:45;36476:1;36480:2;36484:7;36447:20;:45::i;:::-;-1:-1:-1;;;;;36505:13:0;;;;;;:9;:13;;;;;:18;;36522:1;;36505:13;:18;;36522:1;;36505:18;:::i;:::-;;;;-1:-1:-1;;36534:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36534:21:0;-1:-1:-1;;;;;36534:21:0;;;;;;;;36573:33;;36534:16;;;36573:33;;36534:16;;36573:33;36232:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:938::-;;;;;1195:3;1183:9;1174:7;1170:23;1166:33;1163:2;;;1217:6;1209;1202:22;1163:2;1245:31;1266:9;1245:31;:::i;:::-;1235:41;;1295:40;1331:2;1320:9;1316:18;1295:40;:::i;:::-;1285:50;;1382:2;1371:9;1367:18;1354:32;1344:42;;1437:2;1426:9;1422:18;1409:32;1464:18;1456:6;1453:30;1450:2;;;1501:6;1493;1486:22;1450:2;1529:22;;1582:4;1574:13;;1570:27;-1:-1:-1;1560:2:1;;1616:6;1608;1601:22;1560:2;1657;1644:16;1682:49;1697:33;1727:2;1697:33;:::i;:::-;1682:49;:::i;:::-;1754:2;1747:5;1740:17;1794:7;1789:2;1784;1780;1776:11;1772:20;1769:33;1766:2;;;1820:6;1812;1805:22;1766:2;1880;1875;1871;1867:11;1862:2;1855:5;1851:14;1838:45;1903:14;;;1919:2;1899:23;1892:39;;;;-1:-1:-1;1153:808:1;;;;-1:-1:-1;1153:808:1;-1:-1:-1;1153:808:1:o;1966:369::-;;;2092:2;2080:9;2071:7;2067:23;2063:32;2060:2;;;2113:6;2105;2098:22;2060:2;2141:31;2162:9;2141:31;:::i;:::-;2131:41;;2222:2;2211:9;2207:18;2194:32;2269:5;2262:13;2255:21;2248:5;2245:32;2235:2;;2296:6;2288;2281:22;2235:2;2324:5;2314:15;;;2050:285;;;;;:::o;2340:266::-;;;2469:2;2457:9;2448:7;2444:23;2440:32;2437:2;;;2490:6;2482;2475:22;2437:2;2518:31;2539:9;2518:31;:::i;:::-;2508:41;2596:2;2581:18;;;;2568:32;;-1:-1:-1;;;2427:179:1:o;2611:257::-;;2722:2;2710:9;2701:7;2697:23;2693:32;2690:2;;;2743:6;2735;2728:22;2690:2;2787:9;2774:23;2806:32;2832:5;2806:32;:::i;2873:261::-;;2995:2;2983:9;2974:7;2970:23;2966:32;2963:2;;;3016:6;3008;3001:22;2963:2;3053:9;3047:16;3072:32;3098:5;3072:32;:::i;3139:676::-;;3272:2;3260:9;3251:7;3247:23;3243:32;3240:2;;;3293:6;3285;3278:22;3240:2;3331:9;3325:16;3364:18;3356:6;3353:30;3350:2;;;3401:6;3393;3386:22;3350:2;3429:22;;3482:4;3474:13;;3470:27;-1:-1:-1;3460:2:1;;3516:6;3508;3501:22;3460:2;3550;3544:9;3575:49;3590:33;3620:2;3590:33;:::i;3575:49::-;3647:2;3640:5;3633:17;3687:7;3682:2;3677;3673;3669:11;3665:20;3662:33;3659:2;;;3713:6;3705;3698:22;3659:2;3731:54;3782:2;3777;3770:5;3766:14;3761:2;3757;3753:11;3731:54;:::i;:::-;3804:5;3230:585;-1:-1:-1;;;;;3230:585:1:o;3820:190::-;;3932:2;3920:9;3911:7;3907:23;3903:32;3900:2;;;3953:6;3945;3938:22;3900:2;-1:-1:-1;3981:23:1;;3890:120;-1:-1:-1;3890:120:1:o;4015:194::-;;4138:2;4126:9;4117:7;4113:23;4109:32;4106:2;;;4159:6;4151;4144:22;4106:2;-1:-1:-1;4187:16:1;;4096:113;-1:-1:-1;4096:113:1:o;4214:259::-;;4295:5;4289:12;4322:6;4317:3;4310:19;4338:63;4394:6;4387:4;4382:3;4378:14;4371:4;4364:5;4360:16;4338:63;:::i;:::-;4455:2;4434:15;-1:-1:-1;;4430:29:1;4421:39;;;;4462:4;4417:50;;4265:208;-1:-1:-1;;4265:208:1:o;4478:127::-;-1:-1:-1;;;4545:27:1;;4597:1;4588:11;;4535:70::o;4610:348::-;;4799:6;4794:3;4787:19;4835:6;4829:13;4851:60;4904:6;4899:2;4894:3;4890:12;4885:2;4877:6;4873:15;4851:60;:::i;:::-;4931:16;;;;4949:2;4927:25;;4777:181;-1:-1:-1;;;4777:181:1:o;4963:801::-;;5284:6;5279:3;5272:19;5320:6;5314:13;5336:60;5389:6;5384:2;5379:3;5375:12;5370:2;5362:6;5358:15;5336:60;:::i;:::-;5424:6;5419:3;5415:16;5405:26;;5462:6;5456:13;5478:61;5530:8;5525:2;5521;5517:11;5512:2;5504:6;5500:15;5478:61;:::i;:::-;5558:17;5599:2;5591:11;;5584:27;;;;-1:-1:-1;;5635:2:1;5627:11;;5620:27;;;;-1:-1:-1;;5684:2:1;5680:15;;;5676:53;5663:11;;;5656:74;5754:3;5746:12;;;-1:-1:-1;;;5262:502:1:o;5769:276::-;;5938:6;5932:13;5954:53;6000:6;5995:3;5988:4;5980:6;5976:17;5954:53;:::i;:::-;6023:16;;;;;5908:137;-1:-1:-1;;5908:137:1:o;6050:664::-;;6315:6;6309:13;6331:53;6377:6;6372:3;6365:4;6357:6;6353:17;6331:53;:::i;:::-;6447:13;;6406:16;;;;6469:57;6447:13;6406:16;6503:4;6491:17;;6469:57;:::i;:::-;6593:13;;6548:20;;;6615:57;6593:13;6548:20;6649:4;6637:17;;6615:57;:::i;:::-;6688:20;;6285:429;-1:-1:-1;;;;;6285:429:1:o;6719:858::-;;7032:6;7026:13;7048:53;7094:6;7089:3;7082:4;7074:6;7070:17;7048:53;:::i;:::-;7164:13;;7123:16;;;;7186:57;7164:13;7123:16;7220:4;7208:17;;7186:57;:::i;:::-;7310:13;;7265:20;;;7332:57;7310:13;7265:20;7366:4;7354:17;;7332:57;:::i;:::-;7456:13;;7411:20;;;7478:57;7456:13;7411:20;7512:4;7500:17;;7478:57;:::i;:::-;7551:20;;7002:575;-1:-1:-1;;;;;;7002:575:1:o;7582:1816::-;-1:-1:-1;;;8380:63:1;;8466:13;;7582:1816;;8488:62;8466:13;8538:2;8529:12;;8522:4;8510:17;;8488:62;:::i;:::-;8614:66;8609:2;8569:16;;;8601:11;;;8594:87;8710:27;8705:2;8697:11;;8690:48;8763:13;;8785:63;8763:13;8834:2;8826:11;;8819:4;8807:17;;8785:63;:::i;:::-;-1:-1:-1;;;8908:2:1;8867:17;;;;8900:11;;;8893:33;8951:13;;8973:63;8951:13;9022:2;9014:11;;9007:4;8995:17;;8973:63;:::i;:::-;9101:66;9096:2;9055:17;;;;9088:11;;;9081:87;-1:-1:-1;;;9192:3:1;9184:12;;9177:28;9230:13;;9252:64;9230:13;9301:3;9293:12;;9286:4;9274:17;;9252:64;:::i;:::-;9332:60;9387:3;9376:8;9372:2;9368:17;9364:27;9332:60;:::i;:::-;9325:67;8370:1028;-1:-1:-1;;;;;;;;8370:1028:1:o;9403:1836::-;;10213:66;10208:3;10201:79;10309:6;10303:13;10325:62;10380:6;10375:2;10370:3;10366:12;10359:4;10351:6;10347:17;10325:62;:::i;:::-;-1:-1:-1;;;10446:2:1;10406:16;;;10438:11;;;10431:76;10532:13;;10554:63;10532:13;10603:2;10595:11;;10588:4;10576:17;;10554:63;:::i;:::-;10682:34;10677:2;10636:17;;;;10669:11;;;10662:55;10746:66;10741:2;10733:11;;10726:87;10838:13;;10860:64;10838:13;10909:3;10901:12;;10894:4;10882:17;;10860:64;:::i;:::-;-1:-1:-1;;;10984:3:1;10943:17;;;;10976:12;;;10969:36;11030:13;;11052:64;11030:13;11101:3;11093:12;;11086:4;11074:17;;11052:64;:::i;:::-;-1:-1:-1;;;11176:3:1;11135:17;;;;11168:12;;;11161:44;11229:3;11221:12;;10191:1048;-1:-1:-1;;;;;;10191:1048:1:o;11244:419::-;;-1:-1:-1;;;11501:3:1;11494:17;11540:6;11534:13;11556:61;11610:6;11606:1;11601:3;11597:11;11590:4;11582:6;11578:17;11556:61;:::i;:::-;11637:16;;;;11655:1;11633:24;;11484:179;-1:-1:-1;;11484:179:1:o;11668:420::-;;-1:-1:-1;;;11925:3:1;11918:18;11965:6;11959:13;11981:61;12035:6;12031:1;12026:3;12022:11;12015:4;12007:6;12003:17;11981:61;:::i;:::-;12062:16;;;;12080:1;12058:24;;11908:180;-1:-1:-1;;11908:180:1:o;12093:899::-;;-1:-1:-1;;;12629:2:1;12624:3;12617:15;12661:6;12655:13;12677:61;12731:6;12727:1;12722:3;12718:11;12711:4;12703:6;12699:17;12677:61;:::i;:::-;12766:6;12761:3;12757:16;12747:26;;-1:-1:-1;;;12797:1:1;12793:2;12789:10;12782:23;12833:2;12829:1;12825:2;12821:10;12814:22;12867:6;12861:13;12845:29;;12883:62;12936:8;12932:1;12928:2;12924:10;12917:4;12909:6;12905:17;12883:62;:::i;:::-;12965:17;12984:1;12961:25;;12583:409;-1:-1:-1;;;;12583:409:1:o;12997:616::-;;-1:-1:-1;;;13355:3:1;13348:18;13395:6;13389:13;13411:61;13465:6;13461:1;13456:3;13452:11;13445:4;13437:6;13433:17;13411:61;:::i;:::-;-1:-1:-1;;;13531:1:1;13491:16;;;;13523:10;;;13516:64;-1:-1:-1;13604:2:1;13596:11;;13338:275;-1:-1:-1;13338:275:1:o;13618:448::-;;13880:31;13875:3;13868:44;13941:6;13935:13;13957:62;14012:6;14007:2;14002:3;13998:12;13991:4;13983:6;13979:17;13957:62;:::i;:::-;14039:16;;;;14057:2;14035:25;;13858:208;-1:-1:-1;;13858:208:1:o;14071:738::-;;14434:66;14429:3;14422:79;14540:18;14535:3;14531:28;14526:2;14521:3;14517:12;14510:50;14589:6;14583:13;14605:60;14658:6;14653:2;14648:3;14644:12;14639:2;14631:6;14627:15;14605:60;:::i;:::-;-1:-1:-1;;;14724:2:1;14684:16;;;;14716:11;;;14709:67;-1:-1:-1;14800:2:1;14792:11;;14412:397;-1:-1:-1;14412:397:1:o;14814:828::-;;15177:66;15172:3;15165:79;15274:66;15269:2;15264:3;15260:12;15253:88;15380:32;15375:3;15371:42;15366:2;15361:3;15357:12;15350:64;15443:6;15437:13;15459:60;15512:6;15507:2;15502:3;15498:12;15493:2;15485:6;15481:15;15459:60;:::i;:::-;-1:-1:-1;;;15578:2:1;15538:16;;;;15570:11;;;15563:45;-1:-1:-1;15632:3:1;15624:12;;15155:487;-1:-1:-1;15155:487:1:o;15647:203::-;-1:-1:-1;;;;;15811:32:1;;;;15793:51;;15781:2;15766:18;;15748:102::o;15855:490::-;-1:-1:-1;;;;;16124:15:1;;;16106:34;;16176:15;;16171:2;16156:18;;16149:43;16223:2;16208:18;;16201:34;;;16271:3;16266:2;16251:18;;16244:31;;;15855:490;;16292:47;;16319:19;;16311:6;16292:47;:::i;:::-;16284:55;16058:287;-1:-1:-1;;;;;;16058:287:1:o;16350:187::-;16515:14;;16508:22;16490:41;;16478:2;16463:18;;16445:92::o;16542:221::-;;16691:2;16680:9;16673:21;16711:46;16753:2;16742:9;16738:18;16730:6;16711:46;:::i;16768:414::-;16970:2;16952:21;;;17009:2;16989:18;;;16982:30;17048:34;17043:2;17028:18;;17021:62;-1:-1:-1;;;17114:2:1;17099:18;;17092:48;17172:3;17157:19;;16942:240::o;17187:355::-;17389:2;17371:21;;;17428:2;17408:18;;;17401:30;17467:33;17462:2;17447:18;;17440:61;17533:2;17518:18;;17361:181::o;17547:407::-;17749:2;17731:21;;;17788:2;17768:18;;;17761:30;17827:34;17822:2;17807:18;;17800:62;-1:-1:-1;;;17893:2:1;17878:18;;17871:41;17944:3;17929:19;;17721:233::o;17959:414::-;18161:2;18143:21;;;18200:2;18180:18;;;18173:30;18239:34;18234:2;18219:18;;18212:62;-1:-1:-1;;;18305:2:1;18290:18;;18283:48;18363:3;18348:19;;18133:240::o;18378:484::-;18580:2;18562:21;;;18619:2;18599:18;;;18592:30;18658:34;18653:2;18638:18;;18631:62;18729:34;18724:2;18709:18;;18702:62;-1:-1:-1;;;18795:3:1;18780:19;;18773:47;18852:3;18837:19;;18552:310::o;18867:402::-;19069:2;19051:21;;;19108:2;19088:18;;;19081:30;19147:34;19142:2;19127:18;;19120:62;-1:-1:-1;;;19213:2:1;19198:18;;19191:36;19259:3;19244:19;;19041:228::o;19274:352::-;19476:2;19458:21;;;19515:2;19495:18;;;19488:30;19554;19549:2;19534:18;;19527:58;19617:2;19602:18;;19448:178::o;19631:400::-;19833:2;19815:21;;;19872:2;19852:18;;;19845:30;19911:34;19906:2;19891:18;;19884:62;-1:-1:-1;;;19977:2:1;19962:18;;19955:34;20021:3;20006:19;;19805:226::o;20036:349::-;20238:2;20220:21;;;20277:2;20257:18;;;20250:30;20316:27;20311:2;20296:18;;20289:55;20376:2;20361:18;;20210:175::o;20390:408::-;20592:2;20574:21;;;20631:2;20611:18;;;20604:30;20670:34;20665:2;20650:18;;20643:62;-1:-1:-1;;;20736:2:1;20721:18;;20714:42;20788:3;20773:19;;20564:234::o;20803:420::-;21005:2;20987:21;;;21044:2;21024:18;;;21017:30;21083:34;21078:2;21063:18;;21056:62;21154:26;21149:2;21134:18;;21127:54;21213:3;21198:19;;20977:246::o;21228:406::-;21430:2;21412:21;;;21469:2;21449:18;;;21442:30;21508:34;21503:2;21488:18;;21481:62;-1:-1:-1;;;21574:2:1;21559:18;;21552:40;21624:3;21609:19;;21402:232::o;21639:405::-;21841:2;21823:21;;;21880:2;21860:18;;;21853:30;21919:34;21914:2;21899:18;;21892:62;-1:-1:-1;;;21985:2:1;21970:18;;21963:39;22034:3;22019:19;;21813:231::o;22049:350::-;22251:2;22233:21;;;22290:2;22270:18;;;22263:30;22329:28;22324:2;22309:18;;22302:56;22390:2;22375:18;;22223:176::o;22404:356::-;22606:2;22588:21;;;22625:18;;;22618:30;22684:34;22679:2;22664:18;;22657:62;22751:2;22736:18;;22578:182::o;22765:347::-;22967:2;22949:21;;;23006:2;22986:18;;;22979:30;23045:25;23040:2;23025:18;;23018:53;23103:2;23088:18;;22939:173::o;23117:472::-;23319:2;23301:21;;;23358:2;23338:18;;;23331:30;23397:34;23392:2;23377:18;;23370:62;23468:34;23463:2;23448:18;;23441:62;-1:-1:-1;;;23534:3:1;23519:19;;23512:35;23579:3;23564:19;;23291:298::o;23594:408::-;23796:2;23778:21;;;23835:2;23815:18;;;23808:30;23874:34;23869:2;23854:18;;23847:62;-1:-1:-1;;;23940:2:1;23925:18;;23918:42;23992:3;23977:19;;23768:234::o;24007:356::-;24209:2;24191:21;;;24228:18;;;24221:30;24287:34;24282:2;24267:18;;24260:62;24354:2;24339:18;;24181:182::o;24368:405::-;24570:2;24552:21;;;24609:2;24589:18;;;24582:30;24648:34;24643:2;24628:18;;24621:62;-1:-1:-1;;;24714:2:1;24699:18;;24692:39;24763:3;24748:19;;24542:231::o;24778:397::-;24980:2;24962:21;;;25019:2;24999:18;;;24992:30;25058:34;25053:2;25038:18;;25031:62;-1:-1:-1;;;25124:2:1;25109:18;;25102:31;25165:3;25150:19;;24952:223::o;25180:352::-;25382:2;25364:21;;;25421:2;25401:18;;;25394:30;25460;25455:2;25440:18;;25433:58;25523:2;25508:18;;25354:178::o;25537:352::-;25739:2;25721:21;;;25778:2;25758:18;;;25751:30;25817;25812:2;25797:18;;25790:58;25880:2;25865:18;;25711:178::o;25894:413::-;26096:2;26078:21;;;26135:2;26115:18;;;26108:30;26174:34;26169:2;26154:18;;26147:62;-1:-1:-1;;;26240:2:1;26225:18;;26218:47;26297:3;26282:19;;26068:239::o;26312:408::-;26514:2;26496:21;;;26553:2;26533:18;;;26526:30;26592:34;26587:2;26572:18;;26565:62;-1:-1:-1;;;26658:2:1;26643:18;;26636:42;26710:3;26695:19;;26486:234::o;26725:355::-;26927:2;26909:21;;;26966:2;26946:18;;;26939:30;27005:33;27000:2;26985:18;;26978:61;27071:2;27056:18;;26899:181::o;27085:408::-;27287:2;27269:21;;;27326:2;27306:18;;;27299:30;27365:34;27360:2;27345:18;;27338:62;-1:-1:-1;;;27431:2:1;27416:18;;27409:42;27483:3;27468:19;;27259:234::o;27498:177::-;27644:25;;;27632:2;27617:18;;27599:76::o;27680:251::-;27750:2;27744:9;27780:17;;;27827:18;27812:34;;27848:22;;;27809:62;27806:2;;;27874:18;;:::i;:::-;27910:2;27903:22;27724:207;;-1:-1:-1;27724:207:1:o;27936:190::-;;28019:18;28011:6;28008:30;28005:2;;;28041:18;;:::i;:::-;-1:-1:-1;28109:2:1;28086:17;-1:-1:-1;;28082:31:1;28115:4;28078:42;;27995:131::o;28131:267::-;;28198:11;;;28225:10;;-1:-1:-1;;;;;28244:27:1;;;28237:35;;28221:52;28218:2;;;28276:18;;:::i;:::-;-1:-1:-1;;;28323:19:1;;;28316:27;;28308:36;;28305:2;;;28347:18;;:::i;:::-;-1:-1:-1;;28383:9:1;;28178:220::o;28403:128::-;;28474:1;28470:6;28467:1;28464:13;28461:2;;;28480:18;;:::i;:::-;-1:-1:-1;28516:9:1;;28451:80::o;28536:120::-;;28602:1;28592:2;;28607:18;;:::i;:::-;-1:-1:-1;28641:9:1;;28582:74::o;28661:168::-;;28767:1;28763;28759:6;28755:14;28752:1;28749:21;28744:1;28737:9;28730:17;28726:45;28723:2;;;28774:18;;:::i;:::-;-1:-1:-1;28814:9:1;;28713:116::o;28834:125::-;;28902:1;28899;28896:8;28893:2;;;28907:18;;:::i;:::-;-1:-1:-1;28944:9:1;;28883:76::o;28964:258::-;29036:1;29046:113;29060:6;29057:1;29054:13;29046:113;;;29136:11;;;29130:18;29117:11;;;29110:39;29082:2;29075:10;29046:113;;;29177:6;29174:1;29171:13;29168:2;;;-1:-1:-1;;29212:1:1;29194:16;;29187:27;29017:205::o;29227:380::-;29312:1;29302:12;;29359:1;29349:12;;;29370:2;;29424:4;29416:6;29412:17;29402:27;;29370:2;29477;29469:6;29466:14;29446:18;29443:38;29440:2;;;29523:10;29518:3;29514:20;29511:1;29504:31;29558:4;29555:1;29548:15;29586:4;29583:1;29576:15;29440:2;;29282:325;;;:::o;29612:135::-;;-1:-1:-1;;29672:17:1;;29669:2;;;29692:18;;:::i;:::-;-1:-1:-1;29739:1:1;29728:13;;29659:88::o;29752:112::-;;29810:1;29800:2;;29815:18;;:::i;:::-;-1:-1:-1;29849:9:1;;29790:74::o;29869:127::-;29930:10;29925:3;29921:20;29918:1;29911:31;29961:4;29958:1;29951:15;29985:4;29982:1;29975:15;30001:127;30062:10;30057:3;30053:20;30050:1;30043:31;30093:4;30090:1;30083:15;30117:4;30114:1;30107:15;30133:127;30194:10;30189:3;30185:20;30182:1;30175:31;30225:4;30222:1;30215:15;30249:4;30246:1;30239:15;30265:133;-1:-1:-1;;;;;;30341:32:1;;30331:43;;30321:2;;30388:1;30385;30378:12

Swarm Source

ipfs://2c612d8aee24d932c300895b977b3c44794162cdf4f308a69f1fee87d3439158
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.