ETH Price: $3,334.20 (-3.85%)

Token

Aftrmrkt (Aftrmrkt)
 

Overview

Max Total Supply

4,779 Aftrmrkt

Holders

357

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xb5d74F8BDB8AB8bb346e09eD3D09d29495B16849
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:
Aftrmrkt

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-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Required interface of an 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;
}

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

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

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

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

/**
 * @dev Implementation of 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;
    string private _name = 'Aftrmrkt';
    string private _symbol = 'Aftrmrkt';

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }
	
    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }
	
    /**
     * @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
    {
        require(
            _msgSender() != operator,
            "ERC1155: setting approval status for self"
        );

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

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

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

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            account,
            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 `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

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

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

        emit TransferSingle(operator, account, 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 account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

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

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

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

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

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set)
        internal
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set)
        internal
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set)
        internal
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

interface LinkTokenInterface {
    function allowance(address owner, address spender)
        external
        view
        returns (uint256 remaining);

    function approve(address spender, uint256 value)
        external
        returns (bool success);

    function balanceOf(address owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 decimalPlaces);

    function decreaseApproval(address spender, uint256 addedValue)
        external
        returns (bool success);

    function increaseApproval(address spender, uint256 subtractedValue)
        external;

    function name() external view returns (string memory tokenName);

    function symbol() external view returns (string memory tokenSymbol);

    function totalSupply() external view returns (uint256 totalTokensIssued);

    function transfer(address to, uint256 value)
        external
        returns (bool success);

    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool success);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool success);
}

contract VRFRequestIDBase {
    /**
     * @notice returns the seed which is actually input to the VRF coordinator
     *
     * @dev To prevent repetition of VRF output due to repetition of the
     * @dev user-supplied seed, that seed is combined in a hash with the
     * @dev user-specific nonce, and the address of the consuming contract. The
     * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
     * @dev the final seed, but the nonce does protect against repetition in
     * @dev requests which are included in a single block.
     *
     * @param _userSeed VRF seed input provided by user
     * @param _requester Address of the requesting contract
     * @param _nonce User-specific nonce at the time of the request
     */
    function makeVRFInputSeed(
        bytes32 _keyHash,
        uint256 _userSeed,
        address _requester,
        uint256 _nonce
    ) internal pure returns (uint256) {
        return
            uint256(
                keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))
            );
    }

    /**
     * @notice Returns the id for this request
     * @param _keyHash The serviceAgreement ID to be used for this request
     * @param _vRFInputSeed The seed to be passed directly to the VRF
     * @return The id for this request
     *
     * @dev Note that _vRFInputSeed is not the seed passed by the consuming
     * @dev contract, but the one generated by makeVRFInputSeed
     */
    function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
    }
}

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
    /**
     * @notice fulfillRandomness handles the VRF response. Your contract must
     * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
     * @notice principles to keep in mind when implementing your fulfillRandomness
     * @notice method.
     *
     * @dev VRFConsumerBase expects its subcontracts to have a method with this
     * @dev signature, and will call it once it has verified the proof
     * @dev associated with the randomness. (It is triggered via a call to
     * @dev rawFulfillRandomness, below.)
     *
     * @param requestId The Id initially returned by requestRandomness
     * @param randomness the VRF output
     */
    function fulfillRandomness(bytes32 requestId, uint256 randomness)
        internal
        virtual;

    /**
     * @dev In order to keep backwards compatibility we have kept the user
     * seed field around. We remove the use of it because given that the blockhash
     * enters later, it overrides whatever randomness the used seed provides.
     * Given that it adds no security, and can easily lead to misunderstandings,
     * we have removed it from usage and can now provide a simpler API.
     */
    uint256 private constant USER_SEED_PLACEHOLDER = 0;

    /**
     * @notice requestRandomness initiates a request for VRF output given _seed
     *
     * @dev The fulfillRandomness method receives the output, once it's provided
     * @dev by the Oracle, and verified by the vrfCoordinator.
     *
     * @dev The _keyHash must already be registered with the VRFCoordinator, and
     * @dev the _fee must exceed the fee specified during registration of the
     * @dev _keyHash.
     *
     * @dev The _seed parameter is vestigial, and is kept only for API
     * @dev compatibility with older versions. It can't *hurt* to mix in some of
     * @dev your own randomness, here, but it's not necessary because the VRF
     * @dev oracle will mix the hash of the block containing your request into the
     * @dev VRF seed it ultimately uses.
     *
     * @param _keyHash ID of public key against which randomness is generated
     * @param _fee The amount of LINK to send with the request
     *
     * @return requestId unique ID for this request
     *
     * @dev The returned requestId can be used to distinguish responses to
     * @dev concurrent requests. It is passed as the first argument to
     * @dev fulfillRandomness.
     */
    function requestRandomness(bytes32 _keyHash, uint256 _fee)
        internal
        returns (bytes32 requestId)
    {
        LINK.transferAndCall(
            vrfCoordinator,
            _fee,
            abi.encode(_keyHash, USER_SEED_PLACEHOLDER)
        );
        // This is the seed passed to VRFCoordinator. The oracle will mix this with
        // the hash of the block containing this request to obtain the seed/input
        // which is finally passed to the VRF cryptographic machinery.
        uint256 vRFSeed = makeVRFInputSeed(
            _keyHash,
            USER_SEED_PLACEHOLDER,
            address(this),
            nonces[_keyHash]
        );
        // nonces[_keyHash] must stay in sync with
        // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
        // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
        // This provides protection against the user repeating their input seed,
        // which would result in a predictable/duplicate output, if multiple such
        // requests appeared in the same block.
        nonces[_keyHash] = nonces[_keyHash] + 1;
        return makeRequestId(_keyHash, vRFSeed);
    }

    LinkTokenInterface internal immutable LINK;
    address private immutable vrfCoordinator;

    // Nonces for each VRF key from which randomness has been requested.
    //
    // Must stay in sync with VRFCoordinator[_keyHash][this]
    mapping(bytes32 => uint256) /* keyHash */ /* nonce */
        private nonces;

    /**
     * @param _vrfCoordinator address of VRFCoordinator contract
     * @param _link address of LINK token contract
     *
     * @dev https://docs.chain.link/docs/link-token-contracts
     */
    constructor(address _vrfCoordinator, address _link) {
        vrfCoordinator = _vrfCoordinator;
        LINK = LinkTokenInterface(_link);
    }

    // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
    // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
    // the origin of the call
    function rawFulfillRandomness(bytes32 requestId, uint256 randomness)
        external
    {
        require(
            msg.sender == vrfCoordinator,
            "Only VRFCoordinator can fulfill"
        );
        fulfillRandomness(requestId, randomness);
    }
}

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

