ETH Price: $3,367.21 (+5.45%)
Gas: 9 Gwei

 

Overview

TokenID

25

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
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BooksOfYe

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-23
*/

// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: contracts/BooksOfYe.sol



pragma solidity ^0.8.0;






contract BooksOfYe is ERC1155, Ownable, ERC1155Burnable, ERC1155Supply {
    struct SaleEvent {
        uint256 price;
        bool isActive;
        bool isPreSale;
        bool isPublicSale;
        uint256 minCardId;
        uint256 maxCardId;
        mapping(address => bool) whitelist;
    }

    SaleEvent[] saleEvents;
    uint256[] public mintedCards;
       
    uint256 public maxSupply = 1000;
    uint256 public mintLimit = 8;
    string public baseURI;

    mapping(uint256 => string) private _URIS;
    mapping(address => uint256) public cardPurchaseTracker;
    mapping(address => bool) private luckTracker;



    constructor() ERC1155(baseURI) {
        SaleEvent storage saleEvent1 = saleEvents.push();
        SaleEvent storage saleEvent2 = saleEvents.push();
        SaleEvent storage saleEvent3 = saleEvents.push();
        SaleEvent storage saleEvent4 = saleEvents.push();
        SaleEvent storage saleEvent5 = saleEvents.push();
    }

    //Public Functions

    function preSaleMint(uint256 eventNumber, uint256 cardId) external payable {
        uint256 price = saleEvents[eventNumber].price;
        uint256 _maxSupply = maxSupply;
        uint256 minCardId = saleEvents[eventNumber].minCardId;
        uint256 maxCardId = saleEvents[eventNumber].maxCardId;

        require(saleEvents[eventNumber].whitelist[msg.sender],"You Aren't On The Whitelist");
        require(tx.origin == msg.sender, "No Proxy Contracts");
        require(saleEvents[eventNumber].isActive, "Sale Is Not Active");
        require(saleEvents[eventNumber].isPreSale && !saleEvents[eventNumber].isPublicSale, "PreSale Not Live");
        require(cardId >= minCardId && cardId <= maxCardId, "Card Not For Sale");
        require(_maxSupply - 1 >= 0, "Sold Out");
        require(!exists(cardId), "Card Is Already Minted");
        require(cardPurchaseTracker[msg.sender] != mintLimit,"Mint Limit Reached");
        require(msg.value >= price, "Not Enough Ether Sent");

        _mint(msg.sender, cardId, 1, "");


        maxSupply = _maxSupply - 1;
        cardPurchaseTracker[msg.sender] = cardPurchaseTracker[msg.sender] + 1;
        mintedCards.push(cardId);
        
        
}

    function publicMint(uint256 eventNumber, uint256 cardId) external payable {
        uint256 price = saleEvents[eventNumber].price;
        uint256 _maxSupply = maxSupply;
        uint256 minCardId = saleEvents[eventNumber].minCardId;
        uint256 maxCardId = saleEvents[eventNumber].maxCardId;

        require(tx.origin == msg.sender, "No Proxy Contracts");
        require(saleEvents[eventNumber].isActive, "Sale Is Not Active");
        require(!saleEvents[eventNumber].isPreSale && saleEvents[eventNumber].isPublicSale, "Public Not Live");
        require(cardId >= minCardId && cardId <= maxCardId,"Card Not For Sale");
        require(_maxSupply - 1 >= 0, "Sold Out");
        require(!exists(cardId), "Card Is Already Minted");
        require(cardPurchaseTracker[msg.sender] != mintLimit,"Mint Limit Reached");
        require(msg.value >= price, "Not Enough Ether Sent");

        _mint(msg.sender, cardId, 1, "");
                

        maxSupply = _maxSupply - 1;
        cardPurchaseTracker[msg.sender] = cardPurchaseTracker[msg.sender] + 1;
        mintedCards.push(cardId);


    }


    function checkWhitelist(uint256 eventNumber, address _address)
        external
        view
        returns (bool isUserWL)
    {
        isUserWL = saleEvents[eventNumber].whitelist[_address];
        return isUserWL;
    }


    function viewMintedCards() external view returns (uint256[] memory allMintedCards){
        allMintedCards = mintedCards;
        return allMintedCards;
    }

    //Only Owner Functions

    function setPriceAndInventory() external onlyOwner {
        
        saleEvents[0].price = 200000000000000000;
        saleEvents[1].price = 600000000000000000;
        saleEvents[2].price = 1800000000000000000;
        saleEvents[3].price = 5400000000000000000;
        saleEvents[4].price = 16200000000000000000;
        saleEvents[0].minCardId = 0;
        saleEvents[1].minCardId = 200;
        saleEvents[2].minCardId = 400;
        saleEvents[3].minCardId = 600;
        saleEvents[4].minCardId = 800;
        saleEvents[0].maxCardId = 199;
        saleEvents[1].maxCardId = 399;
        saleEvents[2].maxCardId = 599;
        saleEvents[3].maxCardId = 799;
        saleEvents[4].maxCardId = 999;

       
    }

    function batchGiftMint(
        address[] memory _addresses,
        uint256[] memory cardId
    ) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            require(
                cardId[i] < 1000,
                "The Card Number Selected Does Not Exist"
            );
            require(
                maxSupply - cardId.length >= 0,
                "Sorry, There Aren't Anymore Available Cards"
            );
            require(
                !exists(cardId[i]),
                "A Card Selected Already Belongs To Someone Else"
            );

            _mint(_addresses[i], cardId[i], 1, "0x");
            maxSupply = maxSupply - cardId.length;
            mintedCards.push(cardId[i]);
        }
    }

    function editMinMaxCardId(
        uint256 eventNumber,
        uint256 _newMin,
        uint256 _newMax
    ) external onlyOwner {
        require(
            _newMin >= 0 && _newMin < 999,
            "Your new minimum is either below 0 or over 999"
        );
        require(
            _newMax >= 0 && _newMax < 999,
            "Your new maximum is either below 0 or over 999"
        );
        require(
            _newMin != _newMax,
            "Your minimum and maximum cannot be the same number"
        );

        saleEvents[eventNumber].minCardId = _newMin;
        saleEvents[eventNumber].maxCardId = _newMax;
    }

    function editSaleStatus(
        uint256 eventNumber,
        bool _isActive,
        bool _isPreSale,
        bool _isPublicSale
    ) external onlyOwner {
        require(eventNumber <= 4);
        saleEvents[eventNumber].isActive = _isActive;
        saleEvents[eventNumber].isPreSale = _isPreSale;
        saleEvents[eventNumber].isPublicSale = _isPublicSale;
    }

    function alterMintLimit(uint256 newLimit) external onlyOwner {
        mintLimit = newLimit;
    }

    function viewSaleStatus(uint256 eventNumber)
        external
        view
        returns (
            uint256 price,
            bool isActive,
            bool isPreSale,
            bool isPublicSale,
            uint256 minCardId,
            uint256 maxCardId
        )
    {
        price = saleEvents[eventNumber].price;
        isActive = saleEvents[eventNumber].isActive;
        isPreSale = saleEvents[eventNumber].isPreSale;
        isPublicSale = saleEvents[eventNumber].isPublicSale;
        minCardId = saleEvents[eventNumber].minCardId;
        maxCardId = saleEvents[eventNumber].maxCardId;
        return (
            price,
            isActive,
            isPreSale,
            isPublicSale,
            minCardId,
            maxCardId
        );
    }

    function editSalePrice(uint256 eventNumber, uint256 _newPriceInWei)
        external
        onlyOwner
    {
        require(eventNumber <= 4);
        saleEvents[eventNumber].price = _newPriceInWei;
    }

    function batchAddToWhitelist(
        address[] memory _addresses,
        uint256 eventNumber
    ) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            saleEvents[eventNumber].whitelist[_addresses[i]] = true;
            
        }
    }

    function batchRemoveFromWhitelist(
        address[] memory _addresses,
        uint256 eventNumber
    ) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            require(
                saleEvents[eventNumber].whitelist[_addresses[i]] != false,
                "One of these users is already not on WL. Use the Check WhiteList function to solve"
            );
            saleEvents[eventNumber].whitelist[_addresses[i]] = false;
        
        }
    }

    function withdraw(address payable _to) public onlyOwner {
        require(_to != address(0), "Token cannot be zero address.");
        _to.transfer(address(this).balance);
    }

    function setTokenURI(string memory _newURI) public onlyOwner {
        baseURI = _newURI;
    }

    function contractURI() public pure returns (string memory) {
        return "ipfs://QmcCVnnRiy7TAgREHxKJJrcZLCSBmz2fYm1Lum5vjVY6Ge";
    }

    //Misc Functions
    
    function uri(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        if (bytes(_URIS[_tokenId]).length != 0) {
            return string(_URIS[_tokenId]);
        }
        return
            string(
                abi.encodePacked(baseURI, Strings.toString(_tokenId), ".json")
            );
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    fallback() external payable {}

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"alterMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","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":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"eventNumber","type":"uint256"}],"name":"batchAddToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"cardId","type":"uint256[]"}],"name":"batchGiftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"eventNumber","type":"uint256"}],"name":"batchRemoveFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cardPurchaseTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"isUserWL","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"uint256","name":"_newMin","type":"uint256"},{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"editMinMaxCardId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"uint256","name":"_newPriceInWei","type":"uint256"}],"name":"editSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"},{"internalType":"bool","name":"_isPreSale","type":"bool"},{"internalType":"bool","name":"_isPublicSale","type":"bool"}],"name":"editSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPriceAndInventory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setTokenURI","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewMintedCards","outputs":[{"internalType":"uint256[]","name":"allMintedCards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"}],"name":"viewSaleStatus","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isPreSale","type":"bool"},{"internalType":"bool","name":"isPublicSale","type":"bool"},{"internalType":"uint256","name":"minCardId","type":"uint256"},{"internalType":"uint256","name":"maxCardId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526103e8600755600880553480156200001b57600080fd5b50600980546200002b90620001fd565b80601f01602080910402602001604051908101604052809291908181526020018280546200005990620001fd565b8015620000aa5780601f106200007e57610100808354040283529160200191620000aa565b820191906000526020600020905b8154815290600101906020018083116200008c57829003601f168201915b5050505050620000c081620000e860201b60201c565b50620000d5620000cf62000101565b62000105565b600580546000829052810190556200023a565b8051620000fd90600290602084019062000157565b5050565b3390565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016590620001fd565b90600052602060002090601f016020900481019282620001895760008555620001d4565b82601f10620001a457805160ff1916838001178555620001d4565b82800160010185558215620001d4579182015b82811115620001d4578251825591602001919060010190620001b7565b50620001e2929150620001e6565b5090565b5b80821115620001e25760008155600101620001e7565b6002810460018216806200021257607f821691505b602082108114156200023457634e487b7160e01b600052602260045260246000fd5b50919050565b6140c2806200024a6000396000f3fe6080604052600436106102125760003560e01c8063715018a611610118578063d18ffd66116100a0578063e985e9c51161006f578063e985e9c5146105e5578063eca7518d14610605578063f242432a14610625578063f2fde38b14610645578063f5298aca1461066557610219565b8063d18ffd6614610588578063d5abeb011461059b578063e0df5b6f146105b0578063e8a3d485146105d057610219565b8063996517cf116100e7578063996517cf146104f3578063a22cb46514610508578063bd85b03914610528578063bfb9639d14610548578063cf69cd861461056857610219565b8063715018a6146104945780638da5cb5b146104a9578063906ad486146104cb57806398ae99a8146104e057610219565b80633a35e0011161019b57806351cff8d91161016a57806351cff8d9146103ed5780636a04b12c1461040d5780636ac4564d1461043f5780636b20c4541461045f5780636c0360eb1461047f57610219565b80633a35e001146103605780633d1cabd1146103805780634e1273f4146103a05780634f558e79146103cd57610219565b80630e89341c116101e25780630e89341c146102b35780630ed2cfff146102e05780632eb2c2d6146103005780632f5c66eb146103205780633858552d1461034057610219565b8062fdd58e1461021b57806301ffc9a714610251578063068080e21461027e57806307da09881461029e57610219565b3661021957005b005b34801561022757600080fd5b5061023b6102363660046130be565b610685565b6040516102489190613dc7565b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046131c1565b6106dc565b6040516102489190613543565b34801561028a57600080fd5b5061021961029936600461327b565b610724565b3480156102aa57600080fd5b50610219610855565b3480156102bf57600080fd5b506102d36102ce36600461323f565b610c17565b604051610248919061354e565b3480156102ec57600080fd5b506102196102fb36600461311d565b610d0b565b34801561030c57600080fd5b5061021961031b366004612f06565b610efc565b34801561032c57600080fd5b5061023b61033b366004612eb2565b610f5a565b34801561034c57600080fd5b5061021961035b36600461323f565b610f6c565b34801561036c57600080fd5b5061021961037b36600461317e565b610fb0565b34801561038c57600080fd5b5061023b61039b36600461323f565b611095565b3480156103ac57600080fd5b506103c06103bb36600461311d565b6110b6565b604051610248919061350b565b3480156103d957600080fd5b506102716103e836600461323f565b6111d6565b3480156103f957600080fd5b50610219610408366004612eb2565b6111e9565b34801561041957600080fd5b5061042d61042836600461323f565b611287565b60405161024896959493929190613dd0565b34801561044b57600080fd5b5061021961045a36600461317e565b6113fe565b34801561046b57600080fd5b5061021961047a366004613017565b61157a565b34801561048b57600080fd5b506102d36115cf565b3480156104a057600080fd5b5061021961165d565b3480156104b557600080fd5b506104be6116a8565b6040516102489190613454565b3480156104d757600080fd5b506103c06116b8565b6102196104ee3660046132c7565b611710565b3480156104ff57600080fd5b5061023b611a35565b34801561051457600080fd5b5061021961052336600461308a565b611a3b565b34801561053457600080fd5b5061023b61054336600461323f565b611a4d565b34801561055457600080fd5b506102196105633660046132c7565b611a5f565b34801561057457600080fd5b50610271610583366004613257565b611ae3565b6102196105963660046132c7565b611b3a565b3480156105a757600080fd5b5061023b611d5e565b3480156105bc57600080fd5b506102196105cb3660046131f9565b611d64565b3480156105dc57600080fd5b506102d3611db6565b3480156105f157600080fd5b50610271610600366004612ece565b611dd6565b34801561061157600080fd5b506102196106203660046132e8565b611e04565b34801561063157600080fd5b50610219610640366004612fb0565b611f18565b34801561065157600080fd5b50610219610660366004612eb2565b611f6f565b34801561067157600080fd5b506102196106803660046130e9565b611fe0565b60006001600160a01b0383166106b65760405162461bcd60e51b81526004016106ad906135fd565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061070d57506001600160e01b031982166303a24d0760e21b145b8061071c575061071c82612035565b90505b919050565b61072c61204e565b6001600160a01b031661073d6116a8565b6001600160a01b0316146107635760405162461bcd60e51b81526004016106ad90613a8b565b600484111561077157600080fd5b826005858154811061079357634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160006101000a81548160ff02191690831515021790555081600585815481106107dd57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160016101000a81548160ff021916908315150217905550806005858154811061082757634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160026101000a81548160ff02191690831515021790555050505050565b61085d61204e565b6001600160a01b031661086e6116a8565b6001600160a01b0316146108945760405162461bcd60e51b81526004016106ad90613a8b565b6702c68af0bb14000060056000815481106108bf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550670853a0d2313c000060056001815481106108ff57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001819055506718fae27693b40000600560028154811061093f57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550674af0a763bb1c0000600560038154811061097f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016000018190555067e0d1f62b3154000060056004815481106109bf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550600060056000815481106109f857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002018190555060c86005600181548110610a3157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506101906005600281548110610a6b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506102586005600381548110610aa557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506103206005600481548110610adf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002018190555060c76005600081548110610b1857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003018190555061018f6005600181548110610b5257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301819055506102576005600281548110610b8c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003018190555061031f6005600381548110610bc657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301819055506103e76005600481548110610c0057634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030181905550565b6000818152600a60205260409020805460609190610c3490613ed5565b159050610cd9576000828152600a602052604090208054610c5490613ed5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090613ed5565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b5050505050905061071f565b6009610ce483612052565b604051602001610cf59291906133a6565b6040516020818303038152906040529050919050565b610d1361204e565b6001600160a01b0316610d246116a8565b6001600160a01b031614610d4a5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef7576103e8828281518110610d7957634e487b7160e01b600052603260045260246000fd5b602002602001015110610d9e5760405162461bcd60e51b81526004016106ad90613bb0565b60008251600754610daf9190613e8e565b1015610dcd5760405162461bcd60e51b81526004016106ad90613b17565b610dfd828281518110610df057634e487b7160e01b600052603260045260246000fd5b60200260200101516111d6565b15610e1a5760405162461bcd60e51b81526004016106ad90613c89565b610e8f838281518110610e3d57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610e6557634e487b7160e01b600052603260045260246000fd5b6020026020010151600160405180604001604052806002815260200161060f60f31b815250612175565b8151600754610e9e9190613e8e565b6007819055506006828281518110610ec657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845291909220015580610eef81613f10565b915050610d4d565b505050565b610f0461204e565b6001600160a01b0316856001600160a01b03161480610f2a5750610f2a8561060061204e565b610f465760405162461bcd60e51b81526004016106ad906138c4565b610f538585858585612264565b5050505050565b600b6020526000908152604090205481565b610f7461204e565b6001600160a01b0316610f856116a8565b6001600160a01b031614610fab5760405162461bcd60e51b81526004016106ad90613a8b565b600855565b610fb861204e565b6001600160a01b0316610fc96116a8565b6001600160a01b031614610fef5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef75760016005838154811061101e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600085848151811061105157634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061108d81613f10565b915050610ff2565b600681815481106110a557600080fd5b600091825260209091200154905081565b606081518351146110d95760405162461bcd60e51b81526004016106ad90613c40565b6000835167ffffffffffffffff81111561110357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561112c578160200160208202803683370190505b50905060005b84518110156111ce5761119385828151811061115e57634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061118657634e487b7160e01b600052603260045260246000fd5b6020026020010151610685565b8282815181106111b357634e487b7160e01b600052603260045260246000fd5b60209081029190910101526111c781613f10565b9050611132565b509392505050565b6000806111e283611a4d565b1192915050565b6111f161204e565b6001600160a01b03166112026116a8565b6001600160a01b0316146112285760405162461bcd60e51b81526004016106ad90613a8b565b6001600160a01b03811661124e5760405162461bcd60e51b81526004016106ad90613d61565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611283573d6000803e3d6000fd5b5050565b600080600080600080600587815481106112b157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001549550600587815481106112e657634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160009054906101000a900460ff1694506005878154811061132857634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff1693506005878154811061136a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff169250600587815481106113ac57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201549150600587815481106113e157634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030154905091939550919395565b61140661204e565b6001600160a01b03166114176116a8565b6001600160a01b03161461143d5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef7576005828154811061146a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600084838151811061149d57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166114e05760405162461bcd60e51b81526004016106ad906136f4565b60006005838154811061150357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600085848151811061153657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061157281613f10565b915050611440565b61158261204e565b6001600160a01b0316836001600160a01b031614806115a857506115a88361060061204e565b6115c45760405162461bcd60e51b81526004016106ad9061376c565b610ef7838383612435565b600980546115dc90613ed5565b80601f016020809104026020016040519081016040528092919081815260200182805461160890613ed5565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b505050505081565b61166561204e565b6001600160a01b03166116766116a8565b6001600160a01b03161461169c5760405162461bcd60e51b81526004016106ad90613a8b565b6116a660006125e6565b565b6003546001600160a01b03165b90565b6060600680548060200260200160405190810160405280929190818152602001828054801561170657602002820191906000526020600020905b8154815260200190600101908083116116f2575b5050505050905090565b60006005838154811061173357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016000015490506000600754905060006005858154811061177157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015490506000600586815481106117a857634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600590920201015490503233146117dd5760405162461bcd60e51b81526004016106ad90613916565b600586815481106117fe57634e487b7160e01b600052603260045260246000fd5b600091825260209091206001600590920201015460ff166118315760405162461bcd60e51b81526004016106ad90613ac0565b6005868154811061185257634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff161580156118ba57506005868154811061189a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff165b6118d65760405162461bcd60e51b81526004016106ad9061399e565b8185101580156118e65750808511155b6119025760405162461bcd60e51b81526004016106ad90613aec565b600061190f600185613e8e565b101561192d5760405162461bcd60e51b81526004016106ad90613648565b611936856111d6565b156119535760405162461bcd60e51b81526004016106ad90613942565b600854336000908152600b602052604090205414156119845760405162461bcd60e51b81526004016106ad90613972565b833410156119a45760405162461bcd60e51b81526004016106ad90613d98565b6119c03386600160405180602001604052806000815250612175565b6119cb600184613e8e565b600755336000908152600b60205260409020546119e9906001613e62565b336000908152600b60205260408120919091556006805460018101825591527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01949094555050505050565b60085481565b611283611a4661204e565b8383612638565b60009081526004602052604090205490565b611a6761204e565b6001600160a01b0316611a786116a8565b6001600160a01b031614611a9e5760405162461bcd60e51b81526004016106ad90613a8b565b6004821115611aac57600080fd5b8060058381548110611ace57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600590910201555050565b600060058381548110611b0657634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600160a01b03861684526004600590930201919091019052604090205460ff16905092915050565b600060058381548110611b5d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000154905060006007549050600060058581548110611b9b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201549050600060058681548110611bd257634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030154905060058681548110611c0757634e487b7160e01b600052603260045260246000fd5b600091825260208083203384526004600590930201919091019052604090205460ff16611c465760405162461bcd60e51b81526004016106ad90613a54565b323314611c655760405162461bcd60e51b81526004016106ad90613916565b60058681548110611c8657634e487b7160e01b600052603260045260246000fd5b600091825260209091206001600590920201015460ff16611cb95760405162461bcd60e51b81526004016106ad90613ac0565b60058681548110611cda57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff168015611d42575060058681548110611d2157634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff16155b6118d65760405162461bcd60e51b81526004016106ad9061389a565b60075481565b611d6c61204e565b6001600160a01b0316611d7d6116a8565b6001600160a01b031614611da35760405162461bcd60e51b81526004016106ad90613a8b565b8051611283906009906020840190612cbc565b606060405180606001604052806035815260200161405860359139905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b611e0c61204e565b6001600160a01b0316611e1d6116a8565b6001600160a01b031614611e435760405162461bcd60e51b81526004016106ad90613a8b565b6103e78210611e645760405162461bcd60e51b81526004016106ad906137b5565b6103e78110611e855760405162461bcd60e51b81526004016106ad90613b62565b80821415611ea55760405162461bcd60e51b81526004016106ad90613803565b8160058481548110611ec757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055508060058481548110611efe57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030181905550505050565b611f2061204e565b6001600160a01b0316856001600160a01b03161480611f465750611f468561060061204e565b611f625760405162461bcd60e51b81526004016106ad9061376c565b610f5385858585856126db565b611f7761204e565b6001600160a01b0316611f886116a8565b6001600160a01b031614611fae5760405162461bcd60e51b81526004016106ad90613a8b565b6001600160a01b038116611fd45760405162461bcd60e51b81526004016106ad9061366a565b611fdd816125e6565b50565b611fe861204e565b6001600160a01b0316836001600160a01b0316148061200e575061200e8361060061204e565b61202a5760405162461bcd60e51b81526004016106ad9061376c565b610ef783838361280f565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b60608161207757506040805180820190915260018152600360fc1b602082015261071f565b8160005b81156120a1578061208b81613f10565b915061209a9050600a83613e7a565b915061207b565b60008167ffffffffffffffff8111156120ca57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120f4576020820181803683370190505b5090505b841561216d57612109600183613e8e565b9150612116600a86613f2b565b612121906030613e62565b60f81b81838151811061214457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612166600a86613e7a565b94506120f8565b949350505050565b6001600160a01b03841661219b5760405162461bcd60e51b81526004016106ad90613d20565b60006121a561204e565b90506121c6816000876121b78861291e565b6121c08861291e565b87612977565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906121f6908490613e62565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161224d929190613dfa565b60405180910390a4610f5381600087878787612985565b81518351146122855760405162461bcd60e51b81526004016106ad90613cd8565b6001600160a01b0384166122ab5760405162461bcd60e51b81526004016106ad90613855565b60006122b561204e565b90506122c5818787878787612977565b60005b84518110156123c75760008582815181106122f357634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061231f57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561236f5760405162461bcd60e51b81526004016106ad90613a0a565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906123ac908490613e62565b92505081905550505050806123c090613f10565b90506122c8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161241792919061351e565b60405180910390a461242d818787878787612a93565b505050505050565b6001600160a01b03831661245b5760405162461bcd60e51b81526004016106ad906139c7565b805182511461247c5760405162461bcd60e51b81526004016106ad90613cd8565b600061248661204e565b90506124a681856000868660405180602001604052806000815250612977565b60005b83518110156125875760008482815181106124d457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061250057634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156125505760405162461bcd60e51b81526004016106ad906136b0565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061257f81613f10565b9150506124a9565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516125d892919061351e565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561266a5760405162461bcd60e51b81526004016106ad90613bf7565b6001600160a01b0383811660008181526001602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906126ce908590613543565b60405180910390a3505050565b6001600160a01b0384166127015760405162461bcd60e51b81526004016106ad90613855565b600061270b61204e565b905061271c8187876121b78861291e565b6000848152602081815260408083206001600160a01b038a1684529091529020548381101561275d5760405162461bcd60e51b81526004016106ad90613a0a565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061279a908490613e62565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516127f0929190613dfa565b60405180910390a4612806828888888888612985565b50505050505050565b6001600160a01b0383166128355760405162461bcd60e51b81526004016106ad906139c7565b600061283f61204e565b905061286f818560006128518761291e565b61285a8761291e565b60405180602001604052806000815250612977565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156128b05760405162461bcd60e51b81526004016106ad906136b0565b6000848152602081815260408083206001600160a01b03808a16808652919093528184208786039055905190918516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061290f9089908990613dfa565b60405180910390a45050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061296657634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b61242d868686868686612b64565b612997846001600160a01b0316612cb6565b1561242d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129d090899089908890889088906004016134c6565b602060405180830381600087803b1580156129ea57600080fd5b505af1925050508015612a1a575060408051601f3d908101601f19168201909252612a17918101906131dd565b60015b612a6357612a26613f87565b80612a315750612a4b565b8060405162461bcd60e51b81526004016106ad919061354e565b60405162461bcd60e51b81526004016106ad90613561565b6001600160e01b0319811663f23a6e6160e01b146128065760405162461bcd60e51b81526004016106ad906135b5565b612aa5846001600160a01b0316612cb6565b1561242d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612ade9089908990889088908890600401613468565b602060405180830381600087803b158015612af857600080fd5b505af1925050508015612b28575060408051601f3d908101601f19168201909252612b25918101906131dd565b60015b612b3457612a26613f87565b6001600160e01b0319811663bc197c8160e01b146128065760405162461bcd60e51b81526004016106ad906135b5565b612b7286868686868661242d565b6001600160a01b038516612c155760005b8351811015612c1357828181518110612bac57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000868481518110612bd857634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612bfd9190613e62565b90915550612c0c905081613f10565b9050612b83565b505b6001600160a01b03841661242d5760005b835181101561280657828181518110612c4f57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000868481518110612c7b57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612ca09190613e8e565b90915550612caf905081613f10565b9050612c26565b3b151590565b828054612cc890613ed5565b90600052602060002090601f016020900481019282612cea5760008555612d30565b82601f10612d0357805160ff1916838001178555612d30565b82800160010185558215612d30579182015b82811115612d30578251825591602001919060010190612d15565b50612d3c929150612d40565b5090565b5b80821115612d3c5760008155600101612d41565b600067ffffffffffffffff831115612d6f57612d6f613f6b565b612d82601f8401601f1916602001613e08565b9050828152838383011115612d9657600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dbd578081fd5b81356020612dd2612dcd83613e32565b613e08565b8281528181019085830183850287018401881015612dee578586fd5b855b85811015612e15578135612e038161402c565b84529284019290840190600101612df0565b5090979650505050505050565b600082601f830112612e32578081fd5b81356020612e42612dcd83613e32565b8281528181019085830183850287018401881015612e5e578586fd5b855b85811015612e1557813584529284019290840190600101612e60565b8035801515811461071f57600080fd5b600082601f830112612e9c578081fd5b612eab83833560208501612d55565b9392505050565b600060208284031215612ec3578081fd5b8135612eab8161402c565b60008060408385031215612ee0578081fd5b8235612eeb8161402c565b91506020830135612efb8161402c565b809150509250929050565b600080600080600060a08688031215612f1d578081fd5b8535612f288161402c565b94506020860135612f388161402c565b9350604086013567ffffffffffffffff80821115612f54578283fd5b612f6089838a01612e22565b94506060880135915080821115612f75578283fd5b612f8189838a01612e22565b93506080880135915080821115612f96578283fd5b50612fa388828901612e8c565b9150509295509295909350565b600080600080600060a08688031215612fc7578081fd5b8535612fd28161402c565b94506020860135612fe28161402c565b93506040860135925060608601359150608086013567ffffffffffffffff81111561300b578182fd5b612fa388828901612e8c565b60008060006060848603121561302b578283fd5b83356130368161402c565b9250602084013567ffffffffffffffff80821115613052578384fd5b61305e87838801612e22565b93506040860135915080821115613073578283fd5b5061308086828701612e22565b9150509250925092565b6000806040838503121561309c578182fd5b82356130a78161402c565b91506130b560208401612e7c565b90509250929050565b600080604083850312156130d0578081fd5b82356130db8161402c565b946020939093013593505050565b6000806000606084860312156130fd578081fd5b83356131088161402c565b95602085013595506040909401359392505050565b6000806040838503121561312f578182fd5b823567ffffffffffffffff80821115613146578384fd5b61315286838701612dad565b93506020850135915080821115613167578283fd5b5061317485828601612e22565b9150509250929050565b60008060408385031215613190578182fd5b823567ffffffffffffffff8111156131a6578283fd5b6131b285828601612dad565b95602094909401359450505050565b6000602082840312156131d2578081fd5b8135612eab81614041565b6000602082840312156131ee578081fd5b8151612eab81614041565b60006020828403121561320a578081fd5b813567ffffffffffffffff811115613220578182fd5b8201601f81018413613230578182fd5b61216d84823560208401612d55565b600060208284031215613250578081fd5b5035919050565b60008060408385031215613269578182fd5b823591506020830135612efb8161402c565b60008060008060808587031215613290578182fd5b843593506132a060208601612e7c565b92506132ae60408601612e7c565b91506132bc60608601612e7c565b905092959194509250565b600080604083850312156132d9578182fd5b50508035926020909101359150565b6000806000606084860312156132fc578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561334257815187529582019590820190600101613326565b509495945050505050565b60008151808452613365816020860160208601613ea5565b601f01601f19169290920160200192915050565b6000815161338b818560208601613ea5565b9290920192915050565b64173539b7b760d91b815260050190565b82546000908190600281046001808316806133c257607f831692505b60208084108214156133e257634e487b7160e01b87526022600452602487fd5b8180156133f6576001811461340757613433565b60ff19861689528489019650613433565b6134108b613e56565b885b8681101561342b5781548b820152908501908301613412565b505084890196505b50505050505061344b6134468286613379565b613395565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061349490830186613313565b82810360608401526134a68186613313565b905082810360808401526134ba818561334d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906135009083018461334d565b979650505050505050565b600060208252612eab6020830184613313565b6000604082526135316040830185613313565b828103602084015261344b8185613313565b901515815260200190565b600060208252612eab602083018461334d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526008908201526714dbdb190813dd5d60c21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526052908201527f4f6e65206f6620746865736520757365727320697320616c7265616479206e6f60408201527f74206f6e20574c2e205573652074686520436865636b2057686974654c6973746060820152712066756e6374696f6e20746f20736f6c766560701b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252602e908201527f596f7572206e6577206d696e696d756d206973206569746865722062656c6f7760408201526d2030206f72206f7665722039393960901b606082015260800190565b60208082526032908201527f596f7572206d696e696d756d20616e64206d6178696d756d2063616e6e6f74206040820152713132903a34329039b0b6b290373ab6b132b960711b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526010908201526f50726553616c65204e6f74204c69766560801b604082015260600190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252601290820152714e6f2050726f787920436f6e74726163747360701b604082015260600190565b60208082526016908201527510d85c9908125cc8105b1c9958591e48135a5b9d195960521b604082015260600190565b602080825260129082015271135a5b9d08131a5b5a5d0814995858da195960721b604082015260600190565b6020808252600f908201526e5075626c6963204e6f74204c69766560881b604082015260600190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252601b908201527f596f75204172656e2774204f6e205468652057686974656c6973740000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527153616c65204973204e6f742041637469766560701b604082015260600190565b60208082526011908201527043617264204e6f7420466f722053616c6560781b604082015260600190565b6020808252602b908201527f536f7272792c205468657265204172656e277420416e796d6f7265204176616960408201526a6c61626c6520436172647360a81b606082015260800190565b6020808252602e908201527f596f7572206e6577206d6178696d756d206973206569746865722062656c6f7760408201526d2030206f72206f7665722039393960901b606082015260800190565b60208082526027908201527f5468652043617264204e756d6265722053656c656374656420446f6573204e6f6040820152661d08115e1a5cdd60ca1b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252602f908201527f4120436172642053656c656374656420416c72656164792042656c6f6e67732060408201526e546f20536f6d656f6e6520456c736560881b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601d908201527f546f6b656e2063616e6e6f74206265207a65726f20616464726573732e000000604082015260600190565b602080825260159082015274139bdd08115b9bdd59da08115d1a195c8814d95b9d605a1b604082015260600190565b90815260200190565b9586529315156020860152911515604085015215156060840152608083015260a082015260c00190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613e2a57613e2a613f6b565b604052919050565b600067ffffffffffffffff821115613e4c57613e4c613f6b565b5060209081020190565b60009081526020902090565b60008219821115613e7557613e75613f3f565b500190565b600082613e8957613e89613f55565b500490565b600082821015613ea057613ea0613f3f565b500390565b60005b83811015613ec0578181015183820152602001613ea8565b83811115613ecf576000848401525b50505050565b600281046001821680613ee957607f821691505b60208210811415613f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2457613f24613f3f565b5060010190565b600082613f3a57613f3a613f55565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015613f97576116b5565b600481823e6308c379a0613fab8251613f81565b14613fb5576116b5565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715613fe557505050506116b5565b82840192508251915080821115613fff57505050506116b5565b503d83016020828401011115614017575050506116b5565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114611fdd57600080fd5b6001600160e01b031981168114611fdd57600080fdfe697066733a2f2f516d6343566e6e52697937544167524548784b4a4a72635a4c4353426d7a3266596d314c756d35766a5659364765a2646970667358221220be0c0f53b4fb89bb9bef4324049c1ae635488e110fe2178c0d7c2ecdde97e5d664736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102125760003560e01c8063715018a611610118578063d18ffd66116100a0578063e985e9c51161006f578063e985e9c5146105e5578063eca7518d14610605578063f242432a14610625578063f2fde38b14610645578063f5298aca1461066557610219565b8063d18ffd6614610588578063d5abeb011461059b578063e0df5b6f146105b0578063e8a3d485146105d057610219565b8063996517cf116100e7578063996517cf146104f3578063a22cb46514610508578063bd85b03914610528578063bfb9639d14610548578063cf69cd861461056857610219565b8063715018a6146104945780638da5cb5b146104a9578063906ad486146104cb57806398ae99a8146104e057610219565b80633a35e0011161019b57806351cff8d91161016a57806351cff8d9146103ed5780636a04b12c1461040d5780636ac4564d1461043f5780636b20c4541461045f5780636c0360eb1461047f57610219565b80633a35e001146103605780633d1cabd1146103805780634e1273f4146103a05780634f558e79146103cd57610219565b80630e89341c116101e25780630e89341c146102b35780630ed2cfff146102e05780632eb2c2d6146103005780632f5c66eb146103205780633858552d1461034057610219565b8062fdd58e1461021b57806301ffc9a714610251578063068080e21461027e57806307da09881461029e57610219565b3661021957005b005b34801561022757600080fd5b5061023b6102363660046130be565b610685565b6040516102489190613dc7565b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046131c1565b6106dc565b6040516102489190613543565b34801561028a57600080fd5b5061021961029936600461327b565b610724565b3480156102aa57600080fd5b50610219610855565b3480156102bf57600080fd5b506102d36102ce36600461323f565b610c17565b604051610248919061354e565b3480156102ec57600080fd5b506102196102fb36600461311d565b610d0b565b34801561030c57600080fd5b5061021961031b366004612f06565b610efc565b34801561032c57600080fd5b5061023b61033b366004612eb2565b610f5a565b34801561034c57600080fd5b5061021961035b36600461323f565b610f6c565b34801561036c57600080fd5b5061021961037b36600461317e565b610fb0565b34801561038c57600080fd5b5061023b61039b36600461323f565b611095565b3480156103ac57600080fd5b506103c06103bb36600461311d565b6110b6565b604051610248919061350b565b3480156103d957600080fd5b506102716103e836600461323f565b6111d6565b3480156103f957600080fd5b50610219610408366004612eb2565b6111e9565b34801561041957600080fd5b5061042d61042836600461323f565b611287565b60405161024896959493929190613dd0565b34801561044b57600080fd5b5061021961045a36600461317e565b6113fe565b34801561046b57600080fd5b5061021961047a366004613017565b61157a565b34801561048b57600080fd5b506102d36115cf565b3480156104a057600080fd5b5061021961165d565b3480156104b557600080fd5b506104be6116a8565b6040516102489190613454565b3480156104d757600080fd5b506103c06116b8565b6102196104ee3660046132c7565b611710565b3480156104ff57600080fd5b5061023b611a35565b34801561051457600080fd5b5061021961052336600461308a565b611a3b565b34801561053457600080fd5b5061023b61054336600461323f565b611a4d565b34801561055457600080fd5b506102196105633660046132c7565b611a5f565b34801561057457600080fd5b50610271610583366004613257565b611ae3565b6102196105963660046132c7565b611b3a565b3480156105a757600080fd5b5061023b611d5e565b3480156105bc57600080fd5b506102196105cb3660046131f9565b611d64565b3480156105dc57600080fd5b506102d3611db6565b3480156105f157600080fd5b50610271610600366004612ece565b611dd6565b34801561061157600080fd5b506102196106203660046132e8565b611e04565b34801561063157600080fd5b50610219610640366004612fb0565b611f18565b34801561065157600080fd5b50610219610660366004612eb2565b611f6f565b34801561067157600080fd5b506102196106803660046130e9565b611fe0565b60006001600160a01b0383166106b65760405162461bcd60e51b81526004016106ad906135fd565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061070d57506001600160e01b031982166303a24d0760e21b145b8061071c575061071c82612035565b90505b919050565b61072c61204e565b6001600160a01b031661073d6116a8565b6001600160a01b0316146107635760405162461bcd60e51b81526004016106ad90613a8b565b600484111561077157600080fd5b826005858154811061079357634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160006101000a81548160ff02191690831515021790555081600585815481106107dd57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160016101000a81548160ff021916908315150217905550806005858154811061082757634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160026101000a81548160ff02191690831515021790555050505050565b61085d61204e565b6001600160a01b031661086e6116a8565b6001600160a01b0316146108945760405162461bcd60e51b81526004016106ad90613a8b565b6702c68af0bb14000060056000815481106108bf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550670853a0d2313c000060056001815481106108ff57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001819055506718fae27693b40000600560028154811061093f57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550674af0a763bb1c0000600560038154811061097f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016000018190555067e0d1f62b3154000060056004815481106109bf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000181905550600060056000815481106109f857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002018190555060c86005600181548110610a3157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506101906005600281548110610a6b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506102586005600381548110610aa557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055506103206005600481548110610adf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002018190555060c76005600081548110610b1857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003018190555061018f6005600181548110610b5257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301819055506102576005600281548110610b8c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003018190555061031f6005600381548110610bc657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301819055506103e76005600481548110610c0057634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030181905550565b6000818152600a60205260409020805460609190610c3490613ed5565b159050610cd9576000828152600a602052604090208054610c5490613ed5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090613ed5565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b5050505050905061071f565b6009610ce483612052565b604051602001610cf59291906133a6565b6040516020818303038152906040529050919050565b610d1361204e565b6001600160a01b0316610d246116a8565b6001600160a01b031614610d4a5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef7576103e8828281518110610d7957634e487b7160e01b600052603260045260246000fd5b602002602001015110610d9e5760405162461bcd60e51b81526004016106ad90613bb0565b60008251600754610daf9190613e8e565b1015610dcd5760405162461bcd60e51b81526004016106ad90613b17565b610dfd828281518110610df057634e487b7160e01b600052603260045260246000fd5b60200260200101516111d6565b15610e1a5760405162461bcd60e51b81526004016106ad90613c89565b610e8f838281518110610e3d57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610e6557634e487b7160e01b600052603260045260246000fd5b6020026020010151600160405180604001604052806002815260200161060f60f31b815250612175565b8151600754610e9e9190613e8e565b6007819055506006828281518110610ec657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845291909220015580610eef81613f10565b915050610d4d565b505050565b610f0461204e565b6001600160a01b0316856001600160a01b03161480610f2a5750610f2a8561060061204e565b610f465760405162461bcd60e51b81526004016106ad906138c4565b610f538585858585612264565b5050505050565b600b6020526000908152604090205481565b610f7461204e565b6001600160a01b0316610f856116a8565b6001600160a01b031614610fab5760405162461bcd60e51b81526004016106ad90613a8b565b600855565b610fb861204e565b6001600160a01b0316610fc96116a8565b6001600160a01b031614610fef5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef75760016005838154811061101e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600085848151811061105157634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061108d81613f10565b915050610ff2565b600681815481106110a557600080fd5b600091825260209091200154905081565b606081518351146110d95760405162461bcd60e51b81526004016106ad90613c40565b6000835167ffffffffffffffff81111561110357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561112c578160200160208202803683370190505b50905060005b84518110156111ce5761119385828151811061115e57634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061118657634e487b7160e01b600052603260045260246000fd5b6020026020010151610685565b8282815181106111b357634e487b7160e01b600052603260045260246000fd5b60209081029190910101526111c781613f10565b9050611132565b509392505050565b6000806111e283611a4d565b1192915050565b6111f161204e565b6001600160a01b03166112026116a8565b6001600160a01b0316146112285760405162461bcd60e51b81526004016106ad90613a8b565b6001600160a01b03811661124e5760405162461bcd60e51b81526004016106ad90613d61565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611283573d6000803e3d6000fd5b5050565b600080600080600080600587815481106112b157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001549550600587815481106112e657634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160009054906101000a900460ff1694506005878154811061132857634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff1693506005878154811061136a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff169250600587815481106113ac57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201549150600587815481106113e157634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030154905091939550919395565b61140661204e565b6001600160a01b03166114176116a8565b6001600160a01b03161461143d5760405162461bcd60e51b81526004016106ad90613a8b565b60005b8251811015610ef7576005828154811061146a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600084838151811061149d57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166114e05760405162461bcd60e51b81526004016106ad906136f4565b60006005838154811061150357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600401600085848151811061153657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061157281613f10565b915050611440565b61158261204e565b6001600160a01b0316836001600160a01b031614806115a857506115a88361060061204e565b6115c45760405162461bcd60e51b81526004016106ad9061376c565b610ef7838383612435565b600980546115dc90613ed5565b80601f016020809104026020016040519081016040528092919081815260200182805461160890613ed5565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b505050505081565b61166561204e565b6001600160a01b03166116766116a8565b6001600160a01b03161461169c5760405162461bcd60e51b81526004016106ad90613a8b565b6116a660006125e6565b565b6003546001600160a01b03165b90565b6060600680548060200260200160405190810160405280929190818152602001828054801561170657602002820191906000526020600020905b8154815260200190600101908083116116f2575b5050505050905090565b60006005838154811061173357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016000015490506000600754905060006005858154811061177157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015490506000600586815481106117a857634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600590920201015490503233146117dd5760405162461bcd60e51b81526004016106ad90613916565b600586815481106117fe57634e487b7160e01b600052603260045260246000fd5b600091825260209091206001600590920201015460ff166118315760405162461bcd60e51b81526004016106ad90613ac0565b6005868154811061185257634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff161580156118ba57506005868154811061189a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff165b6118d65760405162461bcd60e51b81526004016106ad9061399e565b8185101580156118e65750808511155b6119025760405162461bcd60e51b81526004016106ad90613aec565b600061190f600185613e8e565b101561192d5760405162461bcd60e51b81526004016106ad90613648565b611936856111d6565b156119535760405162461bcd60e51b81526004016106ad90613942565b600854336000908152600b602052604090205414156119845760405162461bcd60e51b81526004016106ad90613972565b833410156119a45760405162461bcd60e51b81526004016106ad90613d98565b6119c03386600160405180602001604052806000815250612175565b6119cb600184613e8e565b600755336000908152600b60205260409020546119e9906001613e62565b336000908152600b60205260408120919091556006805460018101825591527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01949094555050505050565b60085481565b611283611a4661204e565b8383612638565b60009081526004602052604090205490565b611a6761204e565b6001600160a01b0316611a786116a8565b6001600160a01b031614611a9e5760405162461bcd60e51b81526004016106ad90613a8b565b6004821115611aac57600080fd5b8060058381548110611ace57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600590910201555050565b600060058381548110611b0657634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600160a01b03861684526004600590930201919091019052604090205460ff16905092915050565b600060058381548110611b5d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000154905060006007549050600060058581548110611b9b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201549050600060058681548110611bd257634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030154905060058681548110611c0757634e487b7160e01b600052603260045260246000fd5b600091825260208083203384526004600590930201919091019052604090205460ff16611c465760405162461bcd60e51b81526004016106ad90613a54565b323314611c655760405162461bcd60e51b81526004016106ad90613916565b60058681548110611c8657634e487b7160e01b600052603260045260246000fd5b600091825260209091206001600590920201015460ff16611cb95760405162461bcd60e51b81526004016106ad90613ac0565b60058681548110611cda57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160019054906101000a900460ff168015611d42575060058681548110611d2157634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160029054906101000a900460ff16155b6118d65760405162461bcd60e51b81526004016106ad9061389a565b60075481565b611d6c61204e565b6001600160a01b0316611d7d6116a8565b6001600160a01b031614611da35760405162461bcd60e51b81526004016106ad90613a8b565b8051611283906009906020840190612cbc565b606060405180606001604052806035815260200161405860359139905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b611e0c61204e565b6001600160a01b0316611e1d6116a8565b6001600160a01b031614611e435760405162461bcd60e51b81526004016106ad90613a8b565b6103e78210611e645760405162461bcd60e51b81526004016106ad906137b5565b6103e78110611e855760405162461bcd60e51b81526004016106ad90613b62565b80821415611ea55760405162461bcd60e51b81526004016106ad90613803565b8160058481548110611ec757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600201819055508060058481548110611efe57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160030181905550505050565b611f2061204e565b6001600160a01b0316856001600160a01b03161480611f465750611f468561060061204e565b611f625760405162461bcd60e51b81526004016106ad9061376c565b610f5385858585856126db565b611f7761204e565b6001600160a01b0316611f886116a8565b6001600160a01b031614611fae5760405162461bcd60e51b81526004016106ad90613a8b565b6001600160a01b038116611fd45760405162461bcd60e51b81526004016106ad9061366a565b611fdd816125e6565b50565b611fe861204e565b6001600160a01b0316836001600160a01b0316148061200e575061200e8361060061204e565b61202a5760405162461bcd60e51b81526004016106ad9061376c565b610ef783838361280f565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b60608161207757506040805180820190915260018152600360fc1b602082015261071f565b8160005b81156120a1578061208b81613f10565b915061209a9050600a83613e7a565b915061207b565b60008167ffffffffffffffff8111156120ca57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120f4576020820181803683370190505b5090505b841561216d57612109600183613e8e565b9150612116600a86613f2b565b612121906030613e62565b60f81b81838151811061214457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612166600a86613e7a565b94506120f8565b949350505050565b6001600160a01b03841661219b5760405162461bcd60e51b81526004016106ad90613d20565b60006121a561204e565b90506121c6816000876121b78861291e565b6121c08861291e565b87612977565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906121f6908490613e62565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161224d929190613dfa565b60405180910390a4610f5381600087878787612985565b81518351146122855760405162461bcd60e51b81526004016106ad90613cd8565b6001600160a01b0384166122ab5760405162461bcd60e51b81526004016106ad90613855565b60006122b561204e565b90506122c5818787878787612977565b60005b84518110156123c75760008582815181106122f357634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061231f57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561236f5760405162461bcd60e51b81526004016106ad90613a0a565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906123ac908490613e62565b92505081905550505050806123c090613f10565b90506122c8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161241792919061351e565b60405180910390a461242d818787878787612a93565b505050505050565b6001600160a01b03831661245b5760405162461bcd60e51b81526004016106ad906139c7565b805182511461247c5760405162461bcd60e51b81526004016106ad90613cd8565b600061248661204e565b90506124a681856000868660405180602001604052806000815250612977565b60005b83518110156125875760008482815181106124d457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061250057634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156125505760405162461bcd60e51b81526004016106ad906136b0565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061257f81613f10565b9150506124a9565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516125d892919061351e565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561266a5760405162461bcd60e51b81526004016106ad90613bf7565b6001600160a01b0383811660008181526001602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906126ce908590613543565b60405180910390a3505050565b6001600160a01b0384166127015760405162461bcd60e51b81526004016106ad90613855565b600061270b61204e565b905061271c8187876121b78861291e565b6000848152602081815260408083206001600160a01b038a1684529091529020548381101561275d5760405162461bcd60e51b81526004016106ad90613a0a565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061279a908490613e62565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516127f0929190613dfa565b60405180910390a4612806828888888888612985565b50505050505050565b6001600160a01b0383166128355760405162461bcd60e51b81526004016106ad906139c7565b600061283f61204e565b905061286f818560006128518761291e565b61285a8761291e565b60405180602001604052806000815250612977565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156128b05760405162461bcd60e51b81526004016106ad906136b0565b6000848152602081815260408083206001600160a01b03808a16808652919093528184208786039055905190918516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061290f9089908990613dfa565b60405180910390a45050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061296657634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b61242d868686868686612b64565b612997846001600160a01b0316612cb6565b1561242d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129d090899089908890889088906004016134c6565b602060405180830381600087803b1580156129ea57600080fd5b505af1925050508015612a1a575060408051601f3d908101601f19168201909252612a17918101906131dd565b60015b612a6357612a26613f87565b80612a315750612a4b565b8060405162461bcd60e51b81526004016106ad919061354e565b60405162461bcd60e51b81526004016106ad90613561565b6001600160e01b0319811663f23a6e6160e01b146128065760405162461bcd60e51b81526004016106ad906135b5565b612aa5846001600160a01b0316612cb6565b1561242d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612ade9089908990889088908890600401613468565b602060405180830381600087803b158015612af857600080fd5b505af1925050508015612b28575060408051601f3d908101601f19168201909252612b25918101906131dd565b60015b612b3457612a26613f87565b6001600160e01b0319811663bc197c8160e01b146128065760405162461bcd60e51b81526004016106ad906135b5565b612b7286868686868661242d565b6001600160a01b038516612c155760005b8351811015612c1357828181518110612bac57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000868481518110612bd857634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612bfd9190613e62565b90915550612c0c905081613f10565b9050612b83565b505b6001600160a01b03841661242d5760005b835181101561280657828181518110612c4f57634e487b7160e01b600052603260045260246000fd5b602002602001015160046000868481518110612c7b57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612ca09190613e8e565b90915550612caf905081613f10565b9050612c26565b3b151590565b828054612cc890613ed5565b90600052602060002090601f016020900481019282612cea5760008555612d30565b82601f10612d0357805160ff1916838001178555612d30565b82800160010185558215612d30579182015b82811115612d30578251825591602001919060010190612d15565b50612d3c929150612d40565b5090565b5b80821115612d3c5760008155600101612d41565b600067ffffffffffffffff831115612d6f57612d6f613f6b565b612d82601f8401601f1916602001613e08565b9050828152838383011115612d9657600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dbd578081fd5b81356020612dd2612dcd83613e32565b613e08565b8281528181019085830183850287018401881015612dee578586fd5b855b85811015612e15578135612e038161402c565b84529284019290840190600101612df0565b5090979650505050505050565b600082601f830112612e32578081fd5b81356020612e42612dcd83613e32565b8281528181019085830183850287018401881015612e5e578586fd5b855b85811015612e1557813584529284019290840190600101612e60565b8035801515811461071f57600080fd5b600082601f830112612e9c578081fd5b612eab83833560208501612d55565b9392505050565b600060208284031215612ec3578081fd5b8135612eab8161402c565b60008060408385031215612ee0578081fd5b8235612eeb8161402c565b91506020830135612efb8161402c565b809150509250929050565b600080600080600060a08688031215612f1d578081fd5b8535612f288161402c565b94506020860135612f388161402c565b9350604086013567ffffffffffffffff80821115612f54578283fd5b612f6089838a01612e22565b94506060880135915080821115612f75578283fd5b612f8189838a01612e22565b93506080880135915080821115612f96578283fd5b50612fa388828901612e8c565b9150509295509295909350565b600080600080600060a08688031215612fc7578081fd5b8535612fd28161402c565b94506020860135612fe28161402c565b93506040860135925060608601359150608086013567ffffffffffffffff81111561300b578182fd5b612fa388828901612e8c565b60008060006060848603121561302b578283fd5b83356130368161402c565b9250602084013567ffffffffffffffff80821115613052578384fd5b61305e87838801612e22565b93506040860135915080821115613073578283fd5b5061308086828701612e22565b9150509250925092565b6000806040838503121561309c578182fd5b82356130a78161402c565b91506130b560208401612e7c565b90509250929050565b600080604083850312156130d0578081fd5b82356130db8161402c565b946020939093013593505050565b6000806000606084860312156130fd578081fd5b83356131088161402c565b95602085013595506040909401359392505050565b6000806040838503121561312f578182fd5b823567ffffffffffffffff80821115613146578384fd5b61315286838701612dad565b93506020850135915080821115613167578283fd5b5061317485828601612e22565b9150509250929050565b60008060408385031215613190578182fd5b823567ffffffffffffffff8111156131a6578283fd5b6131b285828601612dad565b95602094909401359450505050565b6000602082840312156131d2578081fd5b8135612eab81614041565b6000602082840312156131ee578081fd5b8151612eab81614041565b60006020828403121561320a578081fd5b813567ffffffffffffffff811115613220578182fd5b8201601f81018413613230578182fd5b61216d84823560208401612d55565b600060208284031215613250578081fd5b5035919050565b60008060408385031215613269578182fd5b823591506020830135612efb8161402c565b60008060008060808587031215613290578182fd5b843593506132a060208601612e7c565b92506132ae60408601612e7c565b91506132bc60608601612e7c565b905092959194509250565b600080604083850312156132d9578182fd5b50508035926020909101359150565b6000806000606084860312156132fc578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561334257815187529582019590820190600101613326565b509495945050505050565b60008151808452613365816020860160208601613ea5565b601f01601f19169290920160200192915050565b6000815161338b818560208601613ea5565b9290920192915050565b64173539b7b760d91b815260050190565b82546000908190600281046001808316806133c257607f831692505b60208084108214156133e257634e487b7160e01b87526022600452602487fd5b8180156133f6576001811461340757613433565b60ff19861689528489019650613433565b6134108b613e56565b885b8681101561342b5781548b820152908501908301613412565b505084890196505b50505050505061344b6134468286613379565b613395565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061349490830186613313565b82810360608401526134a68186613313565b905082810360808401526134ba818561334d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906135009083018461334d565b979650505050505050565b600060208252612eab6020830184613313565b6000604082526135316040830185613313565b828103602084015261344b8185613313565b901515815260200190565b600060208252612eab602083018461334d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526008908201526714dbdb190813dd5d60c21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526052908201527f4f6e65206f6620746865736520757365727320697320616c7265616479206e6f60408201527f74206f6e20574c2e205573652074686520436865636b2057686974654c6973746060820152712066756e6374696f6e20746f20736f6c766560701b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252602e908201527f596f7572206e6577206d696e696d756d206973206569746865722062656c6f7760408201526d2030206f72206f7665722039393960901b606082015260800190565b60208082526032908201527f596f7572206d696e696d756d20616e64206d6178696d756d2063616e6e6f74206040820152713132903a34329039b0b6b290373ab6b132b960711b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526010908201526f50726553616c65204e6f74204c69766560801b604082015260600190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252601290820152714e6f2050726f787920436f6e74726163747360701b604082015260600190565b60208082526016908201527510d85c9908125cc8105b1c9958591e48135a5b9d195960521b604082015260600190565b602080825260129082015271135a5b9d08131a5b5a5d0814995858da195960721b604082015260600190565b6020808252600f908201526e5075626c6963204e6f74204c69766560881b604082015260600190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252601b908201527f596f75204172656e2774204f6e205468652057686974656c6973740000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527153616c65204973204e6f742041637469766560701b604082015260600190565b60208082526011908201527043617264204e6f7420466f722053616c6560781b604082015260600190565b6020808252602b908201527f536f7272792c205468657265204172656e277420416e796d6f7265204176616960408201526a6c61626c6520436172647360a81b606082015260800190565b6020808252602e908201527f596f7572206e6577206d6178696d756d206973206569746865722062656c6f7760408201526d2030206f72206f7665722039393960901b606082015260800190565b60208082526027908201527f5468652043617264204e756d6265722053656c656374656420446f6573204e6f6040820152661d08115e1a5cdd60ca1b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252602f908201527f4120436172642053656c656374656420416c72656164792042656c6f6e67732060408201526e546f20536f6d656f6e6520456c736560881b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601d908201527f546f6b656e2063616e6e6f74206265207a65726f20616464726573732e000000604082015260600190565b602080825260159082015274139bdd08115b9bdd59da08115d1a195c8814d95b9d605a1b604082015260600190565b90815260200190565b9586529315156020860152911515604085015215156060840152608083015260a082015260c00190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613e2a57613e2a613f6b565b604052919050565b600067ffffffffffffffff821115613e4c57613e4c613f6b565b5060209081020190565b60009081526020902090565b60008219821115613e7557613e75613f3f565b500190565b600082613e8957613e89613f55565b500490565b600082821015613ea057613ea0613f3f565b500390565b60005b83811015613ec0578181015183820152602001613ea8565b83811115613ecf576000848401525b50505050565b600281046001821680613ee957607f821691505b60208210811415613f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2457613f24613f3f565b5060010190565b600082613f3a57613f3a613f55565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015613f97576116b5565b600481823e6308c379a0613fab8251613f81565b14613fb5576116b5565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715613fe557505050506116b5565b82840192508251915080821115613fff57505050506116b5565b503d83016020828401011115614017575050506116b5565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114611fdd57600080fd5b6001600160e01b031981168114611fdd57600080fdfe697066733a2f2f516d6343566e6e52697937544167524548784b4a4a72635a4c4353426d7a3266596d314c756d35766a5659364765a2646970667358221220be0c0f53b4fb89bb9bef4324049c1ae635488e110fe2178c0d7c2ecdde97e5d664736f6c63430008000033

Deployed Bytecode Sourcemap

41636:9589:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25141:231;;;;;;;;;;-1:-1:-1;25141:231:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24164:310;;;;;;;;;;-1:-1:-1;24164:310:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47647:379::-;;;;;;;;;;-1:-1:-1;47647:379:0;;;;;:::i;:::-;;:::i;45459:737::-;;;;;;;;;;;;;:::i;50445:365::-;;;;;;;;;;-1:-1:-1;50445:365:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46204:774::-;;;;;;;;;;-1:-1:-1;46204:774:0;;;;;:::i;:::-;;:::i;27080:442::-;;;;;;;;;;-1:-1:-1;27080:442:0;;;;;:::i;:::-;;:::i;42172:54::-;;;;;;;;;;-1:-1:-1;42172:54:0;;;;;:::i;:::-;;:::i;48034:100::-;;;;;;;;;;-1:-1:-1;48034:100:0;;;;;:::i;:::-;;:::i;49172:285::-;;;;;;;;;;-1:-1:-1;49172:285:0;;;;;:::i;:::-;;:::i;41978:28::-;;;;;;;;;;-1:-1:-1;41978:28:0;;;;;:::i;:::-;;:::i;25538:524::-;;;;;;;;;;-1:-1:-1;25538:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39580:122::-;;;;;;;;;;-1:-1:-1;39580:122:0;;;;;:::i;:::-;;:::i;49976:180::-;;;;;;;;;;-1:-1:-1;49976:180:0;;;;;:::i;:::-;;:::i;48142:803::-;;;;;;;;;;-1:-1:-1;48142:803:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;49465:503::-;;;;;;;;;;-1:-1:-1;49465:503:0;;;;;:::i;:::-;;:::i;41199:353::-;;;;;;;;;;-1:-1:-1;41199:353:0;;;;;:::i;:::-;;:::i;42095:21::-;;;;;;;;;;;;;:::i;4769:103::-;;;;;;;;;;;;;:::i;4118:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45260:161::-;;;;;;;;;;;;;:::i;43884:1124::-;;;;;;:::i;:::-;;:::i;42060:28::-;;;;;;;;;;;;;:::i;26135:155::-;;;;;;;;;;-1:-1:-1;26135:155:0;;;;;:::i;:::-;;:::i;39369:113::-;;;;;;;;;;-1:-1:-1;39369:113:0;;;;;:::i;:::-;;:::i;48953:211::-;;;;;;;;;;-1:-1:-1;48953:211:0;;;;;:::i;:::-;;:::i;45018:232::-;;;;;;;;;;-1:-1:-1;45018:232:0;;;;;:::i;:::-;;:::i;42658:1218::-;;;;;;:::i;:::-;;:::i;42022:31::-;;;;;;;;;;;;;:::i;50164:97::-;;;;;;;;;;-1:-1:-1;50164:97:0;;;;;:::i;:::-;;:::i;50269:140::-;;;;;;;;;;;;;:::i;26362:168::-;;;;;;;;;;-1:-1:-1;26362:168:0;;;;;:::i;:::-;;:::i;46986:653::-;;;;;;;;;;-1:-1:-1;46986:653:0;;;;;:::i;:::-;;:::i;26602:401::-;;;;;;;;;;-1:-1:-1;26602:401:0;;;;;:::i;:::-;;:::i;5027:201::-;;;;;;;;;;-1:-1:-1;5027:201:0;;;;;:::i;:::-;;:::i;40870:321::-;;;;;;;;;;-1:-1:-1;40870:321:0;;;;;:::i;:::-;;:::i;25141:231::-;25227:7;-1:-1:-1;;;;;25255:21:0;;25247:77;;;;-1:-1:-1;;;25247:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;25342:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;25342:22:0;;;;;;;;;;;;25141:231::o;24164:310::-;24266:4;-1:-1:-1;;;;;;24303:41:0;;-1:-1:-1;;;24303:41:0;;:110;;-1:-1:-1;;;;;;;24361:52:0;;-1:-1:-1;;;24361:52:0;24303:110;:163;;;;24430:36;24454:11;24430:23;:36::i;:::-;24283:183;;24164:310;;;;:::o;47647:379::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;47841:1:::1;47826:11;:16;;47818:25;;;::::0;::::1;;47889:9;47854:10;47865:11;47854:23;;;;;;-1:-1:-1::0;;;47854:23:0::1;;;;;;;;;;;;;;;;;;;:32;;;:44;;;;;;;;;;;;;;;;;;47945:10;47909;47920:11;47909:23;;;;;;-1:-1:-1::0;;;47909:23:0::1;;;;;;;;;;;;;;;;;;;:33;;;:46;;;;;;;;;;;;;;;;;;48005:13;47966:10;47977:11;47966:23;;;;;;-1:-1:-1::0;;;47966:23:0::1;;;;;;;;;;;;;;;;;;;:36;;;:52;;;;;;;;;;;;;;;;;;47647:379:::0;;;;:::o;45459:737::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;45553:18:::1;45531:10;45542:1;45531:13;;;;;;-1:-1:-1::0;;;45531:13:0::1;;;;;;;;;;;;;;;;;;;:19;;:40;;;;45604:18;45582:10;45593:1;45582:13;;;;;;-1:-1:-1::0;;;45582:13:0::1;;;;;;;;;;;;;;;;;;;:19;;:40;;;;45655:19;45633:10;45644:1;45633:13;;;;;;-1:-1:-1::0;;;45633:13:0::1;;;;;;;;;;;;;;;;;;;:19;;:41;;;;45707:19;45685:10;45696:1;45685:13;;;;;;-1:-1:-1::0;;;45685:13:0::1;;;;;;;;;;;;;;;;;;;:19;;:41;;;;45759:20;45737:10;45748:1;45737:13;;;;;;-1:-1:-1::0;;;45737:13:0::1;;;;;;;;;;;;;;;;;;;:19;;:42;;;;45816:1;45790:10;45801:1;45790:13;;;;;;-1:-1:-1::0;;;45790:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:27;;;;45854:3;45828:10;45839:1;45828:13;;;;;;-1:-1:-1::0;;;45828:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;45894:3;45868:10;45879:1;45868:13;;;;;;-1:-1:-1::0;;;45868:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;45934:3;45908:10;45919:1;45908:13;;;;;;-1:-1:-1::0;;;45908:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;45974:3;45948:10;45959:1;45948:13;;;;;;-1:-1:-1::0;;;45948:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;46014:3;45988:10;45999:1;45988:13;;;;;;-1:-1:-1::0;;;45988:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;46054:3;46028:10;46039:1;46028:13;;;;;;-1:-1:-1::0;;;46028:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;46094:3;46068:10;46079:1;46068:13;;;;;;-1:-1:-1::0;;;46068:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;46134:3;46108:10;46119:1;46108:13;;;;;;-1:-1:-1::0;;;46108:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;46174:3;46148:10;46159:1;46148:13;;;;;;-1:-1:-1::0;;;46148:13:0::1;;;;;;;;;;;;;;;;;;;:23;;:29;;;;45459:737::o:0;50445:365::-;50583:15;;;;:5;:15;;;;;50577:29;;50542:13;;50583:15;50577:29;;;:::i;:::-;:34;;-1:-1:-1;50573:97:0;;50642:15;;;;:5;:15;;;;;50628:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50573:97;50742:7;50751:26;50768:8;50751:16;:26::i;:::-;50725:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50680:122;;50445:365;;;:::o;46204:774::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;46341:9:::1;46336:635;46360:10;:17;46356:1;:21;46336:635;;;46437:4;46425:6;46432:1;46425:9;;;;;;-1:-1:-1::0;;;46425:9:0::1;;;;;;;;;;;;;;;:16;46399:117;;;;-1:-1:-1::0;;;46399:117:0::1;;;;;;;:::i;:::-;46586:1;46569:6;:13;46557:9;;:25;;;;:::i;:::-;:30;;46531:135;;;;-1:-1:-1::0;;;46531:135:0::1;;;;;;;:::i;:::-;46708:17;46715:6;46722:1;46715:9;;;;;;-1:-1:-1::0;;;46715:9:0::1;;;;;;;;;;;;;;;46708:6;:17::i;:::-;46707:18;46681:127;;;;-1:-1:-1::0;;;46681:127:0::1;;;;;;;:::i;:::-;46825:40;46831:10;46842:1;46831:13;;;;;;-1:-1:-1::0;;;46831:13:0::1;;;;;;;;;;;;;;;46846:6;46853:1;46846:9;;;;;;-1:-1:-1::0;;;46846:9:0::1;;;;;;;;;;;;;;;46857:1;46825:40;;;;;;;;;;;;;-1:-1:-1::0;;;46825:40:0::1;;::::0;:5:::1;:40::i;:::-;46904:6;:13;46892:9;;:25;;;;:::i;:::-;46880:9;:37;;;;46932:11;46949:6;46956:1;46949:9;;;;;;-1:-1:-1::0;;;46949:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;46932:27;;::::1;::::0;::::1;::::0;;-1:-1:-1;46932:27:0;;;;;;;::::1;::::0;46379:3;::::1;::::0;::::1;:::i;:::-;;;;46336:635;;;;46204:774:::0;;:::o;27080:442::-;27321:12;:10;:12::i;:::-;-1:-1:-1;;;;;27313:20:0;:4;-1:-1:-1;;;;;27313:20:0;;:60;;;;27337:36;27354:4;27360:12;:10;:12::i;27337:36::-;27291:160;;;;-1:-1:-1;;;27291:160:0;;;;;;;:::i;:::-;27462:52;27485:4;27491:2;27495:3;27500:7;27509:4;27462:22;:52::i;:::-;27080:442;;;;;:::o;42172:54::-;;;;;;;;;;;;;:::o;48034:100::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;48106:9:::1;:20:::0;48034:100::o;49172:285::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;49311:9:::1;49306:144;49330:10;:17;49326:1;:21;49306:144;;;49420:4;49369:10;49380:11;49369:23;;;;;;-1:-1:-1::0;;;49369:23:0::1;;;;;;;;;;;;;;;;;;;:33;;:48;49403:10;49414:1;49403:13;;;;;;-1:-1:-1::0;;;49403:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49369:48:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49369:48:0;:55;;-1:-1:-1;;49369:55:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49349:3;::::1;::::0;::::1;:::i;:::-;;;;49306:144;;41978:28:::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41978:28:0;:::o;25538:524::-;25694:16;25755:3;:10;25736:8;:15;:29;25728:83;;;;-1:-1:-1;;;25728:83:0;;;;;;;:::i;:::-;25824:30;25871:8;:15;25857:30;;;;;;-1:-1:-1;;;25857:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25857:30:0;;25824:63;;25905:9;25900:122;25924:8;:15;25920:1;:19;25900:122;;;25980:30;25990:8;25999:1;25990:11;;;;;;-1:-1:-1;;;25990:11:0;;;;;;;;;;;;;;;26003:3;26007:1;26003:6;;;;;;-1:-1:-1;;;26003:6:0;;;;;;;;;;;;;;;25980:9;:30::i;:::-;25961:13;25975:1;25961:16;;;;;;-1:-1:-1;;;25961:16:0;;;;;;;;;;;;;;;;;;:49;25941:3;;;:::i;:::-;;;25900:122;;;-1:-1:-1;26041:13:0;25538:524;-1:-1:-1;;;25538:524:0:o;39580:122::-;39637:4;39693:1;39661:29;39687:2;39661:25;:29::i;:::-;:33;;39580:122;-1:-1:-1;;39580:122:0:o;49976:180::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50051:17:0;::::1;50043:59;;;;-1:-1:-1::0;;;50043:59:0::1;;;;;;;:::i;:::-;50113:35;::::0;-1:-1:-1;;;;;50113:12:0;::::1;::::0;50126:21:::1;50113:35:::0;::::1;;;::::0;::::1;::::0;;;50126:21;50113:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49976:180:::0;:::o;48142:803::-;48251:13;48279;48307:14;48336:17;48368;48400;48453:10;48464:11;48453:23;;;;;;-1:-1:-1;;;48453:23:0;;;;;;;;;;;;;;;;;;;:29;;;48445:37;;48504:10;48515:11;48504:23;;;;;;-1:-1:-1;;;48504:23:0;;;;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;48493:43;;48559:10;48570:11;48559:23;;;;;;-1:-1:-1;;;48559:23:0;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;48547:45;;48618:10;48629:11;48618:23;;;;;;-1:-1:-1;;;48618:23:0;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;48603:51;;48677:10;48688:11;48677:23;;;;;;-1:-1:-1;;;48677:23:0;;;;;;;;;;;;;;;;;;;:33;;;48665:45;;48733:10;48744:11;48733:23;;;;;;-1:-1:-1;;;48733:23:0;;;;;;;;;;;;;;;;;;;:33;;;48721:45;;48142:803;;;;;;;:::o;49465:503::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;49609:9:::1;49604:357;49628:10;:17;49624:1;:21;49604:357;;;49693:10;49704:11;49693:23;;;;;;-1:-1:-1::0;;;49693:23:0::1;;;;;;;;;;;;;;;;;;;:33;;:48;49727:10;49738:1;49727:13;;;;;;-1:-1:-1::0;;;49727:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49693:48:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49693:48:0;;::::1;;49667:201;;;;-1:-1:-1::0;;;49667:201:0::1;;;;;;;:::i;:::-;49934:5;49883:10;49894:11;49883:23;;;;;;-1:-1:-1::0;;;49883:23:0::1;;;;;;;;;;;;;;;;;;;:33;;:48;49917:10;49928:1;49917:13;;;;;;-1:-1:-1::0;;;49917:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49883:48:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49883:48:0;:56;;-1:-1:-1;;49883:56:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49647:3;::::1;::::0;::::1;:::i;:::-;;;;49604:357;;41199:353:::0;41375:12;:10;:12::i;:::-;-1:-1:-1;;;;;41364:23:0;:7;-1:-1:-1;;;;;41364:23:0;;:66;;;;41391:39;41408:7;41417:12;:10;:12::i;41391:39::-;41342:157;;;;-1:-1:-1;;;41342:157:0;;;;;;;:::i;:::-;41512:32;41523:7;41532:3;41537:6;41512:10;:32::i;42095:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4769:103::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;4834:30:::1;4861:1;4834:18;:30::i;:::-;4769:103::o:0;4118:87::-;4191:6;;-1:-1:-1;;;;;4191:6:0;4118:87;;:::o;45260:161::-;45310:31;45370:11;45353:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45260:161;:::o;43884:1124::-;43969:13;43985:10;43996:11;43985:23;;;;;;-1:-1:-1;;;43985:23:0;;;;;;;;;;;;;;;;;;;:29;;;43969:45;;44025:18;44046:9;;44025:30;;44066:17;44086:10;44097:11;44086:23;;;;;;-1:-1:-1;;;44086:23:0;;;;;;;;;;;;;;;;;;;:33;;;44066:53;;44130:17;44150:10;44161:11;44150:23;;;;;;-1:-1:-1;;;44150:23:0;;;;;;;;;;;;;;;;;:33;:23;;;;;:33;;;-1:-1:-1;44204:9:0;44217:10;44204:23;44196:54;;;;-1:-1:-1;;;44196:54:0;;;;;;;:::i;:::-;44269:10;44280:11;44269:23;;;;;;-1:-1:-1;;;44269:23:0;;;;;;;;;;;;;;;;;:32;:23;;;;;:32;;;;44261:63;;;;-1:-1:-1;;;44261:63:0;;;;;;;:::i;:::-;44344:10;44355:11;44344:23;;;;;;-1:-1:-1;;;44344:23:0;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;44343:34;:74;;;;;44381:10;44392:11;44381:23;;;;;;-1:-1:-1;;;44381:23:0;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;44343:74;44335:102;;;;-1:-1:-1;;;44335:102:0;;;;;;;:::i;:::-;44466:9;44456:6;:19;;:42;;;;;44489:9;44479:6;:19;;44456:42;44448:71;;;;-1:-1:-1;;;44448:71:0;;;;;;;:::i;:::-;44556:1;44538:14;44551:1;44538:10;:14;:::i;:::-;:19;;44530:40;;;;-1:-1:-1;;;44530:40:0;;;;;;;:::i;:::-;44590:14;44597:6;44590;:14::i;:::-;44589:15;44581:50;;;;-1:-1:-1;;;44581:50:0;;;;;;;:::i;:::-;44685:9;;44670:10;44650:31;;;;:19;:31;;;;;;:44;;44642:74;;;;-1:-1:-1;;;44642:74:0;;;;;;;:::i;:::-;44748:5;44735:9;:18;;44727:52;;;;-1:-1:-1;;;44727:52:0;;;;;;;:::i;:::-;44792:32;44798:10;44810:6;44818:1;44792:32;;;;;;;;;;;;:5;:32::i;:::-;44867:14;44880:1;44867:10;:14;:::i;:::-;44855:9;:26;44946:10;44926:31;;;;:19;:31;;;;;;:35;;44960:1;44926:35;:::i;:::-;44912:10;44892:31;;;;:19;:31;;;;;:69;;;;44972:11;:24;;;;;;;;;;;;;;;-1:-1:-1;;;;;43884:1124:0:o;42060:28::-;;;;:::o;26135:155::-;26230:52;26249:12;:10;:12::i;:::-;26263:8;26273;26230:18;:52::i;39369:113::-;39431:7;39458:16;;;:12;:16;;;;;;;39369:113::o;48953:211::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;49097:1:::1;49082:11;:16;;49074:25;;;::::0;::::1;;49142:14;49110:10;49121:11;49110:23;;;;;;-1:-1:-1::0;;;49110:23:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:46:::0;-1:-1:-1;;48953:211:0:o;45018:232::-;45131:13;45173:10;45184:11;45173:23;;;;;;-1:-1:-1;;;45173:23:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45173:43:0;;;;:33;:23;;;;;:33;;;;:43;;;;;;;;;-1:-1:-1;45018:232:0;;;;:::o;42658:1218::-;42744:13;42760:10;42771:11;42760:23;;;;;;-1:-1:-1;;;42760:23:0;;;;;;;;;;;;;;;;;;;:29;;;42744:45;;42800:18;42821:9;;42800:30;;42841:17;42861:10;42872:11;42861:23;;;;;;-1:-1:-1;;;42861:23:0;;;;;;;;;;;;;;;;;;;:33;;;42841:53;;42905:17;42925:10;42936:11;42925:23;;;;;;-1:-1:-1;;;42925:23:0;;;;;;;;;;;;;;;;;;;:33;;;42905:53;;42979:10;42990:11;42979:23;;;;;;-1:-1:-1;;;42979:23:0;;;;;;;;;;;;;;;;;43013:10;42979:45;;:33;:23;;;;;:33;;;;:45;;;;;;;;42971:84;;;;-1:-1:-1;;;42971:84:0;;;;;;;:::i;:::-;43074:9;43087:10;43074:23;43066:54;;;;-1:-1:-1;;;43066:54:0;;;;;;;:::i;:::-;43139:10;43150:11;43139:23;;;;;;-1:-1:-1;;;43139:23:0;;;;;;;;;;;;;;;;;:32;:23;;;;;:32;;;;43131:63;;;;-1:-1:-1;;;43131:63:0;;;;;;;:::i;:::-;43213:10;43224:11;43213:23;;;;;;-1:-1:-1;;;43213:23:0;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:74;;;;;43251:10;43262:11;43251:23;;;;;;-1:-1:-1;;;43251:23:0;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;43250:37;43213:74;43205:103;;;;-1:-1:-1;;;43205:103:0;;;;;;;:::i;42022:31::-;;;;:::o;50164:97::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;50236:17;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;50269:140::-:0;50313:13;50339:62;;;;;;;;;;;;;;;;;;;50269:140;:::o;26362:168::-;-1:-1:-1;;;;;26485:27:0;;;26461:4;26485:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26362:168::o;46986:653::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;47179:3:::1;47169:7;:13;47131:125;;;;-1:-1:-1::0;;;47131:125:0::1;;;;;;;:::i;:::-;47315:3;47305:7;:13;47267:125;;;;-1:-1:-1::0;;;47267:125:0::1;;;;;;;:::i;:::-;47436:7;47425;:18;;47403:118;;;;-1:-1:-1::0;;;47403:118:0::1;;;;;;;:::i;:::-;47570:7;47534:10;47545:11;47534:23;;;;;;-1:-1:-1::0;;;47534:23:0::1;;;;;;;;;;;;;;;;;;;:33;;:43;;;;47624:7;47588:10;47599:11;47588:23;;;;;;-1:-1:-1::0;;;47588:23:0::1;;;;;;;;;;;;;;;;;;;:33;;:43;;;;46986:653:::0;;;:::o;26602:401::-;26818:12;:10;:12::i;:::-;-1:-1:-1;;;;;26810:20:0;:4;-1:-1:-1;;;;;26810:20:0;;:60;;;;26834:36;26851:4;26857:12;:10;:12::i;26834:36::-;26788:151;;;;-1:-1:-1;;;26788:151:0;;;;;;;:::i;:::-;26950:45;26968:4;26974:2;26978;26982:6;26990:4;26950:17;:45::i;5027:201::-;4349:12;:10;:12::i;:::-;-1:-1:-1;;;;;4338:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4338:23:0;;4330:68;;;;-1:-1:-1;;;4330:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5116:22:0;::::1;5108:73;;;;-1:-1:-1::0;;;5108:73:0::1;;;;;;;:::i;:::-;5192:28;5211:8;5192:18;:28::i;:::-;5027:201:::0;:::o;40870:321::-;41021:12;:10;:12::i;:::-;-1:-1:-1;;;;;41010:23:0;:7;-1:-1:-1;;;;;41010:23:0;;:66;;;;41037:39;41054:7;41063:12;:10;:12::i;41037:39::-;40988:157;;;;-1:-1:-1;;;40988:157:0;;;;;;;:::i;:::-;41158:25;41164:7;41173:2;41177:5;41158;:25::i;15519:157::-;-1:-1:-1;;;;;;15628:40:0;;-1:-1:-1;;;15628:40:0;15519:157;;;:::o;2842:98::-;2922:10;2842:98;:::o;404:723::-;460:13;681:10;677:53;;-1:-1:-1;708:10:0;;;;;;;;;;;;-1:-1:-1;;;708:10:0;;;;;;677:53;755:5;740:12;796:78;803:9;;796:78;;829:8;;;;:::i;:::-;;-1:-1:-1;852:10:0;;-1:-1:-1;860:2:0;852:10;;:::i;:::-;;;796:78;;;884:19;916:6;906:17;;;;;;-1:-1:-1;;;906:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;906:17:0;;884:39;;934:154;941:10;;934:154;;968:11;978:1;968:11;;:::i;:::-;;-1:-1:-1;1037:10:0;1045:2;1037:5;:10;:::i;:::-;1024:24;;:2;:24;:::i;:::-;1011:39;;994:6;1001;994:14;;;;;;-1:-1:-1;;;994:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;994:56:0;;;;;;;;-1:-1:-1;1065:11:0;1074:2;1065:11;;:::i;:::-;;;934:154;;;1112:6;404:723;-1:-1:-1;;;;404:723:0:o;31556:569::-;-1:-1:-1;;;;;31709:16:0;;31701:62;;;;-1:-1:-1;;;31701:62:0;;;;;;;:::i;:::-;31776:16;31795:12;:10;:12::i;:::-;31776:31;;31820:102;31841:8;31859:1;31863:2;31867:21;31885:2;31867:17;:21::i;:::-;31890:25;31908:6;31890:17;:25::i;:::-;31917:4;31820:20;:102::i;:::-;31935:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31935:17:0;;;;;;;;;:27;;31956:6;;31935:9;:27;;31956:6;;31935:27;:::i;:::-;;;;;;;;32015:2;-1:-1:-1;;;;;31978:52:0;32011:1;-1:-1:-1;;;;;31978:52:0;31993:8;-1:-1:-1;;;;;31978:52:0;;32019:2;32023:6;31978:52;;;;;;;:::i;:::-;;;;;;;;32043:74;32074:8;32092:1;32096:2;32100;32104:6;32112:4;32043:30;:74::i;29164:1074::-;29391:7;:14;29377:3;:10;:28;29369:81;;;;-1:-1:-1;;;29369:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29469:16:0;;29461:66;;;;-1:-1:-1;;;29461:66:0;;;;;;;:::i;:::-;29540:16;29559:12;:10;:12::i;:::-;29540:31;;29584:60;29605:8;29615:4;29621:2;29625:3;29630:7;29639:4;29584:20;:60::i;:::-;29662:9;29657:421;29681:3;:10;29677:1;:14;29657:421;;;29713:10;29726:3;29730:1;29726:6;;;;;;-1:-1:-1;;;29726:6:0;;;;;;;;;;;;;;;29713:19;;29747:14;29764:7;29772:1;29764:10;;;;;;-1:-1:-1;;;29764:10:0;;;;;;;;;;;;;;;;;;;;29791:19;29813:13;;;;;;;;;;-1:-1:-1;;;;;29813:19:0;;;;;;;;;;;;29764:10;;-1:-1:-1;29855:21:0;;;;29847:76;;;;-1:-1:-1;;;29847:76:0;;;;;;;:::i;:::-;29967:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29967:19:0;;;;;;;;;;29989:20;;;29967:42;;30039:17;;;;;;;:27;;29989:20;;29967:9;30039:27;;29989:20;;30039:27;:::i;:::-;;;;;;;;29657:421;;;29693:3;;;;:::i;:::-;;;29657:421;;;;30125:2;-1:-1:-1;;;;;30095:47:0;30119:4;-1:-1:-1;;;;;30095:47:0;30109:8;-1:-1:-1;;;;;30095:47:0;;30129:3;30134:7;30095:47;;;;;;;:::i;:::-;;;;;;;;30155:75;30191:8;30201:4;30207:2;30211:3;30216:7;30225:4;30155:35;:75::i;:::-;29164:1074;;;;;;:::o;34317:891::-;-1:-1:-1;;;;;34469:18:0;;34461:66;;;;-1:-1:-1;;;34461:66:0;;;;;;;:::i;:::-;34560:7;:14;34546:3;:10;:28;34538:81;;;;-1:-1:-1;;;34538:81:0;;;;;;;:::i;:::-;34632:16;34651:12;:10;:12::i;:::-;34632:31;;34676:66;34697:8;34707:4;34721:1;34725:3;34730:7;34676:66;;;;;;;;;;;;:20;:66::i;:::-;34760:9;34755:373;34779:3;:10;34775:1;:14;34755:373;;;34811:10;34824:3;34828:1;34824:6;;;;;;-1:-1:-1;;;34824:6:0;;;;;;;;;;;;;;;34811:19;;34845:14;34862:7;34870:1;34862:10;;;;;;-1:-1:-1;;;34862:10:0;;;;;;;;;;;;;;;;;;;;34889:19;34911:13;;;;;;;;;;-1:-1:-1;;;;;34911:19:0;;;;;;;;;;;;34862:10;;-1:-1:-1;34953:21:0;;;;34945:70;;;;-1:-1:-1;;;34945:70:0;;;;;;;:::i;:::-;35059:9;:13;;;;;;;;;;;-1:-1:-1;;;;;35059:19:0;;;;;;;;;;35081:20;;35059:42;;34791:3;;;;:::i;:::-;;;;34755:373;;;;35183:1;-1:-1:-1;;;;;35145:55:0;35169:4;-1:-1:-1;;;;;35145:55:0;35159:8;-1:-1:-1;;;;;35145:55:0;;35187:3;35192:7;35145:55;;;;;;;:::i;:::-;;;;;;;;34317:891;;;;:::o;5388:191::-;5481:6;;;-1:-1:-1;;;;;5498:17:0;;;-1:-1:-1;;;;;;5498:17:0;;;;;;;5531:40;;5481:6;;;5498:17;5481:6;;5531:40;;5462:16;;5531:40;5388:191;;:::o;35350:331::-;35505:8;-1:-1:-1;;;;;35496:17:0;:5;-1:-1:-1;;;;;35496:17:0;;;35488:71;;;;-1:-1:-1;;;35488:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35570:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;35570:46:0;;;;;;;35632:41;;;;;35570:46;;35632:41;:::i;:::-;;;;;;;;35350:331;;;:::o;27986:820::-;-1:-1:-1;;;;;28174:16:0;;28166:66;;;;-1:-1:-1;;;28166:66:0;;;;;;;:::i;:::-;28245:16;28264:12;:10;:12::i;:::-;28245:31;;28289:96;28310:8;28320:4;28326:2;28330:21;28348:2;28330:17;:21::i;28289:96::-;28398:19;28420:13;;;;;;;;;;;-1:-1:-1;;;;;28420:19:0;;;;;;;;;;28458:21;;;;28450:76;;;;-1:-1:-1;;;28450:76:0;;;;;;;:::i;:::-;28562:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28562:19:0;;;;;;;;;;28584:20;;;28562:42;;28626:17;;;;;;;:27;;28584:20;;28562:9;28626:27;;28584:20;;28626:27;:::i;:::-;;;;;;;;28702:2;-1:-1:-1;;;;;28671:46:0;28696:4;-1:-1:-1;;;;;28671:46:0;28686:8;-1:-1:-1;;;;;28671:46:0;;28706:2;28710:6;28671:46;;;;;;;:::i;:::-;;;;;;;;28730:68;28761:8;28771:4;28777:2;28781;28785:6;28793:4;28730:30;:68::i;:::-;27986:820;;;;;;;:::o;33466:648::-;-1:-1:-1;;;;;33593:18:0;;33585:66;;;;-1:-1:-1;;;33585:66:0;;;;;;;:::i;:::-;33664:16;33683:12;:10;:12::i;:::-;33664:31;;33708:102;33729:8;33739:4;33753:1;33757:21;33775:2;33757:17;:21::i;:::-;33780:25;33798:6;33780:17;:25::i;:::-;33708:102;;;;;;;;;;;;:20;:102::i;:::-;33823:19;33845:13;;;;;;;;;;;-1:-1:-1;;;;;33845:19:0;;;;;;;;;;33883:21;;;;33875:70;;;;-1:-1:-1;;;33875:70:0;;;;;;;:::i;:::-;33981:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33981:19:0;;;;;;;;;;;;;34003:20;;;33981:42;;34052:54;;33981:19;;34052:54;;;;;;;33991:2;;34017:6;;34052:54;:::i;:::-;;;;;;;;33466:648;;;;;:::o;38439:198::-;38559:16;;;38573:1;38559:16;;;;;;;;;38505;;38534:22;;38559:16;;;;;;;;;;;;-1:-1:-1;38559:16:0;38534:41;;38597:7;38586:5;38592:1;38586:8;;;;;;-1:-1:-1;;;38586:8:0;;;;;;;;;;;;;;;;;;:18;38624:5;38439:198;-1:-1:-1;;38439:198:0:o;50818:329::-;51073:66;51100:8;51110:4;51116:2;51120:3;51125:7;51134:4;51073:26;:66::i;36866:744::-;37081:15;:2;-1:-1:-1;;;;;37081:13:0;;:15::i;:::-;37077:526;;;37117:72;;-1:-1:-1;;;37117:72:0;;-1:-1:-1;;;;;37117:38:0;;;;;:72;;37156:8;;37166:4;;37172:2;;37176:6;;37184:4;;37117:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37117:72:0;;;;;;;;-1:-1:-1;;37117:72:0;;;;;;;;;;;;:::i;:::-;;;37113:479;;;;:::i;:::-;;;;;;;;37465:6;37458:14;;-1:-1:-1;;;37458:14:0;;;;;;;;:::i;37113:479::-;37514:62;;-1:-1:-1;;;37514:62:0;;;;;;;:::i;37113:479::-;-1:-1:-1;;;;;;37239:55:0;;-1:-1:-1;;;37239:55:0;37235:154;;37319:50;;-1:-1:-1;;;37319:50:0;;;;;;;:::i;37618:813::-;37858:15;:2;-1:-1:-1;;;;;37858:13:0;;:15::i;:::-;37854:570;;;37894:79;;-1:-1:-1;;;37894:79:0;;-1:-1:-1;;;;;37894:43:0;;;;;:79;;37938:8;;37948:4;;37954:3;;37959:7;;37968:4;;37894:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37894:79:0;;;;;;;;-1:-1:-1;;37894:79:0;;;;;;;;;;;;:::i;:::-;;;37890:523;;;;:::i;:::-;-1:-1:-1;;;;;;38055:60:0;;-1:-1:-1;;;38055:60:0;38051:159;;38140:50;;-1:-1:-1;;;38140:50:0;;;;;;;:::i;39777:655::-;40016:66;40043:8;40053:4;40059:2;40063:3;40068:7;40077:4;40016:26;:66::i;:::-;-1:-1:-1;;;;;40099:18:0;;40095:160;;40139:9;40134:110;40158:3;:10;40154:1;:14;40134:110;;;40218:7;40226:1;40218:10;;;;;;-1:-1:-1;;;40218:10:0;;;;;;;;;;;;;;;40194:12;:20;40207:3;40211:1;40207:6;;;;;;-1:-1:-1;;;40207:6:0;;;;;;;;;;;;;;;40194:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;40170:3:0;;-1:-1:-1;40170:3:0;;:::i;:::-;;;40134:110;;;;40095:160;-1:-1:-1;;;;;40271:16:0;;40267:158;;40309:9;40304:110;40328:3;:10;40324:1;:14;40304:110;;;40388:7;40396:1;40388:10;;;;;;-1:-1:-1;;;40388:10:0;;;;;;;;;;;;;;;40364:12;:20;40377:3;40381:1;40377:6;;;;;;-1:-1:-1;;;40377:6:0;;;;;;;;;;;;;;;40364:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;40340:3:0;;-1:-1:-1;40340:3:0;;:::i;:::-;;;40304:110;;6406:387;6729:20;6777:8;;;6406:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:782::-;;541:3;534:4;526:6;522:17;518:27;508:2;;563:5;556;549:20;508:2;603:6;590:20;629:4;653:65;668:49;714:2;668:49;:::i;:::-;653:65;:::i;:::-;752:15;;;783:12;;;;815:15;;;861:11;;;849:24;;845:33;;842:42;-1:-1:-1;839:2:1;;;901:5;894;887:20;839:2;927:5;941:240;955:2;952:1;949:9;941:240;;;1026:3;1013:17;1043:33;1070:5;1043:33;:::i;:::-;1089:18;;1127:12;;;;1159;;;;973:1;966:9;941:240;;;-1:-1:-1;1199:5:1;;498:712;-1:-1:-1;;;;;;;498:712:1:o;1215:705::-;;1328:3;1321:4;1313:6;1309:17;1305:27;1295:2;;1350:5;1343;1336:20;1295:2;1390:6;1377:20;1416:4;1440:65;1455:49;1501:2;1455:49;:::i;1440:65::-;1539:15;;;1570:12;;;;1602:15;;;1648:11;;;1636:24;;1632:33;;1629:42;-1:-1:-1;1626:2:1;;;1688:5;1681;1674:20;1626:2;1714:5;1728:163;1742:2;1739:1;1736:9;1728:163;;;1799:17;;1787:30;;1837:12;;;;1869;;;;1760:1;1753:9;1728:163;;1925:162;1992:20;;2048:13;;2041:21;2031:32;;2021:2;;2077:1;2074;2067:12;2092:232;;2189:3;2182:4;2174:6;2170:17;2166:27;2156:2;;2211:5;2204;2197:20;2156:2;2237:81;2314:3;2305:6;2292:20;2285:4;2277:6;2273:17;2237:81;:::i;:::-;2228:90;2146:178;-1:-1:-1;;;2146:178:1:o;2329:259::-;;2441:2;2429:9;2420:7;2416:23;2412:32;2409:2;;;2462:6;2454;2447:22;2409:2;2506:9;2493:23;2525:33;2552:5;2525:33;:::i;2865:402::-;;;2994:2;2982:9;2973:7;2969:23;2965:32;2962:2;;;3015:6;3007;3000:22;2962:2;3059:9;3046:23;3078:33;3105:5;3078:33;:::i;:::-;3130:5;-1:-1:-1;3187:2:1;3172:18;;3159:32;3200:35;3159:32;3200:35;:::i;:::-;3254:7;3244:17;;;2952:315;;;;;:::o;3272:1129::-;;;;;;3511:3;3499:9;3490:7;3486:23;3482:33;3479:2;;;3533:6;3525;3518:22;3479:2;3577:9;3564:23;3596:33;3623:5;3596:33;:::i;:::-;3648:5;-1:-1:-1;3705:2:1;3690:18;;3677:32;3718:35;3677:32;3718:35;:::i;:::-;3772:7;-1:-1:-1;3830:2:1;3815:18;;3802:32;3853:18;3883:14;;;3880:2;;;3915:6;3907;3900:22;3880:2;3943:67;4002:7;3993:6;3982:9;3978:22;3943:67;:::i;:::-;3933:77;;4063:2;4052:9;4048:18;4035:32;4019:48;;4092:2;4082:8;4079:16;4076:2;;;4113:6;4105;4098:22;4076:2;4141:69;4202:7;4191:8;4180:9;4176:24;4141:69;:::i;:::-;4131:79;;4263:3;4252:9;4248:19;4235:33;4219:49;;4293:2;4283:8;4280:16;4277:2;;;4314:6;4306;4299:22;4277:2;;4342:53;4387:7;4376:8;4365:9;4361:24;4342:53;:::i;:::-;4332:63;;;3469:932;;;;;;;;:::o;4406:760::-;;;;;;4595:3;4583:9;4574:7;4570:23;4566:33;4563:2;;;4617:6;4609;4602:22;4563:2;4661:9;4648:23;4680:33;4707:5;4680:33;:::i;:::-;4732:5;-1:-1:-1;4789:2:1;4774:18;;4761:32;4802:35;4761:32;4802:35;:::i;:::-;4856:7;-1:-1:-1;4910:2:1;4895:18;;4882:32;;-1:-1:-1;4961:2:1;4946:18;;4933:32;;-1:-1:-1;5016:3:1;5001:19;;4988:33;5044:18;5033:30;;5030:2;;;5081:6;5073;5066:22;5030:2;5109:51;5152:7;5143:6;5132:9;5128:22;5109:51;:::i;5171:774::-;;;;5367:2;5355:9;5346:7;5342:23;5338:32;5335:2;;;5388:6;5380;5373:22;5335:2;5432:9;5419:23;5451:33;5478:5;5451:33;:::i;:::-;5503:5;-1:-1:-1;5559:2:1;5544:18;;5531:32;5582:18;5612:14;;;5609:2;;;5644:6;5636;5629:22;5609:2;5672:67;5731:7;5722:6;5711:9;5707:22;5672:67;:::i;:::-;5662:77;;5792:2;5781:9;5777:18;5764:32;5748:48;;5821:2;5811:8;5808:16;5805:2;;;5842:6;5834;5827:22;5805:2;;5870:69;5931:7;5920:8;5909:9;5905:24;5870:69;:::i;:::-;5860:79;;;5325:620;;;;;:::o;5950:329::-;;;6076:2;6064:9;6055:7;6051:23;6047:32;6044:2;;;6097:6;6089;6082:22;6044:2;6141:9;6128:23;6160:33;6187:5;6160:33;:::i;:::-;6212:5;-1:-1:-1;6236:37:1;6269:2;6254:18;;6236:37;:::i;:::-;6226:47;;6034:245;;;;;:::o;6284:327::-;;;6413:2;6401:9;6392:7;6388:23;6384:32;6381:2;;;6434:6;6426;6419:22;6381:2;6478:9;6465:23;6497:33;6524:5;6497:33;:::i;:::-;6549:5;6601:2;6586:18;;;;6573:32;;-1:-1:-1;;;6371:240:1:o;6616:395::-;;;;6762:2;6750:9;6741:7;6737:23;6733:32;6730:2;;;6783:6;6775;6768:22;6730:2;6827:9;6814:23;6846:33;6873:5;6846:33;:::i;:::-;6898:5;6950:2;6935:18;;6922:32;;-1:-1:-1;7001:2:1;6986:18;;;6973:32;;6720:291;-1:-1:-1;;;6720:291:1:o;7016:637::-;;;7195:2;7183:9;7174:7;7170:23;7166:32;7163:2;;;7216:6;7208;7201:22;7163:2;7261:9;7248:23;7290:18;7331:2;7323:6;7320:14;7317:2;;;7352:6;7344;7337:22;7317:2;7380:67;7439:7;7430:6;7419:9;7415:22;7380:67;:::i;:::-;7370:77;;7500:2;7489:9;7485:18;7472:32;7456:48;;7529:2;7519:8;7516:16;7513:2;;;7550:6;7542;7535:22;7513:2;;7578:69;7639:7;7628:8;7617:9;7613:24;7578:69;:::i;:::-;7568:79;;;7153:500;;;;;:::o;7658:442::-;;;7812:2;7800:9;7791:7;7787:23;7783:32;7780:2;;;7833:6;7825;7818:22;7780:2;7878:9;7865:23;7911:18;7903:6;7900:30;7897:2;;;7948:6;7940;7933:22;7897:2;7976:67;8035:7;8026:6;8015:9;8011:22;7976:67;:::i;:::-;7966:77;8090:2;8075:18;;;;8062:32;;-1:-1:-1;;;;7770:330:1:o;8105:257::-;;8216:2;8204:9;8195:7;8191:23;8187:32;8184:2;;;8237:6;8229;8222:22;8184:2;8281:9;8268:23;8300:32;8326:5;8300:32;:::i;8367:261::-;;8489:2;8477:9;8468:7;8464:23;8460:32;8457:2;;;8510:6;8502;8495:22;8457:2;8547:9;8541:16;8566:32;8592:5;8566:32;:::i;8633:482::-;;8755:2;8743:9;8734:7;8730:23;8726:32;8723:2;;;8776:6;8768;8761:22;8723:2;8821:9;8808:23;8854:18;8846:6;8843:30;8840:2;;;8891:6;8883;8876:22;8840:2;8919:22;;8972:4;8964:13;;8960:27;-1:-1:-1;8950:2:1;;9006:6;8998;8991:22;8950:2;9034:75;9101:7;9096:2;9083:16;9078:2;9074;9070:11;9034:75;:::i;9120:190::-;;9232:2;9220:9;9211:7;9207:23;9203:32;9200:2;;;9253:6;9245;9238:22;9200:2;-1:-1:-1;9281:23:1;;9190:120;-1:-1:-1;9190:120:1:o;9315:327::-;;;9444:2;9432:9;9423:7;9419:23;9415:32;9412:2;;;9465:6;9457;9450:22;9412:2;9506:9;9493:23;9483:33;;9566:2;9555:9;9551:18;9538:32;9579:33;9606:5;9579:33;:::i;9647:401::-;;;;;9801:3;9789:9;9780:7;9776:23;9772:33;9769:2;;;9823:6;9815;9808:22;9769:2;9864:9;9851:23;9841:33;;9893:37;9926:2;9915:9;9911:18;9893:37;:::i;:::-;9883:47;;9949:37;9982:2;9971:9;9967:18;9949:37;:::i;:::-;9939:47;;10005:37;10038:2;10027:9;10023:18;10005:37;:::i;:::-;9995:47;;9759:289;;;;;;;:::o;10053:258::-;;;10182:2;10170:9;10161:7;10157:23;10153:32;10150:2;;;10203:6;10195;10188:22;10150:2;-1:-1:-1;;10231:23:1;;;10301:2;10286:18;;;10273:32;;-1:-1:-1;10140:171:1:o;10316:326::-;;;;10462:2;10450:9;10441:7;10437:23;10433:32;10430:2;;;10483:6;10475;10468:22;10430:2;-1:-1:-1;;10511:23:1;;;10581:2;10566:18;;10553:32;;-1:-1:-1;10632:2:1;10617:18;;;10604:32;;10420:222;-1:-1:-1;10420:222:1:o;10647:443::-;;10744:5;10738:12;10771:6;10766:3;10759:19;10797:4;10826:2;10821:3;10817:12;10810:19;;10863:2;10856:5;10852:14;10884:3;10896:169;10910:6;10907:1;10904:13;10896:169;;;10971:13;;10959:26;;11005:12;;;;11040:15;;;;10932:1;10925:9;10896:169;;;-1:-1:-1;11081:3:1;;10714:376;-1:-1:-1;;;;;10714:376:1:o;11095:259::-;;11176:5;11170:12;11203:6;11198:3;11191:19;11219:63;11275:6;11268:4;11263:3;11259:14;11252:4;11245:5;11241:16;11219:63;:::i;:::-;11336:2;11315:15;-1:-1:-1;;11311:29:1;11302:39;;;;11343:4;11298:50;;11146:208;-1:-1:-1;;11146:208:1:o;11359:187::-;;11441:5;11435:12;11456:52;11501:6;11496:3;11489:4;11482:5;11478:16;11456:52;:::i;:::-;11524:16;;;;;11411:135;-1:-1:-1;;11411:135:1:o;11551:120::-;-1:-1:-1;;;11618:20:1;;11663:1;11654:11;;11608:63::o;11676:1315::-;12011:13;;11676:1315;;;;12084:1;12069:17;;12105:1;12141:18;;;;12168:2;;12222:4;12214:6;12210:17;12200:27;;12168:2;12248;12296;12288:6;12285:14;12265:18;12262:38;12259:2;;;-1:-1:-1;;;12323:33:1;;12379:4;12376:1;12369:15;12409:4;12330:3;12397:17;12259:2;12440:18;12467:104;;;;12585:1;12580:324;;;;12433:471;;12467:104;-1:-1:-1;;12500:24:1;;12488:37;;12545:16;;;;-1:-1:-1;12467:104:1;;12580:324;12616:39;12648:6;12616:39;:::i;:::-;12677:3;12693:165;12707:6;12704:1;12701:13;12693:165;;;12785:14;;12772:11;;;12765:35;12828:16;;;;12722:10;;12693:165;;;12697:3;;12887:6;12882:3;12878:16;12871:23;;12433:471;;;;;;;12920:65;12952:32;12980:3;12972:6;12952:32;:::i;:::-;12920:65;:::i;:::-;12913:72;11961:1030;-1:-1:-1;;;;;11961:1030:1:o;12996:203::-;-1:-1:-1;;;;;13160:32:1;;;;13142:51;;13130:2;13115:18;;13097:102::o;13204:840::-;-1:-1:-1;;;;;13601:15:1;;;13583:34;;13653:15;;13648:2;13633:18;;13626:43;13563:3;13700:2;13685:18;;13678:31;;;13204:840;;13732:63;;13775:19;;13767:6;13732:63;:::i;:::-;13843:9;13835:6;13831:22;13826:2;13815:9;13811:18;13804:50;13877;13920:6;13912;13877:50;:::i;:::-;13863:64;;13976:9;13968:6;13964:22;13958:3;13947:9;13943:19;13936:51;14004:34;14031:6;14023;14004:34;:::i;:::-;13996:42;13535:509;-1:-1:-1;;;;;;;;13535:509:1:o;14049:562::-;-1:-1:-1;;;;;14346:15:1;;;14328:34;;14398:15;;14393:2;14378:18;;14371:43;14445:2;14430:18;;14423:34;;;14488:2;14473:18;;14466:34;;;14308:3;14531;14516:19;;14509:32;;;14049:562;;14558:47;;14585:19;;14577:6;14558:47;:::i;:::-;14550:55;14280:331;-1:-1:-1;;;;;;;14280:331:1:o;14616:267::-;;14795:2;14784:9;14777:21;14815:62;14873:2;14862:9;14858:18;14850:6;14815:62;:::i;14888:477::-;;15145:2;15134:9;15127:21;15171:62;15229:2;15218:9;15214:18;15206:6;15171:62;:::i;:::-;15281:9;15273:6;15269:22;15264:2;15253:9;15249:18;15242:50;15309;15352:6;15344;15309:50;:::i;15370:187::-;15535:14;;15528:22;15510:41;;15498:2;15483:18;;15465:92::o;15562:221::-;;15711:2;15700:9;15693:21;15731:46;15773:2;15762:9;15758:18;15750:6;15731:46;:::i;15788:416::-;15990:2;15972:21;;;16029:2;16009:18;;;16002:30;16068:34;16063:2;16048:18;;16041:62;-1:-1:-1;;;16134:2:1;16119:18;;16112:50;16194:3;16179:19;;15962:242::o;16209:404::-;16411:2;16393:21;;;16450:2;16430:18;;;16423:30;16489:34;16484:2;16469:18;;16462:62;-1:-1:-1;;;16555:2:1;16540:18;;16533:38;16603:3;16588:19;;16383:230::o;16618:407::-;16820:2;16802:21;;;16859:2;16839:18;;;16832:30;16898:34;16893:2;16878:18;;16871:62;-1:-1:-1;;;16964:2:1;16949:18;;16942:41;17015:3;17000:19;;16792:233::o;17030:331::-;17232:2;17214:21;;;17271:1;17251:18;;;17244:29;-1:-1:-1;;;17304:2:1;17289:18;;17282:38;17352:2;17337:18;;17204:157::o;17366:402::-;17568:2;17550:21;;;17607:2;17587:18;;;17580:30;17646:34;17641:2;17626:18;;17619:62;-1:-1:-1;;;17712:2:1;17697:18;;17690:36;17758:3;17743:19;;17540:228::o;17773:400::-;17975:2;17957:21;;;18014:2;17994:18;;;17987:30;18053:34;18048:2;18033:18;;18026:62;-1:-1:-1;;;18119:2:1;18104:18;;18097:34;18163:3;18148:19;;17947:226::o;18178:486::-;18380:2;18362:21;;;18419:2;18399:18;;;18392:30;18458:34;18453:2;18438:18;;18431:62;18529:34;18524:2;18509:18;;18502:62;-1:-1:-1;;;18595:3:1;18580:19;;18573:49;18654:3;18639:19;;18352:312::o;18669:405::-;18871:2;18853:21;;;18910:2;18890:18;;;18883:30;18949:34;18944:2;18929:18;;18922:62;-1:-1:-1;;;19015:2:1;19000:18;;18993:39;19064:3;19049:19;;18843:231::o;19079:410::-;19281:2;19263:21;;;19320:2;19300:18;;;19293:30;19359:34;19354:2;19339:18;;19332:62;-1:-1:-1;;;19425:2:1;19410:18;;19403:44;19479:3;19464:19;;19253:236::o;19494:414::-;19696:2;19678:21;;;19735:2;19715:18;;;19708:30;19774:34;19769:2;19754:18;;19747:62;-1:-1:-1;;;19840:2:1;19825:18;;19818:48;19898:3;19883:19;;19668:240::o;19913:401::-;20115:2;20097:21;;;20154:2;20134:18;;;20127:30;20193:34;20188:2;20173:18;;20166:62;-1:-1:-1;;;20259:2:1;20244:18;;20237:35;20304:3;20289:19;;20087:227::o;20319:340::-;20521:2;20503:21;;;20560:2;20540:18;;;20533:30;-1:-1:-1;;;20594:2:1;20579:18;;20572:46;20650:2;20635:18;;20493:166::o;20664:414::-;20866:2;20848:21;;;20905:2;20885:18;;;20878:30;20944:34;20939:2;20924:18;;20917:62;-1:-1:-1;;;21010:2:1;20995:18;;20988:48;21068:3;21053:19;;20838:240::o;21083:342::-;21285:2;21267:21;;;21324:2;21304:18;;;21297:30;-1:-1:-1;;;21358:2:1;21343:18;;21336:48;21416:2;21401:18;;21257:168::o;21430:346::-;21632:2;21614:21;;;21671:2;21651:18;;;21644:30;-1:-1:-1;;;21705:2:1;21690:18;;21683:52;21767:2;21752:18;;21604:172::o;21781:342::-;21983:2;21965:21;;;22022:2;22002:18;;;21995:30;-1:-1:-1;;;22056:2:1;22041:18;;22034:48;22114:2;22099:18;;21955:168::o;22128:339::-;22330:2;22312:21;;;22369:2;22349:18;;;22342:30;-1:-1:-1;;;22403:2:1;22388:18;;22381:45;22458:2;22443:18;;22302:165::o;22472:399::-;22674:2;22656:21;;;22713:2;22693:18;;;22686:30;22752:34;22747:2;22732:18;;22725:62;-1:-1:-1;;;22818:2:1;22803:18;;22796:33;22861:3;22846:19;;22646:225::o;22876:406::-;23078:2;23060:21;;;23117:2;23097:18;;;23090:30;23156:34;23151:2;23136:18;;23129:62;-1:-1:-1;;;23222:2:1;23207:18;;23200:40;23272:3;23257:19;;23050:232::o;23287:351::-;23489:2;23471:21;;;23528:2;23508:18;;;23501:30;23567:29;23562:2;23547:18;;23540:57;23629:2;23614:18;;23461:177::o;23643:356::-;23845:2;23827:21;;;23864:18;;;23857:30;23923:34;23918:2;23903:18;;23896:62;23990:2;23975:18;;23817:182::o;24004:342::-;24206:2;24188:21;;;24245:2;24225:18;;;24218:30;-1:-1:-1;;;24279:2:1;24264:18;;24257:48;24337:2;24322:18;;24178:168::o;24351:341::-;24553:2;24535:21;;;24592:2;24572:18;;;24565:30;-1:-1:-1;;;24626:2:1;24611:18;;24604:47;24683:2;24668:18;;24525:167::o;24697:407::-;24899:2;24881:21;;;24938:2;24918:18;;;24911:30;24977:34;24972:2;24957:18;;24950:62;-1:-1:-1;;;25043:2:1;25028:18;;25021:41;25094:3;25079:19;;24871:233::o;25109:410::-;25311:2;25293:21;;;25350:2;25330:18;;;25323:30;25389:34;25384:2;25369:18;;25362:62;-1:-1:-1;;;25455:2:1;25440:18;;25433:44;25509:3;25494:19;;25283:236::o;25524:403::-;25726:2;25708:21;;;25765:2;25745:18;;;25738:30;25804:34;25799:2;25784:18;;25777:62;-1:-1:-1;;;25870:2:1;25855:18;;25848:37;25917:3;25902:19;;25698:229::o;25932:405::-;26134:2;26116:21;;;26173:2;26153:18;;;26146:30;26212:34;26207:2;26192:18;;26185:62;-1:-1:-1;;;26278:2:1;26263:18;;26256:39;26327:3;26312:19;;26106:231::o;26342:405::-;26544:2;26526:21;;;26583:2;26563:18;;;26556:30;26622:34;26617:2;26602:18;;26595:62;-1:-1:-1;;;26688:2:1;26673:18;;26666:39;26737:3;26722:19;;26516:231::o;26752:411::-;26954:2;26936:21;;;26993:2;26973:18;;;26966:30;27032:34;27027:2;27012:18;;27005:62;-1:-1:-1;;;27098:2:1;27083:18;;27076:45;27153:3;27138:19;;26926:237::o;27168:404::-;27370:2;27352:21;;;27409:2;27389:18;;;27382:30;27448:34;27443:2;27428:18;;27421:62;-1:-1:-1;;;27514:2:1;27499:18;;27492:38;27562:3;27547:19;;27342:230::o;27577:397::-;27779:2;27761:21;;;27818:2;27798:18;;;27791:30;27857:34;27852:2;27837:18;;27830:62;-1:-1:-1;;;27923:2:1;27908:18;;27901:31;27964:3;27949:19;;27751:223::o;27979:353::-;28181:2;28163:21;;;28220:2;28200:18;;;28193:30;28259:31;28254:2;28239:18;;28232:59;28323:2;28308:18;;28153:179::o;28337:345::-;28539:2;28521:21;;;28578:2;28558:18;;;28551:30;-1:-1:-1;;;28612:2:1;28597:18;;28590:51;28673:2;28658:18;;28511:171::o;28687:177::-;28833:25;;;28821:2;28806:18;;28788:76::o;28869:565::-;29138:25;;;29206:14;;29199:22;29194:2;29179:18;;29172:50;29265:14;;29258:22;29253:2;29238:18;;29231:50;29324:14;29317:22;29312:2;29297:18;;29290:50;29371:3;29356:19;;29349:35;29415:3;29400:19;;29393:35;29125:3;29110:19;;29092:342::o;29439:248::-;29613:25;;;29669:2;29654:18;;29647:34;29601:2;29586:18;;29568:119::o;29692:251::-;29762:2;29756:9;29792:17;;;29839:18;29824:34;;29860:22;;;29821:62;29818:2;;;29886:18;;:::i;:::-;29922:2;29915:22;29736:207;;-1:-1:-1;29736:207:1:o;29948:192::-;;30047:18;30039:6;30036:30;30033:2;;;30069:18;;:::i;:::-;-1:-1:-1;30129:4:1;30110:17;;;30106:28;;30023:117::o;30145:129::-;;30213:17;;;30263:4;30247:21;;;30203:71::o;30279:128::-;;30350:1;30346:6;30343:1;30340:13;30337:2;;;30356:18;;:::i;:::-;-1:-1:-1;30392:9:1;;30327:80::o;30412:120::-;;30478:1;30468:2;;30483:18;;:::i;:::-;-1:-1:-1;30517:9:1;;30458:74::o;30537:125::-;;30605:1;30602;30599:8;30596:2;;;30610:18;;:::i;:::-;-1:-1:-1;30647:9:1;;30586:76::o;30667:258::-;30739:1;30749:113;30763:6;30760:1;30757:13;30749:113;;;30839:11;;;30833:18;30820:11;;;30813:39;30785:2;30778:10;30749:113;;;30880:6;30877:1;30874:13;30871:2;;;30915:1;30906:6;30901:3;30897:16;30890:27;30871:2;;30720:205;;;:::o;30930:380::-;31015:1;31005:12;;31062:1;31052:12;;;31073:2;;31127:4;31119:6;31115:17;31105:27;;31073:2;31180;31172:6;31169:14;31149:18;31146:38;31143:2;;;31226:10;31221:3;31217:20;31214:1;31207:31;31261:4;31258:1;31251:15;31289:4;31286:1;31279:15;31143:2;;30985:325;;;:::o;31315:135::-;;-1:-1:-1;;31375:17:1;;31372:2;;;31395:18;;:::i;:::-;-1:-1:-1;31442:1:1;31431:13;;31362:88::o;31455:112::-;;31513:1;31503:2;;31518:18;;:::i;:::-;-1:-1:-1;31552:9:1;;31493:74::o;31572:127::-;31633:10;31628:3;31624:20;31621:1;31614:31;31664:4;31661:1;31654:15;31688:4;31685:1;31678:15;31704:127;31765:10;31760:3;31756:20;31753:1;31746:31;31796:4;31793:1;31786:15;31820:4;31817:1;31810:15;31836:127;31897:10;31892:3;31888:20;31885:1;31878:31;31928:4;31925:1;31918:15;31952:4;31949:1;31942:15;31968:88;32043:3;32039:15;;32025:31::o;32061:764::-;;32142:4;32124:16;32121:26;32118:2;;;32150:5;;32118:2;32191:1;32186:3;32181;32166:27;32253:10;32215:36;32246:3;32240:10;32215:36;:::i;:::-;32212:52;32202:2;;32268:5;;32202:2;32302;32296:9;32342:16;-1:-1:-1;;32338:29:1;32335:1;32296:9;32314:54;32397:4;32391:11;32421:16;32456:18;32527:2;32520:4;32512:6;32508:17;32505:25;32500:2;32492:6;32489:14;32486:45;32483:2;;;32534:5;;;;;;32483:2;32571:6;32565:4;32561:17;32550:28;;32607:3;32601:10;32587:24;;32634:2;32626:6;32623:14;32620:2;;;32640:5;;;;;;32620:2;;32701:16;32695:4;32691:27;32684:4;32675:6;32670:3;32666:16;32662:27;32659:60;32656:2;;;32722:5;;;;;32656:2;32787;32766:15;-1:-1:-1;;32762:29:1;32753:39;;32794:4;32749:50;32745:2;32738:62;32757:3;-1:-1:-1;;32108:717:1;:::o;32830:133::-;-1:-1:-1;;;;;32907:31:1;;32897:42;;32887:2;;32953:1;32950;32943:12;32968:133;-1:-1:-1;;;;;;33044:32:1;;33034:43;;33024:2;;33091:1;33088;33081:12

Swarm Source

ipfs://be0c0f53b4fb89bb9bef4324049c1ae635488e110fe2178c0d7c2ecdde97e5d6
Loading...
Loading
Loading...
Loading
[ 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.