ETH Price: $2,360.66 (+5.13%)

Token

Outlaws (OLW)
 

Overview

Max Total Supply

361 OLW

Holders

119

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
191 OLW
0x4629a7fec60899868f5b97648e08183787fb187f
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:
Outlaw

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-13
*/

/** 
 *  SourceUnit: /home/clayrisser/Desktop/Outlaw.sol
*/


/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

////////import "../../utils/introspection/IERC165.sol";

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

////////import "./IERC165.sol";

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

////////import "../IERC721.sol";

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

////////import "./IERC721.sol";
////////import "./IERC721Receiver.sol";
////////import "./extensions/IERC721Metadata.sol";
////////import "../../utils/Address.sol";
////////import "../../utils/Context.sol";
////////import "../../utils/Strings.sol";
////////import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

////////import "../IERC721.sol";

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

////////import "../ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

    /**
     * @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 override {
        super._burn(tokenId);

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

////////import "../ERC721.sol";
////////import "./IERC721Enumerable.sol";

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;

////////import "../ERC721.sol";
////////import "../../../utils/Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

////////import "../utils/Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

////////import "../utils/Context.sol";

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

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

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

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

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

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

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

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




/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/
            
////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

////////import "./IAccessControl.sol";
////////import "../utils/Context.sol";
////////import "../utils/Strings.sol";
////////import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


/** 
 *  SourceUnit: /home/clayrisser/Projects/crypto-outlaws/ethereum-nft/contracts/Outlaw.sol
*/

////////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING-FLATTEN-SUPPRESS-WARNING: UNLICENSED
pragma solidity ^0.8.0;

////////import "@openzeppelin/contracts/access/AccessControl.sol";
////////import "@openzeppelin/contracts/access/Ownable.sol";
////////import "@openzeppelin/contracts/security/Pausable.sol";
////////import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
////////import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
////////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";
////////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
////////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
////////import "@openzeppelin/contracts/utils/Counters.sol";