contract Aftrmrkt is ERC1155, Ownable, VRFConsumerBase {
    using SafeMath for uint256;
    using Strings for uint256;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableSet for EnumerableSet.AddressSet;
	bytes32 public merkleRoot;

    bool public mainSale = false;
    bool public preSale = false;
    bool public paused = false;
	bool public breedingMinted = false;
	bool public reservedMinted = false;
	
    // Chainlink variables ----------
	
    bytes32 internal keyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
    address VRFCoordinator = 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952;
    address LinkToken = 0x514910771AF9Ca656af840dff83E8264EcF986CA;
    uint256 public fee = 2 ether;
	
	uint256 public minPerTxn = 10;
	uint256 public supplyLimit = 19150;

    //Pack Limit
    uint256 public PremiumPack = 337;
    uint256 public FreshPack = 2375;
    uint256 public StarterPack = 4914;
	
	//Premium Pack Limit
    uint256 public PPEliteCardLimit = 337;
	uint256 public PPRareCardLimit = 337;
    uint256 public PPFreshCardLimit = 337;
    uint256 public PPCommonCardLimit = 674;
	
	//Fresh Pack Limit
    uint256 public FPRareCardLimit = 829;
    uint256 public FPFreshCardLimit = 4650;
    uint256 public FPCommonCardLimit = 1646;

    //Starter Pack Limit
    uint256 public SPFreshCardLimit = 449;
    uint256 public SPCommonCardLimit = 9379;
    
	//Pack Fees Pre-Sale
    uint256 public PremiumPackFeePreSale = 0.4 ether;
    uint256 public FreshPackFeePreSale = 0.12 ether;
    uint256 public StarterPackFeePreSale = 0.046 ether;
	
    //Pack Fees Public
    uint256 public PremiumPackFee = 0.41 ether;
    uint256 public FreshPackFee = 0.13 ether;
    uint256 public StarterPackFee = 0.055 ether;

    //Total Cards Per Pack
    uint256 public freshPackCards = 7125;
    uint256 public basePackCards = 9828;
	uint256 public premiumPackCards = 1685;
	
	uint256 public randomResult;
	
    string public baseURI;
	
    enum Pack {
        PREMIUM,
        FRESH,
        BASE
    }
	
	address[] public addressList = [
	   0xE1D1f06282266B72E7aD3374F4E68386da17CD89,
	   0xc300605c136A6995A27E34391cAB9344e881F589,
	   0x7972174DA20702D2cbAabfBB8897Ae4185a82B9A 
	];
	
	uint256[] public shareList = [87,10,3];
	
    mapping(uint256 => uint256) public totalSupply;
    mapping(bytes32 => Pack) requestToPack;
    mapping(bytes32 => address) requestTouser;
    mapping(uint256 => uint256) public supplyOf;
  
    EnumerableSet.UintSet elite;
    EnumerableSet.UintSet rare;
    EnumerableSet.UintSet fresh;
    EnumerableSet.UintSet common;

    constructor() ERC1155("https://gateway.pinata.cloud/ipfs/Qmev1bGgMSaP9J8eLKuApuZeqTYen7sJjoqf2KeXvbrBnx/") VRFConsumerBase(VRFCoordinator, LinkToken) {
	{
            elite.add(4);
            supplyOf[4] = 50;
			
            elite.add(10);
            supplyOf[10] = 50;
            
			elite.add(12);
            supplyOf[12] = 50;
            
			elite.add(19);
            supplyOf[19] = 50;
			
            elite.add(23);
            supplyOf[23] = 50;
			
            elite.add(26);
            supplyOf[26] = 50;
            
			elite.add(29);
            supplyOf[29] = 50;
        }
        {
            rare.add(2);
            supplyOf[2] = 150;
			
            rare.add(5);
            supplyOf[5] = 150;
            
			rare.add(8);
            supplyOf[8] = 150;
            
			rare.add(13);
            supplyOf[13] = 150;
            
			rare.add(14);
            supplyOf[14] = 150;
            
			rare.add(21);
            supplyOf[21] = 150;
            
			rare.add(22);
            supplyOf[22] = 150;
			
            rare.add(28);
            supplyOf[28] = 150;
        }
        {
            fresh.add(1);
            supplyOf[1] = 800;
			
            fresh.add(3);
            supplyOf[3] = 800;
            
			fresh.add(6);
            supplyOf[6] = 800;
            
			fresh.add(7);
            supplyOf[7] = 800;
            
			fresh.add(16);
            supplyOf[16] = 800;
            
			fresh.add(17);
            supplyOf[17] = 800;
            
			fresh.add(24);
            supplyOf[24] = 800;
        }
        {
            common.add(9);
            supplyOf[9] = 1500;
			
            common.add(11);
            supplyOf[11] = 1500;
			
            common.add(15);
            supplyOf[15] = 1500;
			
            common.add(18);
            supplyOf[18] = 1500;
			
            common.add(20);
            supplyOf[20] = 1500;
			
            common.add(25);
            supplyOf[25] = 1500;
			
            common.add(27);
            supplyOf[27] = 1500;
			
            common.add(30);
            supplyOf[30] = 1500;
        }
		
		address beneficiary = 0x7972174DA20702D2cbAabfBB8897Ae4185a82B9A;
		
		 //Fresh Pack Mint
        _mint(beneficiary, 1, 20, "");
        _mint(beneficiary, 3, 20, "");
        _mint(beneficiary, 6, 20, "");
        _mint(beneficiary, 7, 20, "");
        _mint(beneficiary, 16, 20, "");
		_mint(beneficiary, 17, 20, "");
		_mint(beneficiary, 24, 19, "");
        
		 //Rare Pack Mint
        _mint(beneficiary, 2, 4, "");
        _mint(beneficiary, 5, 4, "");
        _mint(beneficiary, 8, 4, "");
        _mint(beneficiary, 13, 4, "");
        _mint(beneficiary, 14, 4, "");
		_mint(beneficiary, 21, 3, "");
		_mint(beneficiary, 22, 3, "");
		_mint(beneficiary, 28, 3, "");

         //Elite Pack Mint
        _mint(beneficiary, 4, 2, "");
        _mint(beneficiary, 10, 1, "");
        _mint(beneficiary, 12, 1, "");
        _mint(beneficiary, 19, 1, "");
        _mint(beneficiary, 23, 1, "");
        _mint(beneficiary, 26, 1, "");
        _mint(beneficiary, 29, 1, "");

         //Comman Pack Mint   
        _mint(beneficiary, 9, 38, "");
        _mint(beneficiary, 11, 38, "");
		_mint(beneficiary, 15, 38, "");
		_mint(beneficiary, 18, 37, "");
		_mint(beneficiary, 20, 37, "");
		_mint(beneficiary, 25, 37, "");
		_mint(beneficiary, 27, 37, "");
		_mint(beneficiary, 30, 37, "");
    }
	
	function setPreSaleStatus(bool _status) public onlyOwner {
	   require(preSale != _status);
       preSale = _status;
    }
	
	function setSaleStatus(bool _status) public onlyOwner {
        require(mainSale != _status);
		mainSale = _status;
    }

    function pause() public onlyOwner {
        paused = !paused;
    }

    function setPremiumPackFee(uint256 _premiumPackFee) external onlyOwner {
        PremiumPackFee = _premiumPackFee;
    }

    function setFreshPackFee(uint256 _freshPackFee) external onlyOwner {
        FreshPackFee = _freshPackFee;
    }

    function setStarterPackFee(uint256 _basePackFee) external onlyOwner {
        StarterPackFee = _basePackFee;
    }
	
	function setPreSalePremiumPackFee(uint256 _premiumPackFee) external onlyOwner {
        PremiumPackFeePreSale = _premiumPackFee;
    }

    function setPreSaleFreshPackFee(uint256 _freshPackFee) external onlyOwner {
        FreshPackFeePreSale = _freshPackFee;
    }

    function setPreSaleStarterPackFee(uint256 _basePackFee) external onlyOwner {
        StarterPackFeePreSale = _basePackFee;
    }
	
    function uri(uint256 id) public view override returns (string memory) {
        require(id > 0, "Aftrmrkt::uri: Invalid id.");
        return string(abi.encodePacked(baseURI, "/", id.toString(), ".json"));
    }

    function setBaseURI(string memory _baseURI) public onlyOwner {
        require(
            bytes(_baseURI).length > 0,
            "Aftrmrkt::setBaseURI: Invalid base URI."
        );
        baseURI = _baseURI;
    }
	
	function getLinkBalance() external view returns (uint256) {
        return LINK.balanceOf(address(this));
    }

    function withdrawLink() external onlyOwner {
        LINK.transfer(owner(), LINK.balanceOf(address(this)));
    }
	
	function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        for (uint256 i = 0; i < addressList.length; i++) {
		   payable(addressList[i]).transfer(balance.mul(shareList[i]).div(100));
        }
    }
	
	function updateMerkleRoot(bytes32 newRoot) external onlyOwner {
	   merkleRoot = newRoot;
	}

    function getValues() external view returns (uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory)
    {
        return (elite.values(), rare.values(), fresh.values(), common.values());
    }
	
    function buyPresalePremiumPack(uint256 count, bytes32[] calldata merkleProof) external payable {
	    bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(!paused, "the contract is paused");
        require(preSale, "Aftmrkt::preCheck: presale is not active");
        require(
            PremiumPack >= count,
            "Aftmrkt::buyPremiumPack: PremiumPacks are sold out."
        );
		require(
			MerkleProof.verify(merkleProof, merkleRoot, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= PremiumPackFeePreSale.mul(count),
            "Aftmrkt::buyPresalePremiumPack: Insufficient amount."
        );
		for (uint256 i = 0; i < count; i++) {
            bytes32 requestId = requestRandomness(keyHash, fee);
			requestToPack[requestId] = Pack.PREMIUM;
			requestTouser[requestId] = _msgSender();
			PremiumPack = PremiumPack - 1;
        }
    }

    function buyPresaleFreshPack(uint256 count, bytes32[] calldata merkleProof) external payable {
	    bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(!paused, "the contract is paused");
        require(preSale, "Aftmrkt::preCheck: presale is not active");
        require(
            FreshPack >= count,
            "Aftmrkt::buyFreshPack: FreshPacks are sold out."
        );
		require(
			MerkleProof.verify(merkleProof, merkleRoot, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= FreshPackFeePreSale.mul(count),
            "Aftmrkt::buyPresaleFreshPack: Insufficient amount."
        );
		for (uint256 i = 0; i < count; i++) {
            bytes32 requestId = requestRandomness(keyHash, fee);
			requestToPack[requestId] = Pack.FRESH;
			requestTouser[requestId] = _msgSender();
			FreshPack = FreshPack - 1;
        }
    }

    function buyPresaleStarterPack(uint256 count, bytes32[] calldata merkleProof) external payable {
	    bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(!paused, "the contract is paused");
        require(preSale, "Aftmrkt::preCheck: presale is not active");
        require(
            StarterPack >= count,
            "Aftmrkt::buyFreshPack: FreshPacks are sold out."
        );
		require(
			MerkleProof.verify(merkleProof, merkleRoot, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= StarterPackFeePreSale.mul(count),
            "Aftmrkt::buyPresaleStarterPack: Insufficient amount."
        );
		
		for (uint256 i = 0; i < count; i++) {
            bytes32 requestId = requestRandomness(keyHash, fee);
			requestToPack[requestId] = Pack.BASE;
			requestTouser[requestId] = _msgSender();
			StarterPack = StarterPack - 1;
        }
    }

    function buyPremiumPack(uint256 count) external payable {
        require(!paused, "the contract is paused");
        require(mainSale, "Aftmrkt::preCheck: Sale is not active");
        require(
            PremiumPack >= count,
            "Aftmrkt::buyPremiumPack: PremiumPacks are sold out."
        );
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= PremiumPackFee.mul(count),
            "Aftmrkt::buyPremiumPack: Insufficient amount."
        );
		for (uint256 i = 0; i < count; i++) {
            bytes32 requestId = requestRandomness(keyHash, fee);
			requestToPack[requestId] = Pack.PREMIUM;
			requestTouser[requestId] = _msgSender();
			PremiumPack = PremiumPack - 1;
        }
    }
	
    function buyFreshPack(uint256 count) external payable {
        require(!paused, "the contract is paused");
        require(mainSale, "Aftmrkt::preCheck: Sale is not active");
        require(
            FreshPack >= count,
            "Aftmrkt::buyFreshPack: FreshPacks are sold out."
        );
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= FreshPackFee.mul(count),
            "Aftmrkt::buyFreshPack: Insufficient amount."
        );
		for (uint256 i = 0; i < count; i++) {
             bytes32 requestId = requestRandomness(keyHash, fee);
			 requestToPack[requestId] = Pack.FRESH;
			 requestTouser[requestId] = _msgSender();
			 FreshPack = FreshPack - 1;
        }
    }
	
    function buyStarterPack(uint256 count) external payable {
        require(!paused, "the contract is paused");
        require(mainSale, "Aftmrkt::preCheck: Sale is not active");
        require(
            StarterPack >= count,
            "Aftmrkt::buyFreshPack: FreshPacks are sold out."
        );
		require(
			count <= minPerTxn,
			"Exceeds max mint limit per tnx"
		);
        require(
            LINK.balanceOf(address(this)) >= fee.mul(count),
            "Not enough LINK - fill contract with faucet"
        );
        require(
            msg.value >= StarterPackFee.mul(count),
            "Aftmrkt::buyStarterPack: Insufficient amount."
        );
		for (uint256 i = 0; i < count; i++) {
             bytes32 requestId = requestRandomness(keyHash, fee);
			 requestToPack[requestId] = Pack.BASE;
			 requestTouser[requestId] = _msgSender();
			 StarterPack = StarterPack - 1;
        }
    }
	
    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override{
        if (requestToPack[requestId] == Pack.PREMIUM) 
		{
            givePremiumPack(randomness, requestId);
        } 
		else if (requestToPack[requestId] == Pack.FRESH) 
		{
            giveFreshPack(randomness, requestId);
        } 
		else {
            giveStarterPack(randomness, requestId);
        }
    }
	
    function givePremiumPack(uint256 _randomNumner, bytes32 _requestId) internal{
        giveEliteCard(_randomNumner.div(10**3), _requestId);
		PPEliteCardLimit = PPEliteCardLimit - 1;
        giveRareCard(_randomNumner.div(10**6), _requestId);
		PPRareCardLimit = PPRareCardLimit - 1;
        giveFreshCard(_randomNumner.div(10**9), _requestId);
		PPFreshCardLimit = PPFreshCardLimit - 1;
        giveCommonCard(_randomNumner.div(10**12), _requestId);
		PPCommonCardLimit = PPCommonCardLimit - 1;
        giveCommonCard(_randomNumner.div(10**15), _requestId);
		PPCommonCardLimit = PPCommonCardLimit - 1;
    }
	
    function giveFreshPack(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 nfts = 3;
        uint256 rareProb = FPRareCardLimit.mul(100).div(freshPackCards);
        if (_randomNumner.div(10**3).mod(100) <= rareProb) {
            giveRareCard(_randomNumner.div(10**6), _requestId);
            nfts = nfts - 1;
            freshPackCards = freshPackCards - 1;
            FPRareCardLimit = FPRareCardLimit - 1;
        }
        uint256 commonProb = FPCommonCardLimit.mul(100).div(freshPackCards);
        if (_randomNumner.div(10**9).mod(100) <= commonProb) {
            giveCommonCard(_randomNumner.div(10**12), _requestId);
            nfts = nfts - 1;
            FPCommonCardLimit = FPCommonCardLimit - 1;
            freshPackCards = freshPackCards - 1;
        }
        for (; nfts > 0; nfts = nfts - 1) {
            giveFreshCard(_randomNumner.div(10**nfts * 5), _requestId);
            freshPackCards = freshPackCards - 1;
            FPFreshCardLimit = FPFreshCardLimit - 1;
        }
    }

    function giveStarterPack(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 nfts = 2;
        uint256 freshProb = SPFreshCardLimit.mul(100).div(basePackCards);
        if (_randomNumner.div(10**9).mod(100) <= freshProb) {
            giveFreshCard(_randomNumner.div(10**15), _requestId);
            basePackCards = basePackCards - 1;
            SPFreshCardLimit = SPFreshCardLimit - 1;
            nfts = nfts - 1;
        }
        for (; nfts > 0; nfts = nfts - 1) {
            giveCommonCard(_randomNumner.div(10**nfts*7), _requestId);
            basePackCards = basePackCards - 1;
            SPCommonCardLimit = SPCommonCardLimit - 1;
        }
    }

    function giveEliteCard(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 edition = _randomNumner.mod(elite.length());
        _mint(requestTouser[_requestId], elite.at(edition), 1, "");
        supplyOf[elite.at(edition)] = supplyOf[elite.at(edition)] - 1;
        if (supplyOf[elite.at(edition)] == 0) {
            elite.remove(edition);
        }
        totalSupply[edition] = totalSupply[edition] + 1;
    }
	
    function giveRareCard(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 edition = _randomNumner.mod(rare.length());
        _mint(requestTouser[_requestId], rare.at(edition), 1, "");
        supplyOf[rare.at(edition)] = supplyOf[rare.at(edition)] - 1;
        if (supplyOf[rare.at(edition)] == 0) {
            rare.remove(edition);
        }
        totalSupply[edition] = totalSupply[edition] + 1;
    }

    function giveFreshCard(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 edition = _randomNumner.mod(fresh.length());
        _mint(requestTouser[_requestId], fresh.at(edition), 1, "");
        supplyOf[fresh.at(edition)] = supplyOf[fresh.at(edition)] - 1;
        if (supplyOf[fresh.at(edition)] == 0) {
            fresh.remove(edition);
        }
        totalSupply[edition] = totalSupply[edition] + 1;
    }

    function giveCommonCard(uint256 _randomNumner, bytes32 _requestId) internal {
        uint256 edition = _randomNumner.mod(common.length());
        _mint(requestTouser[_requestId], common.at(edition), 1, "");
        supplyOf[common.at(edition)] = supplyOf[common.at(edition)] - 1;
        if (supplyOf[common.at(edition)] == 0) {
            common.remove(edition);
        }
        totalSupply[edition] = totalSupply[edition] + 1;
    }
	
	function mintReservedNFT(address beneficiary) external onlyOwner {
	   require(!paused, "the contract is paused");
	   require(!reservedMinted, "already Minted");
	   
	    //Elite
	   _mint(beneficiary, 10, 1, "");
	   _mint(beneficiary, 12, 1, "");
	   _mint(beneficiary, 19, 1, "");
	   _mint(beneficiary, 23, 1, "");
	   _mint(beneficiary, 26, 1, "");
	   
	    //Rare
	   _mint(beneficiary, 2, 1, "");
	   _mint(beneficiary, 8, 1, "");
	   _mint(beneficiary, 14, 1, "");
	   _mint(beneficiary, 21, 1, "");
	   _mint(beneficiary, 22, 1, "");
	   
	    //Fresh
	   _mint(beneficiary, 1, 4, "");
	   _mint(beneficiary, 3, 4, "");
	   _mint(beneficiary, 6, 3, "");
	   _mint(beneficiary, 7, 4, "");
	   _mint(beneficiary, 16, 4, "");
	   _mint(beneficiary, 17, 3, "");
	   _mint(beneficiary, 24, 3, "");
	   
	    //Fresh
	   _mint(beneficiary, 18, 1, "");
	   _mint(beneficiary, 27, 1, "");
	   
	   reservedMinted = true;
	}
	
	function mintBreedingNFT() external onlyOwner {
	   require(!paused, "the contract is paused");
	   require(!breedingMinted, "already Minted");
	   
	  _mint(msg.sender, 31, 10, "");
	  _mint(msg.sender, 32, 15, "");
	  _mint(msg.sender, 33, 20, "");
	  _mint(msg.sender, 34, 25, "");
	  _mint(msg.sender, 35, 25, "");
	  _mint(msg.sender, 36, 25, "");
	  _mint(msg.sender, 37, 25, "");
	  _mint(msg.sender, 38, 25, "");
	  _mint(msg.sender, 39, 25, "");
	  
	   breedingMinted = true;
	}
	
	function updateMintPerTransectionLimit(uint256 newLimit) external onlyOwner {
        minPerTxn = newLimit;
    }
	
	function setFee(uint256 newFee) public onlyOwner {
        fee = newFee;
    }
}

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"},{"inputs":[],"name":"FPCommonCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FPFreshCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FPRareCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreshPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreshPackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreshPackFeePreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PPCommonCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PPEliteCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PPFreshCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PPRareCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PremiumPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PremiumPackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PremiumPackFeePreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPCommonCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPFreshCardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StarterPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StarterPackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StarterPackFeePreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"basePackCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedingMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"buyFreshPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"buyPremiumPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"buyPresaleFreshPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"buyPresalePremiumPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"buyPresaleStarterPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"buyStarterPack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freshPackCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValues","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"mainSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBreedingNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"mintReservedNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumPackCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomResult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freshPackFee","type":"uint256"}],"name":"setFreshPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freshPackFee","type":"uint256"}],"name":"setPreSaleFreshPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumPackFee","type":"uint256"}],"name":"setPreSalePremiumPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basePackFee","type":"uint256"}],"name":"setPreSaleStarterPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPreSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumPackFee","type":"uint256"}],"name":"setPremiumPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basePackFee","type":"uint256"}],"name":"setStarterPackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shareList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","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":"bytes32","name":"newRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMintPerTransectionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLink","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052600860c08190526710599d1c9b5c9add60c21b60e09081526200002c91600391906200137c565b506040805180820190915260088082526710599d1c9b5c9add60c21b60209092019182526200005e916004916200137c565b506008805464ffffffffff191690557faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445600955600a80546001600160a01b031990811673f0d54349addcf704f77ae15b96510dea15cb7952178255600b805490911673514910771af9ca656af840dff83e8264ecf986ca179055671bc16d674ec80000600c55600d55614ace600e55610151600f819055610947601055611332601155601281905560138190556014556102a260155561033d60165561122a60175561066e6018556101c16019556124a3601a5567058d15e176280000601b556701aa535d3d0c0000601c5566a36cc19bab0000601d556705b09cd3e5e90000601e556701cdda4faccd0000601f5566c3663566a580006020908155611bd56021556126646022556106956023556040805160608101825273e1d1f06282266b72e7ad3374f4e68386da17cd89815273c300605c136a6995a27e34391cab9344e881f58992810192909252737972174da20702d2cbaabfbb8897ae4185a82b9a90820152620001f29060269060036200140b565b506040805160608101825260578152600a602082015260039181018290526200021f916027919062001463565b503480156200022d57600080fd5b50600a54600b54604080516080810190915260518082526001600160a01b03938416939092169162006e226020830139620002688162000fdf565b506200027d6200027762000ff8565b62000ffd565b606091821b6001600160601b031990811660a052911b16608052620002b1602c60046200104f602090811b62002d6a17901c565b506004600052602b602090815260327f8bd115fc6ec81ad72d5ca8a8b3bd3d0177f1b615af6ad35644a4e24a7bed08bc55620002fc90602c90600a9062002d6a6200104f821b17901c565b50600a600052602b602090815260327ffe0e37ce758b51a69351c40a804c935f77ae90ee1439b996ebd363289e5c21de556200034790602c90600c9062002d6a6200104f821b17901c565b50600c600052602b602090815260327f5b9e430ca72834a5a91eda4503a6a9307ee407fcc95e91a349793d0f49eb1ee4556200039290602c9060139062002d6a6200104f821b17901c565b506013600052602b602090815260327f0af8b4c21889ee05e7f1812222783c1ffb67295707948e3dd1462d6786d7298255620003dd90602c9060179062002d6a6200104f821b17901c565b506017600052602b602090815260327fe1d7aeebd0d60293b24401c4c92af2173cc3afcde111be494f6d7325e0169e43556200042890602c90601a9062002d6a6200104f821b17901c565b50601a600052602b602090815260327f76902726a9b3f17c942b63910bb61190b8d923008f60556635481583722a6e27556200047390602c90601d9062002d6a6200104f821b17901c565b50601d600052602b602090815260327f1f0d8461f45d70e44a723a66f6652af77a5b531f8999c8d710416a1614cd995955620004be90602e9060029062002d6a6200104f821b17901c565b506002600052602b602090815260967fbd6c10e6ce287735500a1c033be76c57d5e632addc2ff6eff6bb587b8ee0d95c556200050990602e9060059062002d6a6200104f821b17901c565b506005600052602b602090815260967f4b5b933abde5416303ae4347d7fcdf5a17e8022e0fefc2b31c7609ebd3c32fe9556200055490602e9060089062002d6a6200104f821b17901c565b506008600052602b602090815260967fb145d60eaadb8dbd7aeb92dc4e0faae9b4a8d9eacc51e2fdf2d1eda28a5001f9556200059f90602e90600d9062002d6a6200104f821b17901c565b50600d600052602b602090815260967f8c688a7b26847278b765ce8cead72897723ed827e5bfb12d7a9bccf33663cce555620005ea90602e90600e9062002d6a6200104f821b17901c565b50600e600052602b602090815260967f8ed06702931c4683599a40f0bc9b6bf93b82286779558b3bae6f818dd038340f556200063590602e9060159062002d6a6200104f821b17901c565b506015600052602b602090815260967fb41d2087922e824371d6ce97a541b7382e26455957628f040adfa60d34019fc5556200068090602e9060169062002d6a6200104f821b17901c565b506016600052602b602090815260967fc74fc9913e9f053b926f1b7e5e806ea37d6cb080e5ee74eda5393c217285ea5155620006cb90602e90601c9062002d6a6200104f821b17901c565b50601c600052602b602090815260967f4ac77ae7167770617ed91c70f77da0ec4e9feaa376354ca4dd1eac3807ea26a555620007169060309060019062002d6a6200104f821b17901c565b506001600052602b60209081526103207ffcc3d43705633578a5e8f1b6d6f38d08eb8cb891174edcc94b1a54972a1aebbd55620007629060309060039062002d6a6200104f821b17901c565b506003600052602b60209081526103207fd3904653c5d0f9b122879aa13f7287465a10522aedd588dbbd607cf6f8b2147f55620007ae9060309060069062002d6a6200104f821b17901c565b506006600052602b60209081526103207f5ac1f6ea00ad8b0f699e3a293cc93d6fdaf7ee608fbc40ffef54db3fb7ebb94355620007fa9060309060079062002d6a6200104f821b17901c565b506007600052602b60209081526103207f455b6dea826802a5b6200d61a7810fccbd36f05c878743e3ac0e0e7aff3a46e855620008469060309060109062002d6a6200104f821b17901c565b506010600052602b60209081526103207f3935219329ac33d1b4fd3d0830ffa0a7678721661e3dc7c7b4c133cb62834d4155620008929060309060119062002d6a6200104f821b17901c565b506011600052602b60209081526103207ffe2bbaa5749edefbff2cadd7a85f196e9b92c2b074ac7c972618dad9711bba6155620008de9060309060189062002d6a6200104f821b17901c565b506018600052602b60209081526103207fd5e7bbfc4e223e5e3d9d7c7a37313a57026f05eb3aa1937e7c55b7c9c520e38f556200092a9060329060099062002d6a6200104f821b17901c565b506009600052602b60209081526105dc7fbbfb500ddfdc1ad00e64a51e8456a4dbe787cd5e4b8a9b94f14197a4a6b44282556200097690603290600b9062002d6a6200104f821b17901c565b50600b600052602b60209081526105dc7fd37a9057efd446ec548b5d03ef691e3e12549983399a75083b8c8fd64899084755620009c290603290600f9062002d6a6200104f821b17901c565b50600f600052602b60209081526105dc7f6edcdaf87e5c684e1b9b3c7c26017cfada9aed1f842821c314f45cb7e9ba49935562000a0e9060329060129062002d6a6200104f821b17901c565b506012600052602b60209081526105dc7f3ec9727f7a4da99229194cc63f77ac2d18b46a6bcbd75254a5dafab96674ba6d5562000a5a9060329060149062002d6a6200104f821b17901c565b506014600052602b60209081526105dc7f641319d914d6f297fdead0b1eb00dee7ac98fc9de9a3b237d3019be167a550715562000aa69060329060199062002d6a6200104f821b17901c565b506019600052602b60209081526105dc7ff783870b425ed748b5cbd12f99ce764ea89cc0e16405d551c4af4b0c4f5622075562000af290603290601b9062002d6a6200104f821b17901c565b50601b600052602b60209081526105dc7f052998f05032677ffe0e835488a13854f36bbee4b77a705ff64fa2ab49f267385562000b3e90603290601e9062002d6a6200104f821b17901c565b50601e6000908152602b60209081526105dc7f6da937dc5e9bc7e08fa0fe76dc10e790ea0898e1d85fa00d8423a5f755cc823c55604080519182019052908152737972174da20702d2cbaabfbb8897ae4185a82b9a9062000ba790829060019060149062001066565b62000bcc8160036014604051806020016040528060008152506200106660201b60201c565b62000bf18160066014604051806020016040528060008152506200106660201b60201c565b62000c168160076014604051806020016040528060008152506200106660201b60201c565b62000c3b8160106014604051806020016040528060008152506200106660201b60201c565b62000c608160116014604051806020016040528060008152506200106660201b60201c565b62000c858160186013604051806020016040528060008152506200106660201b60201c565b62000caa8160026004604051806020016040528060008152506200106660201b60201c565b62000ccf8160056004604051806020016040528060008152506200106660201b60201c565b62000cf48160086004604051806020016040528060008152506200106660201b60201c565b62000d1981600d6004604051806020016040528060008152506200106660201b60201c565b62000d3e81600e6004604051806020016040528060008152506200106660201b60201c565b62000d638160156003604051806020016040528060008152506200106660201b60201c565b62000d888160166003604051806020016040528060008152506200106660201b60201c565b62000dad81601c6003604051806020016040528060008152506200106660201b60201c565b62000dd28160046002604051806020016040528060008152506200106660201b60201c565b62000df781600a6001604051806020016040528060008152506200106660201b60201c565b62000e1c81600c6001604051806020016040528060008152506200106660201b60201c565b62000e418160136001604051806020016040528060008152506200106660201b60201c565b62000e668160176001604051806020016040528060008152506200106660201b60201c565b62000e8b81601a6001604051806020016040528060008152506200106660201b60201c565b62000eb081601d6001604051806020016040528060008152506200106660201b60201c565b62000ed58160096026604051806020016040528060008152506200106660201b60201c565b62000efa81600b6026604051806020016040528060008152506200106660201b60201c565b62000f1f81600f6026604051806020016040528060008152506200106660201b60201c565b62000f448160126025604051806020016040528060008152506200106660201b60201c565b62000f698160146025604051806020016040528060008152506200106660201b60201c565b62000f8e8160196025604051806020016040528060008152506200106660201b60201c565b62000fb381601b6025604051806020016040528060008152506200106660201b60201c565b62000fd881601e6025604051806020016040528060008152506200106660201b60201c565b50620017a4565b805162000ff49060029060208401906200137c565b5050565b335b90565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006200105d838362001176565b90505b92915050565b6001600160a01b038416620010985760405162461bcd60e51b81526004016200108f906200163d565b60405180910390fd5b6000620010a462000ff8565b9050620010cb81600087620010b988620011c5565b620010c488620011c5565b876200121f565b6000848152602081815260408083206001600160a01b038916845290915281208054859290620010fd9084906200168c565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051620011569291906200167e565b60405180910390a46200116f8160008787878762001227565b5050505050565b60006200118483836200135e565b620011bc5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562001060565b50600062001060565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106200120e57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b505050505050565b62001246846001600160a01b03166200137660201b62002d7d1760201c565b156200121f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200128290899089908890889088906004016200153c565b602060405180830381600087803b1580156200129d57600080fd5b505af1925050508015620012d0575060408051601f3d908101601f19168201909252620012cd91810190620014bd565b60015b6200132257620012df620016f4565b80620012ec575062001308565b8060405162461bcd60e51b81526004016200108f919062001583565b60405162461bcd60e51b81526004016200108f9062001598565b6001600160e01b0319811663f23a6e6160e01b14620013555760405162461bcd60e51b81526004016200108f90620015f5565b50505050505050565b60009081526001919091016020526040902054151590565b3b151590565b8280546200138a90620016b1565b90600052602060002090601f016020900481019282620013ae5760008555620013f9565b82601f10620013c957805160ff1916838001178555620013f9565b82800160010185558215620013f9579182015b82811115620013f9578251825591602001919060010190620013dc565b5062001407929150620014a6565b5090565b828054828255906000526020600020908101928215620013f9579160200282015b82811115620013f957825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200142c565b828054828255906000526020600020908101928215620013f9579160200282015b82811115620013f9578251829060ff1690559160200191906001019062001484565b5b80821115620014075760008155600101620014a7565b600060208284031215620014cf578081fd5b81516001600160e01b031981168114620014e7578182fd5b9392505050565b60008151808452815b818110156200151557602081850181015186830182015201620014f7565b81811115620015275782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906200157890830184620014ee565b979650505050505050565b6000602082526200105d6020830184620014ee565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560408201527f526563656976657220696d706c656d656e746572000000000000000000000000606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b918252602082015260400190565b60008219821115620016ac57634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620016c657607f821691505b60208210811415620016e857634e487b7160e01b600052602260045260246000fd5b50919050565b60e01c90565b600060443d1015620017065762000ffa565b600481823e6308c379a06200171c8251620016ee565b14620017285762000ffa565b6040513d600319016004823e80513d6001600160401b03808311602484018310171562001759575050505062000ffa565b8284019250825191508082111562001775575050505062000ffa565b503d830160208284010111156200178f5750505062000ffa565b601f01601f1916810160200160405291505090565b60805160601c60a05160601c61560c62001816600039600081816121770152612ddb015260008181610dce01528181611249015281816115aa0152818161192701528181611c1701528181611fa101528181611fed0152818161228001528181612b100152612dac015261560c6000f3fe60806040526004361061043b5760003560e01c80636f2ebf3011610234578063a22cb4651161012e578063d897833e116100b6578063e985e9c51161007a578063e985e9c514610b56578063ec6fc2ce14610b76578063f242432a14610b8b578063f2fde38b14610bab578063fa393b9614610bcb5761043b565b8063d897833e14610ae4578063d93e0c2114610b04578063dc18bbcf14610b19578063ddca3f4314610b2e578063e3e7563914610b435761043b565b8063b53c9c6c116100fd578063b53c9c6c14610a4f578063b810fb4314610a6f578063bd85b03914610a8f578063c465488614610aaf578063d402972714610ac45761043b565b8063a22cb465146109e5578063a4f2f9e414610a05578063a8029c9c14610a1a578063a920644514610a3a5761043b565b80638806792f116101bc57806394985ddd1161018057806394985ddd1461097357806395d89b41146109935780639af91bbb146109a85780639c8444c8146109bb5780639e8b1ba9146109d05761043b565b80638806792f146108dc5780638da5cb5b146108fc5780638dc654a21461091e57806391082c92146109335780639402d375146109535761043b565b80637de29510116102035780637de295101461086857806380c45c901461087d5780638456cb591461089d578063853828b6146108b2578063854c43c7146108c75761043b565b80636f2ebf3014610818578063715018a61461082b57806371794b8f146108405780637418f5c7146108555761043b565b8063347b2dfa1161034557806357717925116102cd5780635fd1aae6116102915780635fd1aae61461079b57806360212dc4146107bb57806360cfd359146107ce57806369fe0e2d146107e35780636c0360eb146108035761043b565b8063577179251461071c57806358589f44146107315780635a7adf7f146107515780635c975abb146107665780635e326b921461077b5761043b565b80634783f0ef116103145780634783f0ef146106855780634e1273f4146106a55780634f297ccc146106d257806350c5f975146106e757806355f804b3146106fc5761043b565b8063347b2dfa146106315780633cbfba4c1461064657806342619f661461065b578063429b64af146106705761043b565b806319441880116103c8578063240267821161039757806324026782146105bd5780632c0ac691146105d25780632eb2c2d6146105e75780632eb4a7ab1461060757806330d774181461061c5761043b565b8063194418801461055957806319d1997a1461056e57806319eb4a901461058357806320baa474146105a85761043b565b8063077b9c471161040f578063077b9c47146104da578063086c4405146104ef5780630e89341c1461050457806313f2d99714610524578063143f9717146105395761043b565b8062fdd58e1461044057806301e2e7331461047657806301ffc9a71461048b57806306fdde03146104b8575b600080fd5b34801561044c57600080fd5b5061046061045b36600461442b565b610be0565b60405161046d919061499a565b60405180910390f35b34801561048257600080fd5b50610460610c3a565b34801561049757600080fd5b506104ab6104a6366004614583565b610c40565b60405161046d919061498f565b3480156104c457600080fd5b506104cd610c88565b60405161046d91906149c7565b6104ed6104e836600461454a565b610d1b565b005b3480156104fb57600080fd5b50610460610f30565b34801561051057600080fd5b506104cd61051f36600461454a565b610f36565b34801561053057600080fd5b50610460610f8a565b34801561054557600080fd5b506104ed61055436600461454a565b610f90565b34801561056557600080fd5b50610460610fd4565b34801561057a57600080fd5b50610460610fda565b34801561058f57600080fd5b50610598610fe0565b60405161046d9493929190614942565b3480156105b457600080fd5b5061046061101c565b3480156105c957600080fd5b50610460611022565b3480156105de57600080fd5b50610460611028565b3480156105f357600080fd5b506104ed6106023660046142ec565b61102e565b34801561061357600080fd5b5061046061108c565b34801561062857600080fd5b50610460611092565b34801561063d57600080fd5b506104ab611098565b34801561065257600080fd5b506104606110a8565b34801561066757600080fd5b506104606110ae565b34801561067c57600080fd5b506104606110b4565b34801561069157600080fd5b506104ed6106a036600461454a565b6110ba565b3480156106b157600080fd5b506106c56106c0366004614454565b6110fe565b60405161046d919061490a565b3480156106de57600080fd5b506104ab61121e565b3480156106f357600080fd5b5061046061122f565b34801561070857600080fd5b506104ed6107173660046145bb565b6112d3565b34801561072857600080fd5b50610460611346565b34801561073d57600080fd5b506104ed61074c36600461454a565b61134c565b34801561075d57600080fd5b506104ab611390565b34801561077257600080fd5b506104ab61139e565b34801561078757600080fd5b506104ed610796366004614512565b6113ad565b3480156107a757600080fd5b506104ed6107b636600461454a565b611422565b6104ed6107c9366004614619565b611466565b3480156107da57600080fd5b506104ab611708565b3480156107ef57600080fd5b506104ed6107fe36600461454a565b611711565b34801561080f57600080fd5b506104cd611755565b6104ed610826366004614619565b6117e3565b34801561083757600080fd5b506104ed611a82565b34801561084c57600080fd5b50610460611acd565b6104ed610863366004614619565b611ad3565b34801561087457600080fd5b50610460611d75565b34801561088957600080fd5b506104ed61089836600461454a565b611d7b565b3480156108a957600080fd5b506104ed611dbf565b3480156108be57600080fd5b506104ed611e1d565b3480156108d357600080fd5b50610460611f39565b3480156108e857600080fd5b506104606108f736600461454a565b611f3f565b34801561090857600080fd5b50610911611f51565b60405161046d9190614813565b34801561092a57600080fd5b506104ed611f60565b34801561093f57600080fd5b506104ed61094e36600461454a565b6120e4565b34801561095f57600080fd5b506104ed61096e36600461454a565b612128565b34801561097f57600080fd5b506104ed61098e366004614562565b61216c565b34801561099f57600080fd5b506104cd6121be565b6104ed6109b636600461454a565b6121cd565b3480156109c757600080fd5b506104606123de565b3480156109dc57600080fd5b506104606123e4565b3480156109f157600080fd5b506104ed610a003660046143f5565b6123ea565b348015610a1157600080fd5b506104606124b8565b348015610a2657600080fd5b506104ed610a3536600461454a565b6124be565b348015610a4657600080fd5b50610460612502565b348015610a5b57600080fd5b506104ed610a6a3660046142a0565b612508565b348015610a7b57600080fd5b50610911610a8a36600461454a565b6127da565b348015610a9b57600080fd5b50610460610aaa36600461454a565b612804565b348015610abb57600080fd5b50610460612816565b348015610ad057600080fd5b50610460610adf36600461454a565b61281c565b348015610af057600080fd5b506104ed610aff366004614512565b61283d565b348015610b1057600080fd5b506104606128a5565b348015610b2557600080fd5b506104ed6128ab565b348015610b3a57600080fd5b50610460612a57565b6104ed610b5136600461454a565b612a5d565b348015610b6257600080fd5b506104ab610b713660046142ba565b612c6b565b348015610b8257600080fd5b50610460612c99565b348015610b9757600080fd5b506104ed610ba6366004614392565b612c9f565b348015610bb757600080fd5b506104ed610bc63660046142a0565b612cf6565b348015610bd757600080fd5b50610460612d64565b60006001600160a01b038316610c115760405162461bcd60e51b8152600401610c0890614a76565b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b601f5481565b60006001600160e01b03198216636cdb3d1360e11b1480610c7157506001600160e01b031982166303a24d0760e21b145b80610c805750610c8082612d83565b90505b919050565b606060038054610c979061545b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc39061545b565b8015610d105780601f10610ce557610100808354040283529160200191610d10565b820191906000526020600020905b815481529060010190602001808311610cf357829003601f168201915b505050505090505b90565b60085462010000900460ff1615610d445760405162461bcd60e51b8152600401610c0890614f45565b60085460ff16610d665760405162461bcd60e51b8152600401610c0890614ecb565b806010541015610d885760405162461bcd60e51b8152600401610c0890614d8d565b600d54811115610daa5760405162461bcd60e51b8152600401610c0890614c6b565b600c54610db79082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610e03903090600401614813565b60206040518083038186803b158015610e1b57600080fd5b505afa158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190614601565b1015610e715760405162461bcd60e51b8152600401610c0890614bdf565b601f54610e7e9082612d9c565b341015610e9d5760405162461bcd60e51b8152600401610c0890614f75565b60005b81811015610f2c576000610eb8600954600c54612da8565b6000818152602960205260409020805460ff191660011790559050610edb612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055601054610f1690600190615418565b6010555080610f2481615496565b915050610ea0565b5050565b60145481565b606060008211610f585760405162461bcd60e51b8152600401610c08906150c0565b6025610f6383612eef565b604051602001610f7492919061475d565b6040516020818303038152906040529050919050565b60125481565b610f98612eeb565b6001600160a01b0316610fa9611f51565b6001600160a01b031614610fcf5760405162461bcd60e51b8152600401610c0890614f10565b601d55565b600d5481565b600e5481565b606080606080610ff0602c61300a565b610ffa602e61300a565b611004603061300a565b61100e603261300a565b935093509350935090919293565b60225481565b60105481565b60135481565b611036612eeb565b6001600160a01b0316856001600160a01b0316148061105c575061105c85610b71612eeb565b6110785760405162461bcd60e51b8152600401610c0890614ce7565b6110858585858585613017565b5050505050565b60075481565b601c5481565b6008546301000000900460ff1681565b601e5481565b60245481565b60195481565b6110c2612eeb565b6001600160a01b03166110d3611f51565b6001600160a01b0316146110f95760405162461bcd60e51b8152600401610c0890614f10565b600755565b606081518351146111215760405162461bcd60e51b8152600401610c0890615140565b6000835167ffffffffffffffff81111561114b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611174578160200160208202803683370190505b50905060005b8451811015611216576111db8582815181106111a657634e487b7160e01b600052603260045260246000fd5b60200260200101518583815181106111ce57634e487b7160e01b600052603260045260246000fd5b6020026020010151610be0565b8282815181106111fb57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261120f81615496565b905061117a565b509392505050565b600854640100000000900460ff1681565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319061127e903090600401614813565b60206040518083038186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190614601565b905090565b6112db612eeb565b6001600160a01b03166112ec611f51565b6001600160a01b0316146113125760405162461bcd60e51b8152600401610c0890614f10565b60008151116113335760405162461bcd60e51b8152600401610c0890614b98565b8051610f2c90602590602084019061410d565b60165481565b611354612eeb565b6001600160a01b0316611365611f51565b6001600160a01b03161461138b5760405162461bcd60e51b8152600401610c0890614f10565b601b55565b600854610100900460ff1681565b60085462010000900460ff1681565b6113b5612eeb565b6001600160a01b03166113c6611f51565b6001600160a01b0316146113ec5760405162461bcd60e51b8152600401610c0890614f10565b60085460ff610100909104161515811515141561140857600080fd5b600880549115156101000261ff0019909216919091179055565b61142a612eeb565b6001600160a01b031661143b611f51565b6001600160a01b0316146114615760405162461bcd60e51b8152600401610c0890614f10565b601e55565b6000336040516020016114799190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff16156114be5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff166114e55760405162461bcd60e51b8152600401610c0890614b50565b8360115410156115075760405162461bcd60e51b8152600401610c0890614d8d565b6115488383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b6115645760405162461bcd60e51b8152600401610c0890614c2a565b600d548411156115865760405162461bcd60e51b8152600401610c0890614c6b565b600c546115939085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906115df903090600401614813565b60206040518083038186803b1580156115f757600080fd5b505afa15801561160b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162f9190614601565b101561164d5760405162461bcd60e51b8152600401610c0890614bdf565b601d5461165a9085612d9c565b3410156116795760405162461bcd60e51b8152600401610c0890614d39565b60005b84811015611085576000611694600954600c54612da8565b6000818152602960205260409020805460ff1916600217905590506116b7612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790556011546116f290600190615418565b601155508061170081615496565b91505061167c565b60085460ff1681565b611719612eeb565b6001600160a01b031661172a611f51565b6001600160a01b0316146117505760405162461bcd60e51b8152600401610c0890614f10565b600c55565b602580546117629061545b565b80601f016020809104026020016040519081016040528092919081815260200182805461178e9061545b565b80156117db5780601f106117b0576101008083540402835291602001916117db565b820191906000526020600020905b8154815290600101906020018083116117be57829003601f168201915b505050505081565b6000336040516020016117f69190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff161561183b5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff166118625760405162461bcd60e51b8152600401610c0890614b50565b83600f5410156118845760405162461bcd60e51b8152600401610c0890614e26565b6118c58383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b6118e15760405162461bcd60e51b8152600401610c0890614c2a565b600d548411156119035760405162461bcd60e51b8152600401610c0890614c6b565b600c546119109085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319061195c903090600401614813565b60206040518083038186803b15801561197457600080fd5b505afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190614601565b10156119ca5760405162461bcd60e51b8152600401610c0890614bdf565b601b546119d79085612d9c565b3410156119f65760405162461bcd60e51b8152600401610c089061506c565b60005b84811015611085576000611a11600954600c54612da8565b6000818152602960205260409020805460ff191690559050611a31612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600f54611a6c90600190615418565b600f555080611a7a81615496565b9150506119f9565b611a8a612eeb565b6001600160a01b0316611a9b611f51565b6001600160a01b031614611ac15760405162461bcd60e51b8152600401610c0890614f10565b611acb60006132a3565b565b60185481565b600033604051602001611ae69190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff1615611b2b5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff16611b525760405162461bcd60e51b8152600401610c0890614b50565b836010541015611b745760405162461bcd60e51b8152600401610c0890614d8d565b611bb58383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b611bd15760405162461bcd60e51b8152600401610c0890614c2a565b600d54841115611bf35760405162461bcd60e51b8152600401610c0890614c6b565b600c54611c009085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611c4c903090600401614813565b60206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c9190614601565b1015611cba5760405162461bcd60e51b8152600401610c0890614bdf565b601c54611cc79085612d9c565b341015611ce65760405162461bcd60e51b8152600401610c0890614e79565b60005b84811015611085576000611d01600954600c54612da8565b6000818152602960205260409020805460ff191660011790559050611d24612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055601054611d5f90600190615418565b6010555080611d6d81615496565b915050611ce9565b601b5481565b611d83612eeb565b6001600160a01b0316611d94611f51565b6001600160a01b031614611dba5760405162461bcd60e51b8152600401610c0890614f10565b601f55565b611dc7612eeb565b6001600160a01b0316611dd8611f51565b6001600160a01b031614611dfe5760405162461bcd60e51b8152600401610c0890614f10565b6008805462ff0000198116620100009182900460ff1615909102179055565b611e25612eeb565b6001600160a01b0316611e36611f51565b6001600160a01b031614611e5c5760405162461bcd60e51b8152600401610c0890614f10565b4760005b602654811015610f2c5760268181548110611e8b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166108fc611efe6064611ef860278681548110611ede57634e487b7160e01b600052603260045260246000fd5b906000526020600020015487612d9c90919063ffffffff16565b906132f5565b6040518115909202916000818181858888f19350505050158015611f26573d6000803e3d6000fd5b5080611f3181615496565b915050611e60565b60115481565b602b6020526000908152604090205481565b6005546001600160a01b031690565b611f68612eeb565b6001600160a01b0316611f79611f51565b6001600160a01b031614611f9f5760405162461bcd60e51b8152600401610c0890614f10565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611fd6611f51565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612022903090600401614813565b60206040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120729190614601565b6040518363ffffffff1660e01b815260040161208f9291906148ca565b602060405180830381600087803b1580156120a957600080fd5b505af11580156120bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e1919061452e565b50565b6120ec612eeb565b6001600160a01b03166120fd611f51565b6001600160a01b0316146121235760405162461bcd60e51b8152600401610c0890614f10565b601c55565b612130612eeb565b6001600160a01b0316612141611f51565b6001600160a01b0316146121675760405162461bcd60e51b8152600401610c0890614f10565b602055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121b45760405162461bcd60e51b8152600401610c089061500d565b610f2c8282613301565b606060048054610c979061545b565b60085462010000900460ff16156121f65760405162461bcd60e51b8152600401610c0890614f45565b60085460ff166122185760405162461bcd60e51b8152600401610c0890614ecb565b80601154101561223a5760405162461bcd60e51b8152600401610c0890614d8d565b600d5481111561225c5760405162461bcd60e51b8152600401610c0890614c6b565b600c546122699082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906122b5903090600401614813565b60206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123059190614601565b10156123235760405162461bcd60e51b8152600401610c0890614bdf565b6020546123309082612d9c565b34101561234f5760405162461bcd60e51b8152600401610c0890615212565b60005b81811015610f2c57600061236a600954600c54612da8565b6000818152602960205260409020805460ff19166002179055905061238d612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790556011546123c890600190615418565b60115550806123d681615496565b915050612352565b601d5481565b60205481565b816001600160a01b03166123fc612eeb565b6001600160a01b031614156124235760405162461bcd60e51b8152600401610c08906150f7565b8060016000612430612eeb565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612474612eeb565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ac919061498f565b60405180910390a35050565b60215481565b6124c6612eeb565b6001600160a01b03166124d7611f51565b6001600160a01b0316146124fd5760405162461bcd60e51b8152600401610c0890614f10565b600d55565b60235481565b612510612eeb565b6001600160a01b0316612521611f51565b6001600160a01b0316146125475760405162461bcd60e51b8152600401610c0890614f10565b60085462010000900460ff16156125705760405162461bcd60e51b8152600401610c0890614f45565b600854640100000000900460ff161561259b5760405162461bcd60e51b8152600401610c0890615044565b6125b881600a600160405180602001604052806000815250613394565b6125d581600c600160405180602001604052806000815250613394565b6125f2816013600160405180602001604052806000815250613394565b61260f816017600160405180602001604052806000815250613394565b61262c81601a600160405180602001604052806000815250613394565b612649816002600160405180602001604052806000815250613394565b612666816008600160405180602001604052806000815250613394565b61268381600e600160405180602001604052806000815250613394565b6126a0816015600160405180602001604052806000815250613394565b6126bd816016600160405180602001604052806000815250613394565b6126da816001600460405180602001604052806000815250613394565b6126f7816003600460405180602001604052806000815250613394565b612714816006600360405180602001604052806000815250613394565b612731816007600460405180602001604052806000815250613394565b61274e816010600460405180602001604052806000815250613394565b61276b816011600360405180602001604052806000815250613394565b612788816018600360405180602001604052806000815250613394565b6127a5816012600160405180602001604052806000815250613394565b6127c281601b600160405180602001604052806000815250613394565b506008805464ff000000001916640100000000179055565b602681815481106127ea57600080fd5b6000918252602090912001546001600160a01b0316905081565b60286020526000908152604090205481565b601a5481565b6027818154811061282c57600080fd5b600091825260209091200154905081565b612845612eeb565b6001600160a01b0316612856611f51565b6001600160a01b03161461287c5760405162461bcd60e51b8152600401610c0890614f10565b60085460ff161515811515141561289257600080fd5b6008805460ff1916911515919091179055565b60155481565b6128b3612eeb565b6001600160a01b03166128c4611f51565b6001600160a01b0316146128ea5760405162461bcd60e51b8152600401610c0890614f10565b60085462010000900460ff16156129135760405162461bcd60e51b8152600401610c0890614f45565b6008546301000000900460ff161561293d5760405162461bcd60e51b8152600401610c0890615044565b61295a33601f600a60405180602001604052806000815250613394565b612977336020600f60405180602001604052806000815250613394565b612994336021601460405180602001604052806000815250613394565b6129b1336022601960405180602001604052806000815250613394565b6129ce336023601960405180602001604052806000815250613394565b6129eb336024601960405180602001604052806000815250613394565b612a08336025601960405180602001604052806000815250613394565b612a25336026601960405180602001604052806000815250613394565b612a42336027601960405180602001604052806000815250613394565b6008805463ff00000019166301000000179055565b600c5481565b60085462010000900460ff1615612a865760405162461bcd60e51b8152600401610c0890614f45565b60085460ff16612aa85760405162461bcd60e51b8152600401610c0890614ecb565b80600f541015612aca5760405162461bcd60e51b8152600401610c0890614e26565b600d54811115612aec5760405162461bcd60e51b8152600401610c0890614c6b565b600c54612af99082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612b45903090600401614813565b60206040518083038186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b959190614601565b1015612bb35760405162461bcd60e51b8152600401610c0890614bdf565b601e54612bc09082612d9c565b341015612bdf5760405162461bcd60e51b8152600401610c0890614fc0565b60005b81811015610f2c576000612bfa600954600c54612da8565b6000818152602960205260409020805460ff191690559050612c1a612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600f54612c5590600190615418565b600f555080612c6381615496565b915050612be2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600f5481565b612ca7612eeb565b6001600160a01b0316856001600160a01b03161480612ccd5750612ccd85610b71612eeb565b612ce95760405162461bcd60e51b8152600401610c0890614b07565b6110858585858585613483565b612cfe612eeb565b6001600160a01b0316612d0f611f51565b6001600160a01b031614612d355760405162461bcd60e51b8152600401610c0890614f10565b6001600160a01b038116612d5b5760405162461bcd60e51b8152600401610c0890614ac1565b6120e1816132a3565b60175481565b6000612d7683836135b7565b9392505050565b3b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b6000612d7682846153f9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612e0f92919061474f565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612e3c939291906148e3565b602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8e919061452e565b50600083815260066020526040812054612ead90859083903090613601565b600085815260066020526040902054909150612eca9060016152b9565b600085815260066020526040902055612ee3848261363b565b949350505050565b3390565b606081612f1457506040805180820190915260018152600360fc1b6020820152610c83565b8160005b8115612f3e5780612f2881615496565b9150612f379050600a836152d1565b9150612f18565b60008167ffffffffffffffff811115612f6757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f91576020820181803683370190505b5090505b8415612ee357612fa6600183615418565b9150612fb3600a866154b1565b612fbe9060306152b9565b60f81b818381518110612fe157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613003600a866152d1565b9450612f95565b60606000612d768361366e565b81518351146130385760405162461bcd60e51b8152600401610c0890615189565b6001600160a01b03841661305e5760405162461bcd60e51b8152600401610c0890614ca2565b6000613068612eeb565b90506130788187878787876131e0565b60005b845181101561317a5760008582815181106130a657634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106130d257634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156131225760405162461bcd60e51b8152600401610c0890614ddc565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061315f9084906152b9565b925050819055505050508061317390615496565b905061307b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516131ca92919061491d565b60405180910390a46131e08187878787876136ca565b505050505050565b600081815b855181101561329857600086828151811061321857634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161325957828160405160200161323c92919061474f565b604051602081830303815290604052805190602001209250613285565b808360405160200161326c92919061474f565b6040516020818303038152906040528051906020012092505b508061329081615496565b9150506131ed565b509092149392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612d7682846152d1565b60008281526029602052604081205460ff16600281111561333257634e487b7160e01b600052602160045260246000fd5b14156133475761334281836137d8565b610f2c565b600160008381526029602052604090205460ff16600281111561337a57634e487b7160e01b600052602160045260246000fd5b141561338a5761334281836138a4565b610f2c8183613a0f565b6001600160a01b0384166133ba5760405162461bcd60e51b8152600401610c08906151d1565b60006133c4612eeb565b90506133e5816000876133d688613afd565b6133df88613afd565b876131e0565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906134159084906152b9565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161346c92919061474f565b60405180910390a461108581600087878787613b56565b6001600160a01b0384166134a95760405162461bcd60e51b8152600401610c0890614ca2565b60006134b3612eeb565b90506134c48187876133d688613afd565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156135055760405162461bcd60e51b8152600401610c0890614ddc565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906135429084906152b9565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161359892919061474f565b60405180910390a46135ae828888888888613b56565b50505050505050565b60006135c38383613c27565b6135f957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c34565b506000610c34565b60008484848460405160200161361a94939291906149a3565b60408051601f19818403018152919052805160209091012095945050505050565b6000828260405160200161365092919061474f565b60405160208183030381529060405280519060200120905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156136be57602002820191906000526020600020905b8154815260200190600101908083116136aa575b50505050509050919050565b6136dc846001600160a01b0316612d7d565b156131e05760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906137159089908990889088908890600401614827565b602060405180830381600087803b15801561372f57600080fd5b505af192505050801561375f575060408051601f3d908101601f1916820190925261375c9181019061459f565b60015b6137a85761376b61550d565b806137765750613790565b8060405162461bcd60e51b8152600401610c0891906149c7565b60405162461bcd60e51b8152600401610c08906149da565b6001600160e01b0319811663bc197c8160e01b146135ae5760405162461bcd60e51b8152600401610c0890614a2e565b6137ed6137e7836103e86132f5565b82613c3f565b60016012546137fc9190615418565b60125561381561380f83620f42406132f5565b82613d4b565b60016013546138249190615418565b60135561383e61383883633b9aca006132f5565b82613e09565b600160145461384d9190615418565b6014556138686138628364e8d4a510006132f5565b82613ec7565b60016015546138779190615418565b60155561388e6138628366038d7ea4c680006132f5565b600160155461389d9190615418565b6015555050565b6021546016546003916000916138c09190611ef8906064612d9c565b9050806138da60646138d4876103e86132f5565b90613f85565b11613927576138f56138ef85620f42406132f5565b84613d4b565b613900600183615418565b915060016021546139119190615418565b60215560165461392390600190615418565b6016555b6000613945602154611ef86064601854612d9c90919063ffffffff16565b90508061395b60646138d488633b9aca006132f5565b116139aa576139786139728664e8d4a510006132f5565b85613ec7565b613983600184615418565b925060016018546139949190615418565b6018556021546139a690600190615418565b6021555b8215611085576139d96139d36139c185600a61532b565b6139cc9060056153f9565b87906132f5565b85613e09565b60016021546139e89190615418565b6021556017546139fa90600190615418565b601755613a08600184615418565b92506139aa565b602254601954600291600091613a2b9190611ef8906064612d9c565b905080613a4160646138d487633b9aca006132f5565b11613a9257613a60613a5a8566038d7ea4c680006132f5565b84613e09565b6001602254613a6f9190615418565b602255601954613a8190600190615418565b601955613a8f600183615418565b91505b8115613af757613ac1613abb613aa984600a61532b565b613ab49060076153f9565b86906132f5565b84613ec7565b6001602254613ad09190615418565b602255601a54613ae290600190615418565b601a55613af0600183615418565b9150613a92565b50505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613b4557634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613b68846001600160a01b0316612d7d565b156131e05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613ba19089908990889088908890600401614885565b602060405180830381600087803b158015613bbb57600080fd5b505af1925050508015613beb575060408051601f3d908101601f19168201909252613be89181019061459f565b60015b613bf75761376b61550d565b6001600160e01b0319811663f23a6e6160e01b146135ae5760405162461bcd60e51b8152600401610c0890614a2e565b60009081526001919091016020526040902054151590565b6000613c55613c4e602c613f91565b8490613f85565b6000838152602a6020526040902054909150613c96906001600160a01b0316613c7f602c84613f9c565b600160405180602001604052806000815250613394565b6001602b6000613ca7602c85613f9c565b815260200190815260200160002054613cc09190615418565b602b6000613ccf602c85613f9c565b815260200190815260200160002081905550602b6000613cf983602c613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b602c82613fa8565b505b600081815260286020526040902054613d379060016152b9565b600091825260286020526040909120555050565b6000613d5a613c4e602e613f91565b6000838152602a6020526040902054909150613d84906001600160a01b0316613c7f602e84613f9c565b6001602b6000613d95602e85613f9c565b815260200190815260200160002054613dae9190615418565b602b6000613dbd602e85613f9c565b815260200190815260200160002081905550602b6000613de783602e613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b602e82613fa8565b6000613e18613c4e6030613f91565b6000838152602a6020526040902054909150613e42906001600160a01b0316613c7f603084613f9c565b6001602b6000613e53603085613f9c565b815260200190815260200160002054613e6c9190615418565b602b6000613e7b603085613f9c565b815260200190815260200160002081905550602b6000613ea5836030613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b603082613fa8565b6000613ed6613c4e6032613f91565b6000838152602a6020526040902054909150613f00906001600160a01b0316613c7f603284613f9c565b6001602b6000613f11603285613f9c565b815260200190815260200160002054613f2a9190615418565b602b6000613f39603285613f9c565b815260200190815260200160002081905550602b6000613f63836032613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b603282613fa8565b6000612d7682846154b1565b6000610c8082613fb4565b6000612d768383613fb8565b6000612d768383613ff0565b5490565b6000826000018281548110613fdd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120548015614103576000614014600183615418565b855490915060009061402890600190615418565b90508181146140a957600086600001828154811061405657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061408757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140c857634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c34565b6000915050610c34565b8280546141199061545b565b90600052602060002090601f01602090048101928261413b5760008555614181565b82601f1061415457805160ff1916838001178555614181565b82800160010185558215614181579182015b82811115614181578251825591602001919060010190614166565b5061418d929150614191565b5090565b5b8082111561418d5760008155600101614192565b600067ffffffffffffffff8311156141c0576141c06154f1565b6141d3601f8401601f191660200161525f565b90508281528383830111156141e757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114610c8357600080fd5b600082601f830112614225578081fd5b8135602061423a61423583615289565b61525f565b8281528181019085830183850287018401881015614256578586fd5b855b8581101561427457813584529284019290840190600101614258565b5090979650505050505050565b600082601f830112614291578081fd5b612d76838335602085016141a6565b6000602082840312156142b1578081fd5b612d76826141fe565b600080604083850312156142cc578081fd5b6142d5836141fe565b91506142e3602084016141fe565b90509250929050565b600080600080600060a08688031215614303578081fd5b61430c866141fe565b945061431a602087016141fe565b9350604086013567ffffffffffffffff80821115614336578283fd5b61434289838a01614215565b94506060880135915080821115614357578283fd5b61436389838a01614215565b93506080880135915080821115614378578283fd5b5061438588828901614281565b9150509295509295909350565b600080600080600060a086880312156143a9578081fd5b6143b2866141fe565b94506143c0602087016141fe565b93506040860135925060608601359150608086013567ffffffffffffffff8111156143e9578182fd5b61438588828901614281565b60008060408385031215614407578182fd5b614410836141fe565b91506020830135614420816155b2565b809150509250929050565b6000806040838503121561443d578182fd5b614446836141fe565b946020939093013593505050565b60008060408385031215614466578182fd5b823567ffffffffffffffff8082111561447d578384fd5b818501915085601f830112614490578384fd5b813560206144a061423583615289565b82815281810190858301838502870184018b10156144bc578889fd5b8896505b848710156144e5576144d1816141fe565b8352600196909601959183019183016144c0565b50965050860135925050808211156144fb578283fd5b5061450885828601614215565b9150509250929050565b600060208284031215614523578081fd5b8135612d76816155b2565b60006020828403121561453f578081fd5b8151612d76816155b2565b60006020828403121561455b578081fd5b5035919050565b60008060408385031215614574578182fd5b50508035926020909101359150565b600060208284031215614594578081fd5b8135612d76816155c0565b6000602082840312156145b0578081fd5b8151612d76816155c0565b6000602082840312156145cc578081fd5b813567ffffffffffffffff8111156145e2578182fd5b8201601f810184136145f2578182fd5b612ee3848235602084016141a6565b600060208284031215614612578081fd5b5051919050565b60008060006040848603121561462d578081fd5b83359250602084013567ffffffffffffffff8082111561464b578283fd5b818601915086601f83011261465e578283fd5b81358181111561466c578384fd5b876020808302850101111561467f578384fd5b6020830194508093505050509250925092565b6000815180845260208085019450808401835b838110156146c1578151875295820195908201906001016146a5565b509495945050505050565b600081518084526146e481602086016020860161542f565b601f01601f19169290920160200192915050565b6000815161470a81856020860161542f565b9290920192915050565b64173539b7b760d91b815260050190565b602f60f81b815260010190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b825460009081906002810460018083168061477957607f831692505b602080841082141561479957634e487b7160e01b87526022600452602487fd5b8180156147ad57600181146147be576147ea565b60ff198616895284890196506147ea565b6147c78b6152ad565b885b868110156147e25781548b8201529085019083016147c9565b505084890196505b50505050505061480a6148056147ff83614725565b866146f8565b614714565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061485390830186614692565b82810360608401526148658186614692565b9050828103608084015261487981856146cc565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906148bf908301846146cc565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b03851682528360208301526060604083015261480a60608301846146cc565b600060208252612d766020830184614692565b6000604082526149306040830185614692565b828103602084015261480a8185614692565b6000608082526149556080830187614692565b82810360208401526149678187614692565b9050828103604084015261497b8186614692565b905082810360608401526148bf8185614692565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b600060208252612d7660208301846146cc565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526028908201527f4166746d726b743a3a707265436865636b3a2070726573616c65206973206e6f604082015267742061637469766560c01b606082015260800190565b60208082526027908201527f416674726d726b743a3a736574426173655552493a20496e76616c696420626160408201526639b2902aa9249760c91b606082015260800190565b6020808252602b908201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060408201526a1dda5d1a0819985d58d95d60aa1b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b6020808252601e908201527f45786365656473206d6178206d696e74206c696d69742070657220746e780000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526034908201527f4166746d726b743a3a62757950726573616c65537461727465725061636b3a2060408201527324b739bab33334b1b4b2b73a1030b6b7bab73a1760611b606082015260800190565b6020808252602f908201527f4166746d726b743a3a62757946726573685061636b3a2046726573685061636b60408201526e399030b9329039b7b6321037baba1760891b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526033908201527f4166746d726b743a3a6275795072656d69756d5061636b3a205072656d69756d6040820152722830b1b5b99030b9329039b7b6321037baba1760691b606082015260800190565b60208082526032908201527f4166746d726b743a3a62757950726573616c6546726573685061636b3a20496e60408201527139bab33334b1b4b2b73a1030b6b7bab73a1760711b606082015260800190565b60208082526025908201527f4166746d726b743a3a707265436865636b3a2053616c65206973206e6f742061604082015264637469766560d81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604082015260600190565b6020808252602b908201527f4166746d726b743a3a62757946726573685061636b3a20496e7375666669636960408201526a32b73a1030b6b7bab73a1760a91b606082015260800190565b6020808252602d908201527f4166746d726b743a3a6275795072656d69756d5061636b3a20496e737566666960408201526c31b4b2b73a1030b6b7bab73a1760991b606082015260800190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b6020808252600e908201526d185b1c9958591e48135a5b9d195960921b604082015260600190565b60208082526034908201527f4166746d726b743a3a62757950726573616c655072656d69756d5061636b3a2060408201527324b739bab33334b1b4b2b73a1030b6b7bab73a1760611b606082015260800190565b6020808252601a908201527f416674726d726b743a3a7572693a20496e76616c69642069642e000000000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602d908201527f4166746d726b743a3a627579537461727465725061636b3a20496e737566666960408201526c31b4b2b73a1030b6b7bab73a1760991b606082015260800190565b60405181810167ffffffffffffffff81118282101715615281576152816154f1565b604052919050565b600067ffffffffffffffff8211156152a3576152a36154f1565b5060209081020190565b60009081526020902090565b600082198211156152cc576152cc6154c5565b500190565b6000826152e0576152e06154db565b500490565b80825b60018086116152f75750615322565b818704821115615309576153096154c5565b8086161561531657918102915b9490941c9380026152e8565b94509492505050565b6000612d76600019848460008261534457506001612d76565b8161535157506000612d76565b816001811461536757600281146153715761539e565b6001915050612d76565b60ff841115615382576153826154c5565b6001841b915084821115615398576153986154c5565b50612d76565b5060208310610133831016604e8410600b84101617156153d1575081810a838111156153cc576153cc6154c5565b612d76565b6153de84848460016152e5565b8086048211156153f0576153f06154c5565b02949350505050565b6000816000190483118215151615615413576154136154c5565b500290565b60008282101561542a5761542a6154c5565b500390565b60005b8381101561544a578181015183820152602001615432565b83811115613af75750506000910152565b60028104600182168061546f57607f821691505b6020821081141561549057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154aa576154aa6154c5565b5060010190565b6000826154c0576154c06154db565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d101561551d57610d18565b600481823e6308c379a06155318251615507565b1461553b57610d18565b6040513d600319016004823e80513d67ffffffffffffffff816024840111818411171561556b5750505050610d18565b828401925082519150808211156155855750505050610d18565b503d8301602082840101111561559d57505050610d18565b601f01601f1916810160200160405291505090565b80151581146120e157600080fd5b6001600160e01b0319811681146120e157600080fdfea264697066735822122012caf3ca419ad0cc183e4f0a8a0b0597d440f9de0d1cb6bb0ce7265445ce3f8664736f6c6343000800003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6576316247674d536150394a38654c4b754170755a65715459656e37734a6a6f7166324b6558766272426e782f

