CRO Price: $0.08 (+3.26%)

Token

CryptobackGorillas (CBG)

Overview

Max Total Supply

78 CBG

Holders

14

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
CryptobackGorillas

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-04-10
*/

// SPDX-License-Identifier: MIT
//
//                 ██████╗██████╗ ██╗   ██╗██████╗ ████████╗ ██████╗ ██████╗  █████╗  ██████╗██╗  ██╗
//                ██╔════╝██╔══██╗╚██╗ ██╔╝██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗██╔══██╗██╔════╝██║ ██╔╝
//                ██║     ██████╔╝ ╚████╔╝ ██████╔╝   ██║   ██║   ██║██████╔╝███████║██║     █████╔╝
//                ██║     ██╔══██╗  ╚██╔╝  ██╔═══╝    ██║   ██║   ██║██╔══██╗██╔══██║██║     ██╔═██╗
//                ╚██████╗██║  ██║   ██║   ██║        ██║   ╚██████╔╝██████╔╝██║  ██║╚██████╗██║  ██╗
//                 ╚═════╝╚═╝  ╚═╝   ╚═╝   ╚═╝        ╚═╝    ╚═════╝ ╚═════╝ ╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝
//
//
//                                          &@@@@@@@@@@@@@@@@@@@@@@@@@@@.
//                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//                                 @@@@@@@@@@@                         @@@@@@@@@@@
//                              @@@@@@@@@                                   @@@@@@@@@
//                           @@@@@@@@                                           @@@@@@@@
//                         @@@@@@@                                                 @@@@@@@
//                       @@@@@@@                  @@@@@@@@@@@@@@@                    @@@@@@@
//                      @@@@@@                  @@@@@@@@@@@@@@@@@@                     @@@@@@
//                    /@@@@@@                @@@@@@@@@@@@@@@@@@@@@@                     @@@@@@
//                   @@@@@@                @@@@@@@@@@@@@@@@@@@@@@@@@@                     @@@@@@
//                  @@@@@@              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     @@@@@&
//                  @@@@@             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                @@@@@
//                 @@@@@@             @@@@@@@@@@@@@@@@                      @@              @@@@@@
//                 @@@@@              @@@@@@@@@@@@@@@@                     @@(               @@@@@
//                 @@@@@              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@
//                @@@@@@              @@@@@@@@@@@@@@@@@@@@@@          @@@@@                  @@@@@
//                 @@@@@              @@@@@@@@@@@@@@@@@@@                 @@@                @@@@@
//                 @@@@@              @@@@@@@@@@@@@@@@@                     @@               @@@@@
//                 @@@@@@             @@@@@@@@@@@@@@@@              @@@@@@@@@@@             @@@@@@
//                  @@@@@             @@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@             @@@@@
//                  @@@@@@            @@@@@@@@@@@@@@@                        @@            @@@@@(
//                   @@@@@@           @@@@@@@@@@@@@@@@                       @@           @@@@@@
//                     @@@@@@         @@@@@@@@@@@@@@@@@                     @@          @@@@@@
//                      @@@@@@        @@@@@@@@@@@@@@@@@@@                 @@           @@@@@@
//                       @@@@@@@        @@@@@@@@@@@@@@@@@@@@@        *@@@@           @@@@@@@
//                         @@@@@@@                             @@@@@               @@@@@@@
//                           @@@@@@@@                                           @@@@@@@@
//                              @@@@@@@@@                                   @@@@@@@@@
//                                 @@@@@@@@@@@                         @@@@@@@@@@@
//                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@
//
//
//
//                         ██████╗  ██████╗ ██████╗ ██╗██╗     ██╗      █████╗ ███████╗
//                        ██╔════╝ ██╔═══██╗██╔══██╗██║██║     ██║     ██╔══██╗██╔════╝
//                        ██║  ███╗██║   ██║██████╔╝██║██║     ██║     ███████║███████╗
//                        ██║   ██║██║   ██║██╔══██╗██║██║     ██║     ██╔══██║╚════██║
//                        ╚██████╔╝╚██████╔╝██║  ██║██║███████╗███████╗██║  ██║███████║
//                         ╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚═╝╚══════╝╚══════╝╚═╝  ╚═╝╚══════╝
//
//    Twitter - @cryptobacks
//    Authors - @0xCro , @cryptoboomineth , @darkclaweth
//
//    An exclusive and limited project containing a collection of 10,000 NFTs living on the Cronos Chain.
//    Cryptoback Gorillas - An enriched collection of 10,000 NFTs on the Cronos Chain.
//    Join the members-only collective with this exclusive and limited NFT project.
//
//


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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 Edit for rawOwnerOf token
     */
    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(owner, to, tokenId);

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

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

        emit Transfer(owner, to, tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

contract Withdraw is Ownable {
    using SafeMath for uint256;

    struct Part {
        address wallet;
        uint256 salePart;
        uint256 royaltiesPart;
    }

    Part[] public parts;

    constructor(){
        parts.push(Part(0xE21fA9E7D72D1a2dC163d46fB033839E0F678eEd, 333, 333));
        parts.push(Part(0x3a78C8511C27b19cF5EB86eCE96e76551A0Cd2d5, 333, 333));
        parts.push(Part(0x332D458Ba4f0F2Dc5d9523bbf2149358C0560F0E, 333, 333));
        parts.push(Part(0xfEed5e1afB9D8911C3950b696ADd9Ea40836b164, 1, 1));
    }

    function shareSalesPart() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Sales Balance = 0");

        for(uint8 i = 0; i < parts.length; i++){
            if(parts[i].salePart > 0){
                _withdraw(parts[i].wallet, balance.mul(parts[i].salePart).div(1000));
            }
        }

        _withdraw(owner(), address(this).balance);
    }

    function shareRoyaltiesPart() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Contract Balance = 0");

        for(uint8 i = 0; i < parts.length; i++){
            if(parts[i].royaltiesPart > 0){
                _withdraw(parts[i].wallet, balance.mul(parts[i].royaltiesPart).div(1000));
            }
        }

        _withdraw(owner(), address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    receive() external payable {}

}

/********************************************************************************
 * @dev LIBRARIES.
 *********************************************************************************/

contract CryptobackGorillas is ERC721Enumerable, Ownable, Withdraw {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public CBGRemaining;
    int8 public constant MAX_PUBLIC = 40;

    string public baseURI;

    address[] public whitelistedAddresses;

    struct Sale {
        uint64 start;
        uint64 end;
        int16 maxPerWallet;
        uint8 maxPerTx;
        uint256 price;
        bool paused;
    }

    mapping(string => Sale) public sales;
    mapping(string => mapping(address => uint16)) balanceSale;
    mapping(uint256 => uint256) private assignOrders;

    event EventSaleChange(string _name, Sale _sale);
    event EventCBGMinted(uint[] tokenIds, address buyer);

    constructor(string memory _initBaseURI, uint256 _maxSupply) ERC721("CryptobackGorillas", "CBG") {
        setBaseURI(_initBaseURI);
        CBGRemaining = _maxSupply;
        setSale("PUBLIC", Sale(1649570400, 3093527998800, MAX_PUBLIC, 3, 500 ether, false));
    }

    //**************************//
    //          MODIFIER        //
    //**************************//
    modifier isOpen(string memory _name, uint8 _count) {
        require(saleIsOpen(_name), "CBG: Sales not open");
        require(_count > 0, "CBG: Can not mint 0 NFT");
        require( _count <= CBGRemaining, "CBG: Exceeds maximum supply. Try to mint less NFTs.");
        require(CBGRemaining > 0, "CBG: Collection is SoldOut");
        require(_count <= sales[_name].maxPerTx, "CBG: Max per tx limit");
        require(int16(balanceSale[_name][_msgSender()] + uint16(_count)) <= int16(sales[_name].maxPerWallet), "CBG: Max per wallet limit");
        require(msg.value >= sales[_name].price * _count, "CBG: Insuficient funds");
        balanceSale[_name][_msgSender()] += uint16(_count);
        _;
    }

    //**************************//
    //          SALES           //
    //**************************//
    function setSale(string memory _name, Sale memory _sale) public onlyOwner {
        sales[_name] = _sale;
        emit EventSaleChange(_name, _sale);
    }

    function pauseSale(string memory _name, bool _pause) public onlyOwner() {
        sales[_name].paused = _pause;
    }

    function saleIsOpen(string memory _name) public view returns(bool) {
        return sales[_name].start > 0 && block.timestamp >= sales[_name].start && block.timestamp <= sales[_name].end && !sales[_name].paused;
    }

    //**************************//
    //          GETTERS         //
    //**************************//
    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

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

    function getBalanceOfOwner(address _owner) public view returns (uint256) {
        uint256[] memory tokenIds = getWalletOfOwner(_owner);
        uint256 numberOfMonkeys = tokenIds.length;
        return numberOfMonkeys;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function minted(string memory _name, address _wallet) public view returns(uint16) {
        return balanceSale[_name][_wallet];
    }

    //**************************//
    //          SETTERS         //
    //**************************//
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"));
    }

    function setWhitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    //**************************//
    //          MINT            //
    //**************************//

    function publicSalesMint(uint8 _count) public payable isOpen("PUBLIC", _count){
        if(isWhitelisted(_msgSender())) {
            require(int16(balanceSale["PRESALES"][_msgSender()] + balanceSale["PUBLIC"][_msgSender()]) <= MAX_PUBLIC, "CBG: Max per wallet limit");
        }
        _mintCBG(_count, false);
    }

    function teamMint(uint256 _amount) public onlyOwner {
        require(block.timestamp < sales["PUBLIC"].start, "CBG: Must be executed before presales mint");
        _mintCBG(_amount, true);
    }

    function _mintCBG(uint256 _amount, bool _admin) private {
        uint[] memory tokenIdsBought = new uint[](_amount);

        for (uint i = 0; i < _amount; i++) {
            uint256 randIndex = (!_admin ? _random() : totalSupply()) % CBGRemaining;
            uint256 CBGIndex = _fillAssignOrder(--CBGRemaining, randIndex);
            _safeMint(_msgSender(), CBGIndex + 1);
            tokenIdsBought[i] = CBGIndex;
        }
        emit EventCBGMinted(tokenIdsBought, _msgSender());
    }

    //**************************//
    //          RANDOM          //
    //**************************//
    function _random() internal view returns(uint256) {
        return uint256(
            keccak256(abi.encodePacked(block.timestamp + block.difficulty + block.gaslimit + block.number +
          ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / block.timestamp) +
          ((uint256(keccak256(abi.encodePacked(_msgSender())))) / block.timestamp)
        ))) / CBGRemaining;
    }

    function _fillAssignOrder(uint256 orderA, uint256 orderB) internal returns(uint256) {
        uint256 temp = orderA;
        if (assignOrders[orderA] > 0) temp = assignOrders[orderA];
        assignOrders[orderA] = orderB;
        if (assignOrders[orderB] > 0) assignOrders[orderA] = assignOrders[orderB];
        assignOrders[orderB] = temp;
        return assignOrders[orderA];
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"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":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"EventCBGMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"indexed":false,"internalType":"struct CryptobackGorillas.Sale","name":"_sale","type":"tuple"}],"name":"EventSaleChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CBGRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getBalanceOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getWalletOfOwner","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":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"parts","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"salePart","type":"uint256"},{"internalType":"uint256","name":"royaltiesPart","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"publicSalesMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"saleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"sales","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct CryptobackGorillas.Sale","name":"_sale","type":"tuple"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareRoyaltiesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareSalesPart","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":"_amount","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162004405380380620044058339810160408190526200003491620006ad565b604080518082018252601281527143727970746f6261636b476f72696c6c617360701b60208083019182528351808501909452600384526243424760e81b908401528151919291620000899160009162000607565b5080516200009f90600190602084019062000607565b505050620000bc620000b6620003ee60201b60201c565b620003f2565b600b604051806060016040528073e21fa9e7d72d1a2dc163d46fb033839e0f678eed6001600160a01b0316815260200161014d815260200161014d815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201555050600b6040518060600160405280733a78c8511c27b19cf5eb86ece96e76551a0cd2d56001600160a01b0316815260200161014d815260200161014d815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201555050600b604051806060016040528073332d458ba4f0f2dc5d9523bbf2149358c0560f0e6001600160a01b0316815260200161014d815260200161014d815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201555050600b604051806060016040528073feed5e1afb9d8911c3950b696add9ea40836b1646001600160a01b03168152602001600181526020016001815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155505062000373826200044460201b60201c565b600c81905560408051808201825260068152655055424c494360d01b602080830191909152825160c081018452636252726081526502d044a331509181019190915260289281019290925260036060830152681b1ae4d6e2ef5000006080830152600060a0830152620003e691620004ac565b5050620008c5565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200044e620003ee565b6001600160a01b031662000461620005f8565b6001600160a01b031614620004935760405162461bcd60e51b81526004016200048a906200080a565b60405180910390fd5b8051620004a890600d90602084019062000607565b5050565b620004b6620003ee565b6001600160a01b0316620004c9620005f8565b6001600160a01b031614620004f25760405162461bcd60e51b81526004016200048a906200080a565b80600f8360405162000505919062000765565b908152604080516020928190038301812084518154948601519386015160608701516001600160401b03199096166001600160401b0392831617600160401b600160801b0319166801000000000000000092909516919091029390931761ffff60801b1916600160801b61ffff600195860b16021760ff60901b1916600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c98190620005ec908490849062000783565b60405180910390a15050565b600a546001600160a01b031690565b828054620006159062000872565b90600052602060002090601f01602090048101928262000639576000855562000684565b82601f106200065457805160ff191683800117855562000684565b8280016001018555821562000684579182015b828111156200068457825182559160200191906001019062000667565b506200069292915062000696565b5090565b5b8082111562000692576000815560010162000697565b60008060408385031215620006c0578182fd5b82516001600160401b0380821115620006d7578384fd5b818501915085601f830112620006eb578384fd5b815181811115620007005762000700620008af565b604051601f8201601f191681016020018381118282101715620007275762000727620008af565b6040528181528382016020018810156200073f578586fd5b620007528260208301602087016200083f565b6020969096015195979596505050505050565b60008251620007798184602087016200083f565b9190910192915050565b600060e0825283518060e0840152610100620007a682828601602089016200083f565b80601f19601f8401168501019250505060018060401b0380845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60005b838110156200085c57818101518382015260200162000842565b838111156200086c576000848401525b50505050565b6002810460018216806200088757607f821691505b60208210811415620008a957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613b3080620008d56000396000f3fe6080604052600436106102a45760003560e01c80636c0360eb1161016e578063b88d4fde116100cb578063d052a17a1161007f578063e985e9c511610064578063e985e9c51461072a578063f2fde38b1461074a578063fbb37cf21461076a576102ab565b8063d052a17a146106ea578063e2310ef21461070a576102ab565b8063c87b56dd116100b0578063c87b56dd14610686578063c9eb4662146106a6578063d0141530146106d5576102ab565b8063b88d4fde14610646578063ba4e5c4914610666576102ab565b80638b1671781161012257806395d89b411161010757806395d89b41146105ef5780639753eac014610604578063a22cb46514610626576102ab565b80638b167178146105ad5780638da5cb5b146105da576102ab565b8063715018a611610153578063715018a61461056557806375de52951461057a5780637f81be691461058d576102ab565b80636c0360eb1461053057806370a0823114610545576102ab565b80632f745c591161021c57806346002b06116101d057806355f804b3116101b557806355f804b3146104c3578063627fdeab146104e35780636352211e14610510576102ab565b806346002b061461048e5780634f6ccce7146104a3576102ab565b80633af32abf116102015780633af32abf1461043957806340f9bbe21461045957806342842e0e1461046e576102ab565b80632f745c59146103f95780632fbba11514610419576102ab565b8063095ea7b311610273578063194944db11610258578063194944db1461039957806323b872dd146103b95780632beab4b7146103d9576102ab565b8063095ea7b31461035757806318160ddd14610377576102ab565b806301cacbc8146102b057806301ffc9a7146102d257806306fdde0314610308578063081812fc1461032a576102ab565b366102ab57005b600080fd5b3480156102bc57600080fd5b506102d06102cb366004612c69565b61079c565b005b3480156102de57600080fd5b506102f26102ed366004612b78565b610932565b6040516102ff9190612f61565b60405180910390f35b34801561031457600080fd5b5061031d610978565b6040516102ff9190612f7a565b34801561033657600080fd5b5061034a610345366004612d43565b610a0a565b6040516102ff9190612eb2565b34801561036357600080fd5b506102d0610372366004612ae0565b610a4d565b34801561038357600080fd5b5061038c610ae5565b6040516102ff9190612ea9565b3480156103a557600080fd5b506102f26103b4366004612bb0565b610aeb565b3480156103c557600080fd5b506102d06103d4366004612a03565b610bc5565b3480156103e557600080fd5b506102d06103f4366004612b09565b610bfd565b34801561040557600080fd5b5061038c610414366004612ae0565b610c54565b34801561042557600080fd5b506102d0610434366004612d43565b610ca9565b34801561044557600080fd5b506102f26104543660046129b7565b610d3c565b34801561046557600080fd5b506102d0610db5565b34801561047a57600080fd5b506102d0610489366004612a03565b610f29565b34801561049a57600080fd5b506102d0610f44565b3480156104af57600080fd5b5061038c6104be366004612d43565b61109b565b3480156104cf57600080fd5b506102d06104de366004612bb0565b6110f6565b3480156104ef57600080fd5b506105036104fe3660046129b7565b61114c565b6040516102ff9190612f23565b34801561051c57600080fd5b5061034a61052b366004612d43565b61120a565b34801561053c57600080fd5b5061031d61123f565b34801561055157600080fd5b5061038c6105603660046129b7565b6112cd565b34801561057157600080fd5b506102d0611311565b6102d0610588366004612d5b565b61135c565b34801561059957600080fd5b5061034a6105a8366004612d43565b61169a565b3480156105b957600080fd5b506105cd6105c8366004612be3565b6116b5565b6040516102ff9190613901565b3480156105e657600080fd5b5061034a6116fa565b3480156105fb57600080fd5b5061031d611709565b34801561061057600080fd5b50610619611718565b6040516102ff9190612f6c565b34801561063257600080fd5b506102d0610641366004612ab7565b61171d565b34801561065257600080fd5b506102d0610661366004612a3e565b6117eb565b34801561067257600080fd5b5061034a610681366004612d43565b61182a565b34801561069257600080fd5b5061031d6106a1366004612d43565b611854565b3480156106b257600080fd5b506106c66106c1366004612d43565b6118b3565b6040516102ff93929190612f02565b3480156106e157600080fd5b5061038c6118f0565b3480156106f657600080fd5b506102d0610705366004612c26565b6118f6565b34801561071657600080fd5b5061038c6107253660046129b7565b61196d565b34801561073657600080fd5b506102f26107453660046129d1565b611981565b34801561075657600080fd5b506102d06107653660046129b7565b6119af565b34801561077657600080fd5b5061078a610785366004612bb0565b611a1d565b6040516102ff96959493929190613910565b6107a4611a7d565b6001600160a01b03166107b56116fa565b6001600160a01b0316146107e45760405162461bcd60e51b81526004016107db9061351d565b60405180910390fd5b80600f836040516107f59190612df8565b9081526040805160209281900383018120845181549486015193860151606087015167ffffffffffffffff1990961667ffffffffffffffff928316177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000009290951691909102939093177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff16600160801b61ffff600195860b1602177fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff16600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c981906109269084908490612f8d565b60405180910390a15050565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610970575061097082611a81565b90505b919050565b60606000805461098790613a18565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613a18565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050905090565b6000610a1582611af3565b610a315760405162461bcd60e51b81526004016107db906134d1565b506000908152600460205260409020546001600160a01b031690565b6000610a588261120a565b9050806001600160a01b0316836001600160a01b03161415610a8c5760405162461bcd60e51b81526004016107db906136a0565b806001600160a01b0316610a9e611a7d565b6001600160a01b03161480610aba5750610aba81610745611a7d565b610ad65760405162461bcd60e51b81526004016107db90613328565b610ae08383611b10565b505050565b60085490565b600080600f83604051610afe9190612df8565b9081526040519081900360200190205467ffffffffffffffff16118015610b4e5750600f82604051610b309190612df8565b9081526040519081900360200190205467ffffffffffffffff164210155b8015610b905750600f82604051610b659190612df8565b9081526040519081900360200190205467ffffffffffffffff68010000000000000000909104164211155b80156109705750600f82604051610ba79190612df8565b9081526040519081900360200190206002015460ff16159050919050565b610bd6610bd0611a7d565b82611b7e565b610bf25760405162461bcd60e51b81526004016107db9061376b565b610ae0838383611c03565b610c05611a7d565b6001600160a01b0316610c166116fa565b6001600160a01b031614610c3c5760405162461bcd60e51b81526004016107db9061351d565b610c48600e60006127ce565b610ae0600e83836127ec565b6000610c5f836112cd565b8210610c7d5760405162461bcd60e51b81526004016107db90612ff8565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b610cb1611a7d565b6001600160a01b0316610cc26116fa565b6001600160a01b031614610ce85760405162461bcd60e51b81526004016107db9061351d565b600f604051610cf690612e6b565b9081526040519081900360200190205467ffffffffffffffff164210610d2e5760405162461bcd60e51b81526004016107db90613643565b610d39816001611d30565b50565b6000805b600e54811015610dac57826001600160a01b0316600e8281548110610d7557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610d9a576001915050610973565b80610da481613a53565b915050610d40565b50600092915050565b610dbd611a7d565b6001600160a01b0316610dce6116fa565b6001600160a01b031614610df45760405162461bcd60e51b81526004016107db9061351d565b4780610e125760405162461bcd60e51b81526004016107db90613893565b60005b600b5460ff82161015610f17576000600b8260ff1681548110610e4857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101541115610f0557610f05600b8260ff1681548110610e8757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000160009054906101000a90046001600160a01b0316610f006103e8610efa600b8660ff1681548110610ed957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015487611e8090919063ffffffff16565b90611ecc565b611ef7565b80610f0f81613a6e565b915050610e15565b50610d39610f236116fa565b47611ef7565b610ae0838383604051806020016040528060008152506117eb565b610f4c611a7d565b6001600160a01b0316610f5d6116fa565b6001600160a01b031614610f835760405162461bcd60e51b81526004016107db9061351d565b4780610fa15760405162461bcd60e51b81526004016107db906138ca565b60005b600b5460ff82161015610f17576000600b8260ff1681548110610fd757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154111561108957611089600b8260ff168154811061101657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000160009054906101000a90046001600160a01b0316610f006103e8610efa600b8660ff168154811061106857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002015487611e8090919063ffffffff16565b8061109381613a6e565b915050610fa4565b60006110a5610ae5565b82106110c35760405162461bcd60e51b81526004016107db906137ff565b600882815481106110e457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6110fe611a7d565b6001600160a01b031661110f6116fa565b6001600160a01b0316146111355760405162461bcd60e51b81526004016107db9061351d565b805161114890600d90602084019061284f565b5050565b60606000611159836112cd565b905060008167ffffffffffffffff81111561118457634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111ad578160200160208202803683370190505b50905060005b82811015611202576111c58582610c54565b8282815181106111e557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806111fa81613a53565b9150506111b3565b509392505050565b6000818152600260205260408120546001600160a01b0316806109705760405162461bcd60e51b81526004016107db906133e2565b600d805461124c90613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461127890613a18565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b505050505081565b60006001600160a01b0382166112f55760405162461bcd60e51b81526004016107db90613385565b506001600160a01b031660009081526003602052604090205490565b611319611a7d565b6001600160a01b031661132a6116fa565b6001600160a01b0316146113505760405162461bcd60e51b81526004016107db9061351d565b61135a6000611f73565b565b604051806040016040528060068152602001655055424c494360d01b8152508161138582610aeb565b6113a15760405162461bcd60e51b81526004016107db906136fd565b60008160ff16116113c45760405162461bcd60e51b81526004016107db9061385c565b600c548160ff1611156113e95760405162461bcd60e51b81526004016107db90613146565b6000600c541161140b5760405162461bcd60e51b81526004016107db906132f1565b600f8260405161141b9190612df8565b9081526040519081900360200190205460ff600160901b909104811690821611156114585760405162461bcd60e51b81526004016107db90613552565b600f826040516114689190612df8565b90815260405190819003602001812054600160801b9004600190810b900b9060ff83169060109061149a908690612df8565b908152602001604051809103902060006114b2611a7d565b6001600160a01b031681526020810191909152604001600020546114da919061ffff1661394d565b60010b13156114fb5760405162461bcd60e51b81526004016107db90613283565b8060ff16600f8360405161150f9190612df8565b90815260200160405180910390206001015461152b919061399f565b34101561154a5760405162461bcd60e51b81526004016107db906137c8565b8060ff1660108360405161155e9190612df8565b90815260200160405180910390206000611576611a7d565b6001600160a01b031681526020810191909152604001600090812080549091906115a590849061ffff1661394d565b92506101000a81548161ffff021916908361ffff1602179055506115ca610454611a7d565b1561168c57602860000b60106040516115e290612e6b565b908152602001604051809103902060006115fa611a7d565b6001600160a01b031681526020810191909152604090810160002054905161ffff9091169060109061162b90612e7d565b90815260200160405180910390206000611643611a7d565b6001600160a01b0316815260208101919091526040016000205461166b919061ffff1661394d565b60010b131561168c5760405162461bcd60e51b81526004016107db90613283565b610ae08360ff166000611d30565b6000908152600260205260409020546001600160a01b031690565b60006010836040516116c79190612df8565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b600a546001600160a01b031690565b60606001805461098790613a18565b602881565b611725611a7d565b6001600160a01b0316826001600160a01b031614156117565760405162461bcd60e51b81526004016107db90613200565b8060056000611763611a7d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117a7611a7d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117df9190612f61565b60405180910390a35050565b6117fc6117f6611a7d565b83611b7e565b6118185760405162461bcd60e51b81526004016107db9061376b565b61182484848484611fc5565b50505050565b600e818154811061183a57600080fd5b6000918252602090912001546001600160a01b0316905081565b606061185f82611af3565b61187b5760405162461bcd60e51b81526004016107db906135e6565b611883611ff8565b61188c83612007565b60405160200161189d929190612e14565b6040516020818303038152906040529050919050565b600b81815481106118c357600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b600c5481565b6118fe611a7d565b6001600160a01b031661190f6116fa565b6001600160a01b0316146119355760405162461bcd60e51b81526004016107db9061351d565b80600f836040516119469190612df8565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b6000806119798361114c565b519392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6119b7611a7d565b6001600160a01b03166119c86116fa565b6001600160a01b0316146119ee5760405162461bcd60e51b81526004016107db9061351d565b6001600160a01b038116611a145760405162461bcd60e51b81526004016107db906130b2565b610d3981611f73565b8051602081830181018051600f825292820191909301209152805460018083015460029093015467ffffffffffffffff8084169468010000000000000000850490911693600160801b810490930b92600160901b900460ff908116921686565b3390565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611ae457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610970575061097082612156565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b458261120a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b8982611af3565b611ba55760405162461bcd60e51b81526004016107db90613237565b6000611bb08361120a565b9050806001600160a01b0316846001600160a01b03161480611beb5750836001600160a01b0316611be084610a0a565b6001600160a01b0316145b80611bfb5750611bfb8185611981565b949350505050565b826001600160a01b0316611c168261120a565b6001600160a01b031614611c3c5760405162461bcd60e51b81526004016107db90613589565b6001600160a01b038216611c625760405162461bcd60e51b81526004016107db906131a3565b611c6d838383612188565b611c78600082611b10565b6001600160a01b0383166000908152600360205260408120805460019290611ca19084906139be565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ccf908490613973565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008267ffffffffffffffff811115611d5957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d82578160200160208202803683370190505b50905060005b83811015611e3a576000600c548415611da857611da3610ae5565b611db0565b611db0612211565b611dba9190613a8e565b90506000611ddb600c60008154611dd090613a01565b9182905550836122f3565b9050611df8611de8611a7d565b611df3836001613973565b61236a565b80848481518110611e1957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080611e3290613a53565b915050611d88565b507fcda2b02cc46299e1582245cd141596e593c72d28aaabfde6d7e2930c122b808f81611e65611a7d565b604051611e73929190612f36565b60405180910390a1505050565b600082611e8f57506000610ca3565b6000611e9b838561399f565b905082611ea8858361398b565b14611ec55760405162461bcd60e51b81526004016107db90613474565b9392505050565b6000808211611eed5760405162461bcd60e51b81526004016107db906132ba565b611ec5828461398b565b6000826001600160a01b031682604051611f1090612ea6565b60006040518083038185875af1925050503d8060008114611f4d576040519150601f19603f3d011682016040523d82523d6000602084013e611f52565b606091505b5050905080610ae05760405162461bcd60e51b81526004016107db90613734565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611fd0848484611c03565b611fdc84848484612384565b6118245760405162461bcd60e51b81526004016107db90613055565b6060600d805461098790613a18565b606081612048575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610973565b8160005b8115612072578061205c81613a53565b915061206b9050600a8361398b565b915061204c565b60008167ffffffffffffffff81111561209b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c5576020820181803683370190505b5090505b8415611bfb576120da6001836139be565b91506120e7600a86613a8e565b6120f2906030613973565b60f81b81838151811061211557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061214f600a8661398b565b94506120c9565b6001600160e01b031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b612193838383610ae0565b6001600160a01b0383166121af576121aa816124b8565b6121d2565b816001600160a01b0316836001600160a01b0316146121d2576121d283826124fc565b6001600160a01b0382166121ee576121e981612599565b610ae0565b826001600160a01b0316826001600160a01b031614610ae057610ae08282612672565b6000600c544261221f611a7d565b60405160200161222f9190612ddb565b6040516020818303038152906040528051906020012060001c612252919061398b565b42416040516020016122649190612ddb565b6040516020818303038152906040528051906020012060001c612287919061398b565b43456122934442613973565b61229d9190613973565b6122a79190613973565b6122b19190613973565b6122bb9190613973565b6040516020016122cb9190612ea9565b6040516020818303038152906040528051906020012060001c6122ee919061398b565b905090565b60008281526011602052604081205483901561231a57506000838152601160205260409020545b6000848152601160205260408082208590558482529020541561234e57600083815260116020526040808220548683529120555b6000928352601160205260408084209190915592825250205490565b6111488282604051806020016040528060008152506126b6565b6000612398846001600160a01b03166126e9565b156124ad57836001600160a01b031663150b7a026123b4611a7d565b8786866040518563ffffffff1660e01b81526004016123d69493929190612ec6565b602060405180830381600087803b1580156123f057600080fd5b505af1925050508015612420575060408051601f3d908101601f1916820190925261241d91810190612b94565b60015b61247a573d80801561244e576040519150601f19603f3d011682016040523d82523d6000602084013e612453565b606091505b5080516124725760405162461bcd60e51b81526004016107db90613055565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611bfb565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612509846112cd565b61251391906139be565b600083815260076020526040902054909150808214612566576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125ab906001906139be565b600083815260096020526040812054600880549394509092849081106125e157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061261057634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061265657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061267d836112cd565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6126c083836126ef565b6126cd6000848484612384565b610ae05760405162461bcd60e51b81526004016107db90613055565b3b151590565b6001600160a01b0382166127155760405162461bcd60e51b81526004016107db9061343f565b61271e81611af3565b1561273b5760405162461bcd60e51b81526004016107db9061310f565b61274760008383612188565b6001600160a01b0382166000908152600360205260408120805460019290612770908490613973565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190610d3991906128c3565b82805482825590600052602060002090810192821561283f579160200282015b8281111561283f5781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061280c565b5061284b9291506128c3565b5090565b82805461285b90613a18565b90600052602060002090601f01602090048101928261287d576000855561283f565b82601f1061289657805160ff191683800117855561283f565b8280016001018555821561283f579182015b8281111561283f5782518255916020019190600101906128a8565b5b8082111561284b57600081556001016128c4565b600067ffffffffffffffff808411156128f3576128f3613ace565b604051601f8501601f19168101602001828111828210171561291757612917613ace565b60405284815291508183850186101561292f57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461097357600080fd5b8035801515811461097357600080fd5b600082601f83011261297f578081fd5b611ec5838335602085016128d8565b803567ffffffffffffffff8116811461097357600080fd5b803560ff8116811461097357600080fd5b6000602082840312156129c8578081fd5b611ec582612948565b600080604083850312156129e3578081fd5b6129ec83612948565b91506129fa60208401612948565b90509250929050565b600080600060608486031215612a17578081fd5b612a2084612948565b9250612a2e60208501612948565b9150604084013590509250925092565b60008060008060808587031215612a53578081fd5b612a5c85612948565b9350612a6a60208601612948565b925060408501359150606085013567ffffffffffffffff811115612a8c578182fd5b8501601f81018713612a9c578182fd5b612aab878235602084016128d8565b91505092959194509250565b60008060408385031215612ac9578182fd5b612ad283612948565b91506129fa6020840161295f565b60008060408385031215612af2578182fd5b612afb83612948565b946020939093013593505050565b60008060208385031215612b1b578182fd5b823567ffffffffffffffff80821115612b32578384fd5b818501915085601f830112612b45578384fd5b813581811115612b53578485fd5b8660208083028501011115612b66578485fd5b60209290920196919550909350505050565b600060208284031215612b89578081fd5b8135611ec581613ae4565b600060208284031215612ba5578081fd5b8151611ec581613ae4565b600060208284031215612bc1578081fd5b813567ffffffffffffffff811115612bd7578182fd5b611bfb8482850161296f565b60008060408385031215612bf5578182fd5b823567ffffffffffffffff811115612c0b578283fd5b612c178582860161296f565b9250506129fa60208401612948565b60008060408385031215612c38578182fd5b823567ffffffffffffffff811115612c4e578283fd5b612c5a8582860161296f565b9250506129fa6020840161295f565b60008082840360e0811215612c7c578283fd5b833567ffffffffffffffff80821115612c93578485fd5b612c9f8783880161296f565b945060c0601f1984011215612cb2578384fd5b604051925060c0830191508282108183111715612cd157612cd1613ace565b50604052612ce16020850161298e565b8152612cef6040850161298e565b602082015260608401358060010b8114612d07578283fd5b6040820152612d18608085016129a6565b606082015260a08401356080820152612d3360c0850161295f565b60a0820152809150509250929050565b600060208284031215612d54578081fd5b5035919050565b600060208284031215612d6c578081fd5b611ec5826129a6565b6000815180845260208085019450808401835b83811015612da457815187529582019590820190600101612d88565b509495945050505050565b60008151808452612dc78160208601602086016139d5565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60008251612e0a8184602087016139d5565b9190910192915050565b60008351612e268184602088016139d5565b835190830190612e3a8183602088016139d5565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b655055424c494360d01b815260060190565b7f50524553414c4553000000000000000000000000000000000000000000000000815260080190565b90565b90815260200190565b6001600160a01b0391909116815260200190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612ef86080830184612daf565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600060208252611ec56020830184612d75565b600060408252612f496040830185612d75565b90506001600160a01b03831660208301529392505050565b901515815260200190565b60009190910b815260200190565b600060208252611ec56020830184612daf565b600060e08252612fa060e0830185612daf565b905067ffffffffffffffff80845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526033908201527f4342473a2045786365656473206d6178696d756d20737570706c792e2054727960408201527f20746f206d696e74206c657373204e4654732e00000000000000000000000000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526019908201527f4342473a204d6178207065722077616c6c6574206c696d697400000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601a908201527f4342473a20436f6c6c656374696f6e20697320536f6c644f7574000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526015908201527f4342473a204d617820706572207478206c696d69740000000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4342473a204d757374206265206578656375746564206265666f72652070726560408201527f73616c6573206d696e7400000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f4342473a2053616c6573206e6f74206f70656e00000000000000000000000000604082015260600190565b60208082526010908201527f5472616e73666572206661696c65642e00000000000000000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60208082526016908201527f4342473a20496e737566696369656e742066756e647300000000000000000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201527f7574206f6620626f756e64730000000000000000000000000000000000000000606082015260800190565b60208082526017908201527f4342473a2043616e206e6f74206d696e742030204e4654000000000000000000604082015260600190565b60208082526011908201527f53616c65732042616c616e6365203d2030000000000000000000000000000000604082015260600190565b60208082526014908201527f436f6e74726163742042616c616e6365203d2030000000000000000000000000604082015260600190565b61ffff91909116815260200190565b67ffffffffffffffff968716815294909516602085015260019290920b604084015260ff166060830152608082015290151560a082015260c00190565b600061ffff80831681851680830382111561396a5761396a613aa2565b01949350505050565b6000821982111561398657613986613aa2565b500190565b60008261399a5761399a613ab8565b500490565b60008160001904831182151516156139b9576139b9613aa2565b500290565b6000828210156139d0576139d0613aa2565b500390565b60005b838110156139f05781810151838201526020016139d8565b838111156118245750506000910152565b600081613a1057613a10613aa2565b506000190190565b600281046001821680613a2c57607f821691505b60208210811415613a4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a6757613a67613aa2565b5060010190565b600060ff821660ff811415613a8557613a85613aa2565b60010192915050565b600082613a9d57613a9d613ab8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d3957600080fdfea26469706673582212201488ab625af533705ff63fad9a61e18d8aca930d5220f0ca3c3fb6b6fdbffef064736f6c63430008000033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54434b4a6459536d326a6f514d48515744765334596679616a7a334d526f3673576d3159424b4d53337365432f00000000000000000000

Deployed Bytecode

0x6080604052600436106102a45760003560e01c80636c0360eb1161016e578063b88d4fde116100cb578063d052a17a1161007f578063e985e9c511610064578063e985e9c51461072a578063f2fde38b1461074a578063fbb37cf21461076a576102ab565b8063d052a17a146106ea578063e2310ef21461070a576102ab565b8063c87b56dd116100b0578063c87b56dd14610686578063c9eb4662146106a6578063d0141530146106d5576102ab565b8063b88d4fde14610646578063ba4e5c4914610666576102ab565b80638b1671781161012257806395d89b411161010757806395d89b41146105ef5780639753eac014610604578063a22cb46514610626576102ab565b80638b167178146105ad5780638da5cb5b146105da576102ab565b8063715018a611610153578063715018a61461056557806375de52951461057a5780637f81be691461058d576102ab565b80636c0360eb1461053057806370a0823114610545576102ab565b80632f745c591161021c57806346002b06116101d057806355f804b3116101b557806355f804b3146104c3578063627fdeab146104e35780636352211e14610510576102ab565b806346002b061461048e5780634f6ccce7146104a3576102ab565b80633af32abf116102015780633af32abf1461043957806340f9bbe21461045957806342842e0e1461046e576102ab565b80632f745c59146103f95780632fbba11514610419576102ab565b8063095ea7b311610273578063194944db11610258578063194944db1461039957806323b872dd146103b95780632beab4b7146103d9576102ab565b8063095ea7b31461035757806318160ddd14610377576102ab565b806301cacbc8146102b057806301ffc9a7146102d257806306fdde0314610308578063081812fc1461032a576102ab565b366102ab57005b600080fd5b3480156102bc57600080fd5b506102d06102cb366004612c69565b61079c565b005b3480156102de57600080fd5b506102f26102ed366004612b78565b610932565b6040516102ff9190612f61565b60405180910390f35b34801561031457600080fd5b5061031d610978565b6040516102ff9190612f7a565b34801561033657600080fd5b5061034a610345366004612d43565b610a0a565b6040516102ff9190612eb2565b34801561036357600080fd5b506102d0610372366004612ae0565b610a4d565b34801561038357600080fd5b5061038c610ae5565b6040516102ff9190612ea9565b3480156103a557600080fd5b506102f26103b4366004612bb0565b610aeb565b3480156103c557600080fd5b506102d06103d4366004612a03565b610bc5565b3480156103e557600080fd5b506102d06103f4366004612b09565b610bfd565b34801561040557600080fd5b5061038c610414366004612ae0565b610c54565b34801561042557600080fd5b506102d0610434366004612d43565b610ca9565b34801561044557600080fd5b506102f26104543660046129b7565b610d3c565b34801561046557600080fd5b506102d0610db5565b34801561047a57600080fd5b506102d0610489366004612a03565b610f29565b34801561049a57600080fd5b506102d0610f44565b3480156104af57600080fd5b5061038c6104be366004612d43565b61109b565b3480156104cf57600080fd5b506102d06104de366004612bb0565b6110f6565b3480156104ef57600080fd5b506105036104fe3660046129b7565b61114c565b6040516102ff9190612f23565b34801561051c57600080fd5b5061034a61052b366004612d43565b61120a565b34801561053c57600080fd5b5061031d61123f565b34801561055157600080fd5b5061038c6105603660046129b7565b6112cd565b34801561057157600080fd5b506102d0611311565b6102d0610588366004612d5b565b61135c565b34801561059957600080fd5b5061034a6105a8366004612d43565b61169a565b3480156105b957600080fd5b506105cd6105c8366004612be3565b6116b5565b6040516102ff9190613901565b3480156105e657600080fd5b5061034a6116fa565b3480156105fb57600080fd5b5061031d611709565b34801561061057600080fd5b50610619611718565b6040516102ff9190612f6c565b34801561063257600080fd5b506102d0610641366004612ab7565b61171d565b34801561065257600080fd5b506102d0610661366004612a3e565b6117eb565b34801561067257600080fd5b5061034a610681366004612d43565b61182a565b34801561069257600080fd5b5061031d6106a1366004612d43565b611854565b3480156106b257600080fd5b506106c66106c1366004612d43565b6118b3565b6040516102ff93929190612f02565b3480156106e157600080fd5b5061038c6118f0565b3480156106f657600080fd5b506102d0610705366004612c26565b6118f6565b34801561071657600080fd5b5061038c6107253660046129b7565b61196d565b34801561073657600080fd5b506102f26107453660046129d1565b611981565b34801561075657600080fd5b506102d06107653660046129b7565b6119af565b34801561077657600080fd5b5061078a610785366004612bb0565b611a1d565b6040516102ff96959493929190613910565b6107a4611a7d565b6001600160a01b03166107b56116fa565b6001600160a01b0316146107e45760405162461bcd60e51b81526004016107db9061351d565b60405180910390fd5b80600f836040516107f59190612df8565b9081526040805160209281900383018120845181549486015193860151606087015167ffffffffffffffff1990961667ffffffffffffffff928316177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000009290951691909102939093177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff16600160801b61ffff600195860b1602177fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff16600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c981906109269084908490612f8d565b60405180910390a15050565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610970575061097082611a81565b90505b919050565b60606000805461098790613a18565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613a18565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050905090565b6000610a1582611af3565b610a315760405162461bcd60e51b81526004016107db906134d1565b506000908152600460205260409020546001600160a01b031690565b6000610a588261120a565b9050806001600160a01b0316836001600160a01b03161415610a8c5760405162461bcd60e51b81526004016107db906136a0565b806001600160a01b0316610a9e611a7d565b6001600160a01b03161480610aba5750610aba81610745611a7d565b610ad65760405162461bcd60e51b81526004016107db90613328565b610ae08383611b10565b505050565b60085490565b600080600f83604051610afe9190612df8565b9081526040519081900360200190205467ffffffffffffffff16118015610b4e5750600f82604051610b309190612df8565b9081526040519081900360200190205467ffffffffffffffff164210155b8015610b905750600f82604051610b659190612df8565b9081526040519081900360200190205467ffffffffffffffff68010000000000000000909104164211155b80156109705750600f82604051610ba79190612df8565b9081526040519081900360200190206002015460ff16159050919050565b610bd6610bd0611a7d565b82611b7e565b610bf25760405162461bcd60e51b81526004016107db9061376b565b610ae0838383611c03565b610c05611a7d565b6001600160a01b0316610c166116fa565b6001600160a01b031614610c3c5760405162461bcd60e51b81526004016107db9061351d565b610c48600e60006127ce565b610ae0600e83836127ec565b6000610c5f836112cd565b8210610c7d5760405162461bcd60e51b81526004016107db90612ff8565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b610cb1611a7d565b6001600160a01b0316610cc26116fa565b6001600160a01b031614610ce85760405162461bcd60e51b81526004016107db9061351d565b600f604051610cf690612e6b565b9081526040519081900360200190205467ffffffffffffffff164210610d2e5760405162461bcd60e51b81526004016107db90613643565b610d39816001611d30565b50565b6000805b600e54811015610dac57826001600160a01b0316600e8281548110610d7557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610d9a576001915050610973565b80610da481613a53565b915050610d40565b50600092915050565b610dbd611a7d565b6001600160a01b0316610dce6116fa565b6001600160a01b031614610df45760405162461bcd60e51b81526004016107db9061351d565b4780610e125760405162461bcd60e51b81526004016107db90613893565b60005b600b5460ff82161015610f17576000600b8260ff1681548110610e4857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101541115610f0557610f05600b8260ff1681548110610e8757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000160009054906101000a90046001600160a01b0316610f006103e8610efa600b8660ff1681548110610ed957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015487611e8090919063ffffffff16565b90611ecc565b611ef7565b80610f0f81613a6e565b915050610e15565b50610d39610f236116fa565b47611ef7565b610ae0838383604051806020016040528060008152506117eb565b610f4c611a7d565b6001600160a01b0316610f5d6116fa565b6001600160a01b031614610f835760405162461bcd60e51b81526004016107db9061351d565b4780610fa15760405162461bcd60e51b81526004016107db906138ca565b60005b600b5460ff82161015610f17576000600b8260ff1681548110610fd757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154111561108957611089600b8260ff168154811061101657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000160009054906101000a90046001600160a01b0316610f006103e8610efa600b8660ff168154811061106857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002015487611e8090919063ffffffff16565b8061109381613a6e565b915050610fa4565b60006110a5610ae5565b82106110c35760405162461bcd60e51b81526004016107db906137ff565b600882815481106110e457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6110fe611a7d565b6001600160a01b031661110f6116fa565b6001600160a01b0316146111355760405162461bcd60e51b81526004016107db9061351d565b805161114890600d90602084019061284f565b5050565b60606000611159836112cd565b905060008167ffffffffffffffff81111561118457634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111ad578160200160208202803683370190505b50905060005b82811015611202576111c58582610c54565b8282815181106111e557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806111fa81613a53565b9150506111b3565b509392505050565b6000818152600260205260408120546001600160a01b0316806109705760405162461bcd60e51b81526004016107db906133e2565b600d805461124c90613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461127890613a18565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b505050505081565b60006001600160a01b0382166112f55760405162461bcd60e51b81526004016107db90613385565b506001600160a01b031660009081526003602052604090205490565b611319611a7d565b6001600160a01b031661132a6116fa565b6001600160a01b0316146113505760405162461bcd60e51b81526004016107db9061351d565b61135a6000611f73565b565b604051806040016040528060068152602001655055424c494360d01b8152508161138582610aeb565b6113a15760405162461bcd60e51b81526004016107db906136fd565b60008160ff16116113c45760405162461bcd60e51b81526004016107db9061385c565b600c548160ff1611156113e95760405162461bcd60e51b81526004016107db90613146565b6000600c541161140b5760405162461bcd60e51b81526004016107db906132f1565b600f8260405161141b9190612df8565b9081526040519081900360200190205460ff600160901b909104811690821611156114585760405162461bcd60e51b81526004016107db90613552565b600f826040516114689190612df8565b90815260405190819003602001812054600160801b9004600190810b900b9060ff83169060109061149a908690612df8565b908152602001604051809103902060006114b2611a7d565b6001600160a01b031681526020810191909152604001600020546114da919061ffff1661394d565b60010b13156114fb5760405162461bcd60e51b81526004016107db90613283565b8060ff16600f8360405161150f9190612df8565b90815260200160405180910390206001015461152b919061399f565b34101561154a5760405162461bcd60e51b81526004016107db906137c8565b8060ff1660108360405161155e9190612df8565b90815260200160405180910390206000611576611a7d565b6001600160a01b031681526020810191909152604001600090812080549091906115a590849061ffff1661394d565b92506101000a81548161ffff021916908361ffff1602179055506115ca610454611a7d565b1561168c57602860000b60106040516115e290612e6b565b908152602001604051809103902060006115fa611a7d565b6001600160a01b031681526020810191909152604090810160002054905161ffff9091169060109061162b90612e7d565b90815260200160405180910390206000611643611a7d565b6001600160a01b0316815260208101919091526040016000205461166b919061ffff1661394d565b60010b131561168c5760405162461bcd60e51b81526004016107db90613283565b610ae08360ff166000611d30565b6000908152600260205260409020546001600160a01b031690565b60006010836040516116c79190612df8565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b600a546001600160a01b031690565b60606001805461098790613a18565b602881565b611725611a7d565b6001600160a01b0316826001600160a01b031614156117565760405162461bcd60e51b81526004016107db90613200565b8060056000611763611a7d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117a7611a7d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117df9190612f61565b60405180910390a35050565b6117fc6117f6611a7d565b83611b7e565b6118185760405162461bcd60e51b81526004016107db9061376b565b61182484848484611fc5565b50505050565b600e818154811061183a57600080fd5b6000918252602090912001546001600160a01b0316905081565b606061185f82611af3565b61187b5760405162461bcd60e51b81526004016107db906135e6565b611883611ff8565b61188c83612007565b60405160200161189d929190612e14565b6040516020818303038152906040529050919050565b600b81815481106118c357600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b600c5481565b6118fe611a7d565b6001600160a01b031661190f6116fa565b6001600160a01b0316146119355760405162461bcd60e51b81526004016107db9061351d565b80600f836040516119469190612df8565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b6000806119798361114c565b519392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6119b7611a7d565b6001600160a01b03166119c86116fa565b6001600160a01b0316146119ee5760405162461bcd60e51b81526004016107db9061351d565b6001600160a01b038116611a145760405162461bcd60e51b81526004016107db906130b2565b610d3981611f73565b8051602081830181018051600f825292820191909301209152805460018083015460029093015467ffffffffffffffff8084169468010000000000000000850490911693600160801b810490930b92600160901b900460ff908116921686565b3390565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611ae457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610970575061097082612156565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b458261120a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b8982611af3565b611ba55760405162461bcd60e51b81526004016107db90613237565b6000611bb08361120a565b9050806001600160a01b0316846001600160a01b03161480611beb5750836001600160a01b0316611be084610a0a565b6001600160a01b0316145b80611bfb5750611bfb8185611981565b949350505050565b826001600160a01b0316611c168261120a565b6001600160a01b031614611c3c5760405162461bcd60e51b81526004016107db90613589565b6001600160a01b038216611c625760405162461bcd60e51b81526004016107db906131a3565b611c6d838383612188565b611c78600082611b10565b6001600160a01b0383166000908152600360205260408120805460019290611ca19084906139be565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ccf908490613973565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008267ffffffffffffffff811115611d5957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d82578160200160208202803683370190505b50905060005b83811015611e3a576000600c548415611da857611da3610ae5565b611db0565b611db0612211565b611dba9190613a8e565b90506000611ddb600c60008154611dd090613a01565b9182905550836122f3565b9050611df8611de8611a7d565b611df3836001613973565b61236a565b80848481518110611e1957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080611e3290613a53565b915050611d88565b507fcda2b02cc46299e1582245cd141596e593c72d28aaabfde6d7e2930c122b808f81611e65611a7d565b604051611e73929190612f36565b60405180910390a1505050565b600082611e8f57506000610ca3565b6000611e9b838561399f565b905082611ea8858361398b565b14611ec55760405162461bcd60e51b81526004016107db90613474565b9392505050565b6000808211611eed5760405162461bcd60e51b81526004016107db906132ba565b611ec5828461398b565b6000826001600160a01b031682604051611f1090612ea6565b60006040518083038185875af1925050503d8060008114611f4d576040519150601f19603f3d011682016040523d82523d6000602084013e611f52565b606091505b5050905080610ae05760405162461bcd60e51b81526004016107db90613734565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611fd0848484611c03565b611fdc84848484612384565b6118245760405162461bcd60e51b81526004016107db90613055565b6060600d805461098790613a18565b606081612048575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610973565b8160005b8115612072578061205c81613a53565b915061206b9050600a8361398b565b915061204c565b60008167ffffffffffffffff81111561209b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c5576020820181803683370190505b5090505b8415611bfb576120da6001836139be565b91506120e7600a86613a8e565b6120f2906030613973565b60f81b81838151811061211557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061214f600a8661398b565b94506120c9565b6001600160e01b031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b612193838383610ae0565b6001600160a01b0383166121af576121aa816124b8565b6121d2565b816001600160a01b0316836001600160a01b0316146121d2576121d283826124fc565b6001600160a01b0382166121ee576121e981612599565b610ae0565b826001600160a01b0316826001600160a01b031614610ae057610ae08282612672565b6000600c544261221f611a7d565b60405160200161222f9190612ddb565b6040516020818303038152906040528051906020012060001c612252919061398b565b42416040516020016122649190612ddb565b6040516020818303038152906040528051906020012060001c612287919061398b565b43456122934442613973565b61229d9190613973565b6122a79190613973565b6122b19190613973565b6122bb9190613973565b6040516020016122cb9190612ea9565b6040516020818303038152906040528051906020012060001c6122ee919061398b565b905090565b60008281526011602052604081205483901561231a57506000838152601160205260409020545b6000848152601160205260408082208590558482529020541561234e57600083815260116020526040808220548683529120555b6000928352601160205260408084209190915592825250205490565b6111488282604051806020016040528060008152506126b6565b6000612398846001600160a01b03166126e9565b156124ad57836001600160a01b031663150b7a026123b4611a7d565b8786866040518563ffffffff1660e01b81526004016123d69493929190612ec6565b602060405180830381600087803b1580156123f057600080fd5b505af1925050508015612420575060408051601f3d908101601f1916820190925261241d91810190612b94565b60015b61247a573d80801561244e576040519150601f19603f3d011682016040523d82523d6000602084013e612453565b606091505b5080516124725760405162461bcd60e51b81526004016107db90613055565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611bfb565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612509846112cd565b61251391906139be565b600083815260076020526040902054909150808214612566576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125ab906001906139be565b600083815260096020526040812054600880549394509092849081106125e157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061261057634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061265657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061267d836112cd565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6126c083836126ef565b6126cd6000848484612384565b610ae05760405162461bcd60e51b81526004016107db90613055565b3b151590565b6001600160a01b0382166127155760405162461bcd60e51b81526004016107db9061343f565b61271e81611af3565b1561273b5760405162461bcd60e51b81526004016107db9061310f565b61274760008383612188565b6001600160a01b0382166000908152600360205260408120805460019290612770908490613973565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190610d3991906128c3565b82805482825590600052602060002090810192821561283f579160200282015b8281111561283f5781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061280c565b5061284b9291506128c3565b5090565b82805461285b90613a18565b90600052602060002090601f01602090048101928261287d576000855561283f565b82601f1061289657805160ff191683800117855561283f565b8280016001018555821561283f579182015b8281111561283f5782518255916020019190600101906128a8565b5b8082111561284b57600081556001016128c4565b600067ffffffffffffffff808411156128f3576128f3613ace565b604051601f8501601f19168101602001828111828210171561291757612917613ace565b60405284815291508183850186101561292f57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461097357600080fd5b8035801515811461097357600080fd5b600082601f83011261297f578081fd5b611ec5838335602085016128d8565b803567ffffffffffffffff8116811461097357600080fd5b803560ff8116811461097357600080fd5b6000602082840312156129c8578081fd5b611ec582612948565b600080604083850312156129e3578081fd5b6129ec83612948565b91506129fa60208401612948565b90509250929050565b600080600060608486031215612a17578081fd5b612a2084612948565b9250612a2e60208501612948565b9150604084013590509250925092565b60008060008060808587031215612a53578081fd5b612a5c85612948565b9350612a6a60208601612948565b925060408501359150606085013567ffffffffffffffff811115612a8c578182fd5b8501601f81018713612a9c578182fd5b612aab878235602084016128d8565b91505092959194509250565b60008060408385031215612ac9578182fd5b612ad283612948565b91506129fa6020840161295f565b60008060408385031215612af2578182fd5b612afb83612948565b946020939093013593505050565b60008060208385031215612b1b578182fd5b823567ffffffffffffffff80821115612b32578384fd5b818501915085601f830112612b45578384fd5b813581811115612b53578485fd5b8660208083028501011115612b66578485fd5b60209290920196919550909350505050565b600060208284031215612b89578081fd5b8135611ec581613ae4565b600060208284031215612ba5578081fd5b8151611ec581613ae4565b600060208284031215612bc1578081fd5b813567ffffffffffffffff811115612bd7578182fd5b611bfb8482850161296f565b60008060408385031215612bf5578182fd5b823567ffffffffffffffff811115612c0b578283fd5b612c178582860161296f565b9250506129fa60208401612948565b60008060408385031215612c38578182fd5b823567ffffffffffffffff811115612c4e578283fd5b612c5a8582860161296f565b9250506129fa6020840161295f565b60008082840360e0811215612c7c578283fd5b833567ffffffffffffffff80821115612c93578485fd5b612c9f8783880161296f565b945060c0601f1984011215612cb2578384fd5b604051925060c0830191508282108183111715612cd157612cd1613ace565b50604052612ce16020850161298e565b8152612cef6040850161298e565b602082015260608401358060010b8114612d07578283fd5b6040820152612d18608085016129a6565b606082015260a08401356080820152612d3360c0850161295f565b60a0820152809150509250929050565b600060208284031215612d54578081fd5b5035919050565b600060208284031215612d6c578081fd5b611ec5826129a6565b6000815180845260208085019450808401835b83811015612da457815187529582019590820190600101612d88565b509495945050505050565b60008151808452612dc78160208601602086016139d5565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60008251612e0a8184602087016139d5565b9190910192915050565b60008351612e268184602088016139d5565b835190830190612e3a8183602088016139d5565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b655055424c494360d01b815260060190565b7f50524553414c4553000000000000000000000000000000000000000000000000815260080190565b90565b90815260200190565b6001600160a01b0391909116815260200190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612ef86080830184612daf565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600060208252611ec56020830184612d75565b600060408252612f496040830185612d75565b90506001600160a01b03831660208301529392505050565b901515815260200190565b60009190910b815260200190565b600060208252611ec56020830184612daf565b600060e08252612fa060e0830185612daf565b905067ffffffffffffffff80845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526033908201527f4342473a2045786365656473206d6178696d756d20737570706c792e2054727960408201527f20746f206d696e74206c657373204e4654732e00000000000000000000000000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526019908201527f4342473a204d6178207065722077616c6c6574206c696d697400000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601a908201527f4342473a20436f6c6c656374696f6e20697320536f6c644f7574000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526015908201527f4342473a204d617820706572207478206c696d69740000000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4342473a204d757374206265206578656375746564206265666f72652070726560408201527f73616c6573206d696e7400000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f4342473a2053616c6573206e6f74206f70656e00000000000000000000000000604082015260600190565b60208082526010908201527f5472616e73666572206661696c65642e00000000000000000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60208082526016908201527f4342473a20496e737566696369656e742066756e647300000000000000000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201527f7574206f6620626f756e64730000000000000000000000000000000000000000606082015260800190565b60208082526017908201527f4342473a2043616e206e6f74206d696e742030204e4654000000000000000000604082015260600190565b60208082526011908201527f53616c65732042616c616e6365203d2030000000000000000000000000000000604082015260600190565b60208082526014908201527f436f6e74726163742042616c616e6365203d2030000000000000000000000000604082015260600190565b61ffff91909116815260200190565b67ffffffffffffffff968716815294909516602085015260019290920b604084015260ff166060830152608082015290151560a082015260c00190565b600061ffff80831681851680830382111561396a5761396a613aa2565b01949350505050565b6000821982111561398657613986613aa2565b500190565b60008261399a5761399a613ab8565b500490565b60008160001904831182151516156139b9576139b9613aa2565b500290565b6000828210156139d0576139d0613aa2565b500390565b60005b838110156139f05781810151838201526020016139d8565b838111156118245750506000910152565b600081613a1057613a10613aa2565b506000190190565b600281046001821680613a2c57607f821691505b60208210811415613a4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a6757613a67613aa2565b5060010190565b600060ff821660ff811415613a8557613a85613aa2565b60010192915050565b600082613a9d57613a9d613ab8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d3957600080fdfea26469706673582212201488ab625af533705ff63fad9a61e18d8aca930d5220f0ca3c3fb6b6fdbffef064736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d54434b4a6459536d326a6f514d48515744765334596679616a7a334d526f3673576d3159424b4d53337365432f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmTCKJdYSm2joQMHQWDvS4Yfyajz3MRo6sWm1YBKMS3seC/
Arg [1] : _maxSupply (uint256): 10000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d54434b4a6459536d326a6f514d48515744765334596679
Arg [4] : 616a7a334d526f3673576d3159424b4d53337365432f00000000000000000000


Deployed Bytecode Sourcemap

57390:6453:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59354:158;;;;;;;;;;-1:-1:-1;59354:158:0;;;;;:::i;:::-;;:::i;:::-;;39848:224;;;;;;;;;;-1:-1:-1;39848:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27834:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29393:221::-;;;;;;;;;;-1:-1:-1;29393:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28916:411::-;;;;;;;;;;-1:-1:-1;28916:411:0;;;;;:::i;:::-;;:::i;40488:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59647:219::-;;;;;;;;;;-1:-1:-1;59647:219:0;;;;;:::i;:::-;;:::i;30283:339::-;;;;;;;;;;-1:-1:-1;30283:339:0;;;;;:::i;:::-;;:::i;61615:157::-;;;;;;;;;;-1:-1:-1;61615:157:0;;;;;:::i;:::-;;:::i;40156:256::-;;;;;;;;;;-1:-1:-1;40156:256:0;;;;;:::i;:::-;;:::i;62221:199::-;;;;;;;;;;-1:-1:-1;62221:199:0;;;;;:::i;:::-;;:::i;59982:274::-;;;;;;;;;;-1:-1:-1;59982:274:0;;;;;:::i;:::-;;:::i;56117:412::-;;;;;;;;;;;;;:::i;30693:185::-;;;;;;;;;;-1:-1:-1;30693:185:0;;;;;:::i;:::-;;:::i;56537:429::-;;;;;;;;;;;;;:::i;40678:233::-;;;;;;;;;;-1:-1:-1;40678:233:0;;;;;:::i;:::-;;:::i;61237:104::-;;;;;;;;;;-1:-1:-1;61237:104:0;;;;;:::i;:::-;;:::i;60264:361::-;;;;;;;;;;-1:-1:-1;60264:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27354:239::-;;;;;;;;;;-1:-1:-1;27354:239:0;;;;;:::i;:::-;;:::i;57610:21::-;;;;;;;;;;;;;:::i;27084:208::-;;;;;;;;;;-1:-1:-1;27084:208:0;;;;;:::i;:::-;;:::i;47557:94::-;;;;;;;;;;;;;:::i;61890:323::-;;;;;;:::i;:::-;;:::i;27658:109::-;;;;;;;;;;-1:-1:-1;27658:109:0;;;;;:::i;:::-;;:::i;60986:135::-;;;;;;;;;;-1:-1:-1;60986:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46906:87::-;;;;;;;;;;;;;:::i;28003:104::-;;;;;;;;;;;;;:::i;57565:36::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29686:295::-;;;;;;;;;;-1:-1:-1;29686:295:0;;;;;:::i;:::-;;:::i;30949:328::-;;;;;;;;;;-1:-1:-1;30949:328:0;;;;;:::i;:::-;;:::i;57640:37::-;;;;;;;;;;-1:-1:-1;57640:37:0;;;;;:::i;:::-;;:::i;61349:258::-;;;;;;;;;;-1:-1:-1;61349:258:0;;;;;:::i;:::-;;:::i;55740:19::-;;;;;;;;;;-1:-1:-1;55740:19:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;57531:27::-;;;;;;;;;;;;;:::i;59520:119::-;;;;;;;;;;-1:-1:-1;59520:119:0;;;;;:::i;:::-;;:::i;60633:229::-;;;;;;;;;;-1:-1:-1;60633:229:0;;;;;:::i;:::-;;:::i;30052:164::-;;;;;;;;;;-1:-1:-1;30052:164:0;;;;;:::i;:::-;;:::i;47806:192::-;;;;;;;;;;-1:-1:-1;47806:192:0;;;;;:::i;:::-;;:::i;57858:36::-;;;;;;;;;;-1:-1:-1;57858:36:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;59354:158::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;;;;;;;;;59454:5:::1;59439;59445;59439:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:20;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;59439:20:0;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;-1:-1:-1::0;;;59439:20:0::1;::::0;;;::::1;;;;::::0;::::1;-1:-1:-1::0;;;59439:20:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;59439:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59475:29:::1;::::0;::::1;::::0;59491:5;;59498;;59475:29:::1;:::i;:::-;;;;;;;;59354:158:::0;;:::o;39848:224::-;39950:4;-1:-1:-1;;;;;;39974:50:0;;39989:35;39974:50;;:90;;;40028:36;40052:11;40028:23;:36::i;:::-;39967:97;;39848:224;;;;:::o;27834:100::-;27888:13;27921:5;27914:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27834:100;:::o;29393:221::-;29469:7;29497:16;29505:7;29497;:16::i;:::-;29489:73;;;;-1:-1:-1;;;29489:73:0;;;;;;;:::i;:::-;-1:-1:-1;29582:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29582:24:0;;29393:221::o;28916:411::-;28997:13;29013:23;29028:7;29013:14;:23::i;:::-;28997:39;;29061:5;-1:-1:-1;;;;;29055:11:0;:2;-1:-1:-1;;;;;29055:11:0;;;29047:57;;;;-1:-1:-1;;;29047:57:0;;;;;;;:::i;:::-;29155:5;-1:-1:-1;;;;;29139:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;29139:21:0;;:62;;;;29164:37;29181:5;29188:12;:10;:12::i;29164:37::-;29117:168;;;;-1:-1:-1;;;29117:168:0;;;;;;;:::i;:::-;29298:21;29307:2;29311:7;29298:8;:21::i;:::-;28916:411;;;:::o;40488:113::-;40576:10;:17;40488:113;:::o;59647:219::-;59708:4;59753:1;59732:5;59738;59732:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;;;:22;:63;;;;;59777:5;59783;59777:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;;;59758:15;:37;;59732:63;:102;;;;;59818:5;59824;59818:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;;;;;;;59799:15;:35;;59732:102;:126;;;;;59839:5;59845;59839:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;;;59838:20;59725:133;;59647:219;;;:::o;30283:339::-;30478:41;30497:12;:10;:12::i;:::-;30511:7;30478:18;:41::i;:::-;30470:103;;;;-1:-1:-1;;;30470:103:0;;;;;;;:::i;:::-;30586:28;30596:4;30602:2;30606:7;30586:9;:28::i;61615:157::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;61697:27:::1;61704:20;;61697:27;:::i;:::-;61735:29;:20;61758:6:::0;;61735:29:::1;:::i;40156:256::-:0;40253:7;40289:23;40306:5;40289:16;:23::i;:::-;40281:5;:31;40273:87;;;;-1:-1:-1;;;40273:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;40378:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40156:256;;;;;:::o;62221:199::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;62310:5:::1;:15;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:21;::::1;;62292:15;:39;62284:94;;;;-1:-1:-1::0;;;62284:94:0::1;;;;;;;:::i;:::-;62389:23;62398:7;62407:4;62389:8;:23::i;:::-;62221:199:::0;:::o;59982:274::-;60041:4;;60058:168;60082:20;:27;60078:31;;60058:168;;;60162:5;-1:-1:-1;;;;;60135:32:0;:20;60156:1;60135:23;;;;;;-1:-1:-1;;;60135:23:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60135:23:0;:32;60131:84;;;60195:4;60188:11;;;;;60131:84;60111:3;;;;:::i;:::-;;;;60058:168;;;-1:-1:-1;60243:5:0;;59982:274;-1:-1:-1;;59982:274:0:o;56117:412::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;56189:21:::1;56229:11:::0;56221:41:::1;;;;-1:-1:-1::0;;;56221:41:0::1;;;;;;;:::i;:::-;56279:7;56275:193;56296:5;:12:::0;56292:16:::1;::::0;::::1;;56275:193;;;56352:1;56332:5;56338:1;56332:8;;;;;;;;-1:-1:-1::0;;;56332:8:0::1;;;;;;;;;;;;;;;;;;;:17;;;:21;56329:128;;;56373:68;56383:5;56389:1;56383:8;;;;;;;;-1:-1:-1::0;;;56383:8:0::1;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1::0;;;;;56383:15:0::1;56400:40;56435:4;56400:30;56412:5;56418:1;56412:8;;;;;;;;-1:-1:-1::0;;;56412:8:0::1;;;;;;;;;;;;;;;;;;;:17;;;56400:7;:11;;:30;;;;:::i;:::-;:34:::0;::::1;:40::i;:::-;56373:9;:68::i;:::-;56310:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56275:193;;;;56480:41;56490:7;:5;:7::i;:::-;56499:21;56480:9;:41::i;30693:185::-:0;30831:39;30848:4;30854:2;30858:7;30831:39;;;;;;;;;;;;:16;:39::i;56537:429::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;56613:21:::1;56653:11:::0;56645:44:::1;;;;-1:-1:-1::0;;;56645:44:0::1;;;;;;;:::i;:::-;56706:7;56702:203;56723:5;:12:::0;56719:16:::1;::::0;::::1;;56702:203;;;56784:1;56759:5;56765:1;56759:8;;;;;;;;-1:-1:-1::0;;;56759:8:0::1;;;;;;;;;;;;;;;;;;;:22;;;:26;56756:138;;;56805:73;56815:5;56821:1;56815:8;;;;;;;;-1:-1:-1::0;;;56815:8:0::1;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1::0;;;;;56815:15:0::1;56832:45;56872:4;56832:35;56844:5;56850:1;56844:8;;;;;;;;-1:-1:-1::0;;;56844:8:0::1;;;;;;;;;;;;;;;;;;;:22;;;56832:7;:11;;:35;;;;:::i;56805:73::-;56737:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56702:203;;40678:233:::0;40753:7;40789:30;:28;:30::i;:::-;40781:5;:38;40773:95;;;;-1:-1:-1;;;40773:95:0;;;;;;;:::i;:::-;40886:10;40897:5;40886:17;;;;;;-1:-1:-1;;;40886:17:0;;;;;;;;;;;;;;;;;40879:24;;40678:233;;;:::o;61237:104::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;61312:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;61237:104:::0;:::o;60264:361::-;60327:16;60356:23;60382:17;60392:6;60382:9;:17::i;:::-;60356:43;;60410:25;60452:15;60438:30;;;;;;-1:-1:-1;;;60438:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60438:30:0;;60410:58;;60484:9;60479:113;60499:15;60495:1;:19;60479:113;;;60550:30;60570:6;60578:1;60550:19;:30::i;:::-;60536:8;60545:1;60536:11;;;;;;-1:-1:-1;;;60536:11:0;;;;;;;;;;;;;;;;;;:44;60516:3;;;;:::i;:::-;;;;60479:113;;;-1:-1:-1;60609:8:0;60264:361;-1:-1:-1;;;60264:361:0:o;27354:239::-;27426:7;27462:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27462:16:0;27497:19;27489:73;;;;-1:-1:-1;;;27489:73:0;;;;;;;:::i;57610:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27084:208::-;27156:7;-1:-1:-1;;;;;27184:19:0;;27176:74;;;;-1:-1:-1;;;27176:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27268:16:0;;;;;:9;:16;;;;;;;27084:208::o;47557:94::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;47622:21:::1;47640:1;47622:9;:21::i;:::-;47557:94::o:0;61890:323::-;58522:716;;;;;;;;;;;;;-1:-1:-1;;;58522:716:0;;;61961:6;58592:17;58603:5;58592:10;:17::i;:::-;58584:49;;;;-1:-1:-1;;;58584:49:0;;;;;;;:::i;:::-;58661:1;58652:6;:10;;;58644:46;;;;-1:-1:-1;;;58644:46:0;;;;;;;:::i;:::-;58720:12;;58710:6;:22;;;;58701:87;;;;-1:-1:-1;;;58701:87:0;;;;;;;:::i;:::-;58822:1;58807:12;;:16;58799:55;;;;-1:-1:-1;;;58799:55:0;;;;;;;:::i;:::-;58883:5;58889;58883:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;-1:-1:-1;;;58883:21:0;;;;;58873:31;;;;;58865:65;;;;-1:-1:-1;;;58865:65:0;;;;;;;:::i;:::-;59015:5;59021;59015:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;-1:-1:-1;;;59015:25:0;;;;;;58949:92;;;58990:14;;;;59015:25;;58955:18;;58967:5;;58955:18;:::i;:::-;;;;;;;;;;;;;:32;58974:12;:10;:12::i;:::-;-1:-1:-1;;;;;58955:32:0;;;;;;;;;;;;-1:-1:-1;58955:32:0;;:49;;;:32;;:49;:::i;:::-;58949:92;;;;58941:130;;;;-1:-1:-1;;;58941:130:0;;;;;;;:::i;:::-;59124:6;59103:27;;:5;59109;59103:12;;;;;;:::i;:::-;;;;;;;;;;;;;:18;;;:27;;;;:::i;:::-;59090:9;:40;;59082:75;;;;-1:-1:-1;;;59082:75:0;;;;;;;:::i;:::-;59211:6;59204:14;;59168:11;59180:5;59168:18;;;;;;:::i;:::-;;;;;;;;;;;;;:32;59187:12;:10;:12::i;:::-;-1:-1:-1;;;;;59168:32:0;;;;;;;;;;;;-1:-1:-1;59168:32:0;;;:50;;:32;;-1:-1:-1;59168:50:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;61982:27:::1;61996:12;:10;:12::i;61982:27::-;61979:193;;;57599:2;62034:96;;62080:11;:21;;;;;:::i;:::-;;;;;;;;;;;;;:35;62102:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;62080:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;62080:35:0;;62040:23;;62080:35:::1;::::0;;::::1;::::0;62040:11:::1;::::0;:23:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;:37;62064:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;62040:37:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;62040:37:0;;:75:::1;::::0;;:37:::1;;:75;:::i;:::-;62034:96;;;;62026:134;;;;-1:-1:-1::0;;;62026:134:0::1;;;;;;;:::i;:::-;62182:23;62191:6;62182:23;;62199:5;62182:8;:23::i;27658:109::-:0;27716:7;27743:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27743:16:0;;27658:109::o;60986:135::-;61060:6;61086:11;61098:5;61086:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61086:27:0;;;;;;;;;;;;;;-1:-1:-1;60986:135:0;;;;:::o;46906:87::-;46979:6;;-1:-1:-1;;;;;46979:6:0;46906:87;:::o;28003:104::-;28059:13;28092:7;28085:14;;;;;:::i;57565:36::-;57599:2;57565:36;:::o;29686:295::-;29801:12;:10;:12::i;:::-;-1:-1:-1;;;;;29789:24:0;:8;-1:-1:-1;;;;;29789:24:0;;;29781:62;;;;-1:-1:-1;;;29781:62:0;;;;;;;:::i;:::-;29901:8;29856:18;:32;29875:12;:10;:12::i;:::-;-1:-1:-1;;;;;29856:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;29856:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;29856:53:0;;;;;;;;;;;29940:12;:10;:12::i;:::-;-1:-1:-1;;;;;29925:48:0;;29964:8;29925:48;;;;;;:::i;:::-;;;;;;;;29686:295;;:::o;30949:328::-;31124:41;31143:12;:10;:12::i;:::-;31157:7;31124:18;:41::i;:::-;31116:103;;;;-1:-1:-1;;;31116:103:0;;;;;;;:::i;:::-;31230:39;31244:4;31250:2;31254:7;31263:5;31230:13;:39::i;:::-;30949:328;;;;:::o;57640:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57640:37:0;;-1:-1:-1;57640:37:0;:::o;61349:258::-;61414:13;61448:16;61456:7;61448;:16::i;:::-;61440:76;;;;-1:-1:-1;;;61440:76:0;;;;;;;:::i;:::-;61558:10;:8;:10::i;:::-;61570:18;:7;:16;:18::i;:::-;61541:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61527:72;;61349:258;;;:::o;55740:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55740:19:0;;;;-1:-1:-1;55740:19:0;:::o;57531:27::-;;;;:::o;59520:119::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;59625:6:::1;59603:5;59609;59603:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:19:::1;;:28:::0;;;::::1;;-1:-1:-1::0;;59603:28:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;59520:119:0:o;60633:229::-;60697:7;60717:25;60745:24;60762:6;60745:16;:24::i;:::-;60806:15;;60633:229;-1:-1:-1;;;60633:229:0:o;30052:164::-;-1:-1:-1;;;;;30173:25:0;;;30149:4;30173:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30052:164::o;47806:192::-;47137:12;:10;:12::i;:::-;-1:-1:-1;;;;;47126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;47126:23:0;;47118:68;;;;-1:-1:-1;;;47118:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47895:22:0;::::1;47887:73;;;;-1:-1:-1::0;;;47887:73:0::1;;;;;;;:::i;:::-;47971:19;47981:8;47971:9;:19::i;57858:36::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57858:36:0;;;;;;-1:-1:-1;;;57858:36:0;;;;;;;;;:::o;16609:98::-;16689:10;16609:98;:::o;26727:293::-;26829:4;-1:-1:-1;;;;;;26862:40:0;;26877:25;26862:40;;:101;;-1:-1:-1;;;;;;;26915:48:0;;26930:33;26915:48;26862:101;:150;;;;26976:36;27000:11;26976:23;:36::i;32787:127::-;32852:4;32876:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32876:16:0;:30;;;32787:127::o;36787:174::-;36862:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36862:29:0;-1:-1:-1;;;;;36862:29:0;;;;;;;;:24;;36916:23;36862:24;36916:14;:23::i;:::-;-1:-1:-1;;;;;36907:46:0;;;;;;;;;;;36787:174;;:::o;33081:348::-;33174:4;33199:16;33207:7;33199;:16::i;:::-;33191:73;;;;-1:-1:-1;;;33191:73:0;;;;;;;:::i;:::-;33275:13;33291:23;33306:7;33291:14;:23::i;:::-;33275:39;;33344:5;-1:-1:-1;;;;;33333:16:0;:7;-1:-1:-1;;;;;33333:16:0;;:51;;;;33377:7;-1:-1:-1;;;;;33353:31:0;:20;33365:7;33353:11;:20::i;:::-;-1:-1:-1;;;;;33353:31:0;;33333:51;:87;;;;33388:32;33405:5;33412:7;33388:16;:32::i;:::-;33325:96;33081:348;-1:-1:-1;;;;33081:348:0:o;36091:578::-;36250:4;-1:-1:-1;;;;;36223:31:0;:23;36238:7;36223:14;:23::i;:::-;-1:-1:-1;;;;;36223:31:0;;36215:85;;;;-1:-1:-1;;;36215:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36319:16:0;;36311:65;;;;-1:-1:-1;;;36311:65:0;;;;;;;:::i;:::-;36389:39;36410:4;36416:2;36420:7;36389:20;:39::i;:::-;36493:29;36510:1;36514:7;36493:8;:29::i;:::-;-1:-1:-1;;;;;36535:15:0;;;;;;:9;:15;;;;;:20;;36554:1;;36535:15;:20;;36554:1;;36535:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36566:13:0;;;;;;:9;:13;;;;;:18;;36583:1;;36566:13;:18;;36583:1;;36566:18;:::i;:::-;;;;-1:-1:-1;;36595:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36595:21:0;-1:-1:-1;;;;;36595:21:0;;;;;;;;;36634:27;;36595:16;;36634:27;;;;;;;36091:578;;;:::o;62428:503::-;62495:28;62537:7;62526:19;;;;;;-1:-1:-1;;;62526:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62526:19:0;;62495:50;;62563:6;62558:306;62579:7;62575:1;:11;62558:306;;;62608:17;62668:12;;62630:6;62629:7;:35;;62651:13;:11;:13::i;:::-;62629:35;;;62639:9;:7;:9::i;:::-;62628:52;;;;:::i;:::-;62608:72;;62695:16;62714:43;62733:12;;62731:14;;;;;:::i;:::-;;;;;-1:-1:-1;62747:9:0;62714:16;:43::i;:::-;62695:62;;62772:37;62782:12;:10;:12::i;:::-;62796;:8;62807:1;62796:12;:::i;:::-;62772:9;:37::i;:::-;62844:8;62824:14;62839:1;62824:17;;;;;;-1:-1:-1;;;62824:17:0;;;;;;;;;;;;;;:28;;;;;62558:306;;62588:3;;;;;:::i;:::-;;;;62558:306;;;;62879:44;62894:14;62910:12;:10;:12::i;:::-;62879:44;;;;;;;:::i;:::-;;;;;;;;62428:503;;;:::o;51769:220::-;51827:7;51851:6;51847:20;;-1:-1:-1;51866:1:0;51859:8;;51847:20;51878:9;51890:5;51894:1;51890;:5;:::i;:::-;51878:17;-1:-1:-1;51923:1:0;51914:5;51918:1;51878:17;51914:5;:::i;:::-;:10;51906:56;;;;-1:-1:-1;;;51906:56:0;;;;;;;:::i;:::-;51980:1;51769:220;-1:-1:-1;;;51769:220:0:o;52467:153::-;52525:7;52557:1;52553;:5;52545:44;;;;-1:-1:-1;;;52545:44:0;;;;;;;:::i;:::-;52607:5;52611:1;52607;:5;:::i;56974:180::-;57048:12;57066:8;-1:-1:-1;;;;;57066:13:0;57087:7;57066:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57047:52;;;57118:7;57110:36;;;;-1:-1:-1;;;57110:36:0;;;;;;;:::i;48006:173::-;48081:6;;;-1:-1:-1;;;;;48098:17:0;;;-1:-1:-1;;;;;;48098:17:0;;;;;;;48131:40;;48081:6;;;48098:17;48081:6;;48131:40;;48062:16;;48131:40;48006:173;;:::o;32159:315::-;32316:28;32326:4;32332:2;32336:7;32316:9;:28::i;:::-;32363:48;32386:4;32392:2;32396:7;32405:5;32363:22;:48::i;:::-;32355:111;;;;-1:-1:-1;;;32355:111:0;;;;;;;:::i;60870:108::-;60930:13;60963:7;60956:14;;;;;:::i;6271:723::-;6327:13;6548:10;6544:53;;-1:-1:-1;6575:10:0;;;;;;;;;;;;;;;;;;;6544:53;6622:5;6607:12;6663:78;6670:9;;6663:78;;6696:8;;;;:::i;:::-;;-1:-1:-1;6719:10:0;;-1:-1:-1;6727:2:0;6719:10;;:::i;:::-;;;6663:78;;;6751:19;6783:6;6773:17;;;;;;-1:-1:-1;;;6773:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6773:17:0;;6751:39;;6801:154;6808:10;;6801:154;;6835:11;6845:1;6835:11;;:::i;:::-;;-1:-1:-1;6904:10:0;6912:2;6904:5;:10;:::i;:::-;6891:24;;:2;:24;:::i;:::-;6878:39;;6861:6;6868;6861:14;;;;;;-1:-1:-1;;;6861:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;6932:11:0;6941:2;6932:11;;:::i;:::-;;;6801:154;;18271:157;-1:-1:-1;;;;;;18380:40:0;;18395:25;18380:40;18271:157;;;:::o;41524:589::-;41668:45;41695:4;41701:2;41705:7;41668:26;:45::i;:::-;-1:-1:-1;;;;;41730:18:0;;41726:187;;41765:40;41797:7;41765:31;:40::i;:::-;41726:187;;;41835:2;-1:-1:-1;;;;;41827:10:0;:4;-1:-1:-1;;;;;41827:10:0;;41823:90;;41854:47;41887:4;41893:7;41854:32;:47::i;:::-;-1:-1:-1;;;;;41927:16:0;;41923:183;;41960:45;41997:7;41960:36;:45::i;:::-;41923:183;;;42033:4;-1:-1:-1;;;;;42027:10:0;:2;-1:-1:-1;;;;;42027:10:0;;42023:83;;42054:40;42082:2;42086:7;42054:27;:40::i;63047:393::-;63088:7;63420:12;;63388:15;63369:12;:10;:12::i;:::-;63352:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;63342:41;;;;;;63334:50;;63333:70;;;;:::i;:::-;63302:15;63281:14;63264:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;63254:43;;;;;;63246:52;;63245:72;;;;:::i;:::-;63218:12;63201:14;63164:34;63182:16;63164:15;:34;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:154;;;;:::i;:::-;:240;;;;:::i;:::-;63147:268;;;;;;;;:::i;:::-;;;;;;;;;;;;;63137:279;;;;;;63115:302;;:317;;;;:::i;:::-;63108:324;;63047:393;:::o;63448:392::-;63523:7;63579:20;;;:12;:20;;;;;;63558:6;;63579:24;63575:57;;-1:-1:-1;63612:20:0;;;;:12;:20;;;;;;63575:57;63643:20;;;;:12;:20;;;;;;:29;;;63687:20;;;;;;:24;63683:73;;63736:20;;;;:12;:20;;;;;;;63713;;;;;:43;63683:73;63767:20;;;;:12;:20;;;;;;:27;;;;63812:20;;;-1:-1:-1;63812:20:0;;;63448:392::o;33771:110::-;33847:26;33857:2;33861:7;33847:26;;;;;;;;;;;;:9;:26::i;37526:803::-;37681:4;37702:15;:2;-1:-1:-1;;;;;37702:13:0;;:15::i;:::-;37698:624;;;37754:2;-1:-1:-1;;;;;37738:36:0;;37775:12;:10;:12::i;:::-;37789:4;37795:7;37804:5;37738:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37738:72:0;;;;;;;;-1:-1:-1;;37738:72:0;;;;;;;;;;;;:::i;:::-;;;37734:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37984:13:0;;37980:272;;38027:60;;-1:-1:-1;;;38027:60:0;;;;;;;:::i;37980:272::-;38202:6;38196:13;38187:6;38183:2;38179:15;38172:38;37734:533;-1:-1:-1;;;;;;37861:55:0;37871:45;37861:55;;-1:-1:-1;37854:62:0;;37698:624;-1:-1:-1;38306:4:0;37526:803;;;;;;:::o;42836:164::-;42940:10;:17;;42913:24;;;;:15;:24;;;;;:44;;;42968:24;;;;;;;;;;;;42836:164::o;43627:988::-;43893:22;43943:1;43918:22;43935:4;43918:16;:22::i;:::-;:26;;;;:::i;:::-;43955:18;43976:26;;;:17;:26;;;;;;43893:51;;-1:-1:-1;44109:28:0;;;44105:328;;-1:-1:-1;;;;;44176:18:0;;44154:19;44176:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44227:30;;;;;;:44;;;44344:30;;:17;:30;;;;;:43;;;44105:328;-1:-1:-1;44529:26:0;;;;:17;:26;;;;;;;;44522:33;;;-1:-1:-1;;;;;44573:18:0;;;;;:12;:18;;;;;:34;;;;;;;44566:41;43627:988::o;44910:1079::-;45188:10;:17;45163:22;;45188:21;;45208:1;;45188:21;:::i;:::-;45220:18;45241:24;;;:15;:24;;;;;;45614:10;:26;;45163:46;;-1:-1:-1;45241:24:0;;45163:46;;45614:26;;;;-1:-1:-1;;;45614:26:0;;;;;;;;;;;;;;;;;45592:48;;45678:11;45653:10;45664;45653:22;;;;;;-1:-1:-1;;;45653:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;45758:28;;;:15;:28;;;;;;;:41;;;45930:24;;;;;45923:31;45965:10;:16;;;;;-1:-1:-1;;;45965:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;44910:1079;;;;:::o;42414:221::-;42499:14;42516:20;42533:2;42516:16;:20::i;:::-;-1:-1:-1;;;;;42547:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42592:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42414:221:0:o;34108:321::-;34238:18;34244:2;34248:7;34238:5;:18::i;:::-;34289:54;34320:1;34324:2;34328:7;34337:5;34289:22;:54::i;:::-;34267:154;;;;-1:-1:-1;;;34267:154:0;;;;;;;:::i;8711:387::-;9034:20;9082:8;;;8711:387::o;34765:382::-;-1:-1:-1;;;;;34845:16:0;;34837:61;;;;-1:-1:-1;;;34837:61:0;;;;;;;:::i;:::-;34918:16;34926:7;34918;:16::i;:::-;34917:17;34909:58;;;;-1:-1:-1;;;34909:58:0;;;;;;;:::i;:::-;34980:45;35009:1;35013:2;35017:7;34980:20;:45::i;:::-;-1:-1:-1;;;;;35038:13:0;;;;;;:9;:13;;;;;:18;;35055:1;;35038:13;:18;;35055:1;;35038:18;:::i;:::-;;;;-1:-1:-1;;35067:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35067:21:0;-1:-1:-1;;;;;35067:21:0;;;;;;;;35106:33;;35067:16;;;35106:33;;35067:16;;35106:33;34765:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:198::-;696:20;;-1:-1:-1;;;;;745:54:1;;735:65;;725:2;;814:1;811;804:12;829:162;896:20;;952:13;;945:21;935:32;;925:2;;981:1;978;971:12;996:233;;1094:3;1087:4;1079:6;1075:17;1071:27;1061:2;;1116:5;1109;1102:20;1061:2;1142:81;1219:3;1210:6;1197:20;1190:4;1182:6;1178:17;1142:81;:::i;1234:173::-;1303:20;;1363:18;1352:30;;1342:41;;1332:2;;1397:1;1394;1387:12;1412:158;1480:20;;1540:4;1529:16;;1519:27;;1509:2;;1560:1;1557;1550:12;1575:198;;1687:2;1675:9;1666:7;1662:23;1658:32;1655:2;;;1708:6;1700;1693:22;1655:2;1736:31;1757:9;1736:31;:::i;1778:274::-;;;1907:2;1895:9;1886:7;1882:23;1878:32;1875:2;;;1928:6;1920;1913:22;1875:2;1956:31;1977:9;1956:31;:::i;:::-;1946:41;;2006:40;2042:2;2031:9;2027:18;2006:40;:::i;:::-;1996:50;;1865:187;;;;;:::o;2057:342::-;;;;2203:2;2191:9;2182:7;2178:23;2174:32;2171:2;;;2224:6;2216;2209:22;2171:2;2252:31;2273:9;2252:31;:::i;:::-;2242:41;;2302:40;2338:2;2327:9;2323:18;2302:40;:::i;:::-;2292:50;;2389:2;2378:9;2374:18;2361:32;2351:42;;2161:238;;;;;:::o;2404:702::-;;;;;2576:3;2564:9;2555:7;2551:23;2547:33;2544:2;;;2598:6;2590;2583:22;2544:2;2626:31;2647:9;2626:31;:::i;:::-;2616:41;;2676:40;2712:2;2701:9;2697:18;2676:40;:::i;:::-;2666:50;;2763:2;2752:9;2748:18;2735:32;2725:42;;2818:2;2807:9;2803:18;2790:32;2845:18;2837:6;2834:30;2831:2;;;2882:6;2874;2867:22;2831:2;2910:22;;2963:4;2955:13;;2951:27;-1:-1:-1;2941:2:1;;2997:6;2989;2982:22;2941:2;3025:75;3092:7;3087:2;3074:16;3069:2;3065;3061:11;3025:75;:::i;:::-;3015:85;;;2534:572;;;;;;;:::o;3111:268::-;;;3237:2;3225:9;3216:7;3212:23;3208:32;3205:2;;;3258:6;3250;3243:22;3205:2;3286:31;3307:9;3286:31;:::i;:::-;3276:41;;3336:37;3369:2;3358:9;3354:18;3336:37;:::i;3384:266::-;;;3513:2;3501:9;3492:7;3488:23;3484:32;3481:2;;;3534:6;3526;3519:22;3481:2;3562:31;3583:9;3562:31;:::i;:::-;3552:41;3640:2;3625:18;;;;3612:32;;-1:-1:-1;;;3471:179:1:o;3655:666::-;;;3802:2;3790:9;3781:7;3777:23;3773:32;3770:2;;;3823:6;3815;3808:22;3770:2;3868:9;3855:23;3897:18;3938:2;3930:6;3927:14;3924:2;;;3959:6;3951;3944:22;3924:2;4002:6;3991:9;3987:22;3977:32;;4047:7;4040:4;4036:2;4032:13;4028:27;4018:2;;4074:6;4066;4059:22;4018:2;4119;4106:16;4145:2;4137:6;4134:14;4131:2;;;4166:6;4158;4151:22;4131:2;4225:7;4220:2;4214;4206:6;4202:15;4198:2;4194:24;4190:33;4187:46;4184:2;;;4251:6;4243;4236:22;4184:2;4287;4279:11;;;;;4309:6;;-1:-1:-1;3760:561:1;;-1:-1:-1;;;;3760:561:1:o;4326:257::-;;4437:2;4425:9;4416:7;4412:23;4408:32;4405:2;;;4458:6;4450;4443:22;4405:2;4502:9;4489:23;4521:32;4547:5;4521:32;:::i;4588:261::-;;4710:2;4698:9;4689:7;4685:23;4681:32;4678:2;;;4731:6;4723;4716:22;4678:2;4768:9;4762:16;4787:32;4813:5;4787:32;:::i;4854:344::-;;4976:2;4964:9;4955:7;4951:23;4947:32;4944:2;;;4997:6;4989;4982:22;4944:2;5042:9;5029:23;5075:18;5067:6;5064:30;5061:2;;;5112:6;5104;5097:22;5061:2;5140:52;5184:7;5175:6;5164:9;5160:22;5140:52;:::i;5203:420::-;;;5342:2;5330:9;5321:7;5317:23;5313:32;5310:2;;;5363:6;5355;5348:22;5310:2;5408:9;5395:23;5441:18;5433:6;5430:30;5427:2;;;5478:6;5470;5463:22;5427:2;5506:52;5550:7;5541:6;5530:9;5526:22;5506:52;:::i;:::-;5496:62;;;5577:40;5613:2;5602:9;5598:18;5577:40;:::i;5628:414::-;;;5764:2;5752:9;5743:7;5739:23;5735:32;5732:2;;;5785:6;5777;5770:22;5732:2;5830:9;5817:23;5863:18;5855:6;5852:30;5849:2;;;5900:6;5892;5885:22;5849:2;5928:52;5972:7;5963:6;5952:9;5948:22;5928:52;:::i;:::-;5918:62;;;5999:37;6032:2;6021:9;6017:18;5999:37;:::i;6047:1228::-;;;6199:9;6190:7;6186:23;6229:3;6225:2;6221:12;6218:2;;;6251:6;6243;6236:22;6218:2;6296:9;6283:23;6325:18;6366:2;6358:6;6355:14;6352:2;;;6387:6;6379;6372:22;6352:2;6415:52;6459:7;6450:6;6439:9;6435:22;6415:52;:::i;:::-;6405:62;-1:-1:-1;6501:4:1;-1:-1:-1;;6483:16:1;;6479:27;6476:2;;;6524:6;6516;6509:22;6476:2;6562;6556:9;6542:23;;6604:4;6596:6;6592:17;6574:35;;6659:6;6647:10;6644:22;6639:2;6627:10;6624:18;6621:46;6618:2;;;6670:18;;:::i;:::-;-1:-1:-1;6706:2:1;6699:22;6745:39;6780:2;6765:18;;6745:39;:::i;:::-;6737:6;6730:55;6818:39;6853:2;6842:9;6838:18;6818:39;:::i;:::-;6813:2;6805:6;6801:15;6794:64;6908:2;6897:9;6893:18;6880:32;6955:5;6952:1;6941:20;6934:5;6931:31;6921:2;;6981:6;6973;6966:22;6921:2;7018;7006:15;;6999:30;7062:39;7096:3;7081:19;;7062:39;:::i;:::-;7057:2;7049:6;7045:15;7038:64;7164:3;7153:9;7149:19;7136:33;7130:3;7122:6;7118:16;7111:59;7204:39;7237:4;7226:9;7222:20;7204:39;:::i;:::-;7198:3;7190:6;7186:16;7179:65;7263:6;7253:16;;;6166:1109;;;;;:::o;7280:190::-;;7392:2;7380:9;7371:7;7367:23;7363:32;7360:2;;;7413:6;7405;7398:22;7360:2;-1:-1:-1;7441:23:1;;7350:120;-1:-1:-1;7350:120:1:o;7475:194::-;;7585:2;7573:9;7564:7;7560:23;7556:32;7553:2;;;7606:6;7598;7591:22;7553:2;7634:29;7653:9;7634:29;:::i;7674:443::-;;7771:5;7765:12;7798:6;7793:3;7786:19;7824:4;7853:2;7848:3;7844:12;7837:19;;7890:2;7883:5;7879:14;7911:3;7923:169;7937:6;7934:1;7931:13;7923:169;;;7998:13;;7986:26;;8032:12;;;;8067:15;;;;7959:1;7952:9;7923:169;;;-1:-1:-1;8108:3:1;;7741:376;-1:-1:-1;;;;;7741:376:1:o;8122:259::-;;8203:5;8197:12;8230:6;8225:3;8218:19;8246:63;8302:6;8295:4;8290:3;8286:14;8279:4;8272:5;8268:16;8246:63;:::i;:::-;8363:2;8342:15;-1:-1:-1;;8338:29:1;8329:39;;;;8370:4;8325:50;;8173:208;-1:-1:-1;;8173:208:1:o;8386:229::-;8535:2;8531:15;;;;-1:-1:-1;;8527:53:1;8515:66;;8606:2;8597:12;;8505:110::o;8870:276::-;;9039:6;9033:13;9055:53;9101:6;9096:3;9089:4;9081:6;9077:17;9055:53;:::i;:::-;9124:16;;;;;9009:137;-1:-1:-1;;9009:137:1:o;9151:637::-;;9469:6;9463:13;9485:53;9531:6;9526:3;9519:4;9511:6;9507:17;9485:53;:::i;:::-;9601:13;;9560:16;;;;9623:57;9601:13;9560:16;9657:4;9645:17;;9623:57;:::i;:::-;9745:7;9702:20;;9731:22;;;9780:1;9769:13;;9439:349;-1:-1:-1;;;;9439:349:1:o;9793:256::-;-1:-1:-1;;;9995:21:1;;10041:1;10032:11;;9985:64::o;10054:258::-;10268:10;10256:23;;10304:1;10295:11;;10246:66::o;10317:205::-;10517:3;10508:14::o;10527:182::-;10656:19;;;10700:2;10691:12;;10646:63::o;10714:226::-;-1:-1:-1;;;;;10878:55:1;;;;10860:74;;10848:2;10833:18;;10815:125::o;10945:513::-;;-1:-1:-1;;;;;11249:2:1;11241:6;11237:15;11226:9;11219:34;11301:2;11293:6;11289:15;11284:2;11273:9;11269:18;11262:43;;11341:6;11336:2;11325:9;11321:18;11314:34;11384:3;11379:2;11368:9;11364:18;11357:31;11405:47;11447:3;11436:9;11432:19;11424:6;11405:47;:::i;:::-;11397:55;11148:310;-1:-1:-1;;;;;;11148:310:1:o;11463:368::-;-1:-1:-1;;;;;11683:55:1;;;;11665:74;;11770:2;11755:18;;11748:34;;;;11813:2;11798:18;;11791:34;11653:2;11638:18;;11620:211::o;11836:267::-;;12015:2;12004:9;11997:21;12035:62;12093:2;12082:9;12078:18;12070:6;12035:62;:::i;12108:387::-;;12315:2;12304:9;12297:21;12335:62;12393:2;12382:9;12378:18;12370:6;12335:62;:::i;:::-;12327:70;;-1:-1:-1;;;;;12437:6:1;12433:55;12428:2;12417:9;12413:18;12406:83;12287:208;;;;;:::o;12500:187::-;12665:14;;12658:22;12640:41;;12628:2;12613:18;;12595:92::o;12692:186::-;;12850:21;;;;12832:40;;12820:2;12805:18;;12787:91::o;12883:221::-;;13032:2;13021:9;13014:21;13052:46;13094:2;13083:9;13079:18;13071:6;13052:46;:::i;13109:742::-;;13330:3;13319:9;13312:22;13351:47;13393:3;13382:9;13378:19;13370:6;13351:47;:::i;:::-;13343:55;;13417:18;13490:2;13481:6;13475:13;13471:22;13466:2;13455:9;13451:18;13444:50;13558:2;13552;13544:6;13540:15;13534:22;13530:31;13525:2;13514:9;13510:18;13503:59;;13630:2;13622:6;13618:15;13612:22;13609:1;13598:37;13593:2;13582:9;13578:18;13571:65;13701:4;13695:2;13687:6;13683:15;13677:22;13673:33;13667:3;13656:9;13652:19;13645:62;13762:3;13754:6;13750:16;13744:23;13738:3;13727:9;13723:19;13716:52;13837:3;13829:6;13825:16;13819:23;13812:31;13805:39;13799:3;13788:9;13784:19;13777:68;13302:549;;;;;:::o;13856:407::-;14058:2;14040:21;;;14097:2;14077:18;;;14070:30;14136:34;14131:2;14116:18;;14109:62;14207:13;14202:2;14187:18;;14180:41;14253:3;14238:19;;14030:233::o;14268:414::-;14470:2;14452:21;;;14509:2;14489:18;;;14482:30;14548:34;14543:2;14528:18;;14521:62;14619:20;14614:2;14599:18;;14592:48;14672:3;14657:19;;14442:240::o;14687:402::-;14889:2;14871:21;;;14928:2;14908:18;;;14901:30;14967:34;14962:2;14947:18;;14940:62;15038:8;15033:2;15018:18;;15011:36;15079:3;15064:19;;14861:228::o;15094:352::-;15296:2;15278:21;;;15335:2;15315:18;;;15308:30;15374;15369:2;15354:18;;15347:58;15437:2;15422:18;;15268:178::o;15451:415::-;15653:2;15635:21;;;15692:2;15672:18;;;15665:30;15731:34;15726:2;15711:18;;15704:62;15802:21;15797:2;15782:18;;15775:49;15856:3;15841:19;;15625:241::o;15871:400::-;16073:2;16055:21;;;16112:2;16092:18;;;16085:30;16151:34;16146:2;16131:18;;16124:62;16222:6;16217:2;16202:18;;16195:34;16261:3;16246:19;;16045:226::o;16276:349::-;16478:2;16460:21;;;16517:2;16497:18;;;16490:30;16556:27;16551:2;16536:18;;16529:55;16616:2;16601:18;;16450:175::o;16630:408::-;16832:2;16814:21;;;16871:2;16851:18;;;16844:30;16910:34;16905:2;16890:18;;16883:62;-1:-1:-1;;;16976:2:1;16961:18;;16954:42;17028:3;17013:19;;16804:234::o;17043:349::-;17245:2;17227:21;;;17284:2;17264:18;;;17257:30;17323:27;17318:2;17303:18;;17296:55;17383:2;17368:18;;17217:175::o;17397:350::-;17599:2;17581:21;;;17638:2;17618:18;;;17611:30;17677:28;17672:2;17657:18;;17650:56;17738:2;17723:18;;17571:176::o;17752:350::-;17954:2;17936:21;;;17993:2;17973:18;;;17966:30;18032:28;18027:2;18012:18;;18005:56;18093:2;18078:18;;17926:176::o;18107:420::-;18309:2;18291:21;;;18348:2;18328:18;;;18321:30;18387:34;18382:2;18367:18;;18360:62;18458:26;18453:2;18438:18;;18431:54;18517:3;18502:19;;18281:246::o;18532:406::-;18734:2;18716:21;;;18773:2;18753:18;;;18746:30;18812:34;18807:2;18792:18;;18785:62;18883:12;18878:2;18863:18;;18856:40;18928:3;18913:19;;18706:232::o;18943:405::-;19145:2;19127:21;;;19184:2;19164:18;;;19157:30;19223:34;19218:2;19203:18;;19196:62;19294:11;19289:2;19274:18;;19267:39;19338:3;19323:19;;19117:231::o;19353:356::-;19555:2;19537:21;;;19574:18;;;19567:30;19633:34;19628:2;19613:18;;19606:62;19700:2;19685:18;;19527:182::o;19714:397::-;19916:2;19898:21;;;19955:2;19935:18;;;19928:30;19994:34;19989:2;19974:18;;19967:62;20065:3;20060:2;20045:18;;20038:31;20101:3;20086:19;;19888:223::o;20116:408::-;20318:2;20300:21;;;20357:2;20337:18;;;20330:30;20396:34;20391:2;20376:18;;20369:62;-1:-1:-1;;;20462:2:1;20447:18;;20440:42;20514:3;20499:19;;20290:234::o;20529:356::-;20731:2;20713:21;;;20750:18;;;20743:30;20809:34;20804:2;20789:18;;20782:62;20876:2;20861:18;;20703:182::o;20890:345::-;21092:2;21074:21;;;21131:2;21111:18;;;21104:30;21170:23;21165:2;21150:18;;21143:51;21226:2;21211:18;;21064:171::o;21240:405::-;21442:2;21424:21;;;21481:2;21461:18;;;21454:30;21520:34;21515:2;21500:18;;21493:62;21591:11;21586:2;21571:18;;21564:39;21635:3;21620:19;;21414:231::o;21650:411::-;21852:2;21834:21;;;21891:2;21871:18;;;21864:30;21930:34;21925:2;21910:18;;21903:62;22001:17;21996:2;21981:18;;21974:45;22051:3;22036:19;;21824:237::o;22066:406::-;22268:2;22250:21;;;22307:2;22287:18;;;22280:30;22346:34;22341:2;22326:18;;22319:62;22417:12;22412:2;22397:18;;22390:40;22462:3;22447:19;;22240:232::o;22477:397::-;22679:2;22661:21;;;22718:2;22698:18;;;22691:30;22757:34;22752:2;22737:18;;22730:62;22828:3;22823:2;22808:18;;22801:31;22864:3;22849:19;;22651:223::o;22879:343::-;23081:2;23063:21;;;23120:2;23100:18;;;23093:30;23159:21;23154:2;23139:18;;23132:49;23213:2;23198:18;;23053:169::o;23227:340::-;23429:2;23411:21;;;23468:2;23448:18;;;23441:30;23507:18;23502:2;23487:18;;23480:46;23558:2;23543:18;;23401:166::o;23572:413::-;23774:2;23756:21;;;23813:2;23793:18;;;23786:30;23852:34;23847:2;23832:18;;23825:62;23923:19;23918:2;23903:18;;23896:47;23975:3;23960:19;;23746:239::o;23990:346::-;24192:2;24174:21;;;24231:2;24211:18;;;24204:30;24270:24;24265:2;24250:18;;24243:52;24327:2;24312:18;;24164:172::o;24341:408::-;24543:2;24525:21;;;24582:2;24562:18;;;24555:30;24621:34;24616:2;24601:18;;24594:62;24692:14;24687:2;24672:18;;24665:42;24739:3;24724:19;;24515:234::o;24754:347::-;24956:2;24938:21;;;24995:2;24975:18;;;24968:30;25034:25;25029:2;25014:18;;25007:53;25092:2;25077:18;;24928:173::o;25106:341::-;25308:2;25290:21;;;25347:2;25327:18;;;25320:30;25386:19;25381:2;25366:18;;25359:47;25438:2;25423:18;;25280:167::o;25452:344::-;25654:2;25636:21;;;25693:2;25673:18;;;25666:30;25732:22;25727:2;25712:18;;25705:50;25787:2;25772:18;;25626:170::o;25801:188::-;25975:6;25963:19;;;;25945:38;;25933:2;25918:18;;25900:89::o;26176:614::-;26455:18;26500:15;;;26482:34;;26552:15;;;;26547:2;26532:18;;26525:43;26615:1;26604:21;;;;26599:2;26584:18;;26577:49;26674:4;26662:17;26657:2;26642:18;;26635:45;26711:3;26696:19;;26689:35;26768:14;;26761:22;26755:3;26740:19;;26733:51;26432:3;26417:19;;26399:391::o;26795:224::-;;26862:6;26895:2;26892:1;26888:10;26925:2;26922:1;26918:10;26956:3;26952:2;26948:12;26943:3;26940:21;26937:2;;;26964:18;;:::i;:::-;27000:13;;26842:177;-1:-1:-1;;;;26842:177:1:o;27024:128::-;;27095:1;27091:6;27088:1;27085:13;27082:2;;;27101:18;;:::i;:::-;-1:-1:-1;27137:9:1;;27072:80::o;27157:120::-;;27223:1;27213:2;;27228:18;;:::i;:::-;-1:-1:-1;27262:9:1;;27203:74::o;27282:168::-;;27388:1;27384;27380:6;27376:14;27373:1;27370:21;27365:1;27358:9;27351:17;27347:45;27344:2;;;27395:18;;:::i;:::-;-1:-1:-1;27435:9:1;;27334:116::o;27455:125::-;;27523:1;27520;27517:8;27514:2;;;27528:18;;:::i;:::-;-1:-1:-1;27565:9:1;;27504:76::o;27585:258::-;27657:1;27667:113;27681:6;27678:1;27675:13;27667:113;;;27757:11;;;27751:18;27738:11;;;27731:39;27703:2;27696:10;27667:113;;;27798:6;27795:1;27792:13;27789:2;;;-1:-1:-1;;27833:1:1;27815:16;;27808:27;27638:205::o;27848:136::-;;27915:5;27905:2;;27924:18;;:::i;:::-;-1:-1:-1;;;27960:18:1;;27895:89::o;27989:437::-;28074:1;28064:12;;28121:1;28111:12;;;28132:2;;28186:4;28178:6;28174:17;28164:27;;28132:2;28239;28231:6;28228:14;28208:18;28205:38;28202:2;;;-1:-1:-1;;;28273:1:1;28266:88;28377:4;28374:1;28367:15;28405:4;28402:1;28395:15;28202:2;;28044:382;;;:::o;28431:135::-;;-1:-1:-1;;28491:17:1;;28488:2;;;28511:18;;:::i;:::-;-1:-1:-1;28558:1:1;28547:13;;28478:88::o;28571:175::-;;28652:4;28645:5;28641:16;28681:4;28672:7;28669:17;28666:2;;;28689:18;;:::i;:::-;28738:1;28725:15;;28616:130;-1:-1:-1;;28616:130:1:o;28751:112::-;;28809:1;28799:2;;28814:18;;:::i;:::-;-1:-1:-1;28848:9:1;;28789:74::o;28868:184::-;-1:-1:-1;;;28917:1:1;28910:88;29017:4;29014:1;29007:15;29041:4;29038:1;29031:15;29057:184;-1:-1:-1;;;29106:1:1;29099:88;29206:4;29203:1;29196:15;29230:4;29227:1;29220:15;29246:184;-1:-1:-1;;;29295:1:1;29288:88;29395:4;29392:1;29385:15;29419:4;29416:1;29409:15;29435:179;-1:-1:-1;;;;;;29515:5:1;29511:78;29504:5;29501:89;29491:2;;29604:1;29601;29594:12

Swarm Source

ipfs://1488ab625af533705ff63fad9a61e18d8aca930d5220f0ca3c3fb6b6fdbffef0
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.