// @custom:security-contact [email protected]
contract Outlaw is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    Pausable,
    Ownable,
    AccessControl,
    ERC721Burnable,
    ReentrancyGuard
{
    using Counters for Counters.Counter;

    uint96 private constant _ROYALTIES_PERCENTAGE_BASIS_POINTS = 777; // 100 is 1%
    Counters.Counter private _tokenIdCounter;
    address payable private _royaltiesReceipientAddress;
    mapping(uint256 => uint256) private _tokenIdsByImageId;
    mapping(uint256 => uint256) private _imageIdsByTokenId;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant WHITELIST_ROLE = keccak256("WHITELIST_ROLE");
    string public constant LICENSE = "https://olw.outlawsnft.io/license";
    uint256 public constant MAX_BATCH_MINT = 10;
    uint256 public constant MAX_SUPPLY = 7777;
    uint256 public constant MAX_WHITELIST_SUPPLY = 777;
    uint256 public constant PUBLIC_COST = 0.077 ether;
    uint256 public constant REMINT_COST = 0.00 ether;
    uint256 public constant WHITELIST_COST = 0.05 ether;

    bool public publicSale = false;
    uint256 public whitelistMaxMint = 0;

    constructor() ERC721("Outlaws", "OLW") ReentrancyGuard() {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        _royaltiesReceipientAddress = payable(msg.sender);
        _tokenIdCounter.increment(); // start at 1
    }

    /// @notice mint an nft
    /// @param uris ipfs uris of the metadata
    function mint(string[] memory uris, uint256[] memory imageIds)
        public
        payable
    {
        require(
            uris.length == imageIds.length,
            "uris and image ids must be the same length"
        );
        uint256 mintAmount = uris.length;
        require(mintAmount > 0, "cannot mint 0 tokens");
        require(mintAmount <= MAX_BATCH_MINT, "minting too many tokens");
        if (hasRole(MINTER_ROLE, msg.sender)) {
            _increMint(msg.sender, uris, imageIds);
            return;
        } else if (_canWhitelist(mintAmount)) {
            require(
                msg.value >= (WHITELIST_COST * mintAmount),
                "not enough ether supplied"
            );
            _increMint(msg.sender, uris, imageIds);
            return;
        }
        require(publicSale, "public sale has not started yet");
        require(
            msg.value >= (PUBLIC_COST * mintAmount),
            "not enough ether supplied"
        );
        _increMint(msg.sender, uris, imageIds);
    }

    function mintCost(uint256 mintAmount) public view returns (uint256) {
        if (hasRole(MINTER_ROLE, msg.sender)) {
            return 0;
        } else if (_canWhitelist(mintAmount)) {
            return WHITELIST_COST * mintAmount;
        }
        return PUBLIC_COST * mintAmount;
    }

    /// @notice remint an nft
    function remint(
        uint256 tokenId,
        string memory uri,
        uint256 imageId
    ) public payable {
        address tokenOwner = ownerOf(tokenId);
        require(
            owner() == msg.sender || msg.sender == tokenOwner,
            "must own the token to remint"
        );
        if (owner() != msg.sender) {
            require(msg.value >= REMINT_COST, "not enough ether supplied");
        }
        require(
            _tokenIdsByImageId[imageId] <= 0 ||
                _tokenIdsByImageId[imageId] == tokenId,
            string("image id already minted")
        );
        _burn(tokenId);
        _safeMint(tokenOwner, tokenId);
        _associateImageIdWithTokenId(imageId, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function tokenIdFromImageId(uint256 imageId) public view returns (uint256) {
        return _tokenIdsByImageId[imageId];
    }

    function imageIdFromTokenId(uint256 tokenId) public view returns (uint256) {
        return _imageIdsByTokenId[tokenId];
    }

    function walletOf(address tokenOwner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(tokenOwner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(tokenOwner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

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

    /// @notice withdraw funds from contract
    function withdraw() external nonReentrant onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
    }

    function contractBalance() external view onlyOwner returns (uint256) {
        return address(this).balance;
    }

    function addToWhitelist(address[] calldata addresses) public onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _grantRole(WHITELIST_ROLE, addresses[i]);
        }
    }

    function removeFromWhitelist(address[] calldata addresses)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            _revokeRole(WHITELIST_ROLE, addresses[i]);
        }
    }

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

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

    function flipPublicSale() public onlyOwner {
        publicSale = !publicSale;
    }

    function setWhitelistMaxMint(uint256 _whitelistMaxMint) public onlyOwner {
        whitelistMaxMint = _whitelistMaxMint;
    }

    function burn(uint256 tokenId) public override onlyOwner {
        super.burn(tokenId);
    }

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

    function _increMint(
        address tokenOwner,
        string[] memory uris,
        uint256[] memory imageIds
    ) private {
        uint256 mintAmount = uris.length;
        require(
            (_tokenIdCounter.current() + mintAmount) <= MAX_SUPPLY,
            "all 7777 tokens have been minted"
        );
        for (uint256 i = 0; i < mintAmount; i++) {
            _mintOne(tokenOwner, uris[i], imageIds[i]);
        }
    }

    function _mintOne(
        address tokenOwner,
        string memory uri,
        uint256 imageId
    ) private {
        require(
            (_tokenIdCounter.current() + 1) <= MAX_SUPPLY,
            "all 7777 tokens have been minted"
        );
        require(
            _tokenIdsByImageId[imageId] <= 0,
            string("image id already minted")
        );
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(tokenOwner, tokenId);
        _associateImageIdWithTokenId(imageId, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function _canWhitelist(uint256 mintAmount) private view returns (bool) {
        return
            hasRole(WHITELIST_ROLE, msg.sender) &&
            ((balanceOf(msg.sender) + mintAmount) <= whitelistMaxMint) &&
            ((_tokenIdCounter.current() + mintAmount) <= MAX_WHITELIST_SUPPLY ||
                whitelistMaxMint == 1);
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        _tokenIdsByImageId[_imageIdsByTokenId[tokenId]] = 0;
        _imageIdsByTokenId[tokenId] = 0;
        super._burn(tokenId);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://";
    }

    function _associateImageIdWithTokenId(uint256 imageId, uint256 tokenId)
        private
    {
        _tokenIdsByImageId[imageId] = tokenId;
        _imageIdsByTokenId[tokenId] = imageId;
    }
}

Contract Security Audit

Contract ABI

API
[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHITELIST_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REMINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"imageIdFromTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"uris","type":"string[]"},{"internalType":"uint256[]","name":"imageIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"imageId","type":"uint256"}],"name":"remint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMaxMint","type":"uint256"}],"name":"setWhitelistMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"imageId","type":"uint256"}],"name":"tokenIdFromImageId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"walletOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526012805460ff1916905560006013553480156200002057600080fd5b5060408051808201825260078152664f75746c61777360c81b6020808301918252835180850190945260038452624f4c5760e81b9084015281519192916200006b9160009162000211565b5080516200008190600190602084019062000211565b5050600b805460ff1916905550620000993362000109565b6001600d55620000ab60003362000163565b620000d77f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000163565b600f8054336001600160a01b031990911617905562000103600e62000208602090811b6200180f17901c565b620002f4565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff1662000204576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80546001019055565b8280546200021f90620002b7565b90600052602060002090601f0160209004810192826200024357600085556200028e565b82601f106200025e57805160ff19168380011785556200028e565b828001600101855582156200028e579182015b828111156200028e57825182559160200191906001019062000271565b506200029c929150620002a0565b5090565b5b808211156200029c5760008155600101620002a1565b600181811c90821680620002cc57607f821691505b60208210811415620002ee57634e487b7160e01b600052602260045260246000fd5b50919050565b61381680620003046000396000f3fe6080604052600436106102ff5760003560e01c8063722e141d11610190578063a5dfb9b6116100dc578063d370db1a11610095578063e21469631161006f578063e21469631461089a578063e985e9c5146108ba578063f2fde38b14610903578063f3f5f9fc1461092357600080fd5b8063d370db1a14610833578063d539139314610846578063d547741f1461087a57600080fd5b8063a5dfb9b614610780578063a81152f7146107b5578063af2d4f14146107ca578063b88d4fde146107e0578063be94829814610800578063c87b56dd1461081357600080fd5b80638b7afe2e1161014957806391d148541161012357806391d148541461074b57806395d89b411461076b578063a217fddf14610780578063a22cb4651461079557600080fd5b80638b7afe2e146106e65780638d8b6ad3146106fb5780638da5cb5b1461072857600080fd5b8063722e141d146106495780637a997ab71461065f5780637f649783146106815780638456cb59146106a1578063846342ee146106b657806388084605146106d157600080fd5b806332cb6b0c1161024f57806342966c68116102085780635c975abb116101e25780635c975abb146105dc5780636352211e146105f457806370a0823114610614578063715018a61461063457600080fd5b806342966c681461057c5780634f6ccce71461059c578063548db174146105bc57600080fd5b806332cb6b0c146104e257806333bc1c5c146104f857806336568abe146105125780633ccfd60b146105325780633f4ba83a1461054757806342842e0e1461055c57600080fd5b80631982640c116102bc578063248a9ca311610296578063248a9ca31461045257806327de8f27146104825780632f2ff15d146104a25780632f745c59146104c257600080fd5b80631982640c146103e95780631f9ce1751461041657806323b872dd1461043257600080fd5b806301ffc9a71461030457806306fdde0314610339578063081812fc1461035b578063095ea7b3146103935780630a912fc4146103b557806318160ddd146103ca575b600080fd5b34801561031057600080fd5b5061032461031f3660046132f1565b610950565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b5061034e610961565b60405161033091906134cc565b34801561036757600080fd5b5061037b6103763660046132b5565b6109f3565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103b36103ae36600461313c565b610a80565b005b3480156103c157600080fd5b5061034e610b96565b3480156103d657600080fd5b506008545b604051908152602001610330565b3480156103f557600080fd5b50610409610404366004612ffa565b610bb2565b6040516103309190613488565b34801561042257600080fd5b506103db6701118f178fb4800081565b34801561043e57600080fd5b506103b361044d366004613048565b610c54565b34801561045e57600080fd5b506103db61046d3660046132b5565b6000908152600c602052604090206001015490565b34801561048e57600080fd5b506103db61049d3660046132b5565b610c86565b3480156104ae57600080fd5b506103b36104bd3660046132ce565b610cf0565b3480156104ce57600080fd5b506103db6104dd36600461313c565b610d16565b3480156104ee57600080fd5b506103db611e6181565b34801561050457600080fd5b506012546103249060ff1681565b34801561051e57600080fd5b506103b361052d3660046132ce565b610dac565b34801561053e57600080fd5b506103b3610e2a565b34801561055357600080fd5b506103b3610f0f565b34801561056857600080fd5b506103b3610577366004613048565b610f49565b34801561058857600080fd5b506103b36105973660046132b5565b610f64565b3480156105a857600080fd5b506103db6105b73660046132b5565b610fa0565b3480156105c857600080fd5b506103b36105d7366004613166565b611033565b3480156105e857600080fd5b50600b5460ff16610324565b34801561060057600080fd5b5061037b61060f3660046132b5565b6110be565b34801561062057600080fd5b506103db61062f366004612ffa565b611135565b34801561064057600080fd5b506103b36111bc565b34801561065557600080fd5b506103db60135481565b34801561066b57600080fd5b506103db6000805160206137a083398151915281565b34801561068d57600080fd5b506103b361069c366004613166565b6111f6565b3480156106ad57600080fd5b506103b3611281565b3480156106c257600080fd5b506103db66b1a2bc2ec5000081565b3480156106dd57600080fd5b506103b36112b9565b3480156106f257600080fd5b506103db6112fd565b34801561070757600080fd5b506103db6107163660046132b5565b60009081526011602052604090205490565b34801561073457600080fd5b50600b5461010090046001600160a01b031661037b565b34801561075757600080fd5b506103246107663660046132ce565b611335565b34801561077757600080fd5b5061034e611360565b34801561078c57600080fd5b506103db600081565b3480156107a157600080fd5b506103b36107b0366004613100565b61136f565b3480156107c157600080fd5b506103db600a81565b3480156107d657600080fd5b506103db61030981565b3480156107ec57600080fd5b506103b36107fb366004613084565b61137a565b6103b361080e3660046131db565b6113b2565b34801561081f57600080fd5b5061034e61082e3660046132b5565b6115c4565b6103b361084136600461332b565b6115cf565b34801561085257600080fd5b506103db7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561088657600080fd5b506103b36108953660046132ce565b611716565b3480156108a657600080fd5b506103b36108b53660046132b5565b61173c565b3480156108c657600080fd5b506103246108d5366004613015565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561090f57600080fd5b506103b361091e366004612ffa565b611771565b34801561092f57600080fd5b506103db61093e3660046132b5565b60009081526010602052604090205490565b600061095b82611818565b92915050565b606060008054610970906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461099c906136b1565b80156109e95780601f106109be576101008083540402835291602001916109e9565b820191906000526020600020905b8154815290600101906020018083116109cc57829003601f168201915b5050505050905090565b60006109fe8261183d565b610a645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a8b826110be565b9050806001600160a01b0316836001600160a01b03161415610af95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5b565b336001600160a01b0382161480610b155750610b1581336108d5565b610b875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5b565b610b91838361185a565b505050565b6040518060600160405280602181526020016137c06021913981565b60606000610bbf83611135565b905060008167ffffffffffffffff811115610bdc57610bdc613773565b604051908082528060200260200182016040528015610c05578160200160208202803683370190505b50905060005b82811015610c4c57610c1d8582610d16565b828281518110610c2f57610c2f61375d565b602090810291909101015280610c44816136ec565b915050610c0b565b509392505050565b610c5f335b826118c8565b610c7b5760405162461bcd60e51b8152600401610a5b90613566565b610b918383836119b2565b6000610cb27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611335565b15610cbf57506000919050565b610cc882611b59565b15610cde5761095b8266b1a2bc2ec50000613638565b61095b826701118f178fb48000613638565b6000828152600c6020526040902060010154610d0c8133611bc6565b610b918383611c2a565b6000610d2183611135565b8210610d835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610e1c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a5b565b610e268282611cb0565b5050565b6002600d541415610e7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a5b565b6002600d55600b546001600160a01b03610100909104163314610eb25760405162461bcd60e51b8152600401610a5b90613531565b604051600090339047908381818185875af1925050503d8060008114610ef4576040519150601f19603f3d011682016040523d82523d6000602084013e610ef9565b606091505b5050905080610f0757600080fd5b506001600d55565b600b546001600160a01b03610100909104163314610f3f5760405162461bcd60e51b8152600401610a5b90613531565b610f47611d17565b565b610b918383836040518060200160405280600081525061137a565b600b546001600160a01b03610100909104163314610f945760405162461bcd60e51b8152600401610a5b90613531565b610f9d81611daa565b50565b6000610fab60085490565b821061100e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5b565b600882815481106110215761102161375d565b90600052602060002001549050919050565b600b546001600160a01b036101009091041633146110635760405162461bcd60e51b8152600401610a5b90613531565b60005b81811015610b91576110ac6000805160206137a08339815191528484848181106110925761109261375d565b90506020020160208101906110a79190612ffa565b611cb0565b806110b6816136ec565b915050611066565b6000818152600260205260408120546001600160a01b03168061095b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5b565b60006001600160a01b0382166111a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5b565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146111ec5760405162461bcd60e51b8152600401610a5b90613531565b610f476000611e21565b600b546001600160a01b036101009091041633146112265760405162461bcd60e51b8152600401610a5b90613531565b60005b81811015610b915761126f6000805160206137a08339815191528484848181106112555761125561375d565b905060200201602081019061126a9190612ffa565b611c2a565b80611279816136ec565b915050611229565b600b546001600160a01b036101009091041633146112b15760405162461bcd60e51b8152600401610a5b90613531565b610f47611e7b565b600b546001600160a01b036101009091041633146112e95760405162461bcd60e51b8152600401610a5b90613531565b6012805460ff19811660ff90911615179055565b600b546000906001600160a01b036101009091041633146113305760405162461bcd60e51b8152600401610a5b90613531565b504790565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610970906136b1565b610e26338383611ef6565b61138433836118c8565b6113a05760405162461bcd60e51b8152600401610a5b90613566565b6113ac84848484611fc5565b50505050565b80518251146114165760405162461bcd60e51b815260206004820152602a60248201527f7572697320616e6420696d61676520696473206d7573742062652074686520736044820152690c2daca40d8cadccee8d60b31b6064820152608401610a5b565b81518061145c5760405162461bcd60e51b815260206004820152601460248201527363616e6e6f74206d696e74203020746f6b656e7360601b6044820152606401610a5b565b600a8111156114ad5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e6720746f6f206d616e7920746f6b656e730000000000000000006044820152606401610a5b565b6114d77f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611335565b156114e757610b91338484611ff8565b6114f081611b59565b15611560576115068166b1a2bc2ec50000613638565b3410156115555760405162461bcd60e51b815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610a5b565b610b91338484611ff8565b60125460ff166115b25760405162461bcd60e51b815260206004820152601f60248201527f7075626c69632073616c6520686173206e6f74207374617274656420796574006044820152606401610a5b565b611506816701118f178fb48000613638565b606061095b826120c0565b60006115da846110be565b9050336115f5600b546001600160a01b036101009091041690565b6001600160a01b031614806116125750336001600160a01b038216145b61165e5760405162461bcd60e51b815260206004820152601c60248201527f6d757374206f776e2074686520746f6b656e20746f2072656d696e74000000006044820152606401610a5b565b6000828152601060205260409020541580611686575060008281526010602052604090205484145b604051806040016040528060178152602001761a5b5859d9481a5908185b1c9958591e481b5a5b9d1959604a1b815250906116d45760405162461bcd60e51b8152600401610a5b91906134cc565b506116de8461223e565b6116e8818561226d565b61170c82856000828152601060209081526040808320849055928252601190522055565b6113ac8484612287565b6000828152600c60205260409020600101546117328133611bc6565b610b918383611cb0565b600b546001600160a01b0361010090910416331461176c5760405162461bcd60e51b8152600401610a5b90613531565b601355565b600b546001600160a01b036101009091041633146117a15760405162461bcd60e51b8152600401610a5b90613531565b6001600160a01b0381166118065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5b565b610f9d81611e21565b80546001019055565b60006001600160e01b03198216637965db0b60e01b148061095b575061095b82612312565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061188f826110be565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118d38261183d565b6119345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5b565b600061193f836110be565b9050806001600160a01b0316846001600160a01b0316148061197a5750836001600160a01b031661196f846109f3565b6001600160a01b0316145b806119aa57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119c5826110be565b6001600160a01b031614611a295760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a5b565b6001600160a01b038216611a8b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5b565b611a96838383612337565b611aa160008261185a565b6001600160a01b0383166000908152600360205260408120805460019290611aca908490613657565b90915550506001600160a01b0382166000908152600360205260408120805460019290611af890849061360c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611b736000805160206137a083398151915233611335565b8015611b94575060135482611b8733611135565b611b91919061360c565b11155b801561095b575061030982611ba8600e5490565b611bb2919061360c565b11158061095b575060135460011492915050565b611bd08282611335565b610e2657611be8816001600160a01b03166014612388565b611bf3836020612388565b604051602001611c049291906133d6565b60408051601f198184030181529082905262461bcd60e51b8252610a5b916004016134cc565b611c348282611335565b610e26576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611c6c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611cba8282611335565b15610e26576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b5460ff16611d605760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a5b565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611db333610c59565b611e185760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610a5b565b610f9d8161223e565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff1615611ec15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a5b565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d8d3390565b816001600160a01b0316836001600160a01b03161415611f585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611fd08484846119b2565b611fdc8484848461252b565b6113ac5760405162461bcd60e51b8152600401610a5b906134df565b8151611e6181612007600e5490565b612011919061360c565b111561205f5760405162461bcd60e51b815260206004820181905260248201527f616c6c203737373720746f6b656e732068617665206265656e206d696e7465646044820152606401610a5b565b60005b818110156120b9576120a7858583815181106120805761208061375d565b602002602001015185848151811061209a5761209a61375d565b6020026020010151612638565b806120b1816136ec565b915050612062565b5050505050565b60606120cb8261183d565b6121315760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610a5b565b6000828152600a60205260408120805461214a906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612176906136b1565b80156121c35780601f10612198576101008083540402835291602001916121c3565b820191906000526020600020905b8154815290600101906020018083116121a657829003601f168201915b5050505050905060006121f0604080518082019091526007815266697066733a2f2f60c81b602082015290565b9050805160001415612203575092915050565b81511561223557808260405160200161221d9291906133a7565b60405160208183030381529060405292505050919050565b6119aa84612750565b6000818152601160208181526040808420805485526010835290842084905584845291905255610f9d81612836565b610e26828260405180602001604052806000815250612876565b6122908261183d565b6122f35760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a5b565b6000828152600a602090815260409091208251610b9192840190612e25565b60006001600160e01b0319821663780e9d6360e01b148061095b575061095b826128a9565b600b5460ff161561237d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a5b565b610b918383836128f9565b60606000612397836002613638565b6123a290600261360c565b67ffffffffffffffff8111156123ba576123ba613773565b6040519080825280601f01601f1916602001820160405280156123e4576020820181803683370190505b509050600360fc1b816000815181106123ff576123ff61375d565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061242e5761242e61375d565b60200101906001600160f81b031916908160001a9053506000612452846002613638565b61245d90600161360c565b90505b60018111156124d5576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106124915761249161375d565b1a60f81b8282815181106124a7576124a761375d565b60200101906001600160f81b031916908160001a90535060049490941c936124ce8161369a565b9050612460565b5083156125245760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5b565b9392505050565b60006001600160a01b0384163b1561262d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061256f90339089908890889060040161344b565b602060405180830381600087803b15801561258957600080fd5b505af19250505080156125b9575060408051601f3d908101601f191682019092526125b69181019061330e565b60015b612613573d8080156125e7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ec565b606091505b50805161260b5760405162461bcd60e51b8152600401610a5b906134df565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119aa565b506001949350505050565b611e61612644600e5490565b61264f90600161360c565b111561269d5760405162461bcd60e51b815260206004820181905260248201527f616c6c203737373720746f6b656e732068617665206265656e206d696e7465646044820152606401610a5b565b60008181526010602090815260409182902054825180840190935260178352761a5b5859d9481a5908185b1c9958591e481b5a5b9d1959604a1b91830191909152156126fc5760405162461bcd60e51b8152600401610a5b91906134cc565b506000612708600e5490565b9050612718600e80546001019055565b612722848261226d565b61274682826000828152601060209081526040808320849055928252601190522055565b6113ac8184612287565b606061275b8261183d565b6127bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5b565b60006127e5604080518082019091526007815266697066733a2f2f60c81b602082015290565b905060008151116128055760405180602001604052806000815250612524565b8061280f846129b1565b6040516020016128209291906133a7565b6040516020818303038152906040529392505050565b61283f81612aaf565b6000818152600a602052604090208054612858906136b1565b159050610f9d576000818152600a60205260408120610f9d91612ea9565b6128808383612b56565b61288d600084848461252b565b610b915760405162461bcd60e51b8152600401610a5b906134df565b60006001600160e01b031982166380ac58cd60e01b14806128da57506001600160e01b03198216635b5e139f60e01b145b8061095b57506301ffc9a760e01b6001600160e01b031983161461095b565b6001600160a01b0383166129545761294f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612977565b816001600160a01b0316836001600160a01b031614612977576129778382612c95565b6001600160a01b03821661298e57610b9181612d32565b826001600160a01b0316826001600160a01b031614610b9157610b918282612de1565b6060816129d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129ff57806129e9816136ec565b91506129f89050600a83613624565b91506129d9565b60008167ffffffffffffffff811115612a1a57612a1a613773565b6040519080825280601f01601f191660200182016040528015612a44576020820181803683370190505b5090505b84156119aa57612a59600183613657565b9150612a66600a86613707565b612a7190603061360c565b60f81b818381518110612a8657612a8661375d565b60200101906001600160f81b031916908160001a905350612aa8600a86613624565b9450612a48565b6000612aba826110be565b9050612ac881600084612337565b612ad360008361185a565b6001600160a01b0381166000908152600360205260408120805460019290612afc908490613657565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612bac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5b565b612bb58161183d565b15612c025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5b565b612c0e60008383612337565b6001600160a01b0382166000908152600360205260408120805460019290612c3790849061360c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612ca284611135565b612cac9190613657565b600083815260076020526040902054909150808214612cff576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d4490600190613657565b60008381526009602052604081205460088054939450909284908110612d6c57612d6c61375d565b906000526020600020015490508060088381548110612d8d57612d8d61375d565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dc557612dc5613747565b6001900381819060005260206000200160009055905550505050565b6000612dec83611135565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e31906136b1565b90600052602060002090601f016020900481019282612e535760008555612e99565b82601f10612e6c57805160ff1916838001178555612e99565b82800160010185558215612e99579182015b82811115612e99578251825591602001919060010190612e7e565b50612ea5929150612edf565b5090565b508054612eb5906136b1565b6000825580601f10612ec5575050565b601f016020900490600052602060002090810190610f9d91905b5b80821115612ea55760008155600101612ee0565b600067ffffffffffffffff831115612f0e57612f0e613773565b612f21601f8401601f19166020016135b7565b9050828152838383011115612f3557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612f6357600080fd5b919050565b600082601f830112612f7957600080fd5b81356020612f8e612f89836135e8565b6135b7565b80838252828201915082860187848660051b8901011115612fae57600080fd5b60005b85811015612fcd57813584529284019290840190600101612fb1565b5090979650505050505050565b600082601f830112612feb57600080fd5b61252483833560208501612ef4565b60006020828403121561300c57600080fd5b61252482612f4c565b6000806040838503121561302857600080fd5b61303183612f4c565b915061303f60208401612f4c565b90509250929050565b60008060006060848603121561305d57600080fd5b61306684612f4c565b925061307460208501612f4c565b9150604084013590509250925092565b6000806000806080858703121561309a57600080fd5b6130a385612f4c565b93506130b160208601612f4c565b925060408501359150606085013567ffffffffffffffff8111156130d457600080fd5b8501601f810187136130e557600080fd5b6130f487823560208401612ef4565b91505092959194509250565b6000806040838503121561311357600080fd5b61311c83612f4c565b91506020830135801515811461313157600080fd5b809150509250929050565b6000806040838503121561314f57600080fd5b61315883612f4c565b946020939093013593505050565b6000806020838503121561317957600080fd5b823567ffffffffffffffff8082111561319157600080fd5b818501915085601f8301126131a557600080fd5b8135818111156131b457600080fd5b8660208260051b85010111156131c957600080fd5b60209290920196919550909350505050565b600080604083850312156131ee57600080fd5b823567ffffffffffffffff8082111561320657600080fd5b818501915085601f83011261321a57600080fd5b8135602061322a612f89836135e8565b8083825282820191508286018a848660051b890101111561324a57600080fd5b60005b858110156132855781358781111561326457600080fd5b6132728d87838c0101612fda565b855250928401929084019060010161324d565b5090975050508601359250508082111561329e57600080fd5b506132ab85828601612f68565b9150509250929050565b6000602082840312156132c757600080fd5b5035919050565b600080604083850312156132e157600080fd5b8235915061303f60208401612f4c565b60006020828403121561330357600080fd5b813561252481613789565b60006020828403121561332057600080fd5b815161252481613789565b60008060006060848603121561334057600080fd5b83359250602084013567ffffffffffffffff81111561335e57600080fd5b61336a86828701612fda565b925050604084013590509250925092565b6000815180845261339381602086016020860161366e565b601f01601f19169290920160200192915050565b600083516133b981846020880161366e565b8351908301906133cd81836020880161366e565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161340e81601785016020880161366e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161343f81602884016020880161366e565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347e9083018461337b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134c0578351835292840192918401916001016134a4565b50909695505050505050565b602081526000612524602083018461337b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156135e0576135e0613773565b604052919050565b600067ffffffffffffffff82111561360257613602613773565b5060051b60200190565b6000821982111561361f5761361f61371b565b500190565b60008261363357613633613731565b500490565b60008160001904831182151516156136525761365261371b565b500290565b6000828210156136695761366961371b565b500390565b60005b83811015613689578181015183820152602001613671565b838111156113ac5750506000910152565b6000816136a9576136a961371b565b506000190190565b600181811c908216806136c557607f821691505b602082108114156136e657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137005761370061371b565b5060010190565b60008261371657613716613731565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f9d57600080fdfedc72ed553f2544c34465af23b847953efeb813428162d767f9ba5f4013be676068747470733a2f2f6f6c772e6f75746c6177736e66742e696f2f6c6963656e7365a26469706673582212200b96e6ca189b6e673e28a692d158f0750802a22247a312adabd0af7f5b10713564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c8063722e141d11610190578063a5dfb9b6116100dc578063d370db1a11610095578063e21469631161006f578063e21469631461089a578063e985e9c5146108ba578063f2fde38b14610903578063f3f5f9fc1461092357600080fd5b8063d370db1a14610833578063d539139314610846578063d547741f1461087a57600080fd5b8063a5dfb9b614610780578063a81152f7146107b5578063af2d4f14146107ca578063b88d4fde146107e0578063be94829814610800578063c87b56dd1461081357600080fd5b80638b7afe2e1161014957806391d148541161012357806391d148541461074b57806395d89b411461076b578063a217fddf14610780578063a22cb4651461079557600080fd5b80638b7afe2e146106e65780638d8b6ad3146106fb5780638da5cb5b1461072857600080fd5b8063722e141d146106495780637a997ab71461065f5780637f649783146106815780638456cb59146106a1578063846342ee146106b657806388084605146106d157600080fd5b806332cb6b0c1161024f57806342966c68116102085780635c975abb116101e25780635c975abb146105dc5780636352211e146105f457806370a0823114610614578063715018a61461063457600080fd5b806342966c681461057c5780634f6ccce71461059c578063548db174146105bc57600080fd5b806332cb6b0c146104e257806333bc1c5c146104f857806336568abe146105125780633ccfd60b146105325780633f4ba83a1461054757806342842e0e1461055c57600080fd5b80631982640c116102bc578063248a9ca311610296578063248a9ca31461045257806327de8f27146104825780632f2ff15d146104a25780632f745c59146104c257600080fd5b80631982640c146103e95780631f9ce1751461041657806323b872dd1461043257600080fd5b806301ffc9a71461030457806306fdde0314610339578063081812fc1461035b578063095ea7b3146103935780630a912fc4146103b557806318160ddd146103ca575b600080fd5b34801561031057600080fd5b5061032461031f3660046132f1565b610950565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b5061034e610961565b60405161033091906134cc565b34801561036757600080fd5b5061037b6103763660046132b5565b6109f3565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103b36103ae36600461313c565b610a80565b005b3480156103c157600080fd5b5061034e610b96565b3480156103d657600080fd5b506008545b604051908152602001610330565b3480156103f557600080fd5b50610409610404366004612ffa565b610bb2565b6040516103309190613488565b34801561042257600080fd5b506103db6701118f178fb4800081565b34801561043e57600080fd5b506103b361044d366004613048565b610c54565b34801561045e57600080fd5b506103db61046d3660046132b5565b6000908152600c602052604090206001015490565b34801561048e57600080fd5b506103db61049d3660046132b5565b610c86565b3480156104ae57600080fd5b506103b36104bd3660046132ce565b610cf0565b3480156104ce57600080fd5b506103db6104dd36600461313c565b610d16565b3480156104ee57600080fd5b506103db611e6181565b34801561050457600080fd5b506012546103249060ff1681565b34801561051e57600080fd5b506103b361052d3660046132ce565b610dac565b34801561053e57600080fd5b506103b3610e2a565b34801561055357600080fd5b506103b3610f0f565b34801561056857600080fd5b506103b3610577366004613048565b610f49565b34801561058857600080fd5b506103b36105973660046132b5565b610f64565b3480156105a857600080fd5b506103db6105b73660046132b5565b610fa0565b3480156105c857600080fd5b506103b36105d7366004613166565b611033565b3480156105e857600080fd5b50600b5460ff16610324565b34801561060057600080fd5b5061037b61060f3660046132b5565b6110be565b34801561062057600080fd5b506103db61062f366004612ffa565b611135565b34801561064057600080fd5b506103b36111bc565b34801561065557600080fd5b506103db60135481565b34801561066b57600080fd5b506103db6000805160206137a083398151915281565b34801561068d57600080fd5b506103b361069c366004613166565b6111f6565b3480156106ad57600080fd5b506103b3611281565b3480156106c257600080fd5b506103db66b1a2bc2ec5000081565b3480156106dd57600080fd5b506103b36112b9565b3480156106f257600080fd5b506103db6112fd565b34801561070757600080fd5b506103db6107163660046132b5565b60009081526011602052604090205490565b34801561073457600080fd5b50600b5461010090046001600160a01b031661037b565b34801561075757600080fd5b506103246107663660046132ce565b611335565b34801561077757600080fd5b5061034e611360565b34801561078c57600080fd5b506103db600081565b3480156107a157600080fd5b506103b36107b0366004613100565b61136f565b3480156107c157600080fd5b506103db600a81565b3480156107d657600080fd5b506103db61030981565b3480156107ec57600080fd5b506103b36107fb366004613084565b61137a565b6103b361080e3660046131db565b6113b2565b34801561081f57600080fd5b5061034e61082e3660046132b5565b6115c4565b6103b361084136600461332b565b6115cf565b34801561085257600080fd5b506103db7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561088657600080fd5b506103b36108953660046132ce565b611716565b3480156108a657600080fd5b506103b36108b53660046132b5565b61173c565b3480156108c657600080fd5b506103246108d5366004613015565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561090f57600080fd5b506103b361091e366004612ffa565b611771565b34801561092f57600080fd5b506103db61093e3660046132b5565b60009081526010602052604090205490565b600061095b82611818565b92915050565b606060008054610970906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461099c906136b1565b80156109e95780601f106109be576101008083540402835291602001916109e9565b820191906000526020600020905b8154815290600101906020018083116109cc57829003601f168201915b5050505050905090565b60006109fe8261183d565b610a645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a8b826110be565b9050806001600160a01b0316836001600160a01b03161415610af95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5b565b336001600160a01b0382161480610b155750610b1581336108d5565b610b875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5b565b610b91838361185a565b505050565b6040518060600160405280602181526020016137c06021913981565b60606000610bbf83611135565b905060008167ffffffffffffffff811115610bdc57610bdc613773565b604051908082528060200260200182016040528015610c05578160200160208202803683370190505b50905060005b82811015610c4c57610c1d8582610d16565b828281518110610c2f57610c2f61375d565b602090810291909101015280610c44816136ec565b915050610c0b565b509392505050565b610c5f335b826118c8565b610c7b5760405162461bcd60e51b8152600401610a5b90613566565b610b918383836119b2565b6000610cb27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611335565b15610cbf57506000919050565b610cc882611b59565b15610cde5761095b8266b1a2bc2ec50000613638565b61095b826701118f178fb48000613638565b6000828152600c6020526040902060010154610d0c8133611bc6565b610b918383611c2a565b6000610d2183611135565b8210610d835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610e1c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a5b565b610e268282611cb0565b5050565b6002600d541415610e7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a5b565b6002600d55600b546001600160a01b03610100909104163314610eb25760405162461bcd60e51b8152600401610a5b90613531565b604051600090339047908381818185875af1925050503d8060008114610ef4576040519150601f19603f3d011682016040523d82523d6000602084013e610ef9565b606091505b5050905080610f0757600080fd5b506001600d55565b600b546001600160a01b03610100909104163314610f3f5760405162461bcd60e51b8152600401610a5b90613531565b610f47611d17565b565b610b918383836040518060200160405280600081525061137a565b600b546001600160a01b03610100909104163314610f945760405162461bcd60e51b8152600401610a5b90613531565b610f9d81611daa565b50565b6000610fab60085490565b821061100e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5b565b600882815481106110215761102161375d565b90600052602060002001549050919050565b600b546001600160a01b036101009091041633146110635760405162461bcd60e51b8152600401610a5b90613531565b60005b81811015610b91576110ac6000805160206137a08339815191528484848181106110925761109261375d565b90506020020160208101906110a79190612ffa565b611cb0565b806110b6816136ec565b915050611066565b6000818152600260205260408120546001600160a01b03168061095b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5b565b60006001600160a01b0382166111a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5b565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146111ec5760405162461bcd60e51b8152600401610a5b90613531565b610f476000611e21565b600b546001600160a01b036101009091041633146112265760405162461bcd60e51b8152600401610a5b90613531565b60005b81811015610b915761126f6000805160206137a08339815191528484848181106112555761125561375d565b905060200201602081019061126a9190612ffa565b611c2a565b80611279816136ec565b915050611229565b600b546001600160a01b036101009091041633146112b15760405162461bcd60e51b8152600401610a5b90613531565b610f47611e7b565b600b546001600160a01b036101009091041633146112e95760405162461bcd60e51b8152600401610a5b90613531565b6012805460ff19811660ff90911615179055565b600b546000906001600160a01b036101009091041633146113305760405162461bcd60e51b8152600401610a5b90613531565b504790565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610970906136b1565b610e26338383611ef6565b61138433836118c8565b6113a05760405162461bcd60e51b8152600401610a5b90613566565b6113ac84848484611fc5565b50505050565b80518251146114165760405162461bcd60e51b815260206004820152602a60248201527f7572697320616e6420696d61676520696473206d7573742062652074686520736044820152690c2daca40d8cadccee8d60b31b6064820152608401610a5b565b81518061145c5760405162461bcd60e51b815260206004820152601460248201527363616e6e6f74206d696e74203020746f6b656e7360601b6044820152606401610a5b565b600a8111156114ad5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e6720746f6f206d616e7920746f6b656e730000000000000000006044820152606401610a5b565b6114d77f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611335565b156114e757610b91338484611ff8565b6114f081611b59565b15611560576115068166b1a2bc2ec50000613638565b3410156115555760405162461bcd60e51b815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610a5b565b610b91338484611ff8565b60125460ff166115b25760405162461bcd60e51b815260206004820152601f60248201527f7075626c69632073616c6520686173206e6f74207374617274656420796574006044820152606401610a5b565b611506816701118f178fb48000613638565b606061095b826120c0565b60006115da846110be565b9050336115f5600b546001600160a01b036101009091041690565b6001600160a01b031614806116125750336001600160a01b038216145b61165e5760405162461bcd60e51b815260206004820152601c60248201527f6d757374206f776e2074686520746f6b656e20746f2072656d696e74000000006044820152606401610a5b565b6000828152601060205260409020541580611686575060008281526010602052604090205484145b604051806040016040528060178152602001761a5b5859d9481a5908185b1c9958591e481b5a5b9d1959604a1b815250906116d45760405162461bcd60e51b8152600401610a5b91906134cc565b506116de8461223e565b6116e8818561226d565b61170c82856000828152601060209081526040808320849055928252601190522055565b6113ac8484612287565b6000828152600c60205260409020600101546117328133611bc6565b610b918383611cb0565b600b546001600160a01b0361010090910416331461176c5760405162461bcd60e51b8152600401610a5b90613531565b601355565b600b546001600160a01b036101009091041633146117a15760405162461bcd60e51b8152600401610a5b90613531565b6001600160a01b0381166118065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5b565b610f9d81611e21565b80546001019055565b60006001600160e01b03198216637965db0b60e01b148061095b575061095b82612312565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061188f826110be565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118d38261183d565b6119345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5b565b600061193f836110be565b9050806001600160a01b0316846001600160a01b0316148061197a5750836001600160a01b031661196f846109f3565b6001600160a01b0316145b806119aa57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119c5826110be565b6001600160a01b031614611a295760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a5b565b6001600160a01b038216611a8b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5b565b611a96838383612337565b611aa160008261185a565b6001600160a01b0383166000908152600360205260408120805460019290611aca908490613657565b90915550506001600160a01b0382166000908152600360205260408120805460019290611af890849061360c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611b736000805160206137a083398151915233611335565b8015611b94575060135482611b8733611135565b611b91919061360c565b11155b801561095b575061030982611ba8600e5490565b611bb2919061360c565b11158061095b575060135460011492915050565b611bd08282611335565b610e2657611be8816001600160a01b03166014612388565b611bf3836020612388565b604051602001611c049291906133d6565b60408051601f198184030181529082905262461bcd60e51b8252610a5b916004016134cc565b611c348282611335565b610e26576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611c6c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611cba8282611335565b15610e26576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b5460ff16611d605760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a5b565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611db333610c59565b611e185760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610a5b565b610f9d8161223e565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff1615611ec15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a5b565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d8d3390565b816001600160a01b0316836001600160a01b03161415611f585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611fd08484846119b2565b611fdc8484848461252b565b6113ac5760405162461bcd60e51b8152600401610a5b906134df565b8151611e6181612007600e5490565b612011919061360c565b111561205f5760405162461bcd60e51b815260206004820181905260248201527f616c6c203737373720746f6b656e732068617665206265656e206d696e7465646044820152606401610a5b565b60005b818110156120b9576120a7858583815181106120805761208061375d565b602002602001015185848151811061209a5761209a61375d565b6020026020010151612638565b806120b1816136ec565b915050612062565b5050505050565b60606120cb8261183d565b6121315760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610a5b565b6000828152600a60205260408120805461214a906136b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612176906136b1565b80156121c35780601f10612198576101008083540402835291602001916121c3565b820191906000526020600020905b8154815290600101906020018083116121a657829003601f168201915b5050505050905060006121f0604080518082019091526007815266697066733a2f2f60c81b602082015290565b9050805160001415612203575092915050565b81511561223557808260405160200161221d9291906133a7565b60405160208183030381529060405292505050919050565b6119aa84612750565b6000818152601160208181526040808420805485526010835290842084905584845291905255610f9d81612836565b610e26828260405180602001604052806000815250612876565b6122908261183d565b6122f35760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a5b565b6000828152600a602090815260409091208251610b9192840190612e25565b60006001600160e01b0319821663780e9d6360e01b148061095b575061095b826128a9565b600b5460ff161561237d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a5b565b610b918383836128f9565b60606000612397836002613638565b6123a290600261360c565b67ffffffffffffffff8111156123ba576123ba613773565b6040519080825280601f01601f1916602001820160405280156123e4576020820181803683370190505b509050600360fc1b816000815181106123ff576123ff61375d565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061242e5761242e61375d565b60200101906001600160f81b031916908160001a9053506000612452846002613638565b61245d90600161360c565b90505b60018111156124d5576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106124915761249161375d565b1a60f81b8282815181106124a7576124a761375d565b60200101906001600160f81b031916908160001a90535060049490941c936124ce8161369a565b9050612460565b5083156125245760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5b565b9392505050565b60006001600160a01b0384163b1561262d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061256f90339089908890889060040161344b565b602060405180830381600087803b15801561258957600080fd5b505af19250505080156125b9575060408051601f3d908101601f191682019092526125b69181019061330e565b60015b612613573d8080156125e7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ec565b606091505b50805161260b5760405162461bcd60e51b8152600401610a5b906134df565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119aa565b506001949350505050565b611e61612644600e5490565b61264f90600161360c565b111561269d5760405162461bcd60e51b815260206004820181905260248201527f616c6c203737373720746f6b656e732068617665206265656e206d696e7465646044820152606401610a5b565b60008181526010602090815260409182902054825180840190935260178352761a5b5859d9481a5908185b1c9958591e481b5a5b9d1959604a1b91830191909152156126fc5760405162461bcd60e51b8152600401610a5b91906134cc565b506000612708600e5490565b9050612718600e80546001019055565b612722848261226d565b61274682826000828152601060209081526040808320849055928252601190522055565b6113ac8184612287565b606061275b8261183d565b6127bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5b565b60006127e5604080518082019091526007815266697066733a2f2f60c81b602082015290565b905060008151116128055760405180602001604052806000815250612524565b8061280f846129b1565b6040516020016128209291906133a7565b6040516020818303038152906040529392505050565b61283f81612aaf565b6000818152600a602052604090208054612858906136b1565b159050610f9d576000818152600a60205260408120610f9d91612ea9565b6128808383612b56565b61288d600084848461252b565b610b915760405162461bcd60e51b8152600401610a5b906134df565b60006001600160e01b031982166380ac58cd60e01b14806128da57506001600160e01b03198216635b5e139f60e01b145b8061095b57506301ffc9a760e01b6001600160e01b031983161461095b565b6001600160a01b0383166129545761294f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612977565b816001600160a01b0316836001600160a01b031614612977576129778382612c95565b6001600160a01b03821661298e57610b9181612d32565b826001600160a01b0316826001600160a01b031614610b9157610b918282612de1565b6060816129d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129ff57806129e9816136ec565b91506129f89050600a83613624565b91506129d9565b60008167ffffffffffffffff811115612a1a57612a1a613773565b6040519080825280601f01601f191660200182016040528015612a44576020820181803683370190505b5090505b84156119aa57612a59600183613657565b9150612a66600a86613707565b612a7190603061360c565b60f81b818381518110612a8657612a8661375d565b60200101906001600160f81b031916908160001a905350612aa8600a86613624565b9450612a48565b6000612aba826110be565b9050612ac881600084612337565b612ad360008361185a565b6001600160a01b0381166000908152600360205260408120805460019290612afc908490613657565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612bac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5b565b612bb58161183d565b15612c025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5b565b612c0e60008383612337565b6001600160a01b0382166000908152600360205260408120805460019290612c3790849061360c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612ca284611135565b612cac9190613657565b600083815260076020526040902054909150808214612cff576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d4490600190613657565b60008381526009602052604081205460088054939450909284908110612d6c57612d6c61375d565b906000526020600020015490508060088381548110612d8d57612d8d61375d565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dc557612dc5613747565b6001900381819060005260206000200160009055905550505050565b6000612dec83611135565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e31906136b1565b90600052602060002090601f016020900481019282612e535760008555612e99565b82601f10612e6c57805160ff1916838001178555612e99565b82800160010185558215612e99579182015b82811115612e99578251825591602001919060010190612e7e565b50612ea5929150612edf565b5090565b508054612eb5906136b1565b6000825580601f10612ec5575050565b601f016020900490600052602060002090810190610f9d91905b5b80821115612ea55760008155600101612ee0565b600067ffffffffffffffff831115612f0e57612f0e613773565b612f21601f8401601f19166020016135b7565b9050828152838383011115612f3557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612f6357600080fd5b919050565b600082601f830112612f7957600080fd5b81356020612f8e612f89836135e8565b6135b7565b80838252828201915082860187848660051b8901011115612fae57600080fd5b60005b85811015612fcd57813584529284019290840190600101612fb1565b5090979650505050505050565b600082601f830112612feb57600080fd5b61252483833560208501612ef4565b60006020828403121561300c57600080fd5b61252482612f4c565b6000806040838503121561302857600080fd5b61303183612f4c565b915061303f60208401612f4c565b90509250929050565b60008060006060848603121561305d57600080fd5b61306684612f4c565b925061307460208501612f4c565b9150604084013590509250925092565b6000806000806080858703121561309a57600080fd5b6130a385612f4c565b93506130b160208601612f4c565b925060408501359150606085013567ffffffffffffffff8111156130d457600080fd5b8501601f810187136130e557600080fd5b6130f487823560208401612ef4565b91505092959194509250565b6000806040838503121561311357600080fd5b61311c83612f4c565b91506020830135801515811461313157600080fd5b809150509250929050565b6000806040838503121561314f57600080fd5b61315883612f4c565b946020939093013593505050565b6000806020838503121561317957600080fd5b823567ffffffffffffffff8082111561319157600080fd5b818501915085601f8301126131a557600080fd5b8135818111156131b457600080fd5b8660208260051b85010111156131c957600080fd5b60209290920196919550909350505050565b600080604083850312156131ee57600080fd5b823567ffffffffffffffff8082111561320657600080fd5b818501915085601f83011261321a57600080fd5b8135602061322a612f89836135e8565b8083825282820191508286018a848660051b890101111561324a57600080fd5b60005b858110156132855781358781111561326457600080fd5b6132728d87838c0101612fda565b855250928401929084019060010161324d565b5090975050508601359250508082111561329e57600080fd5b506132ab85828601612f68565b9150509250929050565b6000602082840312156132c757600080fd5b5035919050565b600080604083850312156132e157600080fd5b8235915061303f60208401612f4c565b60006020828403121561330357600080fd5b813561252481613789565b60006020828403121561332057600080fd5b815161252481613789565b60008060006060848603121561334057600080fd5b83359250602084013567ffffffffffffffff81111561335e57600080fd5b61336a86828701612fda565b925050604084013590509250925092565b6000815180845261339381602086016020860161366e565b601f01601f19169290920160200192915050565b600083516133b981846020880161366e565b8351908301906133cd81836020880161366e565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161340e81601785016020880161366e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161343f81602884016020880161366e565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347e9083018461337b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134c0578351835292840192918401916001016134a4565b50909695505050505050565b602081526000612524602083018461337b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156135e0576135e0613773565b604052919050565b600067ffffffffffffffff82111561360257613602613773565b5060051b60200190565b6000821982111561361f5761361f61371b565b500190565b60008261363357613633613731565b500490565b60008160001904831182151516156136525761365261371b565b500290565b6000828210156136695761366961371b565b500390565b60005b83811015613689578181015183820152602001613671565b838111156113ac5750506000910152565b6000816136a9576136a961371b565b506000190190565b600181811c908216806136c557607f821691505b602082108114156136e657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137005761370061371b565b5060010190565b60008261371657613716613731565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f9d57600080fdfedc72ed553f2544c34465af23b847953efeb813428162d767f9ba5f4013be676068747470733a2f2f6f6c772e6f75746c6177736e66742e696f2f6c6963656e7365a26469706673582212200b96e6ca189b6e673e28a692d158f0750802a22247a312adabd0af7f5b10713564736f6c63430008070033