Deployed Bytecode

0x60806040526004361061043b5760003560e01c80636f2ebf3011610234578063a22cb4651161012e578063d897833e116100b6578063e985e9c51161007a578063e985e9c514610b56578063ec6fc2ce14610b76578063f242432a14610b8b578063f2fde38b14610bab578063fa393b9614610bcb5761043b565b8063d897833e14610ae4578063d93e0c2114610b04578063dc18bbcf14610b19578063ddca3f4314610b2e578063e3e7563914610b435761043b565b8063b53c9c6c116100fd578063b53c9c6c14610a4f578063b810fb4314610a6f578063bd85b03914610a8f578063c465488614610aaf578063d402972714610ac45761043b565b8063a22cb465146109e5578063a4f2f9e414610a05578063a8029c9c14610a1a578063a920644514610a3a5761043b565b80638806792f116101bc57806394985ddd1161018057806394985ddd1461097357806395d89b41146109935780639af91bbb146109a85780639c8444c8146109bb5780639e8b1ba9146109d05761043b565b80638806792f146108dc5780638da5cb5b146108fc5780638dc654a21461091e57806391082c92146109335780639402d375146109535761043b565b80637de29510116102035780637de295101461086857806380c45c901461087d5780638456cb591461089d578063853828b6146108b2578063854c43c7146108c75761043b565b80636f2ebf3014610818578063715018a61461082b57806371794b8f146108405780637418f5c7146108555761043b565b8063347b2dfa1161034557806357717925116102cd5780635fd1aae6116102915780635fd1aae61461079b57806360212dc4146107bb57806360cfd359146107ce57806369fe0e2d146107e35780636c0360eb146108035761043b565b8063577179251461071c57806358589f44146107315780635a7adf7f146107515780635c975abb146107665780635e326b921461077b5761043b565b80634783f0ef116103145780634783f0ef146106855780634e1273f4146106a55780634f297ccc146106d257806350c5f975146106e757806355f804b3146106fc5761043b565b8063347b2dfa146106315780633cbfba4c1461064657806342619f661461065b578063429b64af146106705761043b565b806319441880116103c8578063240267821161039757806324026782146105bd5780632c0ac691146105d25780632eb2c2d6146105e75780632eb4a7ab1461060757806330d774181461061c5761043b565b8063194418801461055957806319d1997a1461056e57806319eb4a901461058357806320baa474146105a85761043b565b8063077b9c471161040f578063077b9c47146104da578063086c4405146104ef5780630e89341c1461050457806313f2d99714610524578063143f9717146105395761043b565b8062fdd58e1461044057806301e2e7331461047657806301ffc9a71461048b57806306fdde03146104b8575b600080fd5b34801561044c57600080fd5b5061046061045b36600461442b565b610be0565b60405161046d919061499a565b60405180910390f35b34801561048257600080fd5b50610460610c3a565b34801561049757600080fd5b506104ab6104a6366004614583565b610c40565b60405161046d919061498f565b3480156104c457600080fd5b506104cd610c88565b60405161046d91906149c7565b6104ed6104e836600461454a565b610d1b565b005b3480156104fb57600080fd5b50610460610f30565b34801561051057600080fd5b506104cd61051f36600461454a565b610f36565b34801561053057600080fd5b50610460610f8a565b34801561054557600080fd5b506104ed61055436600461454a565b610f90565b34801561056557600080fd5b50610460610fd4565b34801561057a57600080fd5b50610460610fda565b34801561058f57600080fd5b50610598610fe0565b60405161046d9493929190614942565b3480156105b457600080fd5b5061046061101c565b3480156105c957600080fd5b50610460611022565b3480156105de57600080fd5b50610460611028565b3480156105f357600080fd5b506104ed6106023660046142ec565b61102e565b34801561061357600080fd5b5061046061108c565b34801561062857600080fd5b50610460611092565b34801561063d57600080fd5b506104ab611098565b34801561065257600080fd5b506104606110a8565b34801561066757600080fd5b506104606110ae565b34801561067c57600080fd5b506104606110b4565b34801561069157600080fd5b506104ed6106a036600461454a565b6110ba565b3480156106b157600080fd5b506106c56106c0366004614454565b6110fe565b60405161046d919061490a565b3480156106de57600080fd5b506104ab61121e565b3480156106f357600080fd5b5061046061122f565b34801561070857600080fd5b506104ed6107173660046145bb565b6112d3565b34801561072857600080fd5b50610460611346565b34801561073d57600080fd5b506104ed61074c36600461454a565b61134c565b34801561075d57600080fd5b506104ab611390565b34801561077257600080fd5b506104ab61139e565b34801561078757600080fd5b506104ed610796366004614512565b6113ad565b3480156107a757600080fd5b506104ed6107b636600461454a565b611422565b6104ed6107c9366004614619565b611466565b3480156107da57600080fd5b506104ab611708565b3480156107ef57600080fd5b506104ed6107fe36600461454a565b611711565b34801561080f57600080fd5b506104cd611755565b6104ed610826366004614619565b6117e3565b34801561083757600080fd5b506104ed611a82565b34801561084c57600080fd5b50610460611acd565b6104ed610863366004614619565b611ad3565b34801561087457600080fd5b50610460611d75565b34801561088957600080fd5b506104ed61089836600461454a565b611d7b565b3480156108a957600080fd5b506104ed611dbf565b3480156108be57600080fd5b506104ed611e1d565b3480156108d357600080fd5b50610460611f39565b3480156108e857600080fd5b506104606108f736600461454a565b611f3f565b34801561090857600080fd5b50610911611f51565b60405161046d9190614813565b34801561092a57600080fd5b506104ed611f60565b34801561093f57600080fd5b506104ed61094e36600461454a565b6120e4565b34801561095f57600080fd5b506104ed61096e36600461454a565b612128565b34801561097f57600080fd5b506104ed61098e366004614562565b61216c565b34801561099f57600080fd5b506104cd6121be565b6104ed6109b636600461454a565b6121cd565b3480156109c757600080fd5b506104606123de565b3480156109dc57600080fd5b506104606123e4565b3480156109f157600080fd5b506104ed610a003660046143f5565b6123ea565b348015610a1157600080fd5b506104606124b8565b348015610a2657600080fd5b506104ed610a3536600461454a565b6124be565b348015610a4657600080fd5b50610460612502565b348015610a5b57600080fd5b506104ed610a6a3660046142a0565b612508565b348015610a7b57600080fd5b50610911610a8a36600461454a565b6127da565b348015610a9b57600080fd5b50610460610aaa36600461454a565b612804565b348015610abb57600080fd5b50610460612816565b348015610ad057600080fd5b50610460610adf36600461454a565b61281c565b348015610af057600080fd5b506104ed610aff366004614512565b61283d565b348015610b1057600080fd5b506104606128a5565b348015610b2557600080fd5b506104ed6128ab565b348015610b3a57600080fd5b50610460612a57565b6104ed610b5136600461454a565b612a5d565b348015610b6257600080fd5b506104ab610b713660046142ba565b612c6b565b348015610b8257600080fd5b50610460612c99565b348015610b9757600080fd5b506104ed610ba6366004614392565b612c9f565b348015610bb757600080fd5b506104ed610bc63660046142a0565b612cf6565b348015610bd757600080fd5b50610460612d64565b60006001600160a01b038316610c115760405162461bcd60e51b8152600401610c0890614a76565b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b601f5481565b60006001600160e01b03198216636cdb3d1360e11b1480610c7157506001600160e01b031982166303a24d0760e21b145b80610c805750610c8082612d83565b90505b919050565b606060038054610c979061545b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc39061545b565b8015610d105780601f10610ce557610100808354040283529160200191610d10565b820191906000526020600020905b815481529060010190602001808311610cf357829003601f168201915b505050505090505b90565b60085462010000900460ff1615610d445760405162461bcd60e51b8152600401610c0890614f45565b60085460ff16610d665760405162461bcd60e51b8152600401610c0890614ecb565b806010541015610d885760405162461bcd60e51b8152600401610c0890614d8d565b600d54811115610daa5760405162461bcd60e51b8152600401610c0890614c6b565b600c54610db79082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a0823190610e03903090600401614813565b60206040518083038186803b158015610e1b57600080fd5b505afa158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190614601565b1015610e715760405162461bcd60e51b8152600401610c0890614bdf565b601f54610e7e9082612d9c565b341015610e9d5760405162461bcd60e51b8152600401610c0890614f75565b60005b81811015610f2c576000610eb8600954600c54612da8565b6000818152602960205260409020805460ff191660011790559050610edb612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055601054610f1690600190615418565b6010555080610f2481615496565b915050610ea0565b5050565b60145481565b606060008211610f585760405162461bcd60e51b8152600401610c08906150c0565b6025610f6383612eef565b604051602001610f7492919061475d565b6040516020818303038152906040529050919050565b60125481565b610f98612eeb565b6001600160a01b0316610fa9611f51565b6001600160a01b031614610fcf5760405162461bcd60e51b8152600401610c0890614f10565b601d55565b600d5481565b600e5481565b606080606080610ff0602c61300a565b610ffa602e61300a565b611004603061300a565b61100e603261300a565b935093509350935090919293565b60225481565b60105481565b60135481565b611036612eeb565b6001600160a01b0316856001600160a01b0316148061105c575061105c85610b71612eeb565b6110785760405162461bcd60e51b8152600401610c0890614ce7565b6110858585858585613017565b5050505050565b60075481565b601c5481565b6008546301000000900460ff1681565b601e5481565b60245481565b60195481565b6110c2612eeb565b6001600160a01b03166110d3611f51565b6001600160a01b0316146110f95760405162461bcd60e51b8152600401610c0890614f10565b600755565b606081518351146111215760405162461bcd60e51b8152600401610c0890615140565b6000835167ffffffffffffffff81111561114b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611174578160200160208202803683370190505b50905060005b8451811015611216576111db8582815181106111a657634e487b7160e01b600052603260045260246000fd5b60200260200101518583815181106111ce57634e487b7160e01b600052603260045260246000fd5b6020026020010151610be0565b8282815181106111fb57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261120f81615496565b905061117a565b509392505050565b600854640100000000900460ff1681565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a082319061127e903090600401614813565b60206040518083038186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190614601565b905090565b6112db612eeb565b6001600160a01b03166112ec611f51565b6001600160a01b0316146113125760405162461bcd60e51b8152600401610c0890614f10565b60008151116113335760405162461bcd60e51b8152600401610c0890614b98565b8051610f2c90602590602084019061410d565b60165481565b611354612eeb565b6001600160a01b0316611365611f51565b6001600160a01b03161461138b5760405162461bcd60e51b8152600401610c0890614f10565b601b55565b600854610100900460ff1681565b60085462010000900460ff1681565b6113b5612eeb565b6001600160a01b03166113c6611f51565b6001600160a01b0316146113ec5760405162461bcd60e51b8152600401610c0890614f10565b60085460ff610100909104161515811515141561140857600080fd5b600880549115156101000261ff0019909216919091179055565b61142a612eeb565b6001600160a01b031661143b611f51565b6001600160a01b0316146114615760405162461bcd60e51b8152600401610c0890614f10565b601e55565b6000336040516020016114799190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff16156114be5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff166114e55760405162461bcd60e51b8152600401610c0890614b50565b8360115410156115075760405162461bcd60e51b8152600401610c0890614d8d565b6115488383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b6115645760405162461bcd60e51b8152600401610c0890614c2a565b600d548411156115865760405162461bcd60e51b8152600401610c0890614c6b565b600c546115939085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a08231906115df903090600401614813565b60206040518083038186803b1580156115f757600080fd5b505afa15801561160b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162f9190614601565b101561164d5760405162461bcd60e51b8152600401610c0890614bdf565b601d5461165a9085612d9c565b3410156116795760405162461bcd60e51b8152600401610c0890614d39565b60005b84811015611085576000611694600954600c54612da8565b6000818152602960205260409020805460ff1916600217905590506116b7612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790556011546116f290600190615418565b601155508061170081615496565b91505061167c565b60085460ff1681565b611719612eeb565b6001600160a01b031661172a611f51565b6001600160a01b0316146117505760405162461bcd60e51b8152600401610c0890614f10565b600c55565b602580546117629061545b565b80601f016020809104026020016040519081016040528092919081815260200182805461178e9061545b565b80156117db5780601f106117b0576101008083540402835291602001916117db565b820191906000526020600020905b8154815290600101906020018083116117be57829003601f168201915b505050505081565b6000336040516020016117f69190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff161561183b5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff166118625760405162461bcd60e51b8152600401610c0890614b50565b83600f5410156118845760405162461bcd60e51b8152600401610c0890614e26565b6118c58383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b6118e15760405162461bcd60e51b8152600401610c0890614c2a565b600d548411156119035760405162461bcd60e51b8152600401610c0890614c6b565b600c546119109085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a082319061195c903090600401614813565b60206040518083038186803b15801561197457600080fd5b505afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190614601565b10156119ca5760405162461bcd60e51b8152600401610c0890614bdf565b601b546119d79085612d9c565b3410156119f65760405162461bcd60e51b8152600401610c089061506c565b60005b84811015611085576000611a11600954600c54612da8565b6000818152602960205260409020805460ff191690559050611a31612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600f54611a6c90600190615418565b600f555080611a7a81615496565b9150506119f9565b611a8a612eeb565b6001600160a01b0316611a9b611f51565b6001600160a01b031614611ac15760405162461bcd60e51b8152600401610c0890614f10565b611acb60006132a3565b565b60185481565b600033604051602001611ae69190614732565b604051602081830303815290604052805190602001209050600860029054906101000a900460ff1615611b2b5760405162461bcd60e51b8152600401610c0890614f45565b600854610100900460ff16611b525760405162461bcd60e51b8152600401610c0890614b50565b836010541015611b745760405162461bcd60e51b8152600401610c0890614d8d565b611bb58383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060075491508490506131e8565b611bd15760405162461bcd60e51b8152600401610c0890614c2a565b600d54841115611bf35760405162461bcd60e51b8152600401610c0890614c6b565b600c54611c009085612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a0823190611c4c903090600401614813565b60206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c9190614601565b1015611cba5760405162461bcd60e51b8152600401610c0890614bdf565b601c54611cc79085612d9c565b341015611ce65760405162461bcd60e51b8152600401610c0890614e79565b60005b84811015611085576000611d01600954600c54612da8565b6000818152602960205260409020805460ff191660011790559050611d24612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055601054611d5f90600190615418565b6010555080611d6d81615496565b915050611ce9565b601b5481565b611d83612eeb565b6001600160a01b0316611d94611f51565b6001600160a01b031614611dba5760405162461bcd60e51b8152600401610c0890614f10565b601f55565b611dc7612eeb565b6001600160a01b0316611dd8611f51565b6001600160a01b031614611dfe5760405162461bcd60e51b8152600401610c0890614f10565b6008805462ff0000198116620100009182900460ff1615909102179055565b611e25612eeb565b6001600160a01b0316611e36611f51565b6001600160a01b031614611e5c5760405162461bcd60e51b8152600401610c0890614f10565b4760005b602654811015610f2c5760268181548110611e8b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166108fc611efe6064611ef860278681548110611ede57634e487b7160e01b600052603260045260246000fd5b906000526020600020015487612d9c90919063ffffffff16565b906132f5565b6040518115909202916000818181858888f19350505050158015611f26573d6000803e3d6000fd5b5080611f3181615496565b915050611e60565b60115481565b602b6020526000908152604090205481565b6005546001600160a01b031690565b611f68612eeb565b6001600160a01b0316611f79611f51565b6001600160a01b031614611f9f5760405162461bcd60e51b8152600401610c0890614f10565b7f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b031663a9059cbb611fd6611f51565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a0823190612022903090600401614813565b60206040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120729190614601565b6040518363ffffffff1660e01b815260040161208f9291906148ca565b602060405180830381600087803b1580156120a957600080fd5b505af11580156120bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e1919061452e565b50565b6120ec612eeb565b6001600160a01b03166120fd611f51565b6001600160a01b0316146121235760405162461bcd60e51b8152600401610c0890614f10565b601c55565b612130612eeb565b6001600160a01b0316612141611f51565b6001600160a01b0316146121675760405162461bcd60e51b8152600401610c0890614f10565b602055565b336001600160a01b037f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146121b45760405162461bcd60e51b8152600401610c089061500d565b610f2c8282613301565b606060048054610c979061545b565b60085462010000900460ff16156121f65760405162461bcd60e51b8152600401610c0890614f45565b60085460ff166122185760405162461bcd60e51b8152600401610c0890614ecb565b80601154101561223a5760405162461bcd60e51b8152600401610c0890614d8d565b600d5481111561225c5760405162461bcd60e51b8152600401610c0890614c6b565b600c546122699082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a08231906122b5903090600401614813565b60206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123059190614601565b10156123235760405162461bcd60e51b8152600401610c0890614bdf565b6020546123309082612d9c565b34101561234f5760405162461bcd60e51b8152600401610c0890615212565b60005b81811015610f2c57600061236a600954600c54612da8565b6000818152602960205260409020805460ff19166002179055905061238d612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790556011546123c890600190615418565b60115550806123d681615496565b915050612352565b601d5481565b60205481565b816001600160a01b03166123fc612eeb565b6001600160a01b031614156124235760405162461bcd60e51b8152600401610c08906150f7565b8060016000612430612eeb565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612474612eeb565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ac919061498f565b60405180910390a35050565b60215481565b6124c6612eeb565b6001600160a01b03166124d7611f51565b6001600160a01b0316146124fd5760405162461bcd60e51b8152600401610c0890614f10565b600d55565b60235481565b612510612eeb565b6001600160a01b0316612521611f51565b6001600160a01b0316146125475760405162461bcd60e51b8152600401610c0890614f10565b60085462010000900460ff16156125705760405162461bcd60e51b8152600401610c0890614f45565b600854640100000000900460ff161561259b5760405162461bcd60e51b8152600401610c0890615044565b6125b881600a600160405180602001604052806000815250613394565b6125d581600c600160405180602001604052806000815250613394565b6125f2816013600160405180602001604052806000815250613394565b61260f816017600160405180602001604052806000815250613394565b61262c81601a600160405180602001604052806000815250613394565b612649816002600160405180602001604052806000815250613394565b612666816008600160405180602001604052806000815250613394565b61268381600e600160405180602001604052806000815250613394565b6126a0816015600160405180602001604052806000815250613394565b6126bd816016600160405180602001604052806000815250613394565b6126da816001600460405180602001604052806000815250613394565b6126f7816003600460405180602001604052806000815250613394565b612714816006600360405180602001604052806000815250613394565b612731816007600460405180602001604052806000815250613394565b61274e816010600460405180602001604052806000815250613394565b61276b816011600360405180602001604052806000815250613394565b612788816018600360405180602001604052806000815250613394565b6127a5816012600160405180602001604052806000815250613394565b6127c281601b600160405180602001604052806000815250613394565b506008805464ff000000001916640100000000179055565b602681815481106127ea57600080fd5b6000918252602090912001546001600160a01b0316905081565b60286020526000908152604090205481565b601a5481565b6027818154811061282c57600080fd5b600091825260209091200154905081565b612845612eeb565b6001600160a01b0316612856611f51565b6001600160a01b03161461287c5760405162461bcd60e51b8152600401610c0890614f10565b60085460ff161515811515141561289257600080fd5b6008805460ff1916911515919091179055565b60155481565b6128b3612eeb565b6001600160a01b03166128c4611f51565b6001600160a01b0316146128ea5760405162461bcd60e51b8152600401610c0890614f10565b60085462010000900460ff16156129135760405162461bcd60e51b8152600401610c0890614f45565b6008546301000000900460ff161561293d5760405162461bcd60e51b8152600401610c0890615044565b61295a33601f600a60405180602001604052806000815250613394565b612977336020600f60405180602001604052806000815250613394565b612994336021601460405180602001604052806000815250613394565b6129b1336022601960405180602001604052806000815250613394565b6129ce336023601960405180602001604052806000815250613394565b6129eb336024601960405180602001604052806000815250613394565b612a08336025601960405180602001604052806000815250613394565b612a25336026601960405180602001604052806000815250613394565b612a42336027601960405180602001604052806000815250613394565b6008805463ff00000019166301000000179055565b600c5481565b60085462010000900460ff1615612a865760405162461bcd60e51b8152600401610c0890614f45565b60085460ff16612aa85760405162461bcd60e51b8152600401610c0890614ecb565b80600f541015612aca5760405162461bcd60e51b8152600401610c0890614e26565b600d54811115612aec5760405162461bcd60e51b8152600401610c0890614c6b565b600c54612af99082612d9c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a0823190612b45903090600401614813565b60206040518083038186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b959190614601565b1015612bb35760405162461bcd60e51b8152600401610c0890614bdf565b601e54612bc09082612d9c565b341015612bdf5760405162461bcd60e51b8152600401610c0890614fc0565b60005b81811015610f2c576000612bfa600954600c54612da8565b6000818152602960205260409020805460ff191690559050612c1a612eeb565b6000828152602a6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600f54612c5590600190615418565b600f555080612c6381615496565b915050612be2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600f5481565b612ca7612eeb565b6001600160a01b0316856001600160a01b03161480612ccd5750612ccd85610b71612eeb565b612ce95760405162461bcd60e51b8152600401610c0890614b07565b6110858585858585613483565b612cfe612eeb565b6001600160a01b0316612d0f611f51565b6001600160a01b031614612d355760405162461bcd60e51b8152600401610c0890614f10565b6001600160a01b038116612d5b5760405162461bcd60e51b8152600401610c0890614ac1565b6120e1816132a3565b60175481565b6000612d7683836135b7565b9392505050565b3b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b6000612d7682846153f9565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001612e0f92919061474f565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612e3c939291906148e3565b602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8e919061452e565b50600083815260066020526040812054612ead90859083903090613601565b600085815260066020526040902054909150612eca9060016152b9565b600085815260066020526040902055612ee3848261363b565b949350505050565b3390565b606081612f1457506040805180820190915260018152600360fc1b6020820152610c83565b8160005b8115612f3e5780612f2881615496565b9150612f379050600a836152d1565b9150612f18565b60008167ffffffffffffffff811115612f6757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f91576020820181803683370190505b5090505b8415612ee357612fa6600183615418565b9150612fb3600a866154b1565b612fbe9060306152b9565b60f81b818381518110612fe157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613003600a866152d1565b9450612f95565b60606000612d768361366e565b81518351146130385760405162461bcd60e51b8152600401610c0890615189565b6001600160a01b03841661305e5760405162461bcd60e51b8152600401610c0890614ca2565b6000613068612eeb565b90506130788187878787876131e0565b60005b845181101561317a5760008582815181106130a657634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106130d257634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156131225760405162461bcd60e51b8152600401610c0890614ddc565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061315f9084906152b9565b925050819055505050508061317390615496565b905061307b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516131ca92919061491d565b60405180910390a46131e08187878787876136ca565b505050505050565b600081815b855181101561329857600086828151811061321857634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161325957828160405160200161323c92919061474f565b604051602081830303815290604052805190602001209250613285565b808360405160200161326c92919061474f565b6040516020818303038152906040528051906020012092505b508061329081615496565b9150506131ed565b509092149392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612d7682846152d1565b60008281526029602052604081205460ff16600281111561333257634e487b7160e01b600052602160045260246000fd5b14156133475761334281836137d8565b610f2c565b600160008381526029602052604090205460ff16600281111561337a57634e487b7160e01b600052602160045260246000fd5b141561338a5761334281836138a4565b610f2c8183613a0f565b6001600160a01b0384166133ba5760405162461bcd60e51b8152600401610c08906151d1565b60006133c4612eeb565b90506133e5816000876133d688613afd565b6133df88613afd565b876131e0565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906134159084906152b9565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161346c92919061474f565b60405180910390a461108581600087878787613b56565b6001600160a01b0384166134a95760405162461bcd60e51b8152600401610c0890614ca2565b60006134b3612eeb565b90506134c48187876133d688613afd565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156135055760405162461bcd60e51b8152600401610c0890614ddc565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906135429084906152b9565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161359892919061474f565b60405180910390a46135ae828888888888613b56565b50505050505050565b60006135c38383613c27565b6135f957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c34565b506000610c34565b60008484848460405160200161361a94939291906149a3565b60408051601f19818403018152919052805160209091012095945050505050565b6000828260405160200161365092919061474f565b60405160208183030381529060405280519060200120905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156136be57602002820191906000526020600020905b8154815260200190600101908083116136aa575b50505050509050919050565b6136dc846001600160a01b0316612d7d565b156131e05760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906137159089908990889088908890600401614827565b602060405180830381600087803b15801561372f57600080fd5b505af192505050801561375f575060408051601f3d908101601f1916820190925261375c9181019061459f565b60015b6137a85761376b61550d565b806137765750613790565b8060405162461bcd60e51b8152600401610c0891906149c7565b60405162461bcd60e51b8152600401610c08906149da565b6001600160e01b0319811663bc197c8160e01b146135ae5760405162461bcd60e51b8152600401610c0890614a2e565b6137ed6137e7836103e86132f5565b82613c3f565b60016012546137fc9190615418565b60125561381561380f83620f42406132f5565b82613d4b565b60016013546138249190615418565b60135561383e61383883633b9aca006132f5565b82613e09565b600160145461384d9190615418565b6014556138686138628364e8d4a510006132f5565b82613ec7565b60016015546138779190615418565b60155561388e6138628366038d7ea4c680006132f5565b600160155461389d9190615418565b6015555050565b6021546016546003916000916138c09190611ef8906064612d9c565b9050806138da60646138d4876103e86132f5565b90613f85565b11613927576138f56138ef85620f42406132f5565b84613d4b565b613900600183615418565b915060016021546139119190615418565b60215560165461392390600190615418565b6016555b6000613945602154611ef86064601854612d9c90919063ffffffff16565b90508061395b60646138d488633b9aca006132f5565b116139aa576139786139728664e8d4a510006132f5565b85613ec7565b613983600184615418565b925060016018546139949190615418565b6018556021546139a690600190615418565b6021555b8215611085576139d96139d36139c185600a61532b565b6139cc9060056153f9565b87906132f5565b85613e09565b60016021546139e89190615418565b6021556017546139fa90600190615418565b601755613a08600184615418565b92506139aa565b602254601954600291600091613a2b9190611ef8906064612d9c565b905080613a4160646138d487633b9aca006132f5565b11613a9257613a60613a5a8566038d7ea4c680006132f5565b84613e09565b6001602254613a6f9190615418565b602255601954613a8190600190615418565b601955613a8f600183615418565b91505b8115613af757613ac1613abb613aa984600a61532b565b613ab49060076153f9565b86906132f5565b84613ec7565b6001602254613ad09190615418565b602255601a54613ae290600190615418565b601a55613af0600183615418565b9150613a92565b50505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613b4557634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613b68846001600160a01b0316612d7d565b156131e05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613ba19089908990889088908890600401614885565b602060405180830381600087803b158015613bbb57600080fd5b505af1925050508015613beb575060408051601f3d908101601f19168201909252613be89181019061459f565b60015b613bf75761376b61550d565b6001600160e01b0319811663f23a6e6160e01b146135ae5760405162461bcd60e51b8152600401610c0890614a2e565b60009081526001919091016020526040902054151590565b6000613c55613c4e602c613f91565b8490613f85565b6000838152602a6020526040902054909150613c96906001600160a01b0316613c7f602c84613f9c565b600160405180602001604052806000815250613394565b6001602b6000613ca7602c85613f9c565b815260200190815260200160002054613cc09190615418565b602b6000613ccf602c85613f9c565b815260200190815260200160002081905550602b6000613cf983602c613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b602c82613fa8565b505b600081815260286020526040902054613d379060016152b9565b600091825260286020526040909120555050565b6000613d5a613c4e602e613f91565b6000838152602a6020526040902054909150613d84906001600160a01b0316613c7f602e84613f9c565b6001602b6000613d95602e85613f9c565b815260200190815260200160002054613dae9190615418565b602b6000613dbd602e85613f9c565b815260200190815260200160002081905550602b6000613de783602e613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b602e82613fa8565b6000613e18613c4e6030613f91565b6000838152602a6020526040902054909150613e42906001600160a01b0316613c7f603084613f9c565b6001602b6000613e53603085613f9c565b815260200190815260200160002054613e6c9190615418565b602b6000613e7b603085613f9c565b815260200190815260200160002081905550602b6000613ea5836030613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b603082613fa8565b6000613ed6613c4e6032613f91565b6000838152602a6020526040902054909150613f00906001600160a01b0316613c7f603284613f9c565b6001602b6000613f11603285613f9c565b815260200190815260200160002054613f2a9190615418565b602b6000613f39603285613f9c565b815260200190815260200160002081905550602b6000613f63836032613f9c90919063ffffffff16565b81526020019081526020016000205460001415613d1d57613d1b603282613fa8565b6000612d7682846154b1565b6000610c8082613fb4565b6000612d768383613fb8565b6000612d768383613ff0565b5490565b6000826000018281548110613fdd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120548015614103576000614014600183615418565b855490915060009061402890600190615418565b90508181146140a957600086600001828154811061405657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061408757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140c857634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c34565b6000915050610c34565b8280546141199061545b565b90600052602060002090601f01602090048101928261413b5760008555614181565b82601f1061415457805160ff1916838001178555614181565b82800160010185558215614181579182015b82811115614181578251825591602001919060010190614166565b5061418d929150614191565b5090565b5b8082111561418d5760008155600101614192565b600067ffffffffffffffff8311156141c0576141c06154f1565b6141d3601f8401601f191660200161525f565b90508281528383830111156141e757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114610c8357600080fd5b600082601f830112614225578081fd5b8135602061423a61423583615289565b61525f565b8281528181019085830183850287018401881015614256578586fd5b855b8581101561427457813584529284019290840190600101614258565b5090979650505050505050565b600082601f830112614291578081fd5b612d76838335602085016141a6565b6000602082840312156142b1578081fd5b612d76826141fe565b600080604083850312156142cc578081fd5b6142d5836141fe565b91506142e3602084016141fe565b90509250929050565b600080600080600060a08688031215614303578081fd5b61430c866141fe565b945061431a602087016141fe565b9350604086013567ffffffffffffffff80821115614336578283fd5b61434289838a01614215565b94506060880135915080821115614357578283fd5b61436389838a01614215565b93506080880135915080821115614378578283fd5b5061438588828901614281565b9150509295509295909350565b600080600080600060a086880312156143a9578081fd5b6143b2866141fe565b94506143c0602087016141fe565b93506040860135925060608601359150608086013567ffffffffffffffff8111156143e9578182fd5b61438588828901614281565b60008060408385031215614407578182fd5b614410836141fe565b91506020830135614420816155b2565b809150509250929050565b6000806040838503121561443d578182fd5b614446836141fe565b946020939093013593505050565b60008060408385031215614466578182fd5b823567ffffffffffffffff8082111561447d578384fd5b818501915085601f830112614490578384fd5b813560206144a061423583615289565b82815281810190858301838502870184018b10156144bc578889fd5b8896505b848710156144e5576144d1816141fe565b8352600196909601959183019183016144c0565b50965050860135925050808211156144fb578283fd5b5061450885828601614215565b9150509250929050565b600060208284031215614523578081fd5b8135612d76816155b2565b60006020828403121561453f578081fd5b8151612d76816155b2565b60006020828403121561455b578081fd5b5035919050565b60008060408385031215614574578182fd5b50508035926020909101359150565b600060208284031215614594578081fd5b8135612d76816155c0565b6000602082840312156145b0578081fd5b8151612d76816155c0565b6000602082840312156145cc578081fd5b813567ffffffffffffffff8111156145e2578182fd5b8201601f810184136145f2578182fd5b612ee3848235602084016141a6565b600060208284031215614612578081fd5b5051919050565b60008060006040848603121561462d578081fd5b83359250602084013567ffffffffffffffff8082111561464b578283fd5b818601915086601f83011261465e578283fd5b81358181111561466c578384fd5b876020808302850101111561467f578384fd5b6020830194508093505050509250925092565b6000815180845260208085019450808401835b838110156146c1578151875295820195908201906001016146a5565b509495945050505050565b600081518084526146e481602086016020860161542f565b601f01601f19169290920160200192915050565b6000815161470a81856020860161542f565b9290920192915050565b64173539b7b760d91b815260050190565b602f60f81b815260010190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b825460009081906002810460018083168061477957607f831692505b602080841082141561479957634e487b7160e01b87526022600452602487fd5b8180156147ad57600181146147be576147ea565b60ff198616895284890196506147ea565b6147c78b6152ad565b885b868110156147e25781548b8201529085019083016147c9565b505084890196505b50505050505061480a6148056147ff83614725565b866146f8565b614714565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061485390830186614692565b82810360608401526148658186614692565b9050828103608084015261487981856146cc565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906148bf908301846146cc565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b03851682528360208301526060604083015261480a60608301846146cc565b600060208252612d766020830184614692565b6000604082526149306040830185614692565b828103602084015261480a8185614692565b6000608082526149556080830187614692565b82810360208401526149678187614692565b9050828103604084015261497b8186614692565b905082810360608401526148bf8185614692565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b600060208252612d7660208301846146cc565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526028908201527f4166746d726b743a3a707265436865636b3a2070726573616c65206973206e6f604082015267742061637469766560c01b606082015260800190565b60208082526027908201527f416674726d726b743a3a736574426173655552493a20496e76616c696420626160408201526639b2902aa9249760c91b606082015260800190565b6020808252602b908201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060408201526a1dda5d1a0819985d58d95d60aa1b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b6020808252601e908201527f45786365656473206d6178206d696e74206c696d69742070657220746e780000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526034908201527f4166746d726b743a3a62757950726573616c65537461727465725061636b3a2060408201527324b739bab33334b1b4b2b73a1030b6b7bab73a1760611b606082015260800190565b6020808252602f908201527f4166746d726b743a3a62757946726573685061636b3a2046726573685061636b60408201526e399030b9329039b7b6321037baba1760891b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526033908201527f4166746d726b743a3a6275795072656d69756d5061636b3a205072656d69756d6040820152722830b1b5b99030b9329039b7b6321037baba1760691b606082015260800190565b60208082526032908201527f4166746d726b743a3a62757950726573616c6546726573685061636b3a20496e60408201527139bab33334b1b4b2b73a1030b6b7bab73a1760711b606082015260800190565b60208082526025908201527f4166746d726b743a3a707265436865636b3a2053616c65206973206e6f742061604082015264637469766560d81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604082015260600190565b6020808252602b908201527f4166746d726b743a3a62757946726573685061636b3a20496e7375666669636960408201526a32b73a1030b6b7bab73a1760a91b606082015260800190565b6020808252602d908201527f4166746d726b743a3a6275795072656d69756d5061636b3a20496e737566666960408201526c31b4b2b73a1030b6b7bab73a1760991b606082015260800190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b6020808252600e908201526d185b1c9958591e48135a5b9d195960921b604082015260600190565b60208082526034908201527f4166746d726b743a3a62757950726573616c655072656d69756d5061636b3a2060408201527324b739bab33334b1b4b2b73a1030b6b7bab73a1760611b606082015260800190565b6020808252601a908201527f416674726d726b743a3a7572693a20496e76616c69642069642e000000000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602d908201527f4166746d726b743a3a627579537461727465725061636b3a20496e737566666960408201526c31b4b2b73a1030b6b7bab73a1760991b606082015260800190565b60405181810167ffffffffffffffff81118282101715615281576152816154f1565b604052919050565b600067ffffffffffffffff8211156152a3576152a36154f1565b5060209081020190565b60009081526020902090565b600082198211156152cc576152cc6154c5565b500190565b6000826152e0576152e06154db565b500490565b80825b60018086116152f75750615322565b818704821115615309576153096154c5565b8086161561531657918102915b9490941c9380026152e8565b94509492505050565b6000612d76600019848460008261534457506001612d76565b8161535157506000612d76565b816001811461536757600281146153715761539e565b6001915050612d76565b60ff841115615382576153826154c5565b6001841b915084821115615398576153986154c5565b50612d76565b5060208310610133831016604e8410600b84101617156153d1575081810a838111156153cc576153cc6154c5565b612d76565b6153de84848460016152e5565b8086048211156153f0576153f06154c5565b02949350505050565b6000816000190483118215151615615413576154136154c5565b500290565b60008282101561542a5761542a6154c5565b500390565b60005b8381101561544a578181015183820152602001615432565b83811115613af75750506000910152565b60028104600182168061546f57607f821691505b6020821081141561549057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154aa576154aa6154c5565b5060010190565b6000826154c0576154c06154db565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d101561551d57610d18565b600481823e6308c379a06155318251615507565b1461553b57610d18565b6040513d600319016004823e80513d67ffffffffffffffff816024840111818411171561556b5750505050610d18565b828401925082519150808211156155855750505050610d18565b503d8301602082840101111561559d57505050610d18565b601f01601f1916810160200160405291505090565b80151581146120e157600080fd5b6001600160e01b0319811681146120e157600080fdfea264697066735822122012caf3ca419ad0cc183e4f0a8a0b0597d440f9de0d1cb6bb0ce7265445ce3f8664736f6c63430008000033

Deployed Bytecode Sourcemap

76308:21202:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22439:318;;;;;;;;;;-1:-1:-1;22439:318:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78031:40;;;;;;;;;;;;;:::i;21412:360::-;;;;;;;;;;-1:-1:-1;21412:360:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21145:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;89369:921::-;;;;;;:::i;:::-;;:::i;:::-;;77395:37;;;;;;;;;;;;;:::i;83657:214::-;;;;;;;;;;-1:-1:-1;83657:214:0;;;;;:::i;:::-;;:::i;77311:37::-;;;;;;;;;;;;;:::i;83518:130::-;;;;;;;;;;-1:-1:-1;83518:130:0;;;;;:::i;:::-;;:::i;77074:29::-;;;;;;;;;;;;;:::i;77107:34::-;;;;;;;;;;;;;:::i;84704:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;78201:35::-;;;;;;;;;;;;;:::i;77207:31::-;;;;;;;;;;;;;:::i;77352:36::-;;;;;;;;;;;;;:::i;24777:442::-;;;;;;;;;;-1:-1:-1;24777:442:0;;;;;:::i;:::-;;:::i;76539:25::-;;;;;;;;;;;;;:::i;77844:47::-;;;;;;;;;;;;;:::i;76672:34::-;;;;;;;;;;;;;:::i;77982:42::-;;;;;;;;;;;;;:::i;78285:27::-;;;;;;;;;;;;;:::i;77670:37::-;;;;;;;;;;;;;:::i;84602:94::-;;;;;;;;;;-1:-1:-1;84602:94:0;;;;;:::i;:::-;;:::i;22923:561::-;;;;;;;;;;-1:-1:-1;22923:561:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76710:34::-;;;;;;;;;;;;;:::i;84109:113::-;;;;;;;;;;;;;:::i;83879:224::-;;;;;;;;;;-1:-1:-1;83879:224:0;;;;;:::i;:::-;;:::i;77508:36::-;;;;;;;;;;;;;:::i;83238:136::-;;;;;;;;;;-1:-1:-1;83238:136:0;;;;;:::i;:::-;;:::i;76608:27::-;;;;;;;;;;;;;:::i;76642:26::-;;;;;;;;;;;;;:::i;82523:126::-;;;;;;;;;;-1:-1:-1;82523:126:0;;;;;:::i;:::-;;:::i;82864:122::-;;;;;;;;;;-1:-1:-1;82864:122:0;;;;;:::i;:::-;;:::i;87254:1163::-;;;;;;:::i;:::-;;:::i;76573:28::-;;;;;;;;;;;;;:::i;97427:80::-;;;;;;;;;;-1:-1:-1;97427:80:0;;;;;:::i;:::-;;:::i;78322:21::-;;;;;;;;;;;;;:::i;84924:1166::-;;;;;;:::i;:::-;;:::i;2402:94::-;;;;;;;;;;;;;:::i;77596:39::-;;;;;;;;;;;;;:::i;86098:1148::-;;;;;;:::i;:::-;;:::i;77789:48::-;;;;;;;;;;;;;:::i;82994:114::-;;;;;;;;;;-1:-1:-1;82994:114:0;;;;;:::i;:::-;;:::i;82787:69::-;;;;;;;;;;;;;:::i;84351:245::-;;;;;;;;;;;;;:::i;77245:33::-;;;;;;;;;;;;;:::i;78809:43::-;;;;;;;;;;-1:-1:-1;78809:43:0;;;;;:::i;:::-;;:::i;1751:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;84230:115::-;;;;;;;;;;;;;:::i;83382:128::-;;;;;;;;;;-1:-1:-1;83382:128:0;;;;;:::i;:::-;;:::i;83116:116::-;;;;;;;;;;-1:-1:-1;83116:116:0;;;;;:::i;:::-;;:::i;74832:271::-;;;;;;;;;;-1:-1:-1;74832:271:0;;;;;:::i;:::-;;:::i;21244:95::-;;;;;;;;;;;;;:::i;90299:932::-;;;;;;:::i;:::-;;:::i;77898:50::-;;;;;;;;;;;;;:::i;78078:43::-;;;;;;;;;;;;;:::i;23557:380::-;;;;;;;;;;-1:-1:-1;23557:380:0;;;;;:::i;:::-;;:::i;78158:36::-;;;;;;;;;;;;;:::i;97306:115::-;;;;;;;;;;-1:-1:-1;97306:115:0;;;;;:::i;:::-;;:::i;78240:38::-;;;;;;;;;;;;;:::i;95832:959::-;;;;;;;;;;-1:-1:-1;95832:959:0;;;;;:::i;:::-;;:::i;78425:183::-;;;;;;;;;;-1:-1:-1;78425:183:0;;;;;:::i;:::-;;:::i;78663:46::-;;;;;;;;;;-1:-1:-1;78663:46:0;;;;;:::i;:::-;;:::i;77714:39::-;;;;;;;;;;;;;:::i;78615:38::-;;;;;;;;;;-1:-1:-1;78615:38:0;;;;;:::i;:::-;;:::i;82655:124::-;;;;;;;;;;-1:-1:-1;82655:124:0;;;;;:::i;:::-;;:::i;77439:38::-;;;;;;;;;;;;;:::i;96797:503::-;;;;;;;;;;;;;:::i;77039:28::-;;;;;;;;;;;;;:::i;88425:935::-;;;;;;:::i;:::-;;:::i;24009:218::-;;;;;;;;;;-1:-1:-1;24009:218:0;;;;;:::i;:::-;;:::i;77168:32::-;;;;;;;;;;;;;:::i;24299:401::-;;;;;;;;;;-1:-1:-1;24299:401:0;;;;;:::i;:::-;;:::i;2651:229::-;;;;;;;;;;-1:-1:-1;2651:229:0;;;;;:::i;:::-;;:::i;77551:38::-;;;;;;;;;;;;;:::i;22439:318::-;22570:7;-1:-1:-1;;;;;22617:21:0;;22595:114;;;;-1:-1:-1;;;22595:114:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22727:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;22727:22:0;;;;;;;;;;22439:318;;;;;:::o;78031:40::-;;;;:::o;21412:360::-;21559:4;-1:-1:-1;;;;;;21601:41:0;;-1:-1:-1;;;21601:41:0;;:110;;-1:-1:-1;;;;;;;21659:52:0;;-1:-1:-1;;;21659:52:0;21601:110;:163;;;;21728:36;21752:11;21728:23;:36::i;:::-;21581:183;;21412:360;;;;:::o;21145:91::-;21190:13;21223:5;21216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21145:91;;:::o;89369:921::-;89443:6;;;;;;;89442:7;89434:42;;;;-1:-1:-1;;;89434:42:0;;;;;;;:::i;:::-;89495:8;;;;89487:58;;;;-1:-1:-1;;;89487:58:0;;;;;;;:::i;:::-;89591:5;89578:9;;:18;;89556:115;;;;-1:-1:-1;;;89556:115:0;;;;;;;:::i;:::-;89698:9;;89689:5;:18;;89676:74;;;;-1:-1:-1;;;89676:74:0;;;;;;;:::i;:::-;89816:3;;:14;;89824:5;89816:7;:14::i;:::-;89783:29;;-1:-1:-1;;;89783:29:0;;-1:-1:-1;;;;;89783:4:0;:14;;;;:29;;89806:4;;89783:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;89761:140;;;;-1:-1:-1;;;89761:140:0;;;;;;;:::i;:::-;89947:12;;:23;;89964:5;89947:16;:23::i;:::-;89934:9;:36;;89912:129;;;;-1:-1:-1;;;89912:129:0;;;;;;;:::i;:::-;90051:9;90046:237;90070:5;90066:1;:9;90046:237;;;90098:17;90118:31;90136:7;;90145:3;;90118:17;:31::i;:::-;90156:24;;;;:13;:24;;;;;:37;;-1:-1:-1;;90156:37:0;90183:10;90156:37;;;:24;-1:-1:-1;90227:12:0;:10;:12::i;:::-;90200:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;90200:39:0;-1:-1:-1;;;;;90200:39:0;;;;;;;;;;90258:9;;:13;;-1:-1:-1;;90258:13:0;:::i;:::-;90246:9;:25;-1:-1:-1;90077:3:0;;;;:::i;:::-;;;;90046:237;;;;89369:921;:::o;77395:37::-;;;;:::o;83657:214::-;83712:13;83751:1;83746:2;:6;83738:45;;;;-1:-1:-1;;;83738:45:0;;;;;;;:::i;:::-;83825:7;83839:13;:2;:11;:13::i;:::-;83808:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83794:69;;83657:214;;;:::o;77311:37::-;;;;:::o;83518:130::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83604:21:::1;:36:::0;83518:130::o;77074:29::-;;;;:::o;77107:34::-;;;;:::o;84704:211::-;84748:16;84766;84784;84802;84844:14;:5;:12;:14::i;:::-;84860:13;:4;:11;:13::i;:::-;84875:14;:5;:12;:14::i;:::-;84891:15;:6;:13;:15::i;:::-;84836:71;;;;;;;;84704:211;;;;:::o;78201:35::-;;;;:::o;77207:31::-;;;;:::o;77352:36::-;;;;:::o;24777:442::-;25018:12;:10;:12::i;:::-;-1:-1:-1;;;;;25010:20:0;:4;-1:-1:-1;;;;;25010:20:0;;:60;;;;25034:36;25051:4;25057:12;:10;:12::i;25034:36::-;24988:160;;;;-1:-1:-1;;;24988:160:0;;;;;;;:::i;:::-;25159:52;25182:4;25188:2;25192:3;25197:7;25206:4;25159:22;:52::i;:::-;24777:442;;;;;:::o;76539:25::-;;;;:::o;77844:47::-;;;;:::o;76672:34::-;;;;;;;;;:::o;77982:42::-;;;;:::o;78285:27::-;;;;:::o;77670:37::-;;;;:::o;84602:94::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;84671:10:::1;:20:::0;84602:94::o;22923:561::-;23079:16;23154:3;:10;23135:8;:15;:29;23113:120;;;;-1:-1:-1;;;23113:120:0;;;;;;;:::i;:::-;23246:30;23293:8;:15;23279:30;;;;;;-1:-1:-1;;;23279:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23279:30:0;;23246:63;;23327:9;23322:122;23346:8;:15;23342:1;:19;23322:122;;;23402:30;23412:8;23421:1;23412:11;;;;;;-1:-1:-1;;;23412:11:0;;;;;;;;;;;;;;;23425:3;23429:1;23425:6;;;;;;-1:-1:-1;;;23425:6:0;;;;;;;;;;;;;;;23402:9;:30::i;:::-;23383:13;23397:1;23383:16;;;;;;-1:-1:-1;;;23383:16:0;;;;;;;;;;;;;;;;;;:49;23363:3;;;:::i;:::-;;;23322:122;;;-1:-1:-1;23463:13:0;22923:561;-1:-1:-1;;;22923:561:0:o;76710:34::-;;;;;;;;;:::o;84109:113::-;84185:29;;-1:-1:-1;;;84185:29:0;;84158:7;;-1:-1:-1;;;;;84185:4:0;:14;;;;:29;;84208:4;;84185:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84178:36;;84109:113;:::o;83879:224::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83998:1:::1;83979:8;83973:22;:26;83951:115;;;;-1:-1:-1::0;;;83951:115:0::1;;;;;;;:::i;:::-;84077:18:::0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;77508:36::-:0;;;;:::o;83238:136::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83327:21:::1;:39:::0;83238:136::o;76608:27::-;;;;;;;;;:::o;76642:26::-;;;;;;;;;:::o;82523:126::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;82595:7:::1;::::0;::::1;;::::0;;::::1;;:18;;::::0;::::1;;;;82587:27;;;::::0;::::1;;82624:7;:17:::0;;;::::1;;;;-1:-1:-1::0;;82624:17:0;;::::1;::::0;;;::::1;::::0;;82523:126::o;82864:122::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;82946:14:::1;:32:::0;82864:122::o;87254:1163::-;87357:12;87399:10;87382:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;87372:39;;;;;;87357:54;;87431:6;;;;;;;;;;;87430:7;87422:42;;;;-1:-1:-1;;;87422:42:0;;;;;;;:::i;:::-;87483:7;;;;;;;87475:60;;;;-1:-1:-1;;;87475:60:0;;;;;;;:::i;:::-;87583:5;87568:11;;:20;;87546:117;;;;-1:-1:-1;;;87546:117:0;;;;;;;:::i;:::-;87681:49;87700:11;;87681:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87713:10:0;;;-1:-1:-1;87725:4:0;;-1:-1:-1;87681:18:0;:49::i;:::-;87668:109;;;;-1:-1:-1;;;87668:109:0;;;;;;;:::i;:::-;87804:9;;87795:5;:18;;87782:74;;;;-1:-1:-1;;;87782:74:0;;;;;;;:::i;:::-;87922:3;;:14;;87930:5;87922:7;:14::i;:::-;87889:29;;-1:-1:-1;;;87889:29:0;;-1:-1:-1;;;;;87889:4:0;:14;;;;:29;;87912:4;;87889:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;87867:140;;;;-1:-1:-1;;;87867:140:0;;;;;;;:::i;:::-;88053:21;;:32;;88079:5;88053:25;:32::i;:::-;88040:9;:45;;88018:147;;;;-1:-1:-1;;;88018:147:0;;;;;;;:::i;:::-;88179:9;88174:236;88198:5;88194:1;:9;88174:236;;;88225:17;88245:31;88263:7;;88272:3;;88245:17;:31::i;:::-;88282:24;;;;:13;:24;;;;;:36;;-1:-1:-1;;88282:36:0;88309:9;88282:36;;;:24;-1:-1:-1;88351:12:0;:10;:12::i;:::-;88324:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;88324:39:0;-1:-1:-1;;;;;88324:39:0;;;;;;;;;;88383:11;;:15;;-1:-1:-1;;88383:15:0;:::i;:::-;88369:11;:29;-1:-1:-1;88205:3:0;;;;:::i;:::-;;;;88174:236;;76573:28;;;;;;:::o;97427:80::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;97487:3:::1;:12:::0;97427:80::o;78322:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;84924:1166::-;85027:12;85069:10;85052:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;85042:39;;;;;;85027:54;;85101:6;;;;;;;;;;;85100:7;85092:42;;;;-1:-1:-1;;;85092:42:0;;;;;;;:::i;:::-;85153:7;;;;;;;85145:60;;;;-1:-1:-1;;;85145:60:0;;;;;;;:::i;:::-;85253:5;85238:11;;:20;;85216:121;;;;-1:-1:-1;;;85216:121:0;;;;;;;:::i;:::-;85355:49;85374:11;;85355:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85387:10:0;;;-1:-1:-1;85399:4:0;;-1:-1:-1;85355:18:0;:49::i;:::-;85342:109;;;;-1:-1:-1;;;85342:109:0;;;;;;;:::i;:::-;85478:9;;85469:5;:18;;85456:74;;;;-1:-1:-1;;;85456:74:0;;;;;;;:::i;:::-;85596:3;;:14;;85604:5;85596:7;:14::i;:::-;85563:29;;-1:-1:-1;;;85563:29:0;;-1:-1:-1;;;;;85563:4:0;:14;;;;:29;;85586:4;;85563:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;85541:140;;;;-1:-1:-1;;;85541:140:0;;;;;;;:::i;:::-;85727:21;;:32;;85753:5;85727:25;:32::i;:::-;85714:9;:45;;85692:147;;;;-1:-1:-1;;;85692:147:0;;;;;;;:::i;:::-;85849:9;85844:239;85868:5;85864:1;:9;85844:239;;;85895:17;85915:31;85933:7;;85942:3;;85915:17;:31::i;:::-;85979:12;85952:24;;;:13;:24;;;;;:39;;-1:-1:-1;;85952:39:0;;;:24;-1:-1:-1;86024:12:0;:10;:12::i;:::-;85997:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;85997:39:0;-1:-1:-1;;;;;85997:39:0;;;;;;;;;;86056:11;;:15;;-1:-1:-1;;86056:15:0;:::i;:::-;86042:11;:29;-1:-1:-1;85875:3:0;;;;:::i;:::-;;;;85844:239;;2402:94;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;2467:21:::1;2485:1;2467:9;:21::i;:::-;2402:94::o:0;77596:39::-;;;;:::o;86098:1148::-;86199:12;86241:10;86224:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;86214:39;;;;;;86199:54;;86273:6;;;;;;;;;;;86272:7;86264:42;;;;-1:-1:-1;;;86264:42:0;;;;;;;:::i;:::-;86325:7;;;;;;;86317:60;;;;-1:-1:-1;;;86317:60:0;;;;;;;:::i;:::-;86423:5;86410:9;;:18;;86388:115;;;;-1:-1:-1;;;86388:115:0;;;;;;;:::i;:::-;86521:49;86540:11;;86521:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86553:10:0;;;-1:-1:-1;86565:4:0;;-1:-1:-1;86521:18:0;:49::i;:::-;86508:109;;;;-1:-1:-1;;;86508:109:0;;;;;;;:::i;:::-;86644:9;;86635:5;:18;;86622:74;;;;-1:-1:-1;;;86622:74:0;;;;;;;:::i;:::-;86762:3;;:14;;86770:5;86762:7;:14::i;:::-;86729:29;;-1:-1:-1;;;86729:29:0;;-1:-1:-1;;;;;86729:4:0;:14;;;;:29;;86752:4;;86729:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;86707:140;;;;-1:-1:-1;;;86707:140:0;;;;;;;:::i;:::-;86893:19;;:30;;86917:5;86893:23;:30::i;:::-;86880:9;:43;;86858:143;;;;-1:-1:-1;;;86858:143:0;;;;;;;:::i;:::-;87011:9;87006:233;87030:5;87026:1;:9;87006:233;;;87057:17;87077:31;87095:7;;87104:3;;87077:17;:31::i;:::-;87114:24;;;;:13;:24;;;;;:37;;-1:-1:-1;;87114:37:0;87141:10;87114:37;;;:24;-1:-1:-1;87184:12:0;:10;:12::i;:::-;87157:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;87157:39:0;-1:-1:-1;;;;;87157:39:0;;;;;;;;;;87214:9;;:13;;-1:-1:-1;;87214:13:0;:::i;:::-;87202:9;:25;-1:-1:-1;87037:3:0;;;;:::i;:::-;;;;87006:233;;77789:48;;;;:::o;82994:114::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83072:12:::1;:28:::0;82994:114::o;82787:69::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;82842:6:::1;::::0;;-1:-1:-1;;82832:16:0;::::1;82842:6:::0;;;;::::1;;;82841:7;82832:16:::0;;::::1;;::::0;;82787:69::o;84351:245::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;84420:21:::1;84402:15;84452:137;84476:11;:18:::0;84472:22;::::1;84452:137;;;84517:11;84529:1;84517:14;;;;;;-1:-1:-1::0;;;84517:14:0::1;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;84517:14:0::1;-1:-1:-1::0;;;;;84509:32:0::1;:68;84542:34;84572:3;84542:25;84554:9;84564:1;84554:12;;;;;;-1:-1:-1::0;;;84554:12:0::1;;;;;;;;;;;;;;;;;84542:7;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:34::i;:::-;84509:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;84496:3:0;::::1;::::0;::::1;:::i;:::-;;;;84452:137;;77245:33:::0;;;;:::o;78809:43::-;;;;;;;;;;;;;:::o;1751:87::-;1824:6;;-1:-1:-1;;;;;1824:6:0;1751:87;:::o;84230:115::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;84284:4:::1;-1:-1:-1::0;;;;;84284:13:0::1;;84298:7;:5;:7::i;:::-;84307:29;::::0;-1:-1:-1;;;84307:29:0;;-1:-1:-1;;;;;84307:4:0::1;:14;::::0;::::1;::::0;:29:::1;::::0;84330:4:::1;::::0;84307:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84284:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;84230:115::o:0;83382:128::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83467:19:::1;:35:::0;83382:128::o;83116:116::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;83195:14:::1;:29:::0;83116:116::o;74832:271::-;74957:10;-1:-1:-1;;;;;74971:14:0;74957:28;;74935:109;;;;-1:-1:-1;;;74935:109:0;;;;;;;:::i;:::-;75055:40;75073:9;75084:10;75055:17;:40::i;21244:95::-;21291:13;21324:7;21317:14;;;;;:::i;90299:932::-;90375:6;;;;;;;90374:7;90366:42;;;;-1:-1:-1;;;90366:42:0;;;;;;;:::i;:::-;90427:8;;;;90419:58;;;;-1:-1:-1;;;90419:58:0;;;;;;;:::i;:::-;90525:5;90510:11;;:20;;90488:117;;;;-1:-1:-1;;;90488:117:0;;;;;;;:::i;:::-;90632:9;;90623:5;:18;;90610:74;;;;-1:-1:-1;;;90610:74:0;;;;;;;:::i;:::-;90750:3;;:14;;90758:5;90750:7;:14::i;:::-;90717:29;;-1:-1:-1;;;90717:29:0;;-1:-1:-1;;;;;90717:4:0;:14;;;;:29;;90740:4;;90717:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;90695:140;;;;-1:-1:-1;;;90695:140:0;;;;;;;:::i;:::-;90881:14;;:25;;90900:5;90881:18;:25::i;:::-;90868:9;:38;;90846:133;;;;-1:-1:-1;;;90846:133:0;;;;;;;:::i;:::-;90989:9;90984:240;91008:5;91004:1;:9;90984:240;;;91036:17;91056:31;91074:7;;91083:3;;91056:17;:31::i;:::-;91094:24;;;;:13;:24;;;;;:36;;-1:-1:-1;;91094:36:0;91121:9;91094:36;;;:24;-1:-1:-1;91164:12:0;:10;:12::i;:::-;91137:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;91137:39:0;-1:-1:-1;;;;;91137:39:0;;;;;;;;;;91197:11;;:15;;-1:-1:-1;;91197:15:0;:::i;:::-;91183:11;:29;-1:-1:-1;91015:3:0;;;;:::i;:::-;;;;90984:240;;77898:50;;;;:::o;78078:43::-;;;;:::o;23557:380::-;23722:8;-1:-1:-1;;;;;23706:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23706:24:0;;;23684:115;;;;-1:-1:-1;;;23684:115:0;;;;;;;:::i;:::-;23857:8;23812:18;:32;23831:12;:10;:12::i;:::-;-1:-1:-1;;;;;23812:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23812:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23812:53:0;;;;;;;;;;;23896:12;:10;:12::i;:::-;-1:-1:-1;;;;;23881:48:0;;23920:8;23881:48;;;;;;:::i;:::-;;;;;;;;23557:380;;:::o;78158:36::-;;;;:::o;97306:115::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;97393:9:::1;:20:::0;97306:115::o;78240:38::-;;;;:::o;95832:959::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;95913:6:::1;::::0;;;::::1;;;95912:7;95904:42;;;;-1:-1:-1::0;;;95904:42:0::1;;;;;;;:::i;:::-;95962:14;::::0;;;::::1;;;95961:15;95953:42;;;;-1:-1:-1::0;;;95953:42:0::1;;;;;;;:::i;:::-;96022:29;96028:11;96041:2;96045:1;96022:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96058;96064:11;96077:2;96081:1;96058:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96094;96100:11;96113:2;96117:1;96094:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96130;96136:11;96149:2;96153:1;96130:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96166;96172:11;96185:2;96189:1;96166:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96221:28;96227:11;96240:1;96243;96221:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96256;96262:11;96275:1;96278;96256:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96291:29;96297:11;96310:2;96314:1;96291:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96327;96333:11;96346:2;96350:1;96327:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96363;96369:11;96382:2;96386:1;96363:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96419:28;96425:11;96438:1;96441;96419:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96454;96460:11;96473:1;96476;96454:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96489;96495:11;96508:1;96511;96489:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96524;96530:11;96543:1;96546;96524:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;96559:29;96565:11;96578:2;96582:1;96559:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96595;96601:11;96614:2;96618:1;96595:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96631;96637:11;96650:2;96654:1;96631:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96687;96693:11;96706:2;96710:1;96687:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96723;96729:11;96742:2;96746:1;96723:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;-1:-1:-1::0;96765:14:0::1;:21:::0;;-1:-1:-1;;96765:21:0::1;::::0;::::1;::::0;;95832:959::o;78425:183::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78425:183:0;;-1:-1:-1;78425:183:0;:::o;78663:46::-;;;;;;;;;;;;;:::o;77714:39::-;;;;:::o;78615:38::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78615:38:0;:::o;82655:124::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;82728:8:::1;::::0;::::1;;:19;;::::0;::::1;;;;82720:28;;;::::0;::::1;;82753:8;:18:::0;;-1:-1:-1;;82753:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;82655:124::o;77439:38::-;;;;:::o;96797:503::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;96859:6:::1;::::0;;;::::1;;;96858:7;96850:42;;;;-1:-1:-1::0;;;96850:42:0::1;;;;;;;:::i;:::-;96908:14;::::0;;;::::1;;;96907:15;96899:42;;;;-1:-1:-1::0;;;96899:42:0::1;;;;;;;:::i;:::-;96953:29;96959:10;96971:2;96975;96953:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;96988;96994:10;97006:2;97010;96988:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97023;97029:10;97041:2;97045;97023:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97058;97064:10;97076:2;97080;97058:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97093;97099:10;97111:2;97115;97093:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97128;97134:10;97146:2;97150;97128:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97163;97169:10;97181:2;97185;97163:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97198;97204:10;97216:2;97220;97198:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97233;97239:10;97251:2;97255;97233:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;97274:14;:21:::0;;-1:-1:-1;;97274:21:0::1;::::0;::::1;::::0;;96797:503::o;77039:28::-;;;;:::o;88425:935::-;88501:6;;;;;;;88500:7;88492:42;;;;-1:-1:-1;;;88492:42:0;;;;;;;:::i;:::-;88553:8;;;;88545:58;;;;-1:-1:-1;;;88545:58:0;;;;;;;:::i;:::-;88651:5;88636:11;;:20;;88614:121;;;;-1:-1:-1;;;88614:121:0;;;;;;;:::i;:::-;88762:9;;88753:5;:18;;88740:74;;;;-1:-1:-1;;;88740:74:0;;;;;;;:::i;:::-;88880:3;;:14;;88888:5;88880:7;:14::i;:::-;88847:29;;-1:-1:-1;;;88847:29:0;;-1:-1:-1;;;;;88847:4:0;:14;;;;:29;;88870:4;;88847:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;88825:140;;;;-1:-1:-1;;;88825:140:0;;;;;;;:::i;:::-;89011:14;;:25;;89030:5;89011:18;:25::i;:::-;88998:9;:38;;88976:133;;;;-1:-1:-1;;;88976:133:0;;;;;;;:::i;:::-;89119:9;89114:239;89138:5;89134:1;:9;89114:239;;;89165:17;89185:31;89203:7;;89212:3;;89185:17;:31::i;:::-;89249:12;89222:24;;;:13;:24;;;;;:39;;-1:-1:-1;;89222:39:0;;;:24;-1:-1:-1;89294:12:0;:10;:12::i;:::-;89267:24;;;;:13;:24;;;;;:39;;-1:-1:-1;;;;;;89267:39:0;-1:-1:-1;;;;;89267:39:0;;;;;;;;;;89326:11;;:15;;-1:-1:-1;;89326:15:0;:::i;:::-;89312:11;:29;-1:-1:-1;89145:3:0;;;;:::i;:::-;;;;89114:239;;24009:218;-1:-1:-1;;;;;24182:27:0;;;24153:4;24182:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24009:218::o;77168:32::-;;;;:::o;24299:401::-;24515:12;:10;:12::i;:::-;-1:-1:-1;;;;;24507:20:0;:4;-1:-1:-1;;;;;24507:20:0;;:60;;;;24531:36;24548:4;24554:12;:10;:12::i;24531:36::-;24485:151;;;;-1:-1:-1;;;24485:151:0;;;;;;;:::i;:::-;24647:45;24665:4;24671:2;24675;24679:6;24687:4;24647:17;:45::i;2651:229::-;1982:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1971:23:0;;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2754:22:0;::::1;2732:110;;;;-1:-1:-1::0;;;2732:110:0::1;;;;;;;:::i;:::-;2853:19;2863:8;2853:9;:19::i;77551:38::-:0;;;;:::o;59573:131::-;59640:4;59664:32;59669:3;59689:5;59664:4;:32::i;:::-;59657:39;59573:131;-1:-1:-1;;;59573:131:0:o;11506:387::-;11829:20;11877:8;;;11506:387::o;20002:207::-;-1:-1:-1;;;;;;20161:40:0;;-1:-1:-1;;;20161:40:0;20002:207;;;:::o;45583:98::-;45641:7;45668:5;45672:1;45668;:5;:::i;72711:1224::-;72806:17;72841:4;-1:-1:-1;;;;;72841:20:0;;72876:14;72905:4;72935:8;71489:1;72924:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72841:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;73229:15:0;73365:16;;;:6;:16;;;;;;73247:145;;73278:8;;73229:15;;73345:4;;73247:16;:145::i;:::-;73857:16;;;;:6;:16;;;;;;73229:163;;-1:-1:-1;73857:20:0;;73876:1;73857:20;:::i;:::-;73838:16;;;;:6;:16;;;;;:39;73895:32;73845:8;73919:7;73895:13;:32::i;:::-;73888:39;72711:1224;-1:-1:-1;;;;72711:1224:0:o;602:98::-;682:10;602:98;:::o;40193:723::-;40249:13;40470:10;40466:53;;-1:-1:-1;40497:10:0;;;;;;;;;;;;-1:-1:-1;;;40497:10:0;;;;;;40466:53;40544:5;40529:12;40585:78;40592:9;;40585:78;;40618:8;;;;:::i;:::-;;-1:-1:-1;40641:10:0;;-1:-1:-1;40649:2:0;40641:10;;:::i;:::-;;;40585:78;;;40673:19;40705:6;40695:17;;;;;;-1:-1:-1;;;40695:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40695:17:0;;40673:39;;40723:154;40730:10;;40723:154;;40757:11;40767:1;40757:11;;:::i;:::-;;-1:-1:-1;40826:10:0;40834:2;40826:5;:10;:::i;:::-;40813:24;;:2;:24;:::i;:::-;40800:39;;40783:6;40790;40783:14;;;;;;-1:-1:-1;;;40783:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;40783:56:0;;;;;;;;-1:-1:-1;40854:11:0;40863:2;40854:11;;:::i;:::-;;;40723:154;;61577:295;61664:16;61698:22;61723:19;61731:3;61723:7;:19::i;26987:1249::-;27228:7;:14;27214:3;:10;:28;27192:118;;;;-1:-1:-1;;;27192:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27329:16:0;;27321:66;;;;-1:-1:-1;;;27321:66:0;;;;;;;:::i;:::-;27400:16;27419:12;:10;:12::i;:::-;27400:31;;27444:60;27465:8;27475:4;27481:2;27485:3;27490:7;27499:4;27444:20;:60::i;:::-;27522:9;27517:470;27541:3;:10;27537:1;:14;27517:470;;;27573:10;27586:3;27590:1;27586:6;;;;;;-1:-1:-1;;;27586:6:0;;;;;;;;;;;;;;;27573:19;;27607:14;27624:7;27632:1;27624:10;;;;;;-1:-1:-1;;;27624:10:0;;;;;;;;;;;;;;;;;;;;27651:19;27673:13;;;;;;;;;;-1:-1:-1;;;;;27673:19:0;;;;;;;;;;;;27624:10;;-1:-1:-1;27733:21:0;;;;27707:125;;;;-1:-1:-1;;;27707:125:0;;;;;;;:::i;:::-;27876:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27876:19:0;;;;;;;;;;27898:20;;;27876:42;;27948:17;;;;;;;:27;;27898:20;;27876:9;27948:27;;27898:20;;27948:27;:::i;:::-;;;;;;;;27517:470;;;27553:3;;;;:::i;:::-;;;27517:470;;;;28034:2;-1:-1:-1;;;;;28004:47:0;28028:4;-1:-1:-1;;;;;28004:47:0;28018:8;-1:-1:-1;;;;;28004:47:0;;28038:3;28043:7;28004:47;;;;;;;:::i;:::-;;;;;;;;28064:164;28114:8;28137:4;28156:2;28173:3;28191:7;28213:4;28064:35;:164::i;:::-;26987:1249;;;;;;:::o;75471:830::-;75596:4;75636;75596;75653:525;75677:5;:12;75673:1;:16;75653:525;;;75711:20;75734:5;75740:1;75734:8;;;;;;-1:-1:-1;;;75734:8:0;;;;;;;;;;;;;;;75711:31;;75779:12;75763;:28;75759:408;;75933:12;75947;75916:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75906:55;;;;;;75891:70;;75759:408;;;76123:12;76137;76106:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76096:55;;;;;;76081:70;;75759:408;-1:-1:-1;75691:3:0;;;;:::i;:::-;;;;75653:525;;;-1:-1:-1;76273:20:0;;;;75471:830;-1:-1:-1;;;75471:830:0:o;2888:173::-;2963:6;;;-1:-1:-1;;;;;2980:17:0;;;-1:-1:-1;;;;;;2980:17:0;;;;;;;3013:40;;2963:6;;;2980:17;2963:6;;3013:40;;2944:16;;3013:40;2888:173;;:::o;45982:98::-;46040:7;46067:5;46071:1;46067;:5;:::i;91240:412::-;91366:12;91338:24;;;:13;:24;;;;;;;;:40;;;;;;-1:-1:-1;;;91338:40:0;;;;;;;;;;91334:311;;;91399:38;91415:10;91427:9;91399:15;:38::i;:::-;91334:311;;;91491:10;91463:24;;;;:13;:24;;;;;;;;:38;;;;;;-1:-1:-1;;;91463:38:0;;;;;;;;;;91459:186;;;91522:36;91536:10;91548:9;91522:13;:36::i;91459:186::-;91595:38;91611:10;91623:9;91595:15;:38::i;29569:777::-;-1:-1:-1;;;;;29727:21:0;;29719:67;;;;-1:-1:-1;;;29719:67:0;;;;;;;:::i;:::-;29799:16;29818:12;:10;:12::i;:::-;29799:31;;29843:196;29878:8;29909:1;29926:7;29948:21;29966:2;29948:17;:21::i;:::-;29984:25;30002:6;29984:17;:25::i;:::-;30024:4;29843:20;:196::i;:::-;30052:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30052:22:0;;;;;;;;;:32;;30078:6;;30052:9;:32;;30078:6;;30052:32;:::i;:::-;;;;;;;;30137:7;-1:-1:-1;;;;;30100:57:0;30133:1;-1:-1:-1;;;;;30100:57:0;30115:8;-1:-1:-1;;;;;30100:57:0;;30146:2;30150:6;30100:57;;;;;;;:::i;:::-;;;;;;;;30170:168;30215:8;30246:1;30263:7;30285:2;30302:6;30323:4;30170:30;:168::i;25683:946::-;-1:-1:-1;;;;;25871:16:0;;25863:66;;;;-1:-1:-1;;;25863:66:0;;;;;;;:::i;:::-;25942:16;25961:12;:10;:12::i;:::-;25942:31;;25986:185;26021:8;26044:4;26063:2;26080:21;26098:2;26080:17;:21::i;25986:185::-;26184:19;26206:13;;;;;;;;;;;-1:-1:-1;;;;;26206:19:0;;;;;;;;;;26258:21;;;;26236:113;;;;-1:-1:-1;;;26236:113:0;;;;;;;:::i;:::-;26385:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26385:19:0;;;;;;;;;;26407:20;;;26385:42;;26449:17;;;;;;;:27;;26407:20;;26385:9;26449:27;;26407:20;;26449:27;:::i;:::-;;;;;;;;26525:2;-1:-1:-1;;;;;26494:46:0;26519:4;-1:-1:-1;;;;;26494:46:0;26509:8;-1:-1:-1;;;;;26494:46:0;;26529:2;26533:6;26494:46;;;;;;;:::i;:::-;;;;;;;;26553:68;26584:8;26594:4;26600:2;26604;26608:6;26616:4;26553:30;:68::i;:::-;25683:946;;;;;;;:::o;50630:414::-;50693:4;50715:21;50725:3;50730:5;50715:9;:21::i;:::-;50710:327;;-1:-1:-1;50753:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;50936:18;;50914:19;;;:12;;;:19;;;;;;:40;;;;50969:11;;50710:327;-1:-1:-1;51020:5:0;51013:12;;63918:316;64083:7;64170:8;64180:9;64191:10;64203:6;64159:51;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64159:51:0;;;;;;;;;64149:62;;64159:51;64149:62;;;;;63918:316;-1:-1:-1;;;;;63918:316:0:o;64645:206::-;64759:7;64818:8;64828:13;64801:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64791:52;;;;;;64784:59;;64645:206;;;;:::o;54138:111::-;54194:16;54230:3;:11;;54223:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54138:111;;;:::o;35921:975::-;36161:15;:2;-1:-1:-1;;;;;36161:13:0;;:15::i;:::-;36157:732;;;36214:203;;-1:-1:-1;;;36214:203:0;;-1:-1:-1;;;;;36214:43:0;;;;;:203;;36280:8;;36311:4;;36338:3;;36364:7;;36394:4;;36214:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36214:203:0;;;;;;;;-1:-1:-1;;36214:203:0;;;;;;;;;;;;:::i;:::-;;;36193:685;;;;:::i;:::-;;;;;;;;36751:6;36744:14;;-1:-1:-1;;;36744:14:0;;;;;;;;:::i;36193:685::-;36800:62;;-1:-1:-1;;;36800:62:0;;;;;;;:::i;36193:685::-;-1:-1:-1;;;;;;36502:60:0;;-1:-1:-1;;;36502:60:0;36476:199;;36605:50;;-1:-1:-1;;;36605:50:0;;;;;;;:::i;91661:619::-;91748:51;91762:24;:13;91780:5;91762:17;:24::i;:::-;91788:10;91748:13;:51::i;:::-;91842:1;91823:16;;:20;;;;:::i;:::-;91804:16;:39;91854:50;91867:24;:13;91885:5;91867:17;:24::i;:::-;91893:10;91854:12;:50::i;:::-;91945:1;91927:15;;:19;;;;:::i;:::-;91909:15;:37;91957:51;91971:24;:13;91989:5;91971:17;:24::i;:::-;91997:10;91957:13;:51::i;:::-;92051:1;92032:16;;:20;;;;:::i;:::-;92013:16;:39;92063:53;92078:25;:13;92096:6;92078:17;:25::i;:::-;92105:10;92063:14;:53::i;:::-;92161:1;92141:17;;:21;;;;:::i;:::-;92121:17;:41;92173:53;92188:25;:13;92206:6;92188:17;:25::i;92173:53::-;92271:1;92251:17;;:21;;;;:::i;:::-;92231:17;:41;-1:-1:-1;;91661:619:0:o;92289:1044::-;92450:14;;92421:15;;92390:1;;92375:12;;92421:44;;92450:14;92421:24;;92441:3;92421:19;:24::i;:44::-;92402:63;-1:-1:-1;92402:63:0;92480:33;92509:3;92480:24;:13;92498:5;92480:17;:24::i;:::-;:28;;:33::i;:::-;:45;92476:260;;92542:50;92555:24;:13;92573:5;92555:17;:24::i;:::-;92581:10;92542:12;:50::i;:::-;92614:8;92621:1;92614:4;:8;:::i;:::-;92607:15;;92671:1;92654:14;;:18;;;;:::i;:::-;92637:14;:35;92705:15;;:19;;92723:1;;92705:19;:::i;:::-;92687:15;:37;92476:260;92746:18;92767:46;92798:14;;92767:26;92789:3;92767:17;;:21;;:26;;;;:::i;:46::-;92746:67;-1:-1:-1;92746:67:0;92828:33;92857:3;92828:24;:13;92846:5;92828:17;:24::i;:33::-;:47;92824:269;;92892:53;92907:25;:13;92925:6;92907:17;:25::i;:::-;92934:10;92892:14;:53::i;:::-;92967:8;92974:1;92967:4;:8;:::i;:::-;92960:15;;93030:1;93010:17;;:21;;;;:::i;:::-;92990:17;:41;93063:14;;:18;;93080:1;;93063:18;:::i;:::-;93046:14;:35;92824:269;93110:8;;93103:223;;93152:58;93166:31;93184:8;93188:4;93184:2;:8;:::i;:::-;:12;;93195:1;93184:12;:::i;:::-;93166:13;;:17;:31::i;:::-;93199:10;93152:13;:58::i;:::-;93259:1;93242:14;;:18;;;;:::i;:::-;93225:14;:35;93294:16;;:20;;93313:1;;93294:20;:::i;:::-;93275:16;:39;93127:8;93134:1;93127:4;:8;:::i;:::-;93120:15;;93103:223;;93341:692;93506:13;;93476:16;;93444:1;;93429:12;;93476:44;;93506:13;93476:25;;93497:3;93476:20;:25::i;:44::-;93456:64;-1:-1:-1;93456:64:0;93535:33;93564:3;93535:24;:13;93553:5;93535:17;:24::i;:33::-;:46;93531:263;;93598:52;93612:25;:13;93630:6;93612:17;:25::i;:::-;93639:10;93598:13;:52::i;:::-;93697:1;93681:13;;:17;;;;:::i;:::-;93665:13;:33;93732:16;;:20;;93751:1;;93732:20;:::i;:::-;93713:16;:39;93774:8;93781:1;93774:4;:8;:::i;:::-;93767:15;;93531:263;93811:8;;93804:222;;93853:57;93868:29;93886:8;93890:4;93886:2;:8;:::i;:::-;:10;;93895:1;93886:10;:::i;:::-;93868:13;;:17;:29::i;:::-;93899:10;93853:14;:57::i;:::-;93957:1;93941:13;;:17;;;;:::i;:::-;93925:13;:33;93993:17;;:21;;94013:1;;93993:21;:::i;:::-;93973:17;:41;93828:8;93835:1;93828:4;:8;:::i;:::-;93821:15;;93804:222;;;93341:692;;;;:::o;36904:230::-;37056:16;;;37070:1;37056:16;;;;;;;;;36997;;37031:22;;37056:16;;;;;;;;;;;;-1:-1:-1;37056:16:0;37031:41;;37094:7;37083:5;37089:1;37083:8;;;;;;-1:-1:-1;;;37083:8:0;;;;;;;;;;;;;;;;;;:18;37121:5;36904:230;-1:-1:-1;;36904:230:0:o;35015:898::-;35230:15;:2;-1:-1:-1;;;;;35230:13:0;;:15::i;:::-;35226:680;;;35283:196;;-1:-1:-1;;;35283:196:0;;-1:-1:-1;;;;;35283:38:0;;;;;:196;;35344:8;;35375:4;;35402:2;;35427:6;;35456:4;;35283:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35283:196:0;;;;;;;;-1:-1:-1;;35283:196:0;;;;;;;;;;;;:::i;:::-;;;35262:633;;;;:::i;:::-;-1:-1:-1;;;;;;35542:55:0;;-1:-1:-1;;;35542:55:0;35538:154;;35622:50;;-1:-1:-1;;;35622:50:0;;;;;;;:::i;52726:161::-;52826:4;52855:19;;;:12;;;;;:19;;;;;;:24;;;52726:161::o;94041:440::-;94127:15;94145:33;94163:14;:5;:12;:14::i;:::-;94145:13;;:17;:33::i;:::-;94195:25;;;;:13;:25;;;;;;94127:51;;-1:-1:-1;94189:58:0;;-1:-1:-1;;;;;94195:25:0;94222:17;:5;94127:51;94222:8;:17::i;:::-;94241:1;94189:58;;;;;;;;;;;;:5;:58::i;:::-;94318:1;94288:8;:27;94297:17;:5;94306:7;94297:8;:17::i;:::-;94288:27;;;;;;;;;;;;:31;;;;:::i;:::-;94258:8;:27;94267:17;:5;94276:7;94267:8;:17::i;:::-;94258:27;;;;;;;;;;;:61;;;;94334:8;:27;94343:17;94352:7;94343:5;:8;;:17;;;;:::i;:::-;94334:27;;;;;;;;;;;;94365:1;94334:32;94330:86;;;94383:21;:5;94396:7;94383:12;:21::i;:::-;;94330:86;94449:20;;;;:11;:20;;;;;;:24;;94472:1;94449:24;:::i;:::-;94426:20;;;;:11;:20;;;;;;:47;-1:-1:-1;;94041:440:0:o;94490:433::-;94575:15;94593:32;94611:13;:4;:11;:13::i;94593:32::-;94642:25;;;;:13;:25;;;;;;94575:50;;-1:-1:-1;94636:57:0;;-1:-1:-1;;;;;94642:25:0;94669:16;:4;94575:50;94669:7;:16::i;94636:57::-;94762:1;94733:8;:26;94742:16;:4;94750:7;94742;:16::i;:::-;94733:26;;;;;;;;;;;;:30;;;;:::i;:::-;94704:8;:26;94713:16;:4;94721:7;94713;:16::i;:::-;94704:26;;;;;;;;;;;:59;;;;94778:8;:26;94787:16;94795:7;94787:4;:7;;:16;;;;:::i;:::-;94778:26;;;;;;;;;;;;94808:1;94778:31;94774:84;;;94826:20;:4;94838:7;94826:11;:20::i;94931:440::-;95017:15;95035:33;95053:14;:5;:12;:14::i;95035:33::-;95085:25;;;;:13;:25;;;;;;95017:51;;-1:-1:-1;95079:58:0;;-1:-1:-1;;;;;95085:25:0;95112:17;:5;95017:51;95112:8;:17::i;95079:58::-;95208:1;95178:8;:27;95187:17;:5;95196:7;95187:8;:17::i;:::-;95178:27;;;;;;;;;;;;:31;;;;:::i;:::-;95148:8;:27;95157:17;:5;95166:7;95157:8;:17::i;:::-;95148:27;;;;;;;;;;;:61;;;;95224:8;:27;95233:17;95242:7;95233:5;:8;;:17;;;;:::i;:::-;95224:27;;;;;;;;;;;;95255:1;95224:32;95220:86;;;95273:21;:5;95286:7;95273:12;:21::i;95379:447::-;95466:15;95484:34;95502:15;:6;:13;:15::i;95484:34::-;95535:25;;;;:13;:25;;;;;;95466:52;;-1:-1:-1;95529:59:0;;-1:-1:-1;;;;;95535:25:0;95562:18;:6;95466:52;95562:9;:18::i;95529:59::-;95661:1;95630:8;:28;95639:18;:6;95649:7;95639:9;:18::i;:::-;95630:28;;;;;;;;;;;;:32;;;;:::i;:::-;95599:8;:28;95608:18;:6;95618:7;95608:9;:18::i;:::-;95599:28;;;;;;;;;;;:63;;;;95677:8;:28;95686:18;95696:7;95686:6;:9;;:18;;;;:::i;:::-;95677:28;;;;;;;;;;;;95709:1;95677:33;95673:88;;;95727:22;:6;95741:7;95727:13;:22::i;46547:98::-;46605:7;46632:5;46636:1;46632;:5;:::i;60390:114::-;60450:7;60477:19;60485:3;60477:7;:19::i;60858:169::-;60956:7;60996:22;61000:3;61012:5;60996:3;:22::i;59880:160::-;59968:4;59997:35;60005:3;60025:5;59997:7;:35::i;52973:109::-;53056:18;;52973:109::o;53436:152::-;53530:7;53562:3;:11;;53574:5;53562:18;;;;;;-1:-1:-1;;;53562:18:0;;;;;;;;;;;;;;;;;53555:25;;53436:152;;;;:::o;51220:1420::-;51286:4;51425:19;;;:12;;;:19;;;;;;51461:15;;51457:1176;;51836:21;51860:14;51873:1;51860:10;:14;:::i;:::-;51909:18;;51836:38;;-1:-1:-1;51889:17:0;;51909:22;;51930:1;;51909:22;:::i;:::-;51889:42;;51965:13;51952:9;:26;51948:405;;51999:17;52019:3;:11;;52031:9;52019:22;;;;;;-1:-1:-1;;;52019:22:0;;;;;;;;;;;;;;;;;51999:42;;52173:9;52144:3;:11;;52156:13;52144:26;;;;;;-1:-1:-1;;;52144:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;52258:23;;;:12;;;:23;;;;;:36;;;51948:405;52434:17;;:3;;:17;;;-1:-1:-1;;;52434:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;52529:3;:12;;:19;52542:5;52529:19;;;;;;;;;;;52522:26;;;52572:4;52565:11;;;;;;;51457:1176;52616:5;52609:12;;;;;-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:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:705;;721:3;714:4;706:6;702:17;698:27;688:2;;743:5;736;729:20;688:2;783:6;770:20;809:4;833:65;848:49;894:2;848:49;:::i;:::-;833:65;:::i;:::-;932:15;;;963:12;;;;995:15;;;1041:11;;;1029:24;;1025:33;;1022:42;-1:-1:-1;1019:2:1;;;1081:5;1074;1067:20;1019:2;1107:5;1121:163;1135:2;1132:1;1129:9;1121:163;;;1192:17;;1180:30;;1230:12;;;;1262;;;;1153:1;1146:9;1121:163;;;-1:-1:-1;1302:5:1;;678:635;-1:-1:-1;;;;;;;678:635:1:o;1318:232::-;;1415:3;1408:4;1400:6;1396:17;1392:27;1382:2;;1437:5;1430;1423:20;1382:2;1463:81;1540:3;1531:6;1518:20;1511:4;1503:6;1499:17;1463:81;:::i;1555:198::-;;1667:2;1655:9;1646:7;1642:23;1638:32;1635:2;;;1688:6;1680;1673:22;1635:2;1716:31;1737:9;1716:31;:::i;1758:274::-;;;1887:2;1875:9;1866:7;1862:23;1858:32;1855:2;;;1908:6;1900;1893:22;1855:2;1936:31;1957:9;1936:31;:::i;:::-;1926:41;;1986:40;2022:2;2011:9;2007:18;1986:40;:::i;:::-;1976:50;;1845:187;;;;;:::o;2037:1001::-;;;;;;2276:3;2264:9;2255:7;2251:23;2247:33;2244:2;;;2298:6;2290;2283:22;2244:2;2326:31;2347:9;2326:31;:::i;:::-;2316:41;;2376:40;2412:2;2401:9;2397:18;2376:40;:::i;:::-;2366:50;;2467:2;2456:9;2452:18;2439:32;2490:18;2531:2;2523:6;2520:14;2517:2;;;2552:6;2544;2537:22;2517:2;2580:67;2639:7;2630:6;2619:9;2615:22;2580:67;:::i;:::-;2570:77;;2700:2;2689:9;2685:18;2672:32;2656:48;;2729:2;2719:8;2716:16;2713:2;;;2750:6;2742;2735:22;2713:2;2778:69;2839:7;2828:8;2817:9;2813:24;2778:69;:::i;:::-;2768:79;;2900:3;2889:9;2885:19;2872:33;2856:49;;2930:2;2920:8;2917:16;2914:2;;;2951:6;2943;2936:22;2914:2;;2979:53;3024:7;3013:8;3002:9;2998:24;2979:53;:::i;:::-;2969:63;;;2234:804;;;;;;;;:::o;3043:632::-;;;;;;3232:3;3220:9;3211:7;3207:23;3203:33;3200:2;;;3254:6;3246;3239:22;3200:2;3282:31;3303:9;3282:31;:::i;:::-;3272:41;;3332:40;3368:2;3357:9;3353:18;3332:40;:::i;:::-;3322:50;;3419:2;3408:9;3404:18;3391:32;3381:42;;3470:2;3459:9;3455:18;3442:32;3432:42;;3525:3;3514:9;3510:19;3497:33;3553:18;3545:6;3542:30;3539:2;;;3590:6;3582;3575:22;3539:2;3618:51;3661:7;3652:6;3641:9;3637:22;3618:51;:::i;3680:329::-;;;3806:2;3794:9;3785:7;3781:23;3777:32;3774:2;;;3827:6;3819;3812:22;3774:2;3855:31;3876:9;3855:31;:::i;:::-;3845:41;;3936:2;3925:9;3921:18;3908:32;3949:30;3973:5;3949:30;:::i;:::-;3998:5;3988:15;;;3764:245;;;;;:::o;4014:266::-;;;4143:2;4131:9;4122:7;4118:23;4114:32;4111:2;;;4164:6;4156;4149:22;4111:2;4192:31;4213:9;4192:31;:::i;:::-;4182:41;4270:2;4255:18;;;;4242:32;;-1:-1:-1;;;4101:179:1:o;4285:1226::-;;;4464:2;4452:9;4443:7;4439:23;4435:32;4432:2;;;4485:6;4477;4470:22;4432:2;4530:9;4517:23;4559:18;4600:2;4592:6;4589:14;4586:2;;;4621:6;4613;4606:22;4586:2;4664:6;4653:9;4649:22;4639:32;;4709:7;4702:4;4698:2;4694:13;4690:27;4680:2;;4736:6;4728;4721:22;4680:2;4777;4764:16;4799:4;4823:65;4838:49;4884:2;4838:49;:::i;4823:65::-;4922:15;;;4953:12;;;;4985:11;;;5023;;;5015:20;;5011:29;;5008:42;-1:-1:-1;5005:2:1;;;5068:6;5060;5053:22;5005:2;5095:6;5086:15;;5110:171;5124:2;5121:1;5118:9;5110:171;;;5181:25;5202:3;5181:25;:::i;:::-;5169:38;;5142:1;5135:9;;;;;5227:12;;;;5259;;5110:171;;;-1:-1:-1;5300:5:1;-1:-1:-1;;5343:18:1;;5330:32;;-1:-1:-1;;5374:16:1;;;5371:2;;;5408:6;5400;5393:22;5371:2;;5436:69;5497:7;5486:8;5475:9;5471:24;5436:69;:::i;:::-;5426:79;;;4422:1089;;;;;:::o;5516:253::-;;5625:2;5613:9;5604:7;5600:23;5596:32;5593:2;;;5646:6;5638;5631:22;5593:2;5690:9;5677:23;5709:30;5733:5;5709:30;:::i;5774:257::-;;5894:2;5882:9;5873:7;5869:23;5865:32;5862:2;;;5915:6;5907;5900:22;5862:2;5952:9;5946:16;5971:30;5995:5;5971:30;:::i;6036:190::-;;6148:2;6136:9;6127:7;6123:23;6119:32;6116:2;;;6169:6;6161;6154:22;6116:2;-1:-1:-1;6197:23:1;;6106:120;-1:-1:-1;6106:120:1:o;6231:258::-;;;6360:2;6348:9;6339:7;6335:23;6331:32;6328:2;;;6381:6;6373;6366:22;6328:2;-1:-1:-1;;6409:23:1;;;6479:2;6464:18;;;6451:32;;-1:-1:-1;6318:171:1:o;6494:257::-;;6605:2;6593:9;6584:7;6580:23;6576:32;6573:2;;;6626:6;6618;6611:22;6573:2;6670:9;6657:23;6689:32;6715:5;6689:32;:::i;6756:261::-;;6878:2;6866:9;6857:7;6853:23;6849:32;6846:2;;;6899:6;6891;6884:22;6846:2;6936:9;6930:16;6955:32;6981:5;6955:32;:::i;7022:482::-;;7144:2;7132:9;7123:7;7119:23;7115:32;7112:2;;;7165:6;7157;7150:22;7112:2;7210:9;7197:23;7243:18;7235:6;7232:30;7229:2;;;7280:6;7272;7265:22;7229:2;7308:22;;7361:4;7353:13;;7349:27;-1:-1:-1;7339:2:1;;7395:6;7387;7380:22;7339:2;7423:75;7490:7;7485:2;7472:16;7467:2;7463;7459:11;7423:75;:::i;7704:194::-;;7827:2;7815:9;7806:7;7802:23;7798:32;7795:2;;;7848:6;7840;7833:22;7795:2;-1:-1:-1;7876:16:1;;7785:113;-1:-1:-1;7785:113:1:o;7903:734::-;;;;8067:2;8055:9;8046:7;8042:23;8038:32;8035:2;;;8088:6;8080;8073:22;8035:2;8129:9;8116:23;8106:33;;8190:2;8179:9;8175:18;8162:32;8213:18;8254:2;8246:6;8243:14;8240:2;;;8275:6;8267;8260:22;8240:2;8318:6;8307:9;8303:22;8293:32;;8363:7;8356:4;8352:2;8348:13;8344:27;8334:2;;8390:6;8382;8375:22;8334:2;8435;8422:16;8461:2;8453:6;8450:14;8447:2;;;8482:6;8474;8467:22;8447:2;8541:7;8536:2;8530;8522:6;8518:15;8514:2;8510:24;8506:33;8503:46;8500:2;;;8567:6;8559;8552:22;8500:2;8603;8599;8595:11;8585:21;;8625:6;8615:16;;;;;8025:612;;;;;:::o;8642:443::-;;8739:5;8733:12;8766:6;8761:3;8754:19;8792:4;8821:2;8816:3;8812:12;8805:19;;8858:2;8851:5;8847:14;8879:3;8891:169;8905:6;8902:1;8899:13;8891:169;;;8966:13;;8954:26;;9000:12;;;;9035:15;;;;8927:1;8920:9;8891:169;;;-1:-1:-1;9076:3:1;;8709:376;-1:-1:-1;;;;;8709:376:1:o;9090:259::-;;9171:5;9165:12;9198:6;9193:3;9186:19;9214:63;9270:6;9263:4;9258:3;9254:14;9247:4;9240:5;9236:16;9214:63;:::i;:::-;9331:2;9310:15;-1:-1:-1;;9306:29:1;9297:39;;;;9338:4;9293:50;;9141:208;-1:-1:-1;;9141:208:1:o;9354:187::-;;9436:5;9430:12;9451:52;9496:6;9491:3;9484:4;9477:5;9473:16;9451:52;:::i;:::-;9519:16;;;;;9406:135;-1:-1:-1;;9406:135:1:o;9546:120::-;-1:-1:-1;;;9613:20:1;;9658:1;9649:11;;9603:63::o;9671:116::-;-1:-1:-1;;;9738:16:1;;9779:1;9770:11;;9728:59::o;9792:229::-;9941:2;9937:15;;;;-1:-1:-1;;9933:53:1;9921:66;;10012:2;10003:12;;9911:110::o;10026:247::-;10183:19;;;10227:2;10218:12;;10211:28;10264:2;10255:12;;10173:100::o;10530:1449::-;10966:13;;10530:1449;;;;11039:1;11024:17;;11060:1;11096:18;;;;11123:2;;11177:4;11169:6;11165:17;11155:27;;11123:2;11203;11251;11243:6;11240:14;11220:18;11217:38;11214:2;;;-1:-1:-1;;;11278:33:1;;11334:4;11331:1;11324:15;11364:4;11285:3;11352:17;11214:2;11395:18;11422:104;;;;11540:1;11535:324;;;;11388:471;;11422:104;-1:-1:-1;;11455:24:1;;11443:37;;11500:16;;;;-1:-1:-1;11422:104:1;;11535:324;11571:39;11603:6;11571:39;:::i;:::-;11632:3;11648:165;11662:6;11659:1;11656:13;11648:165;;;11740:14;;11727:11;;;11720:35;11783:16;;;;11677:10;;11648:165;;;11652:3;;11842:6;11837:3;11833:16;11826:23;;11388:471;;;;;;;11875:98;11907:65;11935:36;11967:3;11935:36;:::i;:::-;11927:6;11907:65;:::i;:::-;11875:98;:::i;:::-;11868:105;10916:1063;-1:-1:-1;;;;;10916:1063:1:o;11984:203::-;-1:-1:-1;;;;;12148:32:1;;;;12130:51;;12118:2;12103:18;;12085:102::o;12192:840::-;-1:-1:-1;;;;;12589:15:1;;;12571:34;;12641:15;;12636:2;12621:18;;12614:43;12551:3;12688:2;12673:18;;12666:31;;;12192:840;;12720:63;;12763:19;;12755:6;12720:63;:::i;:::-;12831:9;12823:6;12819:22;12814:2;12803:9;12799:18;12792:50;12865;12908:6;12900;12865:50;:::i;:::-;12851:64;;12964:9;12956:6;12952:22;12946:3;12935:9;12931:19;12924:51;12992:34;13019:6;13011;12992:34;:::i;:::-;12984:42;12523:509;-1:-1:-1;;;;;;;;12523:509:1:o;13037:562::-;-1:-1:-1;;;;;13334:15:1;;;13316:34;;13386:15;;13381:2;13366:18;;13359:43;13433:2;13418:18;;13411:34;;;13476:2;13461:18;;13454:34;;;13296:3;13519;13504:19;;13497:32;;;13037:562;;13546:47;;13573:19;;13565:6;13546:47;:::i;:::-;13538:55;13268:331;-1:-1:-1;;;;;;;13268:331:1:o;13604:274::-;-1:-1:-1;;;;;13796:32:1;;;;13778:51;;13860:2;13845:18;;13838:34;13766:2;13751:18;;13733:145::o;13883:387::-;;14115:1;14111;14106:3;14102:11;14098:19;14090:6;14086:32;14075:9;14068:51;14155:6;14150:2;14139:9;14135:18;14128:34;14198:2;14193;14182:9;14178:18;14171:30;14218:46;14260:2;14249:9;14245:18;14237:6;14218:46;:::i;14275:267::-;;14454:2;14443:9;14436:21;14474:62;14532:2;14521:9;14517:18;14509:6;14474:62;:::i;14547:477::-;;14804:2;14793:9;14786:21;14830:62;14888:2;14877:9;14873:18;14865:6;14830:62;:::i;:::-;14940:9;14932:6;14928:22;14923:2;14912:9;14908:18;14901:50;14968;15011:6;15003;14968:50;:::i;15029:899::-;;15442:3;15431:9;15424:22;15469:63;15527:3;15516:9;15512:19;15504:6;15469:63;:::i;:::-;15580:9;15572:6;15568:22;15563:2;15552:9;15548:18;15541:50;15614;15657:6;15649;15614:50;:::i;:::-;15600:64;;15712:9;15704:6;15700:22;15695:2;15684:9;15680:18;15673:50;15746;15789:6;15781;15746:50;:::i;:::-;15732:64;;15844:9;15836:6;15832:22;15827:2;15816:9;15812:18;15805:50;15872;15915:6;15907;15872:50;:::i;15933:187::-;16098:14;;16091:22;16073:41;;16061:2;16046:18;;16028:92::o;16125:177::-;16271:25;;;16259:2;16244:18;;16226:76::o;16560:417::-;16791:25;;;16847:2;16832:18;;16825:34;;;;-1:-1:-1;;;;;16895:32:1;16890:2;16875:18;;16868:60;16959:2;16944:18;;16937:34;16778:3;16763:19;;16745:232::o;16982:221::-;;17131:2;17120:9;17113:21;17151:46;17193:2;17182:9;17178:18;17170:6;17151:46;:::i;17208:416::-;17410:2;17392:21;;;17449:2;17429:18;;;17422:30;17488:34;17483:2;17468:18;;17461:62;-1:-1:-1;;;17554:2:1;17539:18;;17532:50;17614:3;17599:19;;17382:242::o;17629:404::-;17831:2;17813:21;;;17870:2;17850:18;;;17843:30;17909:34;17904:2;17889:18;;17882:62;-1:-1:-1;;;17975:2:1;17960:18;;17953:38;18023:3;18008:19;;17803:230::o;18038:407::-;18240:2;18222:21;;;18279:2;18259:18;;;18252:30;18318:34;18313:2;18298:18;;18291:62;-1:-1:-1;;;18384:2:1;18369:18;;18362:41;18435:3;18420:19;;18212:233::o;18450:402::-;18652:2;18634:21;;;18691:2;18671:18;;;18664:30;18730:34;18725:2;18710:18;;18703:62;-1:-1:-1;;;18796:2:1;18781:18;;18774:36;18842:3;18827:19;;18624:228::o;18857:405::-;19059:2;19041:21;;;19098:2;19078:18;;;19071:30;19137:34;19132:2;19117:18;;19110:62;-1:-1:-1;;;19203:2:1;19188:18;;19181:39;19252:3;19237:19;;19031:231::o;19267:404::-;19469:2;19451:21;;;19508:2;19488:18;;;19481:30;19547:34;19542:2;19527:18;;19520:62;-1:-1:-1;;;19613:2:1;19598:18;;19591:38;19661:3;19646:19;;19441:230::o;19676:403::-;19878:2;19860:21;;;19917:2;19897:18;;;19890:30;19956:34;19951:2;19936:18;;19929:62;-1:-1:-1;;;20022:2:1;20007:18;;20000:37;20069:3;20054:19;;19850:229::o;20084:407::-;20286:2;20268:21;;;20325:2;20305:18;;;20298:30;20364:34;20359:2;20344:18;;20337:62;-1:-1:-1;;;20430:2:1;20415:18;;20408:41;20481:3;20466:19;;20258:233::o;20496:397::-;20698:2;20680:21;;;20737:2;20717:18;;;20710:30;20776:34;20771:2;20756:18;;20749:62;-1:-1:-1;;;20842:2:1;20827:18;;20820:31;20883:3;20868:19;;20670:223::o;20898:354::-;21100:2;21082:21;;;21139:2;21119:18;;;21112:30;21178:32;21173:2;21158:18;;21151:60;21243:2;21228:18;;21072:180::o;21257:401::-;21459:2;21441:21;;;21498:2;21478:18;;;21471:30;21537:34;21532:2;21517:18;;21510:62;-1:-1:-1;;;21603:2:1;21588:18;;21581:35;21648:3;21633:19;;21431:227::o;21663:414::-;21865:2;21847:21;;;21904:2;21884:18;;;21877:30;21943:34;21938:2;21923:18;;21916:62;-1:-1:-1;;;22009:2:1;21994:18;;21987:48;22067:3;22052:19;;21837:240::o;22082:416::-;22284:2;22266:21;;;22323:2;22303:18;;;22296:30;22362:34;22357:2;22342:18;;22335:62;-1:-1:-1;;;22428:2:1;22413:18;;22406:50;22488:3;22473:19;;22256:242::o;22503:411::-;22705:2;22687:21;;;22744:2;22724:18;;;22717:30;22783:34;22778:2;22763:18;;22756:62;-1:-1:-1;;;22849:2:1;22834:18;;22827:45;22904:3;22889:19;;22677:237::o;22919:406::-;23121:2;23103:21;;;23160:2;23140:18;;;23133:30;23199:34;23194:2;23179:18;;23172:62;-1:-1:-1;;;23265:2:1;23250:18;;23243:40;23315:3;23300:19;;23093:232::o;23330:415::-;23532:2;23514:21;;;23571:2;23551:18;;;23544:30;23610:34;23605:2;23590:18;;23583:62;-1:-1:-1;;;23676:2:1;23661:18;;23654:49;23735:3;23720:19;;23504:241::o;23750:414::-;23952:2;23934:21;;;23991:2;23971:18;;;23964:30;24030:34;24025:2;24010:18;;24003:62;-1:-1:-1;;;24096:2:1;24081:18;;24074:48;24154:3;24139:19;;23924:240::o;24169:401::-;24371:2;24353:21;;;24410:2;24390:18;;;24383:30;24449:34;24444:2;24429:18;;24422:62;-1:-1:-1;;;24515:2:1;24500:18;;24493:35;24560:3;24545:19;;24343:227::o;24575:356::-;24777:2;24759:21;;;24796:18;;;24789:30;24855:34;24850:2;24835:18;;24828:62;24922:2;24907:18;;24749:182::o;24936:346::-;25138:2;25120:21;;;25177:2;25157:18;;;25150:30;-1:-1:-1;;;25211:2:1;25196:18;;25189:52;25273:2;25258:18;;25110:172::o;25287:407::-;25489:2;25471:21;;;25528:2;25508:18;;;25501:30;25567:34;25562:2;25547:18;;25540:62;-1:-1:-1;;;25633:2:1;25618:18;;25611:41;25684:3;25669:19;;25461:233::o;25699:409::-;25901:2;25883:21;;;25940:2;25920:18;;;25913:30;25979:34;25974:2;25959:18;;25952:62;-1:-1:-1;;;26045:2:1;26030:18;;26023:43;26098:3;26083:19;;25873:235::o;26113:355::-;26315:2;26297:21;;;26354:2;26334:18;;;26327:30;26393:33;26388:2;26373:18;;26366:61;26459:2;26444:18;;26287:181::o;26473:338::-;26675:2;26657:21;;;26714:2;26694:18;;;26687:30;-1:-1:-1;;;26748:2:1;26733:18;;26726:44;26802:2;26787:18;;26647:164::o;26816:416::-;27018:2;27000:21;;;27057:2;27037:18;;;27030:30;27096:34;27091:2;27076:18;;27069:62;-1:-1:-1;;;27162:2:1;27147:18;;27140:50;27222:3;27207:19;;26990:242::o;27237:350::-;27439:2;27421:21;;;27478:2;27458:18;;;27451:30;27517:28;27512:2;27497:18;;27490:56;27578:2;27563:18;;27411:176::o;27592:405::-;27794:2;27776:21;;;27833:2;27813:18;;;27806:30;27872:34;27867:2;27852:18;;27845:62;-1:-1:-1;;;27938:2:1;27923:18;;27916:39;27987:3;27972:19;;27766:231::o;28002:405::-;28204:2;28186:21;;;28243:2;28223:18;;;28216:30;28282:34;28277:2;28262:18;;28255:62;-1:-1:-1;;;28348:2:1;28333:18;;28326:39;28397:3;28382:19;;28176:231::o;28412:404::-;28614:2;28596:21;;;28653:2;28633:18;;;28626:30;28692:34;28687:2;28672:18;;28665:62;-1:-1:-1;;;28758:2:1;28743:18;;28736:38;28806:3;28791:19;;28586:230::o;28821:397::-;29023:2;29005:21;;;29062:2;29042:18;;;29035:30;29101:34;29096:2;29081:18;;29074:62;-1:-1:-1;;;29167:2:1;29152:18;;29145:31;29208:3;29193:19;;28995:223::o;29223:409::-;29425:2;29407:21;;;29464:2;29444:18;;;29437:30;29503:34;29498:2;29483:18;;29476:62;-1:-1:-1;;;29569:2:1;29554:18;;29547:43;29622:3;29607:19;;29397:235::o;30072:251::-;30142:2;30136:9;30172:17;;;30219:18;30204:34;;30240:22;;;30201:62;30198:2;;;30266:18;;:::i;:::-;30302:2;30295:22;30116:207;;-1:-1:-1;30116:207:1:o;30328:192::-;;30427:18;30419:6;30416:30;30413:2;;;30449:18;;:::i;:::-;-1:-1:-1;30509:4:1;30490:17;;;30486:28;;30403:117::o;30525:129::-;;30593:17;;;30643:4;30627:21;;;30583:71::o;30659:128::-;;30730:1;30726:6;30723:1;30720:13;30717:2;;;30736:18;;:::i;:::-;-1:-1:-1;30772:9:1;;30707:80::o;30792:120::-;;30858:1;30848:2;;30863:18;;:::i;:::-;-1:-1:-1;30897:9:1;;30838:74::o;30917:453::-;31013:6;31036:5;31050:314;31099:1;31136:2;31126:8;31123:16;31113:2;;31143:5;;;31113:2;31184:4;31179:3;31175:14;31169:4;31166:24;31163:2;;;31193:18;;:::i;:::-;31243:2;31233:8;31229:17;31226:2;;;31258:16;;;;31226:2;31337:17;;;;;31297:15;;31050:314;;;30994:376;;;;;;;:::o;31375:139::-;;31464:44;-1:-1:-1;;31491:8:1;31485:4;31519:922;31603:8;31593:2;;-1:-1:-1;31644:1:1;31658:5;;31593:2;31692:4;31682:2;;-1:-1:-1;31729:1:1;31743:5;;31682:2;31774:4;31792:1;31787:59;;;;31860:1;31855:183;;;;31767:271;;31787:59;31817:1;31808:10;;31831:5;;;31855:183;31892:3;31882:8;31879:17;31876:2;;;31899:18;;:::i;:::-;31955:1;31945:8;31941:16;31932:25;;31983:3;31976:5;31973:14;31970:2;;;31990:18;;:::i;:::-;32023:5;;;31767:271;;32122:2;32112:8;32109:16;32103:3;32097:4;32094:13;32090:36;32084:2;32074:8;32071:16;32066:2;32060:4;32057:12;32053:35;32050:77;32047:2;;;-1:-1:-1;32159:19:1;;;32194:14;;;32191:2;;;32211:18;;:::i;:::-;32244:5;;32047:2;32291:42;32329:3;32319:8;32313:4;32310:1;32291:42;:::i;:::-;32366:6;32361:3;32357:16;32348:7;32345:29;32342:2;;;32377:18;;:::i;:::-;32415:20;;31583:858;-1:-1:-1;;;;31583:858:1:o;32446:168::-;;32552:1;32548;32544:6;32540:14;32537:1;32534:21;32529:1;32522:9;32515:17;32511:45;32508:2;;;32559:18;;:::i;:::-;-1:-1:-1;32599:9:1;;32498:116::o;32619:125::-;;32687:1;32684;32681:8;32678:2;;;32692:18;;:::i;:::-;-1:-1:-1;32729:9:1;;32668:76::o;32749:258::-;32821:1;32831:113;32845:6;32842:1;32839:13;32831:113;;;32921:11;;;32915:18;32902:11;;;32895:39;32867:2;32860:10;32831:113;;;32962:6;32959:1;32956:13;32953:2;;;-1:-1:-1;;32997:1:1;32979:16;;32972:27;32802:205::o;33012:380::-;33097:1;33087:12;;33144:1;33134:12;;;33155:2;;33209:4;33201:6;33197:17;33187:27;;33155:2;33262;33254:6;33251:14;33231:18;33228:38;33225:2;;;33308:10;33303:3;33299:20;33296:1;33289:31;33343:4;33340:1;33333:15;33371:4;33368:1;33361:15;33225:2;;33067:325;;;:::o;33397:135::-;;-1:-1:-1;;33457:17:1;;33454:2;;;33477:18;;:::i;:::-;-1:-1:-1;33524:1:1;33513:13;;33444:88::o;33537:112::-;;33595:1;33585:2;;33600:18;;:::i;:::-;-1:-1:-1;33634:9:1;;33575:74::o;33654:127::-;33715:10;33710:3;33706:20;33703:1;33696:31;33746:4;33743:1;33736:15;33770:4;33767:1;33760:15;33786:127;33847:10;33842:3;33838:20;33835:1;33828:31;33878:4;33875:1;33868:15;33902:4;33899:1;33892:15;33918:127;33979:10;33974:3;33970:20;33967:1;33960:31;34010:4;34007:1;34000:15;34034:4;34031:1;34024:15;34050:88;34125:3;34121:15;;34107:31::o;34143:764::-;;34224:4;34206:16;34203:26;34200:2;;;34232:5;;34200:2;34273:1;34268:3;34263;34248:27;34335:10;34297:36;34328:3;34322:10;34297:36;:::i;:::-;34294:52;34284:2;;34350:5;;34284:2;34384;34378:9;34424:16;-1:-1:-1;;34420:29:1;34417:1;34378:9;34396:54;34479:4;34473:11;34503:16;34538:18;34609:2;34602:4;34594:6;34590:17;34587:25;34582:2;34574:6;34571:14;34568:45;34565:2;;;34616:5;;;;;;34565:2;34653:6;34647:4;34643:17;34632:28;;34689:3;34683:10;34669:24;;34716:2;34708:6;34705:14;34702:2;;;34722:5;;;;;;34702:2;;34783:16;34777:4;34773:27;34766:4;34757:6;34752:3;34748:16;34744:27;34741:60;34738:2;;;34804:5;;;;;34738:2;34869;34848:15;-1:-1:-1;;34844:29:1;34835:39;;34876:4;34831:50;34827:2;34820:62;34839:3;-1:-1:-1;;34190:717:1;:::o;34912:120::-;35000:5;34993:13;34986:21;34979:5;34976:32;34966:2;;35022:1;35019;35012:12;35037:133;-1:-1:-1;;;;;;35113:32:1;;35103:43;;35093:2;;35160:1;35157;35150:12

Swarm Source

ipfs://12caf3ca419ad0cc183e4f0a8a0b0597d440f9de0d1cb6bb0ce7265445ce3f86
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.