Deployed Bytecode Sourcemap

70081:8346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74660:227;;;;;;;;;;-1:-1:-1;74660:227:0;;;;;:::i;:::-;;:::i;:::-;;;10340:14:1;;10333:22;10315:41;;10303:2;10288:18;74660:227:0;;;;;;;;24356:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25915:221::-;;;;;;;;;;-1:-1:-1;25915:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9001:32:1;;;8983:51;;8971:2;8956:18;25915:221:0;8837:203:1;25438:411:0;;;;;;;;;;-1:-1:-1;25438:411:0;;;;;:::i;:::-;;:::i;:::-;;70759:68;;;;;;;;;;;;;:::i;46602:113::-;;;;;;;;;;-1:-1:-1;46690:10:0;:17;46602:113;;;10513:25:1;;;10501:2;10486:18;46602:113:0;10367:177:1;74066:382:0;;;;;;;;;;-1:-1:-1;74066:382:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70989:49::-;;;;;;;;;;;;71027:11;70989:49;;26665:339;;;;;;;;;;-1:-1:-1;26665:339:0;;;;;:::i;:::-;;:::i;65584:131::-;;;;;;;;;;-1:-1:-1;65584:131:0;;;;;:::i;:::-;65658:7;65685:12;;;:6;:12;;;;;:22;;;;65584:131;72667:299;;;;;;;;;;-1:-1:-1;72667:299:0;;;;;:::i;:::-;;:::i;65977:147::-;;;;;;;;;;-1:-1:-1;65977:147:0;;;;;:::i;:::-;;:::i;46270:256::-;;;;;;;;;;-1:-1:-1;46270:256:0;;;;;:::i;:::-;;:::i;70884:41::-;;;;;;;;;;;;70921:4;70884:41;;71160:30;;;;;;;;;;-1:-1:-1;71160:30:0;;;;;;;;67025:218;;;;;;;;;;-1:-1:-1;67025:218:0;;;;;:::i;:::-;;:::i;74941:199::-;;;;;;;;;;;;;:::i;75792:65::-;;;;;;;;;;;;;:::i;27075:185::-;;;;;;;;;;-1:-1:-1;27075:185:0;;;;;:::i;:::-;;:::i;76095:95::-;;;;;;;;;;-1:-1:-1;76095:95:0;;;;;:::i;:::-;;:::i;46792:233::-;;;;;;;;;;-1:-1:-1;46792:233:0;;;;;:::i;:::-;;:::i;75483:232::-;;;;;;;;;;-1:-1:-1;75483:232:0;;;;;:::i;:::-;;:::i;57337:86::-;;;;;;;;;;-1:-1:-1;57408:7:0;;;;57337:86;;24050:239;;;;;;;;;;-1:-1:-1;24050:239:0;;;;;:::i;:::-;;:::i;23780:208::-;;;;;;;;;;-1:-1:-1;23780:208:0;;;;;:::i;:::-;;:::i;60432:103::-;;;;;;;;;;;;;:::i;71197:35::-;;;;;;;;;;;;;;;;70684:68;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;70684:68:0;;75272:203;;;;;;;;;;-1:-1:-1;75272:203:0;;;;;:::i;:::-;;:::i;75723:61::-;;;;;;;;;;;;;:::i;71100:51::-;;;;;;;;;;;;71141:10;71100:51;;75865:86;;;;;;;;;;;;;:::i;75148:116::-;;;;;;;;;;;;;:::i;73930:128::-;;;;;;;;;;-1:-1:-1;73930:128:0;;;;;:::i;:::-;73996:7;74023:27;;;:18;:27;;;;;;;73930:128;59781:87;;;;;;;;;;-1:-1:-1;59854:6:0;;;;;-1:-1:-1;;;;;59854:6:0;59781:87;;64453:147;;;;;;;;;;-1:-1:-1;64453:147:0;;;;;:::i;:::-;;:::i;24525:104::-;;;;;;;;;;;;;:::i;63544:49::-;;;;;;;;;;-1:-1:-1;63544:49:0;63589:4;63544:49;;26208:155;;;;;;;;;;-1:-1:-1;26208:155:0;;;;;:::i;:::-;;:::i;70834:43::-;;;;;;;;;;;;70875:2;70834:43;;70932:50;;;;;;;;;;;;70979:3;70932:50;;27331:328;;;;;;;;;;-1:-1:-1;27331:328:0;;;;;:::i;:::-;;:::i;71601:1058::-;;;;;;:::i;:::-;;:::i;74456:196::-;;;;;;;;;;-1:-1:-1;74456:196:0;;;;;:::i;:::-;;:::i;73005:781::-;;;;;;:::i;:::-;;:::i;70615:62::-;;;;;;;;;;;;70653:24;70615:62;;66369:149;;;;;;;;;;-1:-1:-1;66369:149:0;;;;;:::i;:::-;;:::i;75959:128::-;;;;;;;;;;-1:-1:-1;75959:128:0;;;;;:::i;:::-;;:::i;26434:164::-;;;;;;;;;;-1:-1:-1;26434:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26555:25:0;;;26531:4;26555:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26434:164;60690:201;;;;;;;;;;-1:-1:-1;60690:201:0;;;;;:::i;:::-;;:::i;73794:128::-;;;;;;;;;;-1:-1:-1;73794:128:0;;;;;:::i;:::-;73860:7;73887:27;;;:18;:27;;;;;;;73794:128;74660:227;74814:4;74843:36;74867:11;74843:23;:36::i;:::-;74836:43;74660:227;-1:-1:-1;;74660:227:0:o;24356:100::-;24410:13;24443:5;24436:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24356:100;:::o;25915:221::-;25991:7;26019:16;26027:7;26019;:16::i;:::-;26011:73;;;;-1:-1:-1;;;26011:73:0;;19833:2:1;26011:73:0;;;19815:21:1;19872:2;19852:18;;;19845:30;19911:34;19891:18;;;19884:62;-1:-1:-1;;;19962:18:1;;;19955:42;20014:19;;26011:73:0;;;;;;;;;-1:-1:-1;26104:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26104:24:0;;25915:221::o;25438:411::-;25519:13;25535:23;25550:7;25535:14;:23::i;:::-;25519:39;;25583:5;-1:-1:-1;;;;;25577:11:0;:2;-1:-1:-1;;;;;25577:11:0;;;25569:57;;;;-1:-1:-1;;;25569:57:0;;21023:2:1;25569:57:0;;;21005:21:1;21062:2;21042:18;;;21035:30;21101:34;21081:18;;;21074:62;-1:-1:-1;;;21152:18:1;;;21145:31;21193:19;;25569:57:0;20821:397:1;25569:57:0;10593:10;-1:-1:-1;;;;;25661:21:0;;;;:62;;-1:-1:-1;25686:37:0;25703:5;10593:10;26434:164;:::i;25686:37::-;25639:168;;;;-1:-1:-1;;;25639:168:0;;16273:2:1;25639:168:0;;;16255:21:1;16312:2;16292:18;;;16285:30;16351:34;16331:18;;;16324:62;16422:26;16402:18;;;16395:54;16466:19;;25639:168:0;16071:420:1;25639:168:0;25820:21;25829:2;25833:7;25820:8;:21::i;:::-;25508:341;25438:411;;:::o;70759:68::-;;;;;;;;;;;;;;;;;;;:::o;74066:382::-;74152:16;74186:18;74207:21;74217:10;74207:9;:21::i;:::-;74186:42;;74239:25;74281:10;74267:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74267:25:0;;74239:53;;74308:9;74303:112;74323:10;74319:1;:14;74303:112;;;74369:34;74389:10;74401:1;74369:19;:34::i;:::-;74355:8;74364:1;74355:11;;;;;;;;:::i;:::-;;;;;;;;;;:48;74335:3;;;;:::i;:::-;;;;74303:112;;;-1:-1:-1;74432:8:0;74066:382;-1:-1:-1;;;74066:382:0:o;26665:339::-;26860:41;10593:10;26879:12;26893:7;26860:18;:41::i;:::-;26852:103;;;;-1:-1:-1;;;26852:103:0;;;;;;;:::i;:::-;26968:28;26978:4;26984:2;26988:7;26968:9;:28::i;72667:299::-;72726:7;72750:32;70653:24;72771:10;72750:7;:32::i;:::-;72746:171;;;-1:-1:-1;72806:1:0;;72667:299;-1:-1:-1;72667:299:0:o;72746:171::-;72829:25;72843:10;72829:13;:25::i;:::-;72825:92;;;72878:27;72895:10;71141;72878:27;:::i;72825:92::-;72934:24;72948:10;71027:11;72934:24;:::i;65977:147::-;65658:7;65685:12;;;:6;:12;;;;;:22;;;64035:30;64046:4;10593:10;64035;:30::i;:::-;66091:25:::1;66102:4;66108:7;66091:10;:25::i;46270:256::-:0;46367:7;46403:23;46420:5;46403:16;:23::i;:::-;46395:5;:31;46387:87;;;;-1:-1:-1;;;46387:87:0;;11685:2:1;46387:87:0;;;11667:21:1;11724:2;11704:18;;;11697:30;11763:34;11743:18;;;11736:62;-1:-1:-1;;;11814:18:1;;;11807:41;11865:19;;46387:87:0;11483:407:1;46387:87:0;-1:-1:-1;;;;;;46492:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46270:256::o;67025:218::-;-1:-1:-1;;;;;67121:23:0;;10593:10;67121:23;67113:83;;;;-1:-1:-1;;;67113:83:0;;23387:2:1;67113:83:0;;;23369:21:1;23426:2;23406:18;;;23399:30;23465:34;23445:18;;;23438:62;-1:-1:-1;;;23516:18:1;;;23509:45;23571:19;;67113:83:0;23185:411:1;67113:83:0;67209:26;67221:4;67227:7;67209:11;:26::i;:::-;67025:218;;:::o;74941:199::-;55065:1;55663:7;;:19;;55655:63;;;;-1:-1:-1;;;55655:63:0;;22610:2:1;55655:63:0;;;22592:21:1;22649:2;22629:18;;;22622:30;22688:33;22668:18;;;22661:61;22739:18;;55655:63:0;22408:355:1;55655:63:0;55065:1;55796:7;:18;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23:::1;59993:68;;;;-1:-1:-1::0;;;59993:68:0::1;;;;;;;:::i;:::-;75023:82:::2;::::0;75005:12:::2;::::0;75031:10:::2;::::0;75069:21:::2;::::0;75005:12;75023:82;75005:12;75023:82;75069:21;75031:10;75023:82:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75004:101;;;75124:7;75116:16;;;::::0;::::2;;-1:-1:-1::0;55021:1:0;55975:7;:22;74941:199::o;75792:65::-;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;75839:10:::1;:8;:10::i;:::-;75792:65::o:0;27075:185::-;27213:39;27230:4;27236:2;27240:7;27213:39;;;;;;;;;;;;:16;:39::i;76095:95::-;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;76163:19:::1;76174:7;76163:10;:19::i;:::-;76095:95:::0;:::o;46792:233::-;46867:7;46903:30;46690:10;:17;;46602:113;46903:30;46895:5;:38;46887:95;;;;-1:-1:-1;;;46887:95:0;;21843:2:1;46887:95:0;;;21825:21:1;21882:2;21862:18;;;21855:30;21921:34;21901:18;;;21894:62;-1:-1:-1;;;21972:18:1;;;21965:42;22024:19;;46887:95:0;21641:408:1;46887:95:0;47000:10;47011:5;47000:17;;;;;;;;:::i;:::-;;;;;;;;;46993:24;;46792:233;;;:::o;75483:232::-;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;75598:9:::1;75593:115;75613:20:::0;;::::1;75593:115;;;75655:41;-1:-1:-1::0;;;;;;;;;;;75683:9:0::1;;75693:1;75683:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;75655:11;:41::i;:::-;75635:3:::0;::::1;::::0;::::1;:::i;:::-;;;;75593:115;;24050:239:::0;24122:7;24158:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24158:16:0;24193:19;24185:73;;;;-1:-1:-1;;;24185:73:0;;17461:2:1;24185:73:0;;;17443:21:1;17500:2;17480:18;;;17473:30;17539:34;17519:18;;;17512:62;-1:-1:-1;;;17590:18:1;;;17583:39;17639:19;;24185:73:0;17259:405:1;23780:208:0;23852:7;-1:-1:-1;;;;;23880:19:0;;23872:74;;;;-1:-1:-1;;;23872:74:0;;16698:2:1;23872:74:0;;;16680:21:1;16737:2;16717:18;;;16710:30;16776:34;16756:18;;;16749:62;-1:-1:-1;;;16827:18:1;;;16820:40;16877:19;;23872:74:0;16496:406:1;23872:74:0;-1:-1:-1;;;;;;23964:16:0;;;;;:9;:16;;;;;;;23780:208::o;60432:103::-;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;60497:30:::1;60524:1;60497:18;:30::i;75272:203::-:0;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;75359:9:::1;75354:114;75374:20:::0;;::::1;75354:114;;;75416:40;-1:-1:-1::0;;;;;;;;;;;75443:9:0::1;;75453:1;75443:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;75416:10;:40::i;:::-;75396:3:::0;::::1;::::0;::::1;:::i;:::-;;;;75354:114;;75723:61:::0;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;75768:8:::1;:6;:8::i;75865:86::-:0;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;75933:10:::1;::::0;;-1:-1:-1;;75919:24:0;::::1;75933:10;::::0;;::::1;75932:11;75919:24;::::0;;75865:86::o;75148:116::-;59854:6;;75208:7;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;-1:-1:-1;75235:21:0::1;75148:116:::0;:::o;64453:147::-;64539:4;64563:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;64563:29:0;;;;;;;;;;;;;;;64453:147::o;24525:104::-;24581:13;24614:7;24607:14;;;;;:::i;26208:155::-;26303:52;10593:10;26336:8;26346;26303:18;:52::i;27331:328::-;27506:41;10593:10;27539:7;27506:18;:41::i;:::-;27498:103;;;;-1:-1:-1;;;27498:103:0;;;;;;;:::i;:::-;27612:39;27626:4;27632:2;27636:7;27645:5;27612:13;:39::i;:::-;27331:328;;;;:::o;71601:1058::-;71750:8;:15;71735:4;:11;:30;71713:122;;;;-1:-1:-1;;;71713:122:0;;18286:2:1;71713:122:0;;;18268:21:1;18325:2;18305:18;;;18298:30;18364:34;18344:18;;;18337:62;-1:-1:-1;;;18415:18:1;;;18408:40;18465:19;;71713:122:0;18084:406:1;71713:122:0;71867:11;;71897:14;71889:47;;;;-1:-1:-1;;;71889:47:0;;13686:2:1;71889:47:0;;;13668:21:1;13725:2;13705:18;;;13698:30;-1:-1:-1;;;13744:18:1;;;13737:50;13804:18;;71889:47:0;13484:344:1;71889:47:0;70875:2;71955:10;:28;;71947:64;;;;-1:-1:-1;;;71947:64:0;;17109:2:1;71947:64:0;;;17091:21:1;17148:2;17128:18;;;17121:30;17187:25;17167:18;;;17160:53;17230:18;;71947:64:0;16907:347:1;71947:64:0;72026:32;70653:24;72047:10;72026:7;:32::i;:::-;72022:391;;;72075:38;72086:10;72098:4;72104:8;72075:10;:38::i;72022:391::-;72156:25;72170:10;72156:13;:25::i;:::-;72152:261;;;72238:27;72255:10;71141;72238:27;:::i;:::-;72224:9;:42;;72198:129;;;;-1:-1:-1;;;72198:129:0;;22256:2:1;72198:129:0;;;22238:21:1;22295:2;22275:18;;;22268:30;22334:27;22314:18;;;22307:55;22379:18;;72198:129:0;22054:349:1;72198:129:0;72342:38;72353:10;72365:4;72371:8;72342:10;:38::i;72152:261::-;72431:10;;;;72423:54;;;;-1:-1:-1;;;72423:54:0;;15568:2:1;72423:54:0;;;15550:21:1;15607:2;15587:18;;;15580:30;15646:33;15626:18;;;15619:61;15697:18;;72423:54:0;15366:355:1;72423:54:0;72524:24;72538:10;71027:11;72524:24;:::i;74456:196::-;74583:13;74621:23;74636:7;74621:14;:23::i;73005:781::-;73134:18;73155:16;73163:7;73155;:16::i;:::-;73134:37;-1:-1:-1;73215:10:0;73204:7;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;;59781:87;73204:7;-1:-1:-1;;;;;73204:21:0;;:49;;;-1:-1:-1;73229:10:0;-1:-1:-1;;;;;73229:24:0;;;73204:49;73182:127;;;;-1:-1:-1;;;73182:127:0;;18697:2:1;73182:127:0;;;18679:21:1;18736:2;18716:18;;;18709:30;18775;18755:18;;;18748:58;18823:18;;73182:127:0;18495:352:1;73182:127:0;73499:1;73468:27;;;:18;:27;;;;;;:32;;:91;;-1:-1:-1;73521:27:0;;;;:18;:27;;;;;;:38;;73468:91;73574:33;;;;;;;;;;;;;-1:-1:-1;;;73574:33:0;;;73446:172;;;;;-1:-1:-1;;;73446:172:0;;;;;;;;:::i;:::-;;73629:14;73635:7;73629:5;:14::i;:::-;73654:30;73664:10;73676:7;73654:9;:30::i;:::-;73695:46;73724:7;73733;78331:27;;;;:18;:27;;;;;;;;:37;;;78379:27;;;:18;:27;;;:37;78226:198;73695:46;73752:26;73765:7;73774:3;73752:12;:26::i;66369:149::-;65658:7;65685:12;;;:6;:12;;;;;:22;;;64035:30;64046:4;10593:10;64035;:30::i;:::-;66484:26:::1;66496:4;66502:7;66484:11;:26::i;75959:128::-:0;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;76043:16:::1;:36:::0;75959:128::o;60690:201::-;59854:6;;-1:-1:-1;;;;;59854:6:0;;;;;10593:10;60001:23;59993:68;;;;-1:-1:-1;;;59993:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60779:22:0;::::1;60771:73;;;::::0;-1:-1:-1;;;60771:73:0;;12516:2:1;60771:73:0::1;::::0;::::1;12498:21:1::0;12555:2;12535:18;;;12528:30;12594:34;12574:18;;;12567:62;-1:-1:-1;;;12645:18:1;;;12638:36;12691:19;;60771:73:0::1;12314:402:1::0;60771:73:0::1;60855:28;60874:8;60855:18;:28::i;42108:127::-:0;42197:19;;42215:1;42197:19;;;42108:127::o;64157:204::-;64242:4;-1:-1:-1;;;;;;64266:47:0;;-1:-1:-1;;;64266:47:0;;:87;;;64317:36;64341:11;64317:23;:36::i;29169:127::-;29234:4;29258:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29258:16:0;:30;;;29169:127::o;33315:174::-;33390:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33390:29:0;-1:-1:-1;;;;;33390:29:0;;;;;;;;:24;;33444:23;33390:24;33444:14;:23::i;:::-;-1:-1:-1;;;;;33435:46:0;;;;;;;;;;;33315:174;;:::o;29463:348::-;29556:4;29581:16;29589:7;29581;:16::i;:::-;29573:73;;;;-1:-1:-1;;;29573:73:0;;14794:2:1;29573:73:0;;;14776:21:1;14833:2;14813:18;;;14806:30;14872:34;14852:18;;;14845:62;-1:-1:-1;;;14923:18:1;;;14916:42;14975:19;;29573:73:0;14592:408:1;29573:73:0;29657:13;29673:23;29688:7;29673:14;:23::i;:::-;29657:39;;29726:5;-1:-1:-1;;;;;29715:16:0;:7;-1:-1:-1;;;;;29715:16:0;;:51;;;;29759:7;-1:-1:-1;;;;;29735:31:0;:20;29747:7;29735:11;:20::i;:::-;-1:-1:-1;;;;;29735:31:0;;29715:51;:87;;;-1:-1:-1;;;;;;26555:25:0;;;26531:4;26555:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29770:32;29707:96;29463:348;-1:-1:-1;;;;29463:348:0:o;32572:625::-;32731:4;-1:-1:-1;;;;;32704:31:0;:23;32719:7;32704:14;:23::i;:::-;-1:-1:-1;;;;;32704:31:0;;32696:81;;;;-1:-1:-1;;;32696:81:0;;12923:2:1;32696:81:0;;;12905:21:1;12962:2;12942:18;;;12935:30;13001:34;12981:18;;;12974:62;-1:-1:-1;;;13052:18:1;;;13045:35;13097:19;;32696:81:0;12721:401:1;32696:81:0;-1:-1:-1;;;;;32796:16:0;;32788:65;;;;-1:-1:-1;;;32788:65:0;;14035:2:1;32788:65:0;;;14017:21:1;14074:2;14054:18;;;14047:30;14113:34;14093:18;;;14086:62;-1:-1:-1;;;14164:18:1;;;14157:34;14208:19;;32788:65:0;13833:400:1;32788:65:0;32866:39;32887:4;32893:2;32897:7;32866:20;:39::i;:::-;32970:29;32987:1;32991:7;32970:8;:29::i;:::-;-1:-1:-1;;;;;33012:15:0;;;;;;:9;:15;;;;;:20;;33031:1;;33012:15;:20;;33031:1;;33012:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33043:13:0;;;;;;:9;:13;;;;;:18;;33060:1;;33043:13;:18;;33060:1;;33043:18;:::i;:::-;;;;-1:-1:-1;;33072:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33072:21:0;-1:-1:-1;;;;;33072:21:0;;;;;;;;;33111:27;;33072:16;;33111:27;;;;;;;25508:341;25438:411;;:::o;77513:345::-;77578:4;77615:35;-1:-1:-1;;;;;;;;;;;77639:10:0;77615:7;:35::i;:::-;:110;;;;;77708:16;;77693:10;77669:21;77679:10;77669:9;:21::i;:::-;:34;;;;:::i;:::-;77668:56;;77615:110;:235;;;;;70979:3;77772:10;77744:25;:15;42078:14;;41986:114;77744:25;:38;;;;:::i;:::-;77743:64;;:106;;;;77828:16;;77848:1;77828:21;77595:255;77513:345;-1:-1:-1;;77513:345:0:o;64890:505::-;64979:22;64987:4;64993:7;64979;:22::i;:::-;64974:414;;65167:41;65195:7;-1:-1:-1;;;;;65167:41:0;65205:2;65167:19;:41::i;:::-;65281:38;65309:4;65316:2;65281:19;:38::i;:::-;65072:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;65072:270:0;;;;;;;;;;-1:-1:-1;;;65018:358:0;;;;;;;:::i;68526:238::-;68610:22;68618:4;68624:7;68610;:22::i;:::-;68605:152;;68649:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;68649:29:0;;;;;;;;;:36;;-1:-1:-1;;68649:36:0;68681:4;68649:36;;;68732:12;10593:10;;10513:98;68732:12;-1:-1:-1;;;;;68705:40:0;68723:7;-1:-1:-1;;;;;68705:40:0;68717:4;68705:40;;;;;;;;;;68526:238;;:::o;68896:239::-;68980:22;68988:4;68994:7;68980;:22::i;:::-;68976:152;;;69051:5;69019:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;69019:29:0;;;;;;;;;;:37;;-1:-1:-1;;69019:37:0;;;69076:40;10593:10;;69019:12;;69076:40;;69051:5;69076:40;68896:239;;:::o;58396:120::-;57408:7;;;;57932:41;;;;-1:-1:-1;;;57932:41:0;;11336:2:1;57932:41:0;;;11318:21:1;11375:2;11355:18;;;11348:30;-1:-1:-1;;;11394:18:1;;;11387:50;11454:18;;57932:41:0;11134:344:1;57932:41:0;58455:7:::1;:15:::0;;-1:-1:-1;;58455:15:0::1;::::0;;58486:22:::1;10593:10:::0;58495:12:::1;58486:22;::::0;-1:-1:-1;;;;;9001:32:1;;;8983:51;;8971:2;8956:18;58486:22:0::1;;;;;;;58396:120::o:0;52855:245::-;52973:41;10593:10;52992:12;10513:98;52973:41;52965:102;;;;-1:-1:-1;;;52965:102:0;;22970:2:1;52965:102:0;;;22952:21:1;23009:2;22989:18;;;22982:30;23048:34;23028:18;;;23021:62;-1:-1:-1;;;23099:18:1;;;23092:46;23155:19;;52965:102:0;22768:412:1;52965:102:0;53078:14;53084:7;53078:5;:14::i;61051:191::-;61144:6;;;-1:-1:-1;;;;;61161:17:0;;;61144:6;61161:17;;;-1:-1:-1;;;;;;61161:17:0;;;;;;61194:40;;61144:6;;;;;;;;61194:40;;61125:16;;61194:40;61114:128;61051:191;:::o;58137:118::-;57408:7;;;;57662:9;57654:38;;;;-1:-1:-1;;;57654:38:0;;15928:2:1;57654:38:0;;;15910:21:1;15967:2;15947:18;;;15940:30;-1:-1:-1;;;15986:18:1;;;15979:46;16042:18;;57654:38:0;15726:340:1;57654:38:0;58197:7:::1;:14:::0;;-1:-1:-1;;58197:14:0::1;58207:4;58197:14;::::0;;58227:20:::1;58234:12;10593:10:::0;;10513:98;33631:315;33786:8;-1:-1:-1;;;;;33777:17:0;:5;-1:-1:-1;;;;;33777:17:0;;;33769:55;;;;-1:-1:-1;;;33769:55:0;;14440:2:1;33769:55:0;;;14422:21:1;14479:2;14459:18;;;14452:30;14518:27;14498:18;;;14491:55;14563:18;;33769:55:0;14238:349:1;33769:55:0;-1:-1:-1;;;;;33835:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33835:46:0;;;;;;;;;;33897:41;;10315::1;;;33897::0;;10288:18:1;33897:41:0;;;;;;;33631:315;;;:::o;28541:::-;28698:28;28708:4;28714:2;28718:7;28698:9;:28::i;:::-;28745:48;28768:4;28774:2;28778:7;28787:5;28745:22;:48::i;:::-;28737:111;;;;-1:-1:-1;;;28737:111:0;;;;;;;:::i;76435:449::-;76598:11;;70921:4;76598:11;76643:25;:15;42078:14;;41986:114;76643:25;:38;;;;:::i;:::-;76642:54;;76620:136;;;;-1:-1:-1;;;76620:136:0;;15207:2:1;76620:136:0;;;15189:21:1;;;15226:18;;;15219:30;15285:34;15265:18;;;15258:62;15337:18;;76620:136:0;15005:356:1;76620:136:0;76772:9;76767:110;76791:10;76787:1;:14;76767:110;;;76823:42;76832:10;76844:4;76849:1;76844:7;;;;;;;;:::i;:::-;;;;;;;76853:8;76862:1;76853:11;;;;;;;;:::i;:::-;;;;;;;76823:8;:42::i;:::-;76803:3;;;;:::i;:::-;;;;76767:110;;;;76566:318;76435:449;;;:::o;43253:679::-;43326:13;43360:16;43368:7;43360;:16::i;:::-;43352:78;;;;-1:-1:-1;;;43352:78:0;;19415:2:1;43352:78:0;;;19397:21:1;19454:2;19434:18;;;19427:30;19493:34;19473:18;;;19466:62;-1:-1:-1;;;19544:18:1;;;19537:47;19601:19;;43352:78:0;19213:413:1;43352:78:0;43443:23;43469:19;;;:10;:19;;;;;43443:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43499:18;43520:10;78194:16;;;;;;;;;;;;-1:-1:-1;;;78194:16:0;;;;;78116:102;43520:10;43499:31;;43612:4;43606:18;43628:1;43606:23;43602:72;;;-1:-1:-1;43653:9:0;43253:679;-1:-1:-1;;43253:679:0:o;43602:72::-;43778:23;;:27;43774:108;;43853:4;43859:9;43836:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43822:48;;;;43253:679;;;:::o;43774:108::-;43901:23;43916:7;43901:14;:23::i;77866:242::-;78026:1;77995:27;;;:18;:27;;;;;;;;;;77976:47;;:18;:47;;;;;:51;;;78038:27;;;;;;:31;78080:20;78014:7;78080:11;:20::i;30153:110::-;30229:26;30239:2;30243:7;30229:26;;;;;;;;;;;;:9;:26::i;44088:217::-;44188:16;44196:7;44188;:16::i;:::-;44180:75;;;;-1:-1:-1;;;44180:75:0;;17871:2:1;44180:75:0;;;17853:21:1;17910:2;17890:18;;;17883:30;17949:34;17929:18;;;17922:62;-1:-1:-1;;;18000:18:1;;;17993:44;18054:19;;44180:75:0;17669:410:1;44180:75:0;44266:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;45962:224::-;46064:4;-1:-1:-1;;;;;;46088:50:0;;-1:-1:-1;;;46088:50:0;;:90;;;46142:36;46166:11;46142:23;:36::i;76198:229::-;57408:7;;;;57662:9;57654:38;;;;-1:-1:-1;;;57654:38:0;;15928:2:1;57654:38:0;;;15910:21:1;15967:2;15947:18;;;15940:30;-1:-1:-1;;;15986:18:1;;;15979:46;16042:18;;57654:38:0;15726:340:1;57654:38:0;76374:45:::1;76401:4;76407:2;76411:7;76374:26;:45::i;9219:451::-:0;9294:13;9320:19;9352:10;9356:6;9352:1;:10;:::i;:::-;:14;;9365:1;9352:14;:::i;:::-;9342:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9342:25:0;;9320:47;;-1:-1:-1;;;9378:6:0;9385:1;9378:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9378:15:0;;;;;;;;;-1:-1:-1;;;9404:6:0;9411:1;9404:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9404:15:0;;;;;;;;-1:-1:-1;9435:9:0;9447:10;9451:6;9447:1;:10;:::i;:::-;:14;;9460:1;9447:14;:::i;:::-;9435:26;;9430:135;9467:1;9463;:5;9430:135;;;-1:-1:-1;;;9515:5:0;9523:3;9515:11;9502:25;;;;;;;:::i;:::-;;;;9490:6;9497:1;9490:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;9490:37:0;;;;;;;;-1:-1:-1;9552:1:0;9542:11;;;;;9470:3;;;:::i;:::-;;;9430:135;;;-1:-1:-1;9583:10:0;;9575:55;;;;-1:-1:-1;;;9575:55:0;;10975:2:1;9575:55:0;;;10957:21:1;;;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;11105:18;;9575:55:0;10773:356:1;9575:55:0;9655:6;9219:451;-1:-1:-1;;;9219:451:0:o;34511:799::-;34666:4;-1:-1:-1;;;;;34687:13:0;;12420:19;:23;34683:620;;34723:72;;-1:-1:-1;;;34723:72:0;;-1:-1:-1;;;;;34723:36:0;;;;;:72;;10593:10;;34774:4;;34780:7;;34789:5;;34723:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34723:72:0;;;;;;;;-1:-1:-1;;34723:72:0;;;;;;;;;;;;:::i;:::-;;;34719:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34965:13:0;;34961:272;;35008:60;;-1:-1:-1;;;35008:60:0;;;;;;;:::i;34961:272::-;35183:6;35177:13;35168:6;35164:2;35160:15;35153:38;34719:529;-1:-1:-1;;;;;;34846:51:0;-1:-1:-1;;;34846:51:0;;-1:-1:-1;34839:58:0;;34683:620;-1:-1:-1;35287:4:0;34511:799;;;;;;:::o;76892:613::-;70921:4;77042:25;:15;42078:14;;41986:114;77042:25;:29;;77070:1;77042:29;:::i;:::-;77041:45;;77019:127;;;;-1:-1:-1;;;77019:127:0;;15207:2:1;77019:127:0;;;15189:21:1;;;15226:18;;;15219:30;15285:34;15265:18;;;15258:62;15337:18;;77019:127:0;15005:356:1;77019:127:0;77210:1;77179:27;;;:18;:27;;;;;;;;;;77226:33;;;;;;;;;;;-1:-1:-1;;;77226:33:0;;;;;;;77179:32;77157:113;;;;-1:-1:-1;;;77157:113:0;;;;;;;;:::i;:::-;;77281:15;77299:25;:15;42078:14;;41986:114;77299:25;77281:43;;77335:27;:15;42197:19;;42215:1;42197:19;;;42108:127;77335:27;77373:30;77383:10;77395:7;77373:9;:30::i;:::-;77414:46;77443:7;77452;78331:27;;;;:18;:27;;;;;;;;:37;;;78379:27;;;:18;:27;;;:37;78226:198;77414:46;77471:26;77484:7;77493:3;77471:12;:26::i;24700:334::-;24773:13;24807:16;24815:7;24807;:16::i;:::-;24799:76;;;;-1:-1:-1;;;24799:76:0;;20607:2:1;24799:76:0;;;20589:21:1;20646:2;20626:18;;;20619:30;20685:34;20665:18;;;20658:62;-1:-1:-1;;;20736:18:1;;;20729:45;20791:19;;24799:76:0;20405:411:1;24799:76:0;24888:21;24912:10;78194:16;;;;;;;;;;;;-1:-1:-1;;;78194:16:0;;;;;78116:102;24912:10;24888:34;;24964:1;24946:7;24940:21;:25;:86;;;;;;;;;;;;;;;;;24992:7;25001:18;:7;:16;:18::i;:::-;24975:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24933:93;24700:334;-1:-1:-1;;;24700:334:0:o;44534:206::-;44603:20;44615:7;44603:11;:20::i;:::-;44646:19;;;;:10;:19;;;;;44640:33;;;;;:::i;:::-;:38;;-1:-1:-1;44636:97:0;;44702:19;;;;:10;:19;;;;;44695:26;;;:::i;30490:321::-;30620:18;30626:2;30630:7;30620:5;:18::i;:::-;30671:54;30702:1;30706:2;30710:7;30719:5;30671:22;:54::i;:::-;30649:154;;;;-1:-1:-1;;;30649:154:0;;;;;;;:::i;23411:305::-;23513:4;-1:-1:-1;;;;;;23550:40:0;;-1:-1:-1;;;23550:40:0;;:105;;-1:-1:-1;;;;;;;23607:48:0;;-1:-1:-1;;;23607:48:0;23550:105;:158;;;-1:-1:-1;;;;;;;;;;7341:40:0;;;23672:36;7232:157;47638:589;-1:-1:-1;;;;;47844:18:0;;47840:187;;47879:40;47911:7;49054:10;:17;;49027:24;;;;:15;:24;;;;;:44;;;49082:24;;;;;;;;;;;;48950:164;47879:40;47840:187;;;47949:2;-1:-1:-1;;;;;47941:10:0;:4;-1:-1:-1;;;;;47941:10:0;;47937:90;;47968:47;48001:4;48007:7;47968:32;:47::i;:::-;-1:-1:-1;;;;;48041:16:0;;48037:183;;48074:45;48111:7;48074:36;:45::i;48037:183::-;48147:4;-1:-1:-1;;;;;48141:10:0;:2;-1:-1:-1;;;;;48141:10:0;;48137:83;;48168:40;48196:2;48200:7;48168:27;:40::i;7918:723::-;7974:13;8195:10;8191:53;;-1:-1:-1;;8222:10:0;;;;;;;;;;;;-1:-1:-1;;;8222:10:0;;;;;7918:723::o;8191:53::-;8269:5;8254:12;8310:78;8317:9;;8310:78;;8343:8;;;;:::i;:::-;;-1:-1:-1;8366:10:0;;-1:-1:-1;8374:2:0;8366:10;;:::i;:::-;;;8310:78;;;8398:19;8430:6;8420:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8420:17:0;;8398:39;;8448:154;8455:10;;8448:154;;8482:11;8492:1;8482:11;;:::i;:::-;;-1:-1:-1;8551:10:0;8559:2;8551:5;:10;:::i;:::-;8538:24;;:2;:24;:::i;:::-;8525:39;;8508:6;8515;8508:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8508:56:0;;;;;;;;-1:-1:-1;8579:11:0;8588:2;8579:11;;:::i;:::-;;;8448:154;;31815:420;31875:13;31891:23;31906:7;31891:14;:23::i;:::-;31875:39;;31927:48;31948:5;31963:1;31967:7;31927:20;:48::i;:::-;32016:29;32033:1;32037:7;32016:8;:29::i;:::-;-1:-1:-1;;;;;32058:16:0;;;;;;:9;:16;;;;;:21;;32078:1;;32058:16;:21;;32078:1;;32058:21;:::i;:::-;;;;-1:-1:-1;;32097:16:0;;;;:7;:16;;;;;;32090:23;;-1:-1:-1;;;;;;32090:23:0;;;32131:36;32105:7;;32097:16;-1:-1:-1;;;;;32131:36:0;;;;;32097:16;;32131:36;67025:218;;:::o;31147:439::-;-1:-1:-1;;;;;31227:16:0;;31219:61;;;;-1:-1:-1;;;31219:61:0;;19054:2:1;31219:61:0;;;19036:21:1;;;19073:18;;;19066:30;19132:34;19112:18;;;19105:62;19184:18;;31219:61:0;18852:356:1;31219:61:0;31300:16;31308:7;31300;:16::i;:::-;31299:17;31291:58;;;;-1:-1:-1;;;31291:58:0;;13329:2:1;31291:58:0;;;13311:21:1;13368:2;13348:18;;;13341:30;13407;13387:18;;;13380:58;13455:18;;31291:58:0;13127:352:1;31291:58:0;31362:45;31391:1;31395:2;31399:7;31362:20;:45::i;:::-;-1:-1:-1;;;;;31420:13:0;;;;;;:9;:13;;;;;:18;;31437:1;;31420:13;:18;;31437:1;;31420:18;:::i;:::-;;;;-1:-1:-1;;31449:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31449:21:0;-1:-1:-1;;;;;31449:21:0;;;;;;;;31488:33;;31449:16;;;31488:33;;31449:16;;31488:33;67025:218;;:::o;49741:988::-;50007:22;50057:1;50032:22;50049:4;50032:16;:22::i;:::-;:26;;;;:::i;:::-;50069:18;50090:26;;;:17;:26;;;;;;50007:51;;-1:-1:-1;50223:28:0;;;50219:328;;-1:-1:-1;;;;;50290:18:0;;50268:19;50290:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50341:30;;;;;;:44;;;50458:30;;:17;:30;;;;;:43;;;50219:328;-1:-1:-1;50643:26:0;;;;:17;:26;;;;;;;;50636:33;;;-1:-1:-1;;;;;50687:18:0;;;;;:12;:18;;;;;:34;;;;;;;50680:41;49741:988::o;51024:1079::-;51302:10;:17;51277:22;;51302:21;;51322:1;;51302:21;:::i;:::-;51334:18;51355:24;;;:15;:24;;;;;;51728:10;:26;;51277:46;;-1:-1:-1;51355:24:0;;51277:46;;51728:26;;;;;;:::i;:::-;;;;;;;;;51706:48;;51792:11;51767:10;51778;51767:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51872:28;;;:15;:28;;;;;;;:41;;;52044:24;;;;;52037:31;52079:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51095:1008;;;51024:1079;:::o;48528:221::-;48613:14;48630:20;48647:2;48630:16;:20::i;:::-;-1:-1:-1;;;;;48661:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48706:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48528:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:672::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:59;830:42;869:2;830:42;:::i;:::-;814:59;:::i;:::-;895:3;919:2;914:3;907:15;947:2;942:3;938:12;931:19;;982:2;974:6;970:15;1034:3;1029:2;1023;1020:1;1016:10;1008:6;1004:23;1000:32;997:41;994:61;;;1051:1;1048;1041:12;994:61;1073:1;1083:163;1097:2;1094:1;1091:9;1083:163;;;1154:17;;1142:30;;1192:12;;;;1224;;;;1115:1;1108:9;1083:163;;;-1:-1:-1;1264:5:1;;603:672;-1:-1:-1;;;;;;;603:672:1:o;1280:221::-;1323:5;1376:3;1369:4;1361:6;1357:17;1353:27;1343:55;;1394:1;1391;1384:12;1343:55;1416:79;1491:3;1482:6;1469:20;1462:4;1454:6;1450:17;1416:79;:::i;1506:186::-;1565:6;1618:2;1606:9;1597:7;1593:23;1589:32;1586:52;;;1634:1;1631;1624:12;1586:52;1657:29;1676:9;1657:29;:::i;1697:260::-;1765:6;1773;1826:2;1814:9;1805:7;1801:23;1797:32;1794:52;;;1842:1;1839;1832:12;1794:52;1865:29;1884:9;1865:29;:::i;:::-;1855:39;;1913:38;1947:2;1936:9;1932:18;1913:38;:::i;:::-;1903:48;;1697:260;;;;;:::o;1962:328::-;2039:6;2047;2055;2108:2;2096:9;2087:7;2083:23;2079:32;2076:52;;;2124:1;2121;2114:12;2076:52;2147:29;2166:9;2147:29;:::i;:::-;2137:39;;2195:38;2229:2;2218:9;2214:18;2195:38;:::i;:::-;2185:48;;2280:2;2269:9;2265:18;2252:32;2242:42;;1962:328;;;;;:::o;2295:666::-;2390:6;2398;2406;2414;2467:3;2455:9;2446:7;2442:23;2438:33;2435:53;;;2484:1;2481;2474:12;2435:53;2507:29;2526:9;2507:29;:::i;:::-;2497:39;;2555:38;2589:2;2578:9;2574:18;2555:38;:::i;:::-;2545:48;;2640:2;2629:9;2625:18;2612:32;2602:42;;2695:2;2684:9;2680:18;2667:32;2722:18;2714:6;2711:30;2708:50;;;2754:1;2751;2744:12;2708:50;2777:22;;2830:4;2822:13;;2818:27;-1:-1:-1;2808:55:1;;2859:1;2856;2849:12;2808:55;2882:73;2947:7;2942:2;2929:16;2924:2;2920;2916:11;2882:73;:::i;:::-;2872:83;;;2295:666;;;;;;;:::o;2966:347::-;3031:6;3039;3092:2;3080:9;3071:7;3067:23;3063:32;3060:52;;;3108:1;3105;3098:12;3060:52;3131:29;3150:9;3131:29;:::i;:::-;3121:39;;3210:2;3199:9;3195:18;3182:32;3257:5;3250:13;3243:21;3236:5;3233:32;3223:60;;3279:1;3276;3269:12;3223:60;3302:5;3292:15;;;2966:347;;;;;:::o;3318:254::-;3386:6;3394;3447:2;3435:9;3426:7;3422:23;3418:32;3415:52;;;3463:1;3460;3453:12;3415:52;3486:29;3505:9;3486:29;:::i;:::-;3476:39;3562:2;3547:18;;;;3534:32;;-1:-1:-1;;;3318:254:1:o;3577:615::-;3663:6;3671;3724:2;3712:9;3703:7;3699:23;3695:32;3692:52;;;3740:1;3737;3730:12;3692:52;3780:9;3767:23;3809:18;3850:2;3842:6;3839:14;3836:34;;;3866:1;3863;3856:12;3836:34;3904:6;3893:9;3889:22;3879:32;;3949:7;3942:4;3938:2;3934:13;3930:27;3920:55;;3971:1;3968;3961:12;3920:55;4011:2;3998:16;4037:2;4029:6;4026:14;4023:34;;;4053:1;4050;4043:12;4023:34;4106:7;4101:2;4091:6;4088:1;4084:14;4080:2;4076:23;4072:32;4069:45;4066:65;;;4127:1;4124;4117:12;4066:65;4158:2;4150:11;;;;;4180:6;;-1:-1:-1;3577:615:1;;-1:-1:-1;;;;3577:615:1:o;4197:1301::-;4325:6;4333;4386:2;4374:9;4365:7;4361:23;4357:32;4354:52;;;4402:1;4399;4392:12;4354:52;4442:9;4429:23;4471:18;4512:2;4504:6;4501:14;4498:34;;;4528:1;4525;4518:12;4498:34;4566:6;4555:9;4551:22;4541:32;;4611:7;4604:4;4600:2;4596:13;4592:27;4582:55;;4633:1;4630;4623:12;4582:55;4669:2;4656:16;4691:4;4715:59;4731:42;4770:2;4731:42;:::i;4715:59::-;4796:3;4820:2;4815:3;4808:15;4848:2;4843:3;4839:12;4832:19;;4879:2;4875;4871:11;4927:7;4922:2;4916;4913:1;4909:10;4905:2;4901:19;4897:28;4894:41;4891:61;;;4948:1;4945;4938:12;4891:61;4970:1;4980:304;4994:2;4991:1;4988:9;4980:304;;;5071:3;5058:17;5107:2;5094:11;5091:19;5088:39;;;5123:1;5120;5113:12;5088:39;5152:57;5201:7;5196:2;5182:11;5178:2;5174:20;5170:29;5152:57;:::i;:::-;5140:70;;-1:-1:-1;5230:12:1;;;;5262;;;;5012:1;5005:9;4980:304;;;-1:-1:-1;5303:5:1;;-1:-1:-1;;;5346:18:1;;5333:32;;-1:-1:-1;;5377:16:1;;;5374:36;;;5406:1;5403;5396:12;5374:36;;5429:63;5484:7;5473:8;5462:9;5458:24;5429:63;:::i;:::-;5419:73;;;4197:1301;;;;;:::o;5503:180::-;5562:6;5615:2;5603:9;5594:7;5590:23;5586:32;5583:52;;;5631:1;5628;5621:12;5583:52;-1:-1:-1;5654:23:1;;5503:180;-1:-1:-1;5503:180:1:o;5688:254::-;5756:6;5764;5817:2;5805:9;5796:7;5792:23;5788:32;5785:52;;;5833:1;5830;5823:12;5785:52;5869:9;5856:23;5846:33;;5898:38;5932:2;5921:9;5917:18;5898:38;:::i;5947:245::-;6005:6;6058:2;6046:9;6037:7;6033:23;6029:32;6026:52;;;6074:1;6071;6064:12;6026:52;6113:9;6100:23;6132:30;6156:5;6132:30;:::i;6197:249::-;6266:6;6319:2;6307:9;6298:7;6294:23;6290:32;6287:52;;;6335:1;6332;6325:12;6287:52;6367:9;6361:16;6386:30;6410:5;6386:30;:::i;6636:458::-;6723:6;6731;6739;6792:2;6780:9;6771:7;6767:23;6763:32;6760:52;;;6808:1;6805;6798:12;6760:52;6844:9;6831:23;6821:33;;6905:2;6894:9;6890:18;6877:32;6932:18;6924:6;6921:30;6918:50;;;6964:1;6961;6954:12;6918:50;6987;7029:7;7020:6;7009:9;7005:22;6987:50;:::i;:::-;6977:60;;;7084:2;7073:9;7069:18;7056:32;7046:42;;6636:458;;;;;:::o;7099:257::-;7140:3;7178:5;7172:12;7205:6;7200:3;7193:19;7221:63;7277:6;7270:4;7265:3;7261:14;7254:4;7247:5;7243:16;7221:63;:::i;:::-;7338:2;7317:15;-1:-1:-1;;7313:29:1;7304:39;;;;7345:4;7300:50;;7099:257;-1:-1:-1;;7099:257:1:o;7361:470::-;7540:3;7578:6;7572:13;7594:53;7640:6;7635:3;7628:4;7620:6;7616:17;7594:53;:::i;:::-;7710:13;;7669:16;;;;7732:57;7710:13;7669:16;7766:4;7754:17;;7732:57;:::i;:::-;7805:20;;7361:470;-1:-1:-1;;;;7361:470:1:o;8046:786::-;8457:25;8452:3;8445:38;8427:3;8512:6;8506:13;8528:62;8583:6;8578:2;8573:3;8569:12;8562:4;8554:6;8550:17;8528:62;:::i;:::-;-1:-1:-1;;;8649:2:1;8609:16;;;8641:11;;;8634:40;8699:13;;8721:63;8699:13;8770:2;8762:11;;8755:4;8743:17;;8721:63;:::i;:::-;8804:17;8823:2;8800:26;;8046:786;-1:-1:-1;;;;8046:786:1:o;9045:488::-;-1:-1:-1;;;;;9314:15:1;;;9296:34;;9366:15;;9361:2;9346:18;;9339:43;9413:2;9398:18;;9391:34;;;9461:3;9456:2;9441:18;;9434:31;;;9239:4;;9482:45;;9507:19;;9499:6;9482:45;:::i;:::-;9474:53;9045:488;-1:-1:-1;;;;;;9045:488:1:o;9538:632::-;9709:2;9761:21;;;9831:13;;9734:18;;;9853:22;;;9680:4;;9709:2;9932:15;;;;9906:2;9891:18;;;9680:4;9975:169;9989:6;9986:1;9983:13;9975:169;;;10050:13;;10038:26;;10119:15;;;;10084:12;;;;10011:1;10004:9;9975:169;;;-1:-1:-1;10161:3:1;;9538:632;-1:-1:-1;;;;;;9538:632:1:o;10549:219::-;10698:2;10687:9;10680:21;10661:4;10718:44;10758:2;10747:9;10743:18;10735:6;10718:44;:::i;11895:414::-;12097:2;12079:21;;;12136:2;12116:18;;;12109:30;12175:34;12170:2;12155:18;;12148:62;-1:-1:-1;;;12241:2:1;12226:18;;12219:48;12299:3;12284:19;;11895:414::o;20044:356::-;20246:2;20228:21;;;20265:18;;;20258:30;20324:34;20319:2;20304:18;;20297:62;20391:2;20376:18;;20044:356::o;21223:413::-;21425:2;21407:21;;;21464:2;21444:18;;;21437:30;21503:34;21498:2;21483:18;;21476:62;-1:-1:-1;;;21569:2:1;21554:18;;21547:47;21626:3;21611:19;;21223:413::o;23783:275::-;23854:2;23848:9;23919:2;23900:13;;-1:-1:-1;;23896:27:1;23884:40;;23954:18;23939:34;;23975:22;;;23936:62;23933:88;;;24001:18;;:::i;:::-;24037:2;24030:22;23783:275;;-1:-1:-1;23783:275:1:o;24063:182::-;24122:4;24155:18;24147:6;24144:30;24141:56;;;24177:18;;:::i;:::-;-1:-1:-1;24222:1:1;24218:14;24234:4;24214:25;;24063:182::o;24250:128::-;24290:3;24321:1;24317:6;24314:1;24311:13;24308:39;;;24327:18;;:::i;:::-;-1:-1:-1;24363:9:1;;24250:128::o;24383:120::-;24423:1;24449;24439:35;;24454:18;;:::i;:::-;-1:-1:-1;24488:9:1;;24383:120::o;24508:168::-;24548:7;24614:1;24610;24606:6;24602:14;24599:1;24596:21;24591:1;24584:9;24577:17;24573:45;24570:71;;;24621:18;;:::i;:::-;-1:-1:-1;24661:9:1;;24508:168::o;24681:125::-;24721:4;24749:1;24746;24743:8;24740:34;;;24754:18;;:::i;:::-;-1:-1:-1;24791:9:1;;24681:125::o;24811:258::-;24883:1;24893:113;24907:6;24904:1;24901:13;24893:113;;;24983:11;;;24977:18;24964:11;;;24957:39;24929:2;24922:10;24893:113;;;25024:6;25021:1;25018:13;25015:48;;;-1:-1:-1;;25059:1:1;25041:16;;25034:27;24811:258::o;25074:136::-;25113:3;25141:5;25131:39;;25150:18;;:::i;:::-;-1:-1:-1;;;25186:18:1;;25074:136::o;25215:380::-;25294:1;25290:12;;;;25337;;;25358:61;;25412:4;25404:6;25400:17;25390:27;;25358:61;25465:2;25457:6;25454:14;25434:18;25431:38;25428:161;;;25511:10;25506:3;25502:20;25499:1;25492:31;25546:4;25543:1;25536:15;25574:4;25571:1;25564:15;25428:161;;25215:380;;;:::o;25600:135::-;25639:3;-1:-1:-1;;25660:17:1;;25657:43;;;25680:18;;:::i;:::-;-1:-1:-1;25727:1:1;25716:13;;25600:135::o;25740:112::-;25772:1;25798;25788:35;;25803:18;;:::i;:::-;-1:-1:-1;25837:9:1;;25740:112::o;25857:127::-;25918:10;25913:3;25909:20;25906:1;25899:31;25949:4;25946:1;25939:15;25973:4;25970:1;25963:15;25989:127;26050:10;26045:3;26041:20;26038:1;26031:31;26081:4;26078:1;26071:15;26105:4;26102:1;26095:15;26121:127;26182:10;26177:3;26173:20;26170:1;26163:31;26213:4;26210:1;26203:15;26237:4;26234:1;26227:15;26253:127;26314:10;26309:3;26305:20;26302:1;26295:31;26345:4;26342:1;26335:15;26369:4;26366:1;26359:15;26385:127;26446:10;26441:3;26437:20;26434:1;26427:31;26477:4;26474:1;26467:15;26501:4;26498:1;26491:15;26517:131;-1:-1:-1;;;;;;26591:32:1;;26581:43;;26571:71;;26638:1;26635;26628:12

Swarm Source

ipfs://0b96e6ca189b6e673e28a692d158f0750802a22247a312adabd0af7f5b107135
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.