ETH Price: $3,396.95 (+1.84%)

Token

Mbrayc (MBRA)
 

Overview

Max Total Supply

6,398 MBRA

Holders

1,716

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MBRA
0xb9f4648470ef559937e34b496446a40f41f144cc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

7,777 MBRAYC NFTs are minting.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Mbrayc

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-17
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.10;

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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



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

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



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

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



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

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



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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)



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

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

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



/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

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



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

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

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

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

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

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

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

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


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// buy n pay n
contract Mbrayc is ERC721A, IERC2981, Ownable {

    string public baseURI = "https://ipfs-storage.s3.amazonaws.com/mbrayc/";

    uint256 public tokenPrice = 3500000000000000; //0.005 ETH

    uint256 public whitelistTokenPrice = 2500000000000000; //0.002 ETH

    uint256 public whitelistTokensRemain = 5;//decrease to 0, auto close whitelist mint

    uint public maxTokensPerTx = 20;

    uint public defaultTokensPerTx = 3;

    uint256 public MAX_TOKENS = 7777;

    bool public saleIsActive = true;

    uint public royalty = 1000;//10%

    bytes32 public merkleRoot = 0x0;

    enum TokenURIMode {
        MODE_ONE,
        MODE_TWO,
        MODE_THREE
    }

    TokenURIMode private tokenUriMode = TokenURIMode.MODE_ONE;

    constructor() ERC721A("Mbrayc", "MBRA", 100, MAX_TOKENS) {
    }

    struct HelperState {
        uint256 tokenPrice;
        uint256 maxTokensPerTx;
        uint256 MAX_TOKENS;
        bool saleIsActive;
        uint256 totalSupply;
        uint256 userMinted;
        uint defaultTokensPerTx;
        uint256 whitelistTokenPrice;
        uint256 whitelistTokensRemain;
    }

    function _state(address minter) external view returns (HelperState memory) {
        return HelperState({
            tokenPrice: tokenPrice,
            maxTokensPerTx: maxTokensPerTx,
            MAX_TOKENS: MAX_TOKENS,
            saleIsActive: saleIsActive,
            totalSupply: uint256(totalSupply()),
            userMinted: minter == address(0) ? 0 : uint256(_numberMinted(minter)),
            defaultTokensPerTx : defaultTokensPerTx,
            whitelistTokenPrice : whitelistTokenPrice,
            whitelistTokensRemain :whitelistTokensRemain
        });
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    } 

    function withdrawTo(address to, uint256 amount) public onlyOwner {
        require(amount <= address(this).balance, "Exceed balance of this contract");
        payable(to).transfer(amount);
    } 

    function reserveTokens(address to, uint numberOfTokens) public onlyOwner {        
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Exceed max supply of tokens");
        _safeMint(to, numberOfTokens);
    }         
    
    function setBaseURI(string memory newURI) public onlyOwner {
        baseURI = newURI;
    }    

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function getPrice(uint numberOfTokens, bytes32[] calldata merkleProof) public view returns (uint256) {
        if( MerkleProof.verifyCalldata(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))) && numberMinted(msg.sender) <= 0 && whitelistTokensRemain > 0 ){
            return numberOfTokens * whitelistTokenPrice;
        }
        return numberOfTokens * tokenPrice;
    }

    // if numberMinted(msg.sender) > 0 -> no whitelist, no free.
    function mintToken(uint numberOfTokens, bytes32[] calldata merkleProof) public payable {
        require(saleIsActive, "Sale must be active");
        require(numberOfTokens <= maxTokensPerTx, "Exceed max tokens per tx");
        require(numberOfTokens > 0, "Must mint at least one");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Exceed max supply");
        
        if( MerkleProof.verifyCalldata(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))) && numberMinted(msg.sender) <= 0 && whitelistTokensRemain > 0  ){
            require(msg.value >= numberOfTokens * whitelistTokenPrice, "Not enough ether");
            _safeMint(msg.sender, numberOfTokens);
            if(whitelistTokensRemain >= numberOfTokens){
              whitelistTokensRemain = whitelistTokensRemain - numberOfTokens;
            } else{
              whitelistTokensRemain = 0;
            }
        } else{
            require(msg.value >= numberOfTokens * tokenPrice, "Not enough ether");
            _safeMint(msg.sender, numberOfTokens);
        }
    }

    function setTokenPrice(uint256 newTokenPrice) public onlyOwner{
        tokenPrice = newTokenPrice;
    }

    function setWhitelistTokenPrice(uint256 _whitelistTokenPrice) public onlyOwner{
        whitelistTokenPrice = _whitelistTokenPrice;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) 
    {
        require(_exists(_tokenId), "Token does not exist.");
        if (tokenUriMode == TokenURIMode.MODE_TWO) {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId)
            )
          ) : "";
        } else if (tokenUriMode == TokenURIMode.MODE_ONE) {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              ".json"
            )
          ) : "";
        } else if(tokenUriMode == TokenURIMode.MODE_THREE){
          return baseURI;
        }
        return "";
    }

    function setTokenURIMode(uint256 mode) external onlyOwner {
        if (mode == 2) {
            tokenUriMode = TokenURIMode.MODE_TWO;
        } else if (mode == 1) {
            tokenUriMode = TokenURIMode.MODE_ONE;
        } else{
            tokenUriMode = TokenURIMode.MODE_THREE;
        }
    }

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    } 

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
      merkleRoot = _merkleRoot;
    }

    function setWhitelistTokensRemain(uint256 _whitelistTokensRemain) public onlyOwner {
      whitelistTokensRemain = _whitelistTokensRemain;
    }

    function setMaxTokensPerTx(uint _maxTokensPerTx) public onlyOwner{
        maxTokensPerTx = _maxTokensPerTx;
    }

    function setDefaultTokensPerTx(uint _defaultTokensPerTx) public onlyOwner{
        defaultTokensPerTx = _defaultTokensPerTx;
    }


    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC165-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");
        return (owner(), (salePrice * royalty)/10000);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_state","outputs":[{"components":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"maxTokensPerTx","type":"uint256"},{"internalType":"uint256","name":"MAX_TOKENS","type":"uint256"},{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"userMinted","type":"uint256"},{"internalType":"uint256","name":"defaultTokensPerTx","type":"uint256"},{"internalType":"uint256","name":"whitelistTokenPrice","type":"uint256"},{"internalType":"uint256","name":"whitelistTokensRemain","type":"uint256"}],"internalType":"struct Mbrayc.HelperState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultTokensPerTx","type":"uint256"}],"name":"setDefaultTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensPerTx","type":"uint256"}],"name":"setMaxTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setTokenURIMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistTokenPrice","type":"uint256"}],"name":"setWhitelistTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistTokensRemain","type":"uint256"}],"name":"setWhitelistTokensRemain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistTokensRemain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805560006007556040518060600160405280602d815260200162005f62602d9139600990805190602001906200003e92919062000305565b50660c6f3b40b6c000600a556608e1bc9bf04000600b556005600c556014600d556003600e55611e61600f556001601060006101000a81548160ff0219169083151502179055506103e86011556000801b6012556000601360006101000a81548160ff02191690836002811115620000bb57620000ba620003b5565b5b0217905550348015620000cd57600080fd5b506040518060400160405280600681526020017f4d627261796300000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d425241000000000000000000000000000000000000000000000000000000008152506064600f546000811162000185576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017c906200046b565b60405180910390fd5b60008211620001cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c29062000503565b60405180910390fd5b8360019080519060200190620001e392919062000305565b508260029080519060200190620001fc92919062000305565b508160a0818152505080608081815250505050505062000231620002256200023760201b60201c565b6200023f60201b60201c565b6200058a565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003139062000554565b90600052602060002090601f01602090048101928262000337576000855562000383565b82601f106200035257805160ff191683800117855562000383565b8280016001018555821562000383579182015b828111156200038257825182559160200191906001019062000365565b5b50905062000392919062000396565b5090565b5b80821115620003b157600081600090555060010162000397565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000453602e83620003e4565b91506200046082620003f5565b604082019050919050565b60006020820190508181036000830152620004868162000444565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620004eb602783620003e4565b9150620004f8826200048d565b604082019050919050565b600060208201905081810360008301526200051e81620004dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200056d57607f821691505b6020821081141562000584576200058362000525565b5b50919050565b60805160a0516159a7620005bb60003960008181612e9101528181612eba015261359c0152600050506159a76000f3fe6080604052600436106102885760003560e01c80636a61e5fc1161015a578063b25bea6a116100c1578063dc33e6811161007a578063dc33e681146109bc578063e985e9c5146109f9578063eb8d244414610a36578063f2fde38b14610a61578063f47c84c514610a8a578063fa468ead14610ab557610288565b8063b25bea6a146108b0578063b88d4fde146108d9578063b9bed05e14610902578063c87b56dd1461092b578063c8c4bd2214610968578063d7224ba01461099157610288565b80637ff9b596116101135780637ff9b596146107c15780638da5cb5b146107ec578063900c71f51461081757806395d89b4114610840578063a22cb4651461086b578063ae7c122e1461089457610288565b80636a61e5fc146106c75780636c0360eb146106f057806370a082311461071b578063715018a61461075857806378cf19e91461076f5780637cb647591461079857610288565b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce7146105a357806355f804b3146105e05780635e307a48146106095780636352211e14610634578063681c8bac14610671578063694c7bce1461069c57610288565b80632f745c59146104a957806334918dfd146104e65780633ccfd60b146104fd57806342842e0e14610514578063495e1eba1461053d5780634df8bb451461056657610288565b806318160ddd1161025057806318160ddd14610398578063205c2878146103c357806323b872dd146103ec57806329ee566c146104155780632a55205a146104405780632eb4a7ab1461047e57610288565b806301ffc9a71461028d57806303ce3fc9146102ca57806306fdde0314610307578063081812fc14610332578063095ea7b31461036f575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613ba6565b610ae0565b6040516102c19190613bee565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613ca4565b610b5a565b6040516102fe9190613d13565b60405180910390f35b34801561031357600080fd5b5061031c610be5565b6040516103299190613dc7565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613de9565b610c77565b6040516103669190613e57565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613e9e565b610cfc565b005b3480156103a457600080fd5b506103ad610e15565b6040516103ba9190613d13565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190613e9e565b610e1e565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613ede565b610f28565b005b34801561042157600080fd5b5061042a610f38565b6040516104379190613d13565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613f31565b610f3e565b604051610475929190613f71565b60405180910390f35b34801561048a57600080fd5b50610493610fb7565b6040516104a09190613fb3565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190613e9e565b610fbd565b6040516104dd9190613d13565b60405180910390f35b3480156104f257600080fd5b506104fb6111bb565b005b34801561050957600080fd5b50610512611263565b005b34801561052057600080fd5b5061053b60048036038101906105369190613ede565b61132e565b005b34801561054957600080fd5b50610564600480360381019061055f9190613de9565b61134e565b005b34801561057257600080fd5b5061058d60048036038101906105889190613fce565b6113d4565b60405161059a91906140d0565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613de9565b61148b565b6040516105d79190613d13565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061421c565b6114de565b005b34801561061557600080fd5b5061061e611574565b60405161062b9190613d13565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190613de9565b61157a565b6040516106689190613e57565b60405180910390f35b34801561067d57600080fd5b50610686611590565b6040516106939190613d13565b60405180910390f35b3480156106a857600080fd5b506106b1611596565b6040516106be9190613d13565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190613de9565b61159c565b005b3480156106fc57600080fd5b50610705611622565b6040516107129190613dc7565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613fce565b6116b0565b60405161074f9190613d13565b60405180910390f35b34801561076457600080fd5b5061076d611799565b005b34801561077b57600080fd5b5061079660048036038101906107919190613e9e565b611821565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190614291565b611902565b005b3480156107cd57600080fd5b506107d6611988565b6040516107e39190613d13565b60405180910390f35b3480156107f857600080fd5b5061080161198e565b60405161080e9190613e57565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613de9565b6119b8565b005b34801561084c57600080fd5b50610855611ad6565b6040516108629190613dc7565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d91906142ea565b611b68565b005b6108ae60048036038101906108a99190613ca4565b611ce9565b005b3480156108bc57600080fd5b506108d760048036038101906108d29190613de9565b611f5d565b005b3480156108e557600080fd5b5061090060048036038101906108fb91906143cb565b611fe3565b005b34801561090e57600080fd5b5061092960048036038101906109249190613de9565b61203f565b005b34801561093757600080fd5b50610952600480360381019061094d9190613de9565b6120c5565b60405161095f9190613dc7565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a9190613de9565b612328565b005b34801561099d57600080fd5b506109a66123ae565b6040516109b39190613d13565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613fce565b6123b4565b6040516109f09190613d13565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444e565b6123c6565b604051610a2d9190613bee565b60405180910390f35b348015610a4257600080fd5b50610a4b61245a565b604051610a589190613bee565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190613fce565b61246d565b005b348015610a9657600080fd5b50610a9f612565565b604051610aac9190613d13565b60405180910390f35b348015610ac157600080fd5b50610aca61256b565b604051610ad79190613d13565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b535750610b5282612571565b5b9050919050565b6000610b90838360125433604051602001610b7591906144d6565b604051602081830303815290604052805190602001206126bb565b8015610ba557506000610ba2336123b4565b11155b8015610bb357506000600c54115b15610bcd57600b5484610bc69190614520565b9050610bde565b600a5484610bdb9190614520565b90505b9392505050565b606060018054610bf4906145a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c20906145a9565b8015610c6d5780601f10610c4257610100808354040283529160200191610c6d565b820191906000526020600020905b815481529060010190602001808311610c5057829003601f168201915b5050505050905090565b6000610c82826126d4565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb89061464d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d078261157a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f906146df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d976126e1565b73ffffffffffffffffffffffffffffffffffffffff161480610dc65750610dc581610dc06126e1565b6123c6565b5b610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90614771565b60405180910390fd5b610e108383836126e9565b505050565b60008054905090565b610e266126e1565b73ffffffffffffffffffffffffffffffffffffffff16610e4461198e565b73ffffffffffffffffffffffffffffffffffffffff1614610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906147dd565b60405180910390fd5b47811115610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614849565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f23573d6000803e3d6000fd5b505050565b610f3383838361279b565b505050565b60115481565b600080610f4a846126d4565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906148b5565b60405180910390fd5b610f9161198e565b61271060115485610fa29190614520565b610fac9190614904565b915091509250929050565b60125481565b6000610fc8836116b0565b8210611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906149a7565b60405180910390fd5b6000611013610e15565b905060008060005b83811015611179576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461110d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116557868414156111565781955050505050506111b5565b8380611161906149c7565b9450505b508080611171906149c7565b91505061101b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90614a82565b60405180910390fd5b92915050565b6111c36126e1565b73ffffffffffffffffffffffffffffffffffffffff166111e161198e565b73ffffffffffffffffffffffffffffffffffffffff1614611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e906147dd565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61126b6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661128961198e565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906147dd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561132a573d6000803e3d6000fd5b5050565b61134983838360405180602001604052806000815250611fe3565b505050565b6113566126e1565b73ffffffffffffffffffffffffffffffffffffffff1661137461198e565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c1906147dd565b60405180910390fd5b80600e8190555050565b6113dc613a0f565b604051806101200160405280600a548152602001600d548152602001600f548152602001601060009054906101000a900460ff161515815260200161141f610e15565b8152602001600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146114665761146184612d54565b611469565b60005b8152602001600e548152602001600b548152602001600c548152509050919050565b6000611495610e15565b82106114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614b14565b60405180910390fd5b819050919050565b6114e66126e1565b73ffffffffffffffffffffffffffffffffffffffff1661150461198e565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906147dd565b60405180910390fd5b8060099080519060200190611570929190613a5d565b5050565b600d5481565b600061158582612e3d565b600001519050919050565b600e5481565b600c5481565b6115a46126e1565b73ffffffffffffffffffffffffffffffffffffffff166115c261198e565b73ffffffffffffffffffffffffffffffffffffffff1614611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f906147dd565b60405180910390fd5b80600a8190555050565b6009805461162f906145a9565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906145a9565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614ba6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117a16126e1565b73ffffffffffffffffffffffffffffffffffffffff166117bf61198e565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c906147dd565b60405180910390fd5b61181f6000613040565b565b6118296126e1565b73ffffffffffffffffffffffffffffffffffffffff1661184761198e565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906147dd565b60405180910390fd5b600f54816118a9610e15565b6118b39190614bc6565b11156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614c68565b60405180910390fd5b6118fe8282613106565b5050565b61190a6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661192861198e565b73ffffffffffffffffffffffffffffffffffffffff161461197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906147dd565b60405180910390fd5b8060128190555050565b600a5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119c06126e1565b73ffffffffffffffffffffffffffffffffffffffff166119de61198e565b73ffffffffffffffffffffffffffffffffffffffff1614611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b906147dd565b60405180910390fd5b6002811415611a6d576001601360006101000a81548160ff02191690836002811115611a6357611a62614c88565b5b0217905550611ad3565b6001811415611aa6576000601360006101000a81548160ff02191690836002811115611a9c57611a9b614c88565b5b0217905550611ad2565b6002601360006101000a81548160ff02191690836002811115611acc57611acb614c88565b5b02179055505b5b50565b606060028054611ae5906145a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b11906145a9565b8015611b5e5780601f10611b3357610100808354040283529160200191611b5e565b820191906000526020600020905b815481529060010190602001808311611b4157829003601f168201915b5050505050905090565b611b706126e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590614d03565b60405180910390fd5b8060066000611beb6126e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c986126e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdd9190613bee565b60405180910390a35050565b601060009054906101000a900460ff16611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614d6f565b60405180910390fd5b600d54831115611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490614ddb565b60405180910390fd5b60008311611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790614e47565b60405180910390fd5b600f5483611dcc610e15565b611dd69190614bc6565b1115611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90614eb3565b60405180910390fd5b611e4b828260125433604051602001611e3091906144d6565b604051602081830303815290604052805190602001206126bb565b8015611e6057506000611e5d336123b4565b11155b8015611e6e57506000600c54115b15611efd57600b5483611e819190614520565b341015611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614f1f565b60405180910390fd5b611ecd3384613106565b82600c5410611eef5782600c54611ee49190614f3f565b600c81905550611ef8565b6000600c819055505b611f58565b600a5483611f0b9190614520565b341015611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614f1f565b60405180910390fd5b611f573384613106565b5b505050565b611f656126e1565b73ffffffffffffffffffffffffffffffffffffffff16611f8361198e565b73ffffffffffffffffffffffffffffffffffffffff1614611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906147dd565b60405180910390fd5b80600c8190555050565b611fee84848461279b565b611ffa84848484613124565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090614fe5565b60405180910390fd5b50505050565b6120476126e1565b73ffffffffffffffffffffffffffffffffffffffff1661206561198e565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b2906147dd565b60405180910390fd5b80600d8190555050565b60606120d0826126d4565b61210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690615051565b60405180910390fd5b6001600281111561212357612122614c88565b5b601360009054906101000a900460ff16600281111561214557612144614c88565b5b14156121a95760006009805461215a906145a9565b90501161217657604051806020016040528060008152506121a2565b6009612181836132ac565b604051602001612192929190615141565b6040516020818303038152906040525b9050612323565b600060028111156121bd576121bc614c88565b5b601360009054906101000a900460ff1660028111156121df576121de614c88565b5b1415612243576000600980546121f4906145a9565b905011612210576040518060200160405280600081525061223c565b600961221b836132ac565b60405160200161222c9291906151b1565b6040516020818303038152906040525b9050612323565b60028081111561225657612255614c88565b5b601360009054906101000a900460ff16600281111561227857612277614c88565b5b1415612310576009805461228b906145a9565b80601f01602080910402602001604051908101604052809291908181526020018280546122b7906145a9565b80156123045780601f106122d957610100808354040283529160200191612304565b820191906000526020600020905b8154815290600101906020018083116122e757829003601f168201915b50505050509050612323565b6040518060200160405280600081525090505b919050565b6123306126e1565b73ffffffffffffffffffffffffffffffffffffffff1661234e61198e565b73ffffffffffffffffffffffffffffffffffffffff16146123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b906147dd565b60405180910390fd5b80600b8190555050565b60075481565b60006123bf82612d54565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b6124756126e1565b73ffffffffffffffffffffffffffffffffffffffff1661249361198e565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e0906147dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090615252565b60405180910390fd5b61256281613040565b50565b600f5481565b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b457506126b38261340d565b5b9050919050565b6000826126c9868685613477565b149050949350505050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a682612e3d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127cd6126e1565b73ffffffffffffffffffffffffffffffffffffffff16148061282957506127f26126e1565b73ffffffffffffffffffffffffffffffffffffffff1661281184610c77565b73ffffffffffffffffffffffffffffffffffffffff16145b806128455750612844826000015161283f6126e1565b6123c6565b5b905080612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e906152e4565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090615376565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296090615408565b60405180910390fd5b61297685858560016134cf565b61298660008484600001516126e9565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129f49190615444565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a989190615478565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b9e9190614bc6565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ce457612c14816126d4565b15612ce3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4c86868660016134d5565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbc90615530565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b612e45613ae3565b612e4e826126d4565b612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e84906155c2565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612ef15760017f000000000000000000000000000000000000000000000000000000000000000084612ee49190614f3f565b612eee9190614bc6565b90505b60008390505b818110612fff576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612feb5780935050505061303b565b508080612ff7906155e2565b915050612ef7565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130329061567e565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131208282604051806020016040528060008152506134db565b5050565b60006131458473ffffffffffffffffffffffffffffffffffffffff166139ba565b1561329f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261316e6126e1565b8786866040518563ffffffff1660e01b815260040161319094939291906156f3565b6020604051808303816000875af19250505080156131cc57506040513d601f19601f820116820180604052508101906131c99190615754565b60015b61324f573d80600081146131fc576040519150601f19603f3d011682016040523d82523d6000602084013e613201565b606091505b50600081511415613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323e90614fe5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132a4565b600190505b949350505050565b606060008214156132f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613408565b600082905060005b6000821461332657808061330f906149c7565b915050600a8261331f9190614904565b91506132fc565b60008167ffffffffffffffff811115613342576133416140f1565b5b6040519080825280601f01601f1916602001820160405280156133745781602001600182028036833780820191505090505b5090505b600085146134015760018261338d9190614f3f565b9150600a8561339c9190615781565b60306133a89190614bc6565b60f81b8183815181106133be576133bd6157b2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133fa9190614904565b9450613378565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b858590508110156134c3576134ae828787848181106134a2576134a16157b2565b5b905060200201356139cd565b915080806134bb906149c7565b915050613480565b50809150509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354890615853565b60405180910390fd5b61355a816126d4565b1561359a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613591906158bf565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156135fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f490615951565b60405180910390fd5b61360a60008583866134cf565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516137079190615478565b6fffffffffffffffffffffffffffffffff16815260200185836020015161372e9190615478565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561399d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461393d6000888488613124565b61397c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397390614fe5565b60405180910390fd5b8180613987906149c7565b9250508080613995906149c7565b9150506138cc565b50806000819055506139b260008785886134d5565b505050505050565b600080823b905060008111915050919050565b60008183106139e5576139e082846139f8565b6139f0565b6139ef83836139f8565b5b905092915050565b600082600052816020526040600020905092915050565b60405180610120016040528060008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613a69906145a9565b90600052602060002090601f016020900481019282613a8b5760008555613ad2565b82601f10613aa457805160ff1916838001178555613ad2565b82800160010185558215613ad2579182015b82811115613ad1578251825591602001919060010190613ab6565b5b509050613adf9190613b1d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b36576000816000905550600101613b1e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8381613b4e565b8114613b8e57600080fd5b50565b600081359050613ba081613b7a565b92915050565b600060208284031215613bbc57613bbb613b44565b5b6000613bca84828501613b91565b91505092915050565b60008115159050919050565b613be881613bd3565b82525050565b6000602082019050613c036000830184613bdf565b92915050565b6000819050919050565b613c1c81613c09565b8114613c2757600080fd5b50565b600081359050613c3981613c13565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c6457613c63613c3f565b5b8235905067ffffffffffffffff811115613c8157613c80613c44565b5b602083019150836020820283011115613c9d57613c9c613c49565b5b9250929050565b600080600060408486031215613cbd57613cbc613b44565b5b6000613ccb86828701613c2a565b935050602084013567ffffffffffffffff811115613cec57613ceb613b49565b5b613cf886828701613c4e565b92509250509250925092565b613d0d81613c09565b82525050565b6000602082019050613d286000830184613d04565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d68578082015181840152602081019050613d4d565b83811115613d77576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d9982613d2e565b613da38185613d39565b9350613db3818560208601613d4a565b613dbc81613d7d565b840191505092915050565b60006020820190508181036000830152613de18184613d8e565b905092915050565b600060208284031215613dff57613dfe613b44565b5b6000613e0d84828501613c2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4182613e16565b9050919050565b613e5181613e36565b82525050565b6000602082019050613e6c6000830184613e48565b92915050565b613e7b81613e36565b8114613e8657600080fd5b50565b600081359050613e9881613e72565b92915050565b60008060408385031215613eb557613eb4613b44565b5b6000613ec385828601613e89565b9250506020613ed485828601613c2a565b9150509250929050565b600080600060608486031215613ef757613ef6613b44565b5b6000613f0586828701613e89565b9350506020613f1686828701613e89565b9250506040613f2786828701613c2a565b9150509250925092565b60008060408385031215613f4857613f47613b44565b5b6000613f5685828601613c2a565b9250506020613f6785828601613c2a565b9150509250929050565b6000604082019050613f866000830185613e48565b613f936020830184613d04565b9392505050565b6000819050919050565b613fad81613f9a565b82525050565b6000602082019050613fc86000830184613fa4565b92915050565b600060208284031215613fe457613fe3613b44565b5b6000613ff284828501613e89565b91505092915050565b61400481613c09565b82525050565b61401381613bd3565b82525050565b610120820160008201516140306000850182613ffb565b5060208201516140436020850182613ffb565b5060408201516140566040850182613ffb565b506060820151614069606085018261400a565b50608082015161407c6080850182613ffb565b5060a082015161408f60a0850182613ffb565b5060c08201516140a260c0850182613ffb565b5060e08201516140b560e0850182613ffb565b506101008201516140ca610100850182613ffb565b50505050565b6000610120820190506140e66000830184614019565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61412982613d7d565b810181811067ffffffffffffffff82111715614148576141476140f1565b5b80604052505050565b600061415b613b3a565b90506141678282614120565b919050565b600067ffffffffffffffff821115614187576141866140f1565b5b61419082613d7d565b9050602081019050919050565b82818337600083830152505050565b60006141bf6141ba8461416c565b614151565b9050828152602081018484840111156141db576141da6140ec565b5b6141e684828561419d565b509392505050565b600082601f83011261420357614202613c3f565b5b81356142138482602086016141ac565b91505092915050565b60006020828403121561423257614231613b44565b5b600082013567ffffffffffffffff8111156142505761424f613b49565b5b61425c848285016141ee565b91505092915050565b61426e81613f9a565b811461427957600080fd5b50565b60008135905061428b81614265565b92915050565b6000602082840312156142a7576142a6613b44565b5b60006142b58482850161427c565b91505092915050565b6142c781613bd3565b81146142d257600080fd5b50565b6000813590506142e4816142be565b92915050565b6000806040838503121561430157614300613b44565b5b600061430f85828601613e89565b9250506020614320858286016142d5565b9150509250929050565b600067ffffffffffffffff821115614345576143446140f1565b5b61434e82613d7d565b9050602081019050919050565b600061436e6143698461432a565b614151565b90508281526020810184848401111561438a576143896140ec565b5b61439584828561419d565b509392505050565b600082601f8301126143b2576143b1613c3f565b5b81356143c284826020860161435b565b91505092915050565b600080600080608085870312156143e5576143e4613b44565b5b60006143f387828801613e89565b945050602061440487828801613e89565b935050604061441587828801613c2a565b925050606085013567ffffffffffffffff81111561443657614435613b49565b5b6144428782880161439d565b91505092959194509250565b6000806040838503121561446557614464613b44565b5b600061447385828601613e89565b925050602061448485828601613e89565b9150509250929050565b60008160601b9050919050565b60006144a68261448e565b9050919050565b60006144b88261449b565b9050919050565b6144d06144cb82613e36565b6144ad565b82525050565b60006144e282846144bf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061452b82613c09565b915061453683613c09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456f5761456e6144f1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145c157607f821691505b602082108114156145d5576145d461457a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614637602d83613d39565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006146c9602283613d39565b91506146d48261466d565b604082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061475b603983613d39565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b60006147c7601583613d39565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f4578636565642062616c616e6365206f66207468697320636f6e747261637400600082015250565b6000614833601f83613d39565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061489f601183613d39565b91506148aa82614869565b602082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061490f82613c09565b915061491a83613c09565b92508261492a576149296148d5565b5b828204905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614991602283613d39565b915061499c82614935565b604082019050919050565b600060208201905081810360008301526149c081614984565b9050919050565b60006149d282613c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a0557614a046144f1565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614a6c602e83613d39565b9150614a7782614a10565b604082019050919050565b60006020820190508181036000830152614a9b81614a5f565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614afe602383613d39565b9150614b0982614aa2565b604082019050919050565b60006020820190508181036000830152614b2d81614af1565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614b90602b83613d39565b9150614b9b82614b34565b604082019050919050565b60006020820190508181036000830152614bbf81614b83565b9050919050565b6000614bd182613c09565b9150614bdc83613c09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c1157614c106144f1565b5b828201905092915050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b6000614c52601b83613d39565b9150614c5d82614c1c565b602082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614ced601a83613d39565b9150614cf882614cb7565b602082019050919050565b60006020820190508181036000830152614d1c81614ce0565b9050919050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b6000614d59601383613d39565b9150614d6482614d23565b602082019050919050565b60006020820190508181036000830152614d8881614d4c565b9050919050565b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b6000614dc5601883613d39565b9150614dd082614d8f565b602082019050919050565b60006020820190508181036000830152614df481614db8565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b6000614e31601683613d39565b9150614e3c82614dfb565b602082019050919050565b60006020820190508181036000830152614e6081614e24565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000614e9d601183613d39565b9150614ea882614e67565b602082019050919050565b60006020820190508181036000830152614ecc81614e90565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b6000614f09601083613d39565b9150614f1482614ed3565b602082019050919050565b60006020820190508181036000830152614f3881614efc565b9050919050565b6000614f4a82613c09565b9150614f5583613c09565b925082821015614f6857614f676144f1565b5b828203905092915050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614fcf603383613d39565b9150614fda82614f73565b604082019050919050565b60006020820190508181036000830152614ffe81614fc2565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061503b601583613d39565b915061504682615005565b602082019050919050565b6000602082019050818103600083015261506a8161502e565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461509e816145a9565b6150a88186615071565b945060018216600081146150c357600181146150d457615107565b60ff19831686528186019350615107565b6150dd8561507c565b60005b838110156150ff578154818901526001820191506020810190506150e0565b838801955050505b50505092915050565b600061511b82613d2e565b6151258185615071565b9350615135818560208601613d4a565b80840191505092915050565b600061514d8285615091565b91506151598284615110565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061519b600583615071565b91506151a682615165565b600582019050919050565b60006151bd8285615091565b91506151c98284615110565b91506151d48261518e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061523c602683613d39565b9150615247826151e0565b604082019050919050565b6000602082019050818103600083015261526b8161522f565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006152ce603283613d39565b91506152d982615272565b604082019050919050565b600060208201905081810360008301526152fd816152c1565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615360602683613d39565b915061536b82615304565b604082019050919050565b6000602082019050818103600083015261538f81615353565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006153f2602583613d39565b91506153fd82615396565b604082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061544f82615428565b915061545a83615428565b92508282101561546d5761546c6144f1565b5b828203905092915050565b600061548382615428565b915061548e83615428565b9250826fffffffffffffffffffffffffffffffff038211156154b3576154b26144f1565b5b828201905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061551a603183613d39565b9150615525826154be565b604082019050919050565b600060208201905081810360008301526155498161550d565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006155ac602a83613d39565b91506155b782615550565b604082019050919050565b600060208201905081810360008301526155db8161559f565b9050919050565b60006155ed82613c09565b91506000821415615601576156006144f1565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615668602f83613d39565b91506156738261560c565b604082019050919050565b600060208201905081810360008301526156978161565b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156c58261569e565b6156cf81856156a9565b93506156df818560208601613d4a565b6156e881613d7d565b840191505092915050565b60006080820190506157086000830187613e48565b6157156020830186613e48565b6157226040830185613d04565b818103606083015261573481846156ba565b905095945050505050565b60008151905061574e81613b7a565b92915050565b60006020828403121561576a57615769613b44565b5b60006157788482850161573f565b91505092915050565b600061578c82613c09565b915061579783613c09565b9250826157a7576157a66148d5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061583d602183613d39565b9150615848826157e1565b604082019050919050565b6000602082019050818103600083015261586c81615830565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006158a9601d83613d39565b91506158b482615873565b602082019050919050565b600060208201905081810360008301526158d88161589c565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b600061593b602283613d39565b9150615946826158df565b604082019050919050565b6000602082019050818103600083015261596a8161592e565b905091905056fea2646970667358221220a08de3e1dc51791da4710ec12f994f7d6860a68466b84df7a263f464140f7fde64736f6c634300080b003368747470733a2f2f697066732d73746f726167652e73332e616d617a6f6e6177732e636f6d2f6d62726179632f

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636a61e5fc1161015a578063b25bea6a116100c1578063dc33e6811161007a578063dc33e681146109bc578063e985e9c5146109f9578063eb8d244414610a36578063f2fde38b14610a61578063f47c84c514610a8a578063fa468ead14610ab557610288565b8063b25bea6a146108b0578063b88d4fde146108d9578063b9bed05e14610902578063c87b56dd1461092b578063c8c4bd2214610968578063d7224ba01461099157610288565b80637ff9b596116101135780637ff9b596146107c15780638da5cb5b146107ec578063900c71f51461081757806395d89b4114610840578063a22cb4651461086b578063ae7c122e1461089457610288565b80636a61e5fc146106c75780636c0360eb146106f057806370a082311461071b578063715018a61461075857806378cf19e91461076f5780637cb647591461079857610288565b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce7146105a357806355f804b3146105e05780635e307a48146106095780636352211e14610634578063681c8bac14610671578063694c7bce1461069c57610288565b80632f745c59146104a957806334918dfd146104e65780633ccfd60b146104fd57806342842e0e14610514578063495e1eba1461053d5780634df8bb451461056657610288565b806318160ddd1161025057806318160ddd14610398578063205c2878146103c357806323b872dd146103ec57806329ee566c146104155780632a55205a146104405780632eb4a7ab1461047e57610288565b806301ffc9a71461028d57806303ce3fc9146102ca57806306fdde0314610307578063081812fc14610332578063095ea7b31461036f575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613ba6565b610ae0565b6040516102c19190613bee565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613ca4565b610b5a565b6040516102fe9190613d13565b60405180910390f35b34801561031357600080fd5b5061031c610be5565b6040516103299190613dc7565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613de9565b610c77565b6040516103669190613e57565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613e9e565b610cfc565b005b3480156103a457600080fd5b506103ad610e15565b6040516103ba9190613d13565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190613e9e565b610e1e565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613ede565b610f28565b005b34801561042157600080fd5b5061042a610f38565b6040516104379190613d13565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613f31565b610f3e565b604051610475929190613f71565b60405180910390f35b34801561048a57600080fd5b50610493610fb7565b6040516104a09190613fb3565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190613e9e565b610fbd565b6040516104dd9190613d13565b60405180910390f35b3480156104f257600080fd5b506104fb6111bb565b005b34801561050957600080fd5b50610512611263565b005b34801561052057600080fd5b5061053b60048036038101906105369190613ede565b61132e565b005b34801561054957600080fd5b50610564600480360381019061055f9190613de9565b61134e565b005b34801561057257600080fd5b5061058d60048036038101906105889190613fce565b6113d4565b60405161059a91906140d0565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613de9565b61148b565b6040516105d79190613d13565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061421c565b6114de565b005b34801561061557600080fd5b5061061e611574565b60405161062b9190613d13565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190613de9565b61157a565b6040516106689190613e57565b60405180910390f35b34801561067d57600080fd5b50610686611590565b6040516106939190613d13565b60405180910390f35b3480156106a857600080fd5b506106b1611596565b6040516106be9190613d13565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190613de9565b61159c565b005b3480156106fc57600080fd5b50610705611622565b6040516107129190613dc7565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613fce565b6116b0565b60405161074f9190613d13565b60405180910390f35b34801561076457600080fd5b5061076d611799565b005b34801561077b57600080fd5b5061079660048036038101906107919190613e9e565b611821565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190614291565b611902565b005b3480156107cd57600080fd5b506107d6611988565b6040516107e39190613d13565b60405180910390f35b3480156107f857600080fd5b5061080161198e565b60405161080e9190613e57565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613de9565b6119b8565b005b34801561084c57600080fd5b50610855611ad6565b6040516108629190613dc7565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d91906142ea565b611b68565b005b6108ae60048036038101906108a99190613ca4565b611ce9565b005b3480156108bc57600080fd5b506108d760048036038101906108d29190613de9565b611f5d565b005b3480156108e557600080fd5b5061090060048036038101906108fb91906143cb565b611fe3565b005b34801561090e57600080fd5b5061092960048036038101906109249190613de9565b61203f565b005b34801561093757600080fd5b50610952600480360381019061094d9190613de9565b6120c5565b60405161095f9190613dc7565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a9190613de9565b612328565b005b34801561099d57600080fd5b506109a66123ae565b6040516109b39190613d13565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613fce565b6123b4565b6040516109f09190613d13565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444e565b6123c6565b604051610a2d9190613bee565b60405180910390f35b348015610a4257600080fd5b50610a4b61245a565b604051610a589190613bee565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190613fce565b61246d565b005b348015610a9657600080fd5b50610a9f612565565b604051610aac9190613d13565b60405180910390f35b348015610ac157600080fd5b50610aca61256b565b604051610ad79190613d13565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b535750610b5282612571565b5b9050919050565b6000610b90838360125433604051602001610b7591906144d6565b604051602081830303815290604052805190602001206126bb565b8015610ba557506000610ba2336123b4565b11155b8015610bb357506000600c54115b15610bcd57600b5484610bc69190614520565b9050610bde565b600a5484610bdb9190614520565b90505b9392505050565b606060018054610bf4906145a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c20906145a9565b8015610c6d5780601f10610c4257610100808354040283529160200191610c6d565b820191906000526020600020905b815481529060010190602001808311610c5057829003601f168201915b5050505050905090565b6000610c82826126d4565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb89061464d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d078261157a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f906146df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d976126e1565b73ffffffffffffffffffffffffffffffffffffffff161480610dc65750610dc581610dc06126e1565b6123c6565b5b610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90614771565b60405180910390fd5b610e108383836126e9565b505050565b60008054905090565b610e266126e1565b73ffffffffffffffffffffffffffffffffffffffff16610e4461198e565b73ffffffffffffffffffffffffffffffffffffffff1614610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906147dd565b60405180910390fd5b47811115610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614849565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f23573d6000803e3d6000fd5b505050565b610f3383838361279b565b505050565b60115481565b600080610f4a846126d4565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906148b5565b60405180910390fd5b610f9161198e565b61271060115485610fa29190614520565b610fac9190614904565b915091509250929050565b60125481565b6000610fc8836116b0565b8210611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906149a7565b60405180910390fd5b6000611013610e15565b905060008060005b83811015611179576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461110d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116557868414156111565781955050505050506111b5565b8380611161906149c7565b9450505b508080611171906149c7565b91505061101b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90614a82565b60405180910390fd5b92915050565b6111c36126e1565b73ffffffffffffffffffffffffffffffffffffffff166111e161198e565b73ffffffffffffffffffffffffffffffffffffffff1614611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e906147dd565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61126b6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661128961198e565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906147dd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561132a573d6000803e3d6000fd5b5050565b61134983838360405180602001604052806000815250611fe3565b505050565b6113566126e1565b73ffffffffffffffffffffffffffffffffffffffff1661137461198e565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c1906147dd565b60405180910390fd5b80600e8190555050565b6113dc613a0f565b604051806101200160405280600a548152602001600d548152602001600f548152602001601060009054906101000a900460ff161515815260200161141f610e15565b8152602001600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146114665761146184612d54565b611469565b60005b8152602001600e548152602001600b548152602001600c548152509050919050565b6000611495610e15565b82106114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614b14565b60405180910390fd5b819050919050565b6114e66126e1565b73ffffffffffffffffffffffffffffffffffffffff1661150461198e565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906147dd565b60405180910390fd5b8060099080519060200190611570929190613a5d565b5050565b600d5481565b600061158582612e3d565b600001519050919050565b600e5481565b600c5481565b6115a46126e1565b73ffffffffffffffffffffffffffffffffffffffff166115c261198e565b73ffffffffffffffffffffffffffffffffffffffff1614611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f906147dd565b60405180910390fd5b80600a8190555050565b6009805461162f906145a9565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906145a9565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614ba6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117a16126e1565b73ffffffffffffffffffffffffffffffffffffffff166117bf61198e565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c906147dd565b60405180910390fd5b61181f6000613040565b565b6118296126e1565b73ffffffffffffffffffffffffffffffffffffffff1661184761198e565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906147dd565b60405180910390fd5b600f54816118a9610e15565b6118b39190614bc6565b11156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614c68565b60405180910390fd5b6118fe8282613106565b5050565b61190a6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661192861198e565b73ffffffffffffffffffffffffffffffffffffffff161461197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906147dd565b60405180910390fd5b8060128190555050565b600a5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119c06126e1565b73ffffffffffffffffffffffffffffffffffffffff166119de61198e565b73ffffffffffffffffffffffffffffffffffffffff1614611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b906147dd565b60405180910390fd5b6002811415611a6d576001601360006101000a81548160ff02191690836002811115611a6357611a62614c88565b5b0217905550611ad3565b6001811415611aa6576000601360006101000a81548160ff02191690836002811115611a9c57611a9b614c88565b5b0217905550611ad2565b6002601360006101000a81548160ff02191690836002811115611acc57611acb614c88565b5b02179055505b5b50565b606060028054611ae5906145a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b11906145a9565b8015611b5e5780601f10611b3357610100808354040283529160200191611b5e565b820191906000526020600020905b815481529060010190602001808311611b4157829003601f168201915b5050505050905090565b611b706126e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590614d03565b60405180910390fd5b8060066000611beb6126e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c986126e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdd9190613bee565b60405180910390a35050565b601060009054906101000a900460ff16611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614d6f565b60405180910390fd5b600d54831115611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490614ddb565b60405180910390fd5b60008311611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790614e47565b60405180910390fd5b600f5483611dcc610e15565b611dd69190614bc6565b1115611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90614eb3565b60405180910390fd5b611e4b828260125433604051602001611e3091906144d6565b604051602081830303815290604052805190602001206126bb565b8015611e6057506000611e5d336123b4565b11155b8015611e6e57506000600c54115b15611efd57600b5483611e819190614520565b341015611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614f1f565b60405180910390fd5b611ecd3384613106565b82600c5410611eef5782600c54611ee49190614f3f565b600c81905550611ef8565b6000600c819055505b611f58565b600a5483611f0b9190614520565b341015611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614f1f565b60405180910390fd5b611f573384613106565b5b505050565b611f656126e1565b73ffffffffffffffffffffffffffffffffffffffff16611f8361198e565b73ffffffffffffffffffffffffffffffffffffffff1614611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906147dd565b60405180910390fd5b80600c8190555050565b611fee84848461279b565b611ffa84848484613124565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090614fe5565b60405180910390fd5b50505050565b6120476126e1565b73ffffffffffffffffffffffffffffffffffffffff1661206561198e565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b2906147dd565b60405180910390fd5b80600d8190555050565b60606120d0826126d4565b61210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690615051565b60405180910390fd5b6001600281111561212357612122614c88565b5b601360009054906101000a900460ff16600281111561214557612144614c88565b5b14156121a95760006009805461215a906145a9565b90501161217657604051806020016040528060008152506121a2565b6009612181836132ac565b604051602001612192929190615141565b6040516020818303038152906040525b9050612323565b600060028111156121bd576121bc614c88565b5b601360009054906101000a900460ff1660028111156121df576121de614c88565b5b1415612243576000600980546121f4906145a9565b905011612210576040518060200160405280600081525061223c565b600961221b836132ac565b60405160200161222c9291906151b1565b6040516020818303038152906040525b9050612323565b60028081111561225657612255614c88565b5b601360009054906101000a900460ff16600281111561227857612277614c88565b5b1415612310576009805461228b906145a9565b80601f01602080910402602001604051908101604052809291908181526020018280546122b7906145a9565b80156123045780601f106122d957610100808354040283529160200191612304565b820191906000526020600020905b8154815290600101906020018083116122e757829003601f168201915b50505050509050612323565b6040518060200160405280600081525090505b919050565b6123306126e1565b73ffffffffffffffffffffffffffffffffffffffff1661234e61198e565b73ffffffffffffffffffffffffffffffffffffffff16146123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b906147dd565b60405180910390fd5b80600b8190555050565b60075481565b60006123bf82612d54565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b6124756126e1565b73ffffffffffffffffffffffffffffffffffffffff1661249361198e565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e0906147dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090615252565b60405180910390fd5b61256281613040565b50565b600f5481565b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b457506126b38261340d565b5b9050919050565b6000826126c9868685613477565b149050949350505050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a682612e3d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127cd6126e1565b73ffffffffffffffffffffffffffffffffffffffff16148061282957506127f26126e1565b73ffffffffffffffffffffffffffffffffffffffff1661281184610c77565b73ffffffffffffffffffffffffffffffffffffffff16145b806128455750612844826000015161283f6126e1565b6123c6565b5b905080612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e906152e4565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090615376565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296090615408565b60405180910390fd5b61297685858560016134cf565b61298660008484600001516126e9565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129f49190615444565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a989190615478565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b9e9190614bc6565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ce457612c14816126d4565b15612ce3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4c86868660016134d5565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbc90615530565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b612e45613ae3565b612e4e826126d4565b612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e84906155c2565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000648310612ef15760017f000000000000000000000000000000000000000000000000000000000000006484612ee49190614f3f565b612eee9190614bc6565b90505b60008390505b818110612fff576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612feb5780935050505061303b565b508080612ff7906155e2565b915050612ef7565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130329061567e565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131208282604051806020016040528060008152506134db565b5050565b60006131458473ffffffffffffffffffffffffffffffffffffffff166139ba565b1561329f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261316e6126e1565b8786866040518563ffffffff1660e01b815260040161319094939291906156f3565b6020604051808303816000875af19250505080156131cc57506040513d601f19601f820116820180604052508101906131c99190615754565b60015b61324f573d80600081146131fc576040519150601f19603f3d011682016040523d82523d6000602084013e613201565b606091505b50600081511415613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323e90614fe5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132a4565b600190505b949350505050565b606060008214156132f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613408565b600082905060005b6000821461332657808061330f906149c7565b915050600a8261331f9190614904565b91506132fc565b60008167ffffffffffffffff811115613342576133416140f1565b5b6040519080825280601f01601f1916602001820160405280156133745781602001600182028036833780820191505090505b5090505b600085146134015760018261338d9190614f3f565b9150600a8561339c9190615781565b60306133a89190614bc6565b60f81b8183815181106133be576133bd6157b2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133fa9190614904565b9450613378565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b858590508110156134c3576134ae828787848181106134a2576134a16157b2565b5b905060200201356139cd565b915080806134bb906149c7565b915050613480565b50809150509392505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354890615853565b60405180910390fd5b61355a816126d4565b1561359a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613591906158bf565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000648311156135fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f490615951565b60405180910390fd5b61360a60008583866134cf565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516137079190615478565b6fffffffffffffffffffffffffffffffff16815260200185836020015161372e9190615478565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561399d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461393d6000888488613124565b61397c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397390614fe5565b60405180910390fd5b8180613987906149c7565b9250508080613995906149c7565b9150506138cc565b50806000819055506139b260008785886134d5565b505050505050565b600080823b905060008111915050919050565b60008183106139e5576139e082846139f8565b6139f0565b6139ef83836139f8565b5b905092915050565b600082600052816020526040600020905092915050565b60405180610120016040528060008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613a69906145a9565b90600052602060002090601f016020900481019282613a8b5760008555613ad2565b82601f10613aa457805160ff1916838001178555613ad2565b82800160010185558215613ad2579182015b82811115613ad1578251825591602001919060010190613ab6565b5b509050613adf9190613b1d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b36576000816000905550600101613b1e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8381613b4e565b8114613b8e57600080fd5b50565b600081359050613ba081613b7a565b92915050565b600060208284031215613bbc57613bbb613b44565b5b6000613bca84828501613b91565b91505092915050565b60008115159050919050565b613be881613bd3565b82525050565b6000602082019050613c036000830184613bdf565b92915050565b6000819050919050565b613c1c81613c09565b8114613c2757600080fd5b50565b600081359050613c3981613c13565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c6457613c63613c3f565b5b8235905067ffffffffffffffff811115613c8157613c80613c44565b5b602083019150836020820283011115613c9d57613c9c613c49565b5b9250929050565b600080600060408486031215613cbd57613cbc613b44565b5b6000613ccb86828701613c2a565b935050602084013567ffffffffffffffff811115613cec57613ceb613b49565b5b613cf886828701613c4e565b92509250509250925092565b613d0d81613c09565b82525050565b6000602082019050613d286000830184613d04565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d68578082015181840152602081019050613d4d565b83811115613d77576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d9982613d2e565b613da38185613d39565b9350613db3818560208601613d4a565b613dbc81613d7d565b840191505092915050565b60006020820190508181036000830152613de18184613d8e565b905092915050565b600060208284031215613dff57613dfe613b44565b5b6000613e0d84828501613c2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4182613e16565b9050919050565b613e5181613e36565b82525050565b6000602082019050613e6c6000830184613e48565b92915050565b613e7b81613e36565b8114613e8657600080fd5b50565b600081359050613e9881613e72565b92915050565b60008060408385031215613eb557613eb4613b44565b5b6000613ec385828601613e89565b9250506020613ed485828601613c2a565b9150509250929050565b600080600060608486031215613ef757613ef6613b44565b5b6000613f0586828701613e89565b9350506020613f1686828701613e89565b9250506040613f2786828701613c2a565b9150509250925092565b60008060408385031215613f4857613f47613b44565b5b6000613f5685828601613c2a565b9250506020613f6785828601613c2a565b9150509250929050565b6000604082019050613f866000830185613e48565b613f936020830184613d04565b9392505050565b6000819050919050565b613fad81613f9a565b82525050565b6000602082019050613fc86000830184613fa4565b92915050565b600060208284031215613fe457613fe3613b44565b5b6000613ff284828501613e89565b91505092915050565b61400481613c09565b82525050565b61401381613bd3565b82525050565b610120820160008201516140306000850182613ffb565b5060208201516140436020850182613ffb565b5060408201516140566040850182613ffb565b506060820151614069606085018261400a565b50608082015161407c6080850182613ffb565b5060a082015161408f60a0850182613ffb565b5060c08201516140a260c0850182613ffb565b5060e08201516140b560e0850182613ffb565b506101008201516140ca610100850182613ffb565b50505050565b6000610120820190506140e66000830184614019565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61412982613d7d565b810181811067ffffffffffffffff82111715614148576141476140f1565b5b80604052505050565b600061415b613b3a565b90506141678282614120565b919050565b600067ffffffffffffffff821115614187576141866140f1565b5b61419082613d7d565b9050602081019050919050565b82818337600083830152505050565b60006141bf6141ba8461416c565b614151565b9050828152602081018484840111156141db576141da6140ec565b5b6141e684828561419d565b509392505050565b600082601f83011261420357614202613c3f565b5b81356142138482602086016141ac565b91505092915050565b60006020828403121561423257614231613b44565b5b600082013567ffffffffffffffff8111156142505761424f613b49565b5b61425c848285016141ee565b91505092915050565b61426e81613f9a565b811461427957600080fd5b50565b60008135905061428b81614265565b92915050565b6000602082840312156142a7576142a6613b44565b5b60006142b58482850161427c565b91505092915050565b6142c781613bd3565b81146142d257600080fd5b50565b6000813590506142e4816142be565b92915050565b6000806040838503121561430157614300613b44565b5b600061430f85828601613e89565b9250506020614320858286016142d5565b9150509250929050565b600067ffffffffffffffff821115614345576143446140f1565b5b61434e82613d7d565b9050602081019050919050565b600061436e6143698461432a565b614151565b90508281526020810184848401111561438a576143896140ec565b5b61439584828561419d565b509392505050565b600082601f8301126143b2576143b1613c3f565b5b81356143c284826020860161435b565b91505092915050565b600080600080608085870312156143e5576143e4613b44565b5b60006143f387828801613e89565b945050602061440487828801613e89565b935050604061441587828801613c2a565b925050606085013567ffffffffffffffff81111561443657614435613b49565b5b6144428782880161439d565b91505092959194509250565b6000806040838503121561446557614464613b44565b5b600061447385828601613e89565b925050602061448485828601613e89565b9150509250929050565b60008160601b9050919050565b60006144a68261448e565b9050919050565b60006144b88261449b565b9050919050565b6144d06144cb82613e36565b6144ad565b82525050565b60006144e282846144bf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061452b82613c09565b915061453683613c09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456f5761456e6144f1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145c157607f821691505b602082108114156145d5576145d461457a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614637602d83613d39565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006146c9602283613d39565b91506146d48261466d565b604082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061475b603983613d39565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b60006147c7601583613d39565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f4578636565642062616c616e6365206f66207468697320636f6e747261637400600082015250565b6000614833601f83613d39565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061489f601183613d39565b91506148aa82614869565b602082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061490f82613c09565b915061491a83613c09565b92508261492a576149296148d5565b5b828204905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614991602283613d39565b915061499c82614935565b604082019050919050565b600060208201905081810360008301526149c081614984565b9050919050565b60006149d282613c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a0557614a046144f1565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614a6c602e83613d39565b9150614a7782614a10565b604082019050919050565b60006020820190508181036000830152614a9b81614a5f565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614afe602383613d39565b9150614b0982614aa2565b604082019050919050565b60006020820190508181036000830152614b2d81614af1565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614b90602b83613d39565b9150614b9b82614b34565b604082019050919050565b60006020820190508181036000830152614bbf81614b83565b9050919050565b6000614bd182613c09565b9150614bdc83613c09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c1157614c106144f1565b5b828201905092915050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b6000614c52601b83613d39565b9150614c5d82614c1c565b602082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614ced601a83613d39565b9150614cf882614cb7565b602082019050919050565b60006020820190508181036000830152614d1c81614ce0565b9050919050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b6000614d59601383613d39565b9150614d6482614d23565b602082019050919050565b60006020820190508181036000830152614d8881614d4c565b9050919050565b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b6000614dc5601883613d39565b9150614dd082614d8f565b602082019050919050565b60006020820190508181036000830152614df481614db8565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b6000614e31601683613d39565b9150614e3c82614dfb565b602082019050919050565b60006020820190508181036000830152614e6081614e24565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000614e9d601183613d39565b9150614ea882614e67565b602082019050919050565b60006020820190508181036000830152614ecc81614e90565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b6000614f09601083613d39565b9150614f1482614ed3565b602082019050919050565b60006020820190508181036000830152614f3881614efc565b9050919050565b6000614f4a82613c09565b9150614f5583613c09565b925082821015614f6857614f676144f1565b5b828203905092915050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614fcf603383613d39565b9150614fda82614f73565b604082019050919050565b60006020820190508181036000830152614ffe81614fc2565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061503b601583613d39565b915061504682615005565b602082019050919050565b6000602082019050818103600083015261506a8161502e565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461509e816145a9565b6150a88186615071565b945060018216600081146150c357600181146150d457615107565b60ff19831686528186019350615107565b6150dd8561507c565b60005b838110156150ff578154818901526001820191506020810190506150e0565b838801955050505b50505092915050565b600061511b82613d2e565b6151258185615071565b9350615135818560208601613d4a565b80840191505092915050565b600061514d8285615091565b91506151598284615110565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061519b600583615071565b91506151a682615165565b600582019050919050565b60006151bd8285615091565b91506151c98284615110565b91506151d48261518e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061523c602683613d39565b9150615247826151e0565b604082019050919050565b6000602082019050818103600083015261526b8161522f565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006152ce603283613d39565b91506152d982615272565b604082019050919050565b600060208201905081810360008301526152fd816152c1565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615360602683613d39565b915061536b82615304565b604082019050919050565b6000602082019050818103600083015261538f81615353565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006153f2602583613d39565b91506153fd82615396565b604082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061544f82615428565b915061545a83615428565b92508282101561546d5761546c6144f1565b5b828203905092915050565b600061548382615428565b915061548e83615428565b9250826fffffffffffffffffffffffffffffffff038211156154b3576154b26144f1565b5b828201905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061551a603183613d39565b9150615525826154be565b604082019050919050565b600060208201905081810360008301526155498161550d565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006155ac602a83613d39565b91506155b782615550565b604082019050919050565b600060208201905081810360008301526155db8161559f565b9050919050565b60006155ed82613c09565b91506000821415615601576156006144f1565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615668602f83613d39565b91506156738261560c565b604082019050919050565b600060208201905081810360008301526156978161565b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156c58261569e565b6156cf81856156a9565b93506156df818560208601613d4a565b6156e881613d7d565b840191505092915050565b60006080820190506157086000830187613e48565b6157156020830186613e48565b6157226040830185613d04565b818103606083015261573481846156ba565b905095945050505050565b60008151905061574e81613b7a565b92915050565b60006020828403121561576a57615769613b44565b5b60006157788482850161573f565b91505092915050565b600061578c82613c09565b915061579783613c09565b9250826157a7576157a66148d5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061583d602183613d39565b9150615848826157e1565b604082019050919050565b6000602082019050818103600083015261586c81615830565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006158a9601d83613d39565b91506158b482615873565b602082019050919050565b600060208201905081810360008301526158d88161589c565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b600061593b602283613d39565b9150615946826158df565b604082019050919050565b6000602082019050818103600083015261596a8161592e565b905091905056fea2646970667358221220a08de3e1dc51791da4710ec12f994f7d6860a68466b84df7a263f464140f7fde64736f6c634300080b0033

Deployed Bytecode Sourcemap

47967:6895:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54235:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50532:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26264:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27798:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27361:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23099:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49877:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28648:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48496:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54567:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48536:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23730:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50435:89;;;;;;;;;;;;;:::i;:::-;;49728:140;;;;;;;;;;;;;:::i;:::-;;28853:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54093:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49132:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23262:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50329:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48332:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26087:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48372:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48241:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52093:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48022:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24964:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38496:103;;;;;;;;;;;;;:::i;:::-;;50084:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53705:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48102:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37856:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53148:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26419:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28066:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51000:1085;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53815:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29073:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53969:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52355:785;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52208:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33488:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53583:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28403:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48456:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38754:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48415:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48167:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54235:266;54383:4;54427:26;54412:41;;;:11;:41;;;;:81;;;;54457:36;54481:11;54457:23;:36::i;:::-;54412:81;54405:88;;54235:266;;;:::o;50532:394::-;50624:7;50648:92;50675:11;;50688:10;;50727;50710:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50700:39;;;;;;50648:26;:92::i;:::-;:125;;;;;50772:1;50744:24;50757:10;50744:12;:24::i;:::-;:29;;50648:125;:154;;;;;50801:1;50777:21;;:25;50648:154;50644:230;;;50843:19;;50826:14;:36;;;;:::i;:::-;50819:43;;;;50644:230;50908:10;;50891:14;:27;;;;:::i;:::-;50884:34;;50532:394;;;;;;:::o;26264:94::-;26318:13;26347:5;26340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26264:94;:::o;27798:204::-;27866:7;27890:16;27898:7;27890;:16::i;:::-;27882:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27972:15;:24;27988:7;27972:24;;;;;;;;;;;;;;;;;;;;;27965:31;;27798:204;;;:::o;27361:379::-;27430:13;27446:24;27462:7;27446:15;:24::i;:::-;27430:40;;27491:5;27485:11;;:2;:11;;;;27477:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27576:5;27560:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27585:37;27602:5;27609:12;:10;:12::i;:::-;27585:16;:37::i;:::-;27560:62;27544:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;27706:28;27715:2;27719:7;27728:5;27706:8;:28::i;:::-;27423:317;27361:379;;:::o;23099:94::-;23152:7;23175:12;;23168:19;;23099:94;:::o;49877:198::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49971:21:::1;49961:6;:31;;49953:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50047:2;50039:20;;:28;50060:6;50039:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49877:198:::0;;:::o;28648:142::-;28756:28;28766:4;28772:2;28776:7;28756:9;:28::i;:::-;28648:142;;;:::o;48496:26::-;;;;:::o;54567:292::-;54692:16;54710:21;54757:16;54765:7;54757;:16::i;:::-;54749:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;54814:7;:5;:7::i;:::-;54845:5;54836:7;;54824:9;:19;;;;:::i;:::-;54823:27;;;;:::i;:::-;54806:45;;;;54567:292;;;;;:::o;48536:31::-;;;;:::o;23730:744::-;23839:7;23874:16;23884:5;23874:9;:16::i;:::-;23866:5;:24;23858:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23936:22;23961:13;:11;:13::i;:::-;23936:38;;23981:19;24011:25;24061:9;24056:350;24080:14;24076:1;:18;24056:350;;;24110:31;24144:11;:14;24156:1;24144:14;;;;;;;;;;;24110:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24197:1;24171:28;;:9;:14;;;:28;;;24167:89;;24232:9;:14;;;24212:34;;24167:89;24289:5;24268:26;;:17;:26;;;24264:135;;;24326:5;24311:11;:20;24307:59;;;24353:1;24346:8;;;;;;;;;24307:59;24376:13;;;;;:::i;:::-;;;;24264:135;24101:305;24096:3;;;;;:::i;:::-;;;;24056:350;;;;24412:56;;;;;;;;;;:::i;:::-;;;;;;;;23730:744;;;;;:::o;50435:89::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50504:12:::1;;;;;;;;;;;50503:13;50488:12;;:28;;;;;;;;;;;;;;;;;;50435:89::o:0;49728:140::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49776:12:::1;49791:21;49776:36;;49831:10;49823:28;;:37;49852:7;49823:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49765:103;49728:140::o:0;28853:157::-;28965:39;28982:4;28988:2;28992:7;28965:39;;;;;;;;;;;;:16;:39::i;:::-;28853:157;;;:::o;54093:132::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54198:19:::1;54177:18;:40;;;;54093:132:::0;:::o;49132:588::-;49187:18;;:::i;:::-;49225:487;;;;;;;;49264:10;;49225:487;;;;49305:14;;49225:487;;;;49346:10;;49225:487;;;;49385:12;;;;;;;;;;;49225:487;;;;;;49433:13;:11;:13::i;:::-;49225:487;;;;49492:1;49474:20;;:6;:20;;;:57;;49509:21;49523:6;49509:13;:21::i;:::-;49474:57;;;49497:1;49474:57;49225:487;;;;49567:18;;49225:487;;;;49622:19;;49225:487;;;;49679:21;;49225:487;;;49218:494;;49132:588;;;:::o;23262:177::-;23329:7;23361:13;:11;:13::i;:::-;23353:5;:21;23345:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23428:5;23421:12;;23262:177;;;:::o;50329:94::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50409:6:::1;50399:7;:16;;;;;;;;;;;;:::i;:::-;;50329:94:::0;:::o;48332:31::-;;;;:::o;26087:118::-;26151:7;26174:20;26186:7;26174:11;:20::i;:::-;:25;;;26167:32;;26087:118;;;:::o;48372:34::-;;;;:::o;48241:40::-;;;;:::o;52093:107::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52179:13:::1;52166:10;:26;;;;52093:107:::0;:::o;48022:71::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24964:211::-;25028:7;25069:1;25052:19;;:5;:19;;;;25044:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25141:12;:19;25154:5;25141:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25133:36;;25126:43;;24964:211;;;:::o;38496:103::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38561:30:::1;38588:1;38561:18;:30::i;:::-;38496:103::o:0;50084:224::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50218:10:::1;;50200:14;50184:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;50176:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50271:29;50281:2;50285:14;50271:9;:29::i;:::-;50084:224:::0;;:::o;53705:102::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53788:11:::1;53775:10;:24;;;;53705:102:::0;:::o;48102:44::-;;;;:::o;37856:87::-;37902:7;37929:6;;;;;;;;;;;37922:13;;37856:87;:::o;53148:308::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53229:1:::1;53221:4;:9;53217:232;;;53262:21;53247:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53217:232;;;53313:1;53305:4;:9;53301:148;;;53346:21;53331:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53301:148;;;53414:23;53399:12;;:38;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53301:148;53217:232;53148:308:::0;:::o;26419:98::-;26475:13;26504:7;26497:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26419:98;:::o;28066:274::-;28169:12;:10;:12::i;:::-;28157:24;;:8;:24;;;;28149:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28266:8;28221:18;:32;28240:12;:10;:12::i;:::-;28221:32;;;;;;;;;;;;;;;:42;28254:8;28221:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28315:8;28286:48;;28301:12;:10;:12::i;:::-;28286:48;;;28325:8;28286:48;;;;;;:::i;:::-;;;;;;;;28066:274;;:::o;51000:1085::-;51106:12;;;;;;;;;;;51098:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51179:14;;51161;:32;;51153:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51258:1;51241:14;:18;51233:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51339:10;;51321:14;51305:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;51297:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51396:92;51423:11;;51436:10;;51475;51458:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51448:39;;;;;;51396:26;:92::i;:::-;:125;;;;;51520:1;51492:24;51505:10;51492:12;:24::i;:::-;:29;;51396:125;:154;;;;;51549:1;51525:21;;:25;51396:154;51392:686;;;51606:19;;51589:14;:36;;;;:::i;:::-;51576:9;:49;;51568:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51661:37;51671:10;51683:14;51661:9;:37::i;:::-;51741:14;51716:21;;:39;51713:201;;51821:14;51797:21;;:38;;;;:::i;:::-;51773:21;:62;;;;51713:201;;;51897:1;51873:21;:25;;;;51713:201;51392:686;;;51983:10;;51966:14;:27;;;;:::i;:::-;51953:9;:40;;51945:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52029:37;52039:10;52051:14;52029:9;:37::i;:::-;51392:686;51000:1085;;;:::o;53815:146::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53931:22:::1;53907:21;:46;;;;53815:146:::0;:::o;29073:311::-;29210:28;29220:4;29226:2;29230:7;29210:9;:28::i;:::-;29261:48;29284:4;29290:2;29294:7;29303:5;29261:22;:48::i;:::-;29245:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;29073:311;;;;:::o;53969:116::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54062:15:::1;54045:14;:32;;;;53969:116:::0;:::o;52355:785::-;52421:13;52461:17;52469:8;52461:7;:17::i;:::-;52453:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52535:21;52519:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;52515:598;;;52602:1;52584:7;52578:21;;;;;:::i;:::-;;;:25;:165;;;;;;;;;;;;;;;;;52660:7;52684:26;52701:8;52684:16;:26::i;:::-;52627:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52578:165;52571:172;;;;52515:598;52781:21;52765:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;52761:352;;;52848:1;52830:7;52824:21;;;;;:::i;:::-;;;:25;:189;;;;;;;;;;;;;;;;;52906:7;52930:26;52947:8;52930:16;:26::i;:::-;52873:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52824:189;52817:196;;;;52761:352;53050:23;53034:39;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:39;;;;;;;;:::i;:::-;;;53031:82;;;53094:7;53087:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53031:82;53123:9;;;;;;;;;;;;;;52355:785;;;;:::o;52208:139::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52319:20:::1;52297:19;:42;;;;52208:139:::0;:::o;33488:43::-;;;;:::o;53583:113::-;53641:7;53668:20;53682:5;53668:13;:20::i;:::-;53661:27;;53583:113;;;:::o;28403:186::-;28525:4;28548:18;:25;28567:5;28548:25;;;;;;;;;;;;;;;:35;28574:8;28548:35;;;;;;;;;;;;;;;;;;;;;;;;;28541:42;;28403:186;;;;:::o;48456:31::-;;;;;;;;;;;;;:::o;38754:238::-;38087:12;:10;:12::i;:::-;38076:23;;:7;:5;:7::i;:::-;:23;;;38068:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38877:1:::1;38857:22;;:8;:22;;;;38835:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38956:28;38975:8;38956:18;:28::i;:::-;38754:238:::0;:::o;48415:32::-;;;;:::o;48167:53::-;;;;:::o;24538:370::-;24665:4;24710:25;24695:40;;;:11;:40;;;;:99;;;;24761:33;24746:48;;;:11;:48;;;;24695:99;:160;;;;24820:35;24805:50;;;:11;:50;;;;24695:160;:207;;;;24866:36;24890:11;24866:23;:36::i;:::-;24695:207;24681:221;;24538:370;;;:::o;40741:208::-;40876:4;40937;40900:33;40921:5;;40928:4;40900:20;:33::i;:::-;:41;40893:48;;40741:208;;;;;;:::o;29623:105::-;29680:4;29710:12;;29700:7;:22;29693:29;;29623:105;;;:::o;17578:98::-;17631:7;17658:10;17651:17;;17578:98;:::o;33310:172::-;33434:2;33407:15;:24;33423:7;33407:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33468:7;33464:2;33448:28;;33457:5;33448:28;;;;;;;;;;;;33310:172;;;:::o;31675:1529::-;31772:35;31810:20;31822:7;31810:11;:20::i;:::-;31772:58;;31839:22;31881:13;:18;;;31865:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;31934:12;:10;:12::i;:::-;31910:36;;:20;31922:7;31910:11;:20::i;:::-;:36;;;31865:81;:142;;;;31957:50;31974:13;:18;;;31994:12;:10;:12::i;:::-;31957:16;:50::i;:::-;31865:142;31839:169;;32033:17;32017:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;32165:4;32143:26;;:13;:18;;;:26;;;32127:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;32254:1;32240:16;;:2;:16;;;;32232:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32307:43;32329:4;32335:2;32339:7;32348:1;32307:21;:43::i;:::-;32407:49;32424:1;32428:7;32437:13;:18;;;32407:8;:49::i;:::-;32495:1;32465:12;:18;32478:4;32465:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32531:1;32503:12;:16;32516:2;32503:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32562:43;;;;;;;;32577:2;32562:43;;;;;;32588:15;32562:43;;;;;32539:11;:20;32551:7;32539:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32833:19;32865:1;32855:7;:11;;;;:::i;:::-;32833:33;;32918:1;32877:43;;:11;:24;32889:11;32877:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;32873:236;;;32935:20;32943:11;32935:7;:20::i;:::-;32931:171;;;32995:97;;;;;;;;33022:13;:18;;;32995:97;;;;;;33053:13;:28;;;32995:97;;;;;32968:11;:24;32980:11;32968:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32931:171;32873:236;33141:7;33137:2;33122:27;;33131:4;33122:27;;;;;;;;;;;;33156:42;33177:4;33183:2;33187:7;33196:1;33156:20;:42::i;:::-;31765:1439;;;31675:1529;;;:::o;25181:240::-;25242:7;25291:1;25274:19;;:5;:19;;;;25258:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;25382:12;:19;25395:5;25382:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25374:41;;25367:48;;25181:240;;;:::o;25427:606::-;25503:21;;:::i;:::-;25544:16;25552:7;25544;:16::i;:::-;25536:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25616:26;25664:12;25653:7;:23;25649:93;;25733:1;25718:12;25708:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;25687:47;;25649:93;25755:12;25770:7;25755:22;;25750:212;25787:18;25779:4;:26;25750:212;;25824:31;25858:11;:17;25870:4;25858:17;;;;;;;;;;;25824:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25914:1;25888:28;;:9;:14;;;:28;;;25884:71;;25936:9;25929:16;;;;;;;25884:71;25815:147;25807:6;;;;;:::i;:::-;;;;25750:212;;;;25970:57;;;;;;;;;;:::i;:::-;;;;;;;;25427:606;;;;:::o;39152:191::-;39226:16;39245:6;;;;;;;;;;;39226:25;;39271:8;39262:6;;:17;;;;;;;;;;;;;;;;;;39326:8;39295:40;;39316:8;39295:40;;;;;;;;;;;;39215:128;39152:191;:::o;29734:98::-;29799:27;29809:2;29813:8;29799:27;;;;;;;;;;;;:9;:27::i;:::-;29734:98;;:::o;35025:690::-;35162:4;35179:15;:2;:13;;;:15::i;:::-;35175:535;;;35234:2;35218:36;;;35255:12;:10;:12::i;:::-;35269:4;35275:7;35284:5;35218:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35205:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35466:1;35449:6;:13;:18;35445:215;;;35482:61;;;;;;;;;;:::i;:::-;;;;;;;;35445:215;35628:6;35622:13;35613:6;35609:2;35605:15;35598:38;35205:464;35350:45;;;35340:55;;;:6;:55;;;;35333:62;;;;;35175:535;35698:4;35691:11;;35025:690;;;;;;;:::o;18078:723::-;18134:13;18364:1;18355:5;:10;18351:53;;;18382:10;;;;;;;;;;;;;;;;;;;;;18351:53;18414:12;18429:5;18414:20;;18445:14;18470:78;18485:1;18477:4;:9;18470:78;;18503:8;;;;;:::i;:::-;;;;18534:2;18526:10;;;;;:::i;:::-;;;18470:78;;;18558:19;18590:6;18580:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18558:39;;18608:154;18624:1;18615:5;:10;18608:154;;18652:1;18642:11;;;;;:::i;:::-;;;18719:2;18711:5;:10;;;;:::i;:::-;18698:2;:24;;;;:::i;:::-;18685:39;;18668:6;18675;18668:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18748:2;18739:11;;;;;:::i;:::-;;;18608:154;;;18786:6;18772:21;;;;;18078:723;;;;:::o;8225:207::-;8355:4;8399:25;8384:40;;;:11;:40;;;;8377:47;;8225:207;;;:::o;41720:306::-;41813:7;41833:20;41856:4;41833:27;;41876:9;41871:118;41895:5;;:12;;41891:1;:16;41871:118;;;41944:33;41954:12;41968:5;;41974:1;41968:8;;;;;;;:::i;:::-;;;;;;;;41944:9;:33::i;:::-;41929:48;;41909:3;;;;;:::i;:::-;;;;41871:118;;;;42006:12;41999:19;;;41720:306;;;;;:::o;36177:141::-;;;;;:::o;36704:140::-;;;;;:::o;30171:1272::-;30276:20;30299:12;;30276:35;;30340:1;30326:16;;:2;:16;;;;30318:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30517:21;30525:12;30517:7;:21::i;:::-;30516:22;30508:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30599:12;30587:8;:24;;30579:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30659:61;30689:1;30693:2;30697:12;30711:8;30659:21;:61::i;:::-;30729:30;30762:12;:16;30775:2;30762:16;;;;;;;;;;;;;;;30729:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30804:119;;;;;;;;30854:8;30824:11;:19;;;:39;;;;:::i;:::-;30804:119;;;;;;30907:8;30872:11;:24;;;:44;;;;:::i;:::-;30804:119;;;;;30785:12;:16;30798:2;30785:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30958:43;;;;;;;;30973:2;30958:43;;;;;;30984:15;30958:43;;;;;30930:11;:25;30942:12;30930:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31010:20;31033:12;31010:35;;31059:9;31054:281;31078:8;31074:1;:12;31054:281;;;31132:12;31128:2;31107:38;;31124:1;31107:38;;;;;;;;;;;;31172:59;31203:1;31207:2;31211:12;31225:5;31172:22;:59::i;:::-;31154:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;31313:14;;;;;:::i;:::-;;;;31088:3;;;;;:::i;:::-;;;;31054:281;;;;31358:12;31343;:27;;;;31377:60;31406:1;31410:2;31414:12;31428:8;31377:20;:60::i;:::-;30269:1174;;;30171:1272;;;:::o;9180:387::-;9240:4;9448:12;9515:7;9503:20;9495:28;;9558:1;9551:4;:8;9544:15;;;9180:387;;;:::o;47517:149::-;47580:7;47611:1;47607;:5;:51;;47638:20;47653:1;47656;47638:14;:20::i;:::-;47607:51;;;47615:20;47630:1;47633;47615:14;:20::i;:::-;47607:51;47600:58;;47517:149;;;;:::o;47674:268::-;47742:13;47849:1;47843:4;47836:15;47878:1;47872:4;47865:15;47919:4;47913;47903:21;47894:30;;47674:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:117::-;1983:1;1980;1973:12;1997:117;2106:1;2103;2096:12;2120:117;2229:1;2226;2219:12;2260:568;2333:8;2343:6;2393:3;2386:4;2378:6;2374:17;2370:27;2360:122;;2401:79;;:::i;:::-;2360:122;2514:6;2501:20;2491:30;;2544:18;2536:6;2533:30;2530:117;;;2566:79;;:::i;:::-;2530:117;2680:4;2672:6;2668:17;2656:29;;2734:3;2726:4;2718:6;2714:17;2704:8;2700:32;2697:41;2694:128;;;2741:79;;:::i;:::-;2694:128;2260:568;;;;;:::o;2834:704::-;2929:6;2937;2945;2994:2;2982:9;2973:7;2969:23;2965:32;2962:119;;;3000:79;;:::i;:::-;2962:119;3120:1;3145:53;3190:7;3181:6;3170:9;3166:22;3145:53;:::i;:::-;3135:63;;3091:117;3275:2;3264:9;3260:18;3247:32;3306:18;3298:6;3295:30;3292:117;;;3328:79;;:::i;:::-;3292:117;3441:80;3513:7;3504:6;3493:9;3489:22;3441:80;:::i;:::-;3423:98;;;;3218:313;2834:704;;;;;:::o;3544:118::-;3631:24;3649:5;3631:24;:::i;:::-;3626:3;3619:37;3544:118;;:::o;3668:222::-;3761:4;3799:2;3788:9;3784:18;3776:26;;3812:71;3880:1;3869:9;3865:17;3856:6;3812:71;:::i;:::-;3668:222;;;;:::o;3896:99::-;3948:6;3982:5;3976:12;3966:22;;3896:99;;;:::o;4001:169::-;4085:11;4119:6;4114:3;4107:19;4159:4;4154:3;4150:14;4135:29;;4001:169;;;;:::o;4176:307::-;4244:1;4254:113;4268:6;4265:1;4262:13;4254:113;;;4353:1;4348:3;4344:11;4338:18;4334:1;4329:3;4325:11;4318:39;4290:2;4287:1;4283:10;4278:15;;4254:113;;;4385:6;4382:1;4379:13;4376:101;;;4465:1;4456:6;4451:3;4447:16;4440:27;4376:101;4225:258;4176:307;;;:::o;4489:102::-;4530:6;4581:2;4577:7;4572:2;4565:5;4561:14;4557:28;4547:38;;4489:102;;;:::o;4597:364::-;4685:3;4713:39;4746:5;4713:39;:::i;:::-;4768:71;4832:6;4827:3;4768:71;:::i;:::-;4761:78;;4848:52;4893:6;4888:3;4881:4;4874:5;4870:16;4848:52;:::i;:::-;4925:29;4947:6;4925:29;:::i;:::-;4920:3;4916:39;4909:46;;4689:272;4597:364;;;;:::o;4967:313::-;5080:4;5118:2;5107:9;5103:18;5095:26;;5167:9;5161:4;5157:20;5153:1;5142:9;5138:17;5131:47;5195:78;5268:4;5259:6;5195:78;:::i;:::-;5187:86;;4967:313;;;;:::o;5286:329::-;5345:6;5394:2;5382:9;5373:7;5369:23;5365:32;5362:119;;;5400:79;;:::i;:::-;5362:119;5520:1;5545:53;5590:7;5581:6;5570:9;5566:22;5545:53;:::i;:::-;5535:63;;5491:117;5286:329;;;;:::o;5621:126::-;5658:7;5698:42;5691:5;5687:54;5676:65;;5621:126;;;:::o;5753:96::-;5790:7;5819:24;5837:5;5819:24;:::i;:::-;5808:35;;5753:96;;;:::o;5855:118::-;5942:24;5960:5;5942:24;:::i;:::-;5937:3;5930:37;5855:118;;:::o;5979:222::-;6072:4;6110:2;6099:9;6095:18;6087:26;;6123:71;6191:1;6180:9;6176:17;6167:6;6123:71;:::i;:::-;5979:222;;;;:::o;6207:122::-;6280:24;6298:5;6280:24;:::i;:::-;6273:5;6270:35;6260:63;;6319:1;6316;6309:12;6260:63;6207:122;:::o;6335:139::-;6381:5;6419:6;6406:20;6397:29;;6435:33;6462:5;6435:33;:::i;:::-;6335:139;;;;:::o;6480:474::-;6548:6;6556;6605:2;6593:9;6584:7;6580:23;6576:32;6573:119;;;6611:79;;:::i;:::-;6573:119;6731:1;6756:53;6801:7;6792:6;6781:9;6777:22;6756:53;:::i;:::-;6746:63;;6702:117;6858:2;6884:53;6929:7;6920:6;6909:9;6905:22;6884:53;:::i;:::-;6874:63;;6829:118;6480:474;;;;;:::o;6960:619::-;7037:6;7045;7053;7102:2;7090:9;7081:7;7077:23;7073:32;7070:119;;;7108:79;;:::i;:::-;7070:119;7228:1;7253:53;7298:7;7289:6;7278:9;7274:22;7253:53;:::i;:::-;7243:63;;7199:117;7355:2;7381:53;7426:7;7417:6;7406:9;7402:22;7381:53;:::i;:::-;7371:63;;7326:118;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6960:619;;;;;:::o;7585:474::-;7653:6;7661;7710:2;7698:9;7689:7;7685:23;7681:32;7678:119;;;7716:79;;:::i;:::-;7678:119;7836:1;7861:53;7906:7;7897:6;7886:9;7882:22;7861:53;:::i;:::-;7851:63;;7807:117;7963:2;7989:53;8034:7;8025:6;8014:9;8010:22;7989:53;:::i;:::-;7979:63;;7934:118;7585:474;;;;;:::o;8065:332::-;8186:4;8224:2;8213:9;8209:18;8201:26;;8237:71;8305:1;8294:9;8290:17;8281:6;8237:71;:::i;:::-;8318:72;8386:2;8375:9;8371:18;8362:6;8318:72;:::i;:::-;8065:332;;;;;:::o;8403:77::-;8440:7;8469:5;8458:16;;8403:77;;;:::o;8486:118::-;8573:24;8591:5;8573:24;:::i;:::-;8568:3;8561:37;8486:118;;:::o;8610:222::-;8703:4;8741:2;8730:9;8726:18;8718:26;;8754:71;8822:1;8811:9;8807:17;8798:6;8754:71;:::i;:::-;8610:222;;;;:::o;8838:329::-;8897:6;8946:2;8934:9;8925:7;8921:23;8917:32;8914:119;;;8952:79;;:::i;:::-;8914:119;9072:1;9097:53;9142:7;9133:6;9122:9;9118:22;9097:53;:::i;:::-;9087:63;;9043:117;8838:329;;;;:::o;9173:108::-;9250:24;9268:5;9250:24;:::i;:::-;9245:3;9238:37;9173:108;;:::o;9287:99::-;9358:21;9373:5;9358:21;:::i;:::-;9353:3;9346:34;9287:99;;:::o;9454:1822::-;9609:6;9604:3;9600:16;9704:4;9697:5;9693:16;9687:23;9723:63;9780:4;9775:3;9771:14;9757:12;9723:63;:::i;:::-;9626:170;9888:4;9881:5;9877:16;9871:23;9907:63;9964:4;9959:3;9955:14;9941:12;9907:63;:::i;:::-;9806:174;10068:4;10061:5;10057:16;10051:23;10087:63;10144:4;10139:3;10135:14;10121:12;10087:63;:::i;:::-;9990:170;10250:4;10243:5;10239:16;10233:23;10269:57;10320:4;10315:3;10311:14;10297:12;10269:57;:::i;:::-;10170:166;10425:4;10418:5;10414:16;10408:23;10444:63;10501:4;10496:3;10492:14;10478:12;10444:63;:::i;:::-;10346:171;10605:4;10598:5;10594:16;10588:23;10624:63;10681:4;10676:3;10672:14;10658:12;10624:63;:::i;:::-;10527:170;10793:4;10786:5;10782:16;10776:23;10812:63;10869:4;10864:3;10860:14;10846:12;10812:63;:::i;:::-;10707:178;10982:4;10975:5;10971:16;10965:23;11001:63;11058:4;11053:3;11049:14;11035:12;11001:63;:::i;:::-;10895:179;11173:6;11166:5;11162:18;11156:25;11194:65;11251:6;11246:3;11242:16;11228:12;11194:65;:::i;:::-;11084:185;9578:1698;9454:1822;;:::o;11282:339::-;11433:4;11471:3;11460:9;11456:19;11448:27;;11485:129;11611:1;11600:9;11596:17;11587:6;11485:129;:::i;:::-;11282:339;;;;:::o;11627:117::-;11736:1;11733;11726:12;11750:180;11798:77;11795:1;11788:88;11895:4;11892:1;11885:15;11919:4;11916:1;11909:15;11936:281;12019:27;12041:4;12019:27;:::i;:::-;12011:6;12007:40;12149:6;12137:10;12134:22;12113:18;12101:10;12098:34;12095:62;12092:88;;;12160:18;;:::i;:::-;12092:88;12200:10;12196:2;12189:22;11979:238;11936:281;;:::o;12223:129::-;12257:6;12284:20;;:::i;:::-;12274:30;;12313:33;12341:4;12333:6;12313:33;:::i;:::-;12223:129;;;:::o;12358:308::-;12420:4;12510:18;12502:6;12499:30;12496:56;;;12532:18;;:::i;:::-;12496:56;12570:29;12592:6;12570:29;:::i;:::-;12562:37;;12654:4;12648;12644:15;12636:23;;12358:308;;;:::o;12672:154::-;12756:6;12751:3;12746;12733:30;12818:1;12809:6;12804:3;12800:16;12793:27;12672:154;;;:::o;12832:412::-;12910:5;12935:66;12951:49;12993:6;12951:49;:::i;:::-;12935:66;:::i;:::-;12926:75;;13024:6;13017:5;13010:21;13062:4;13055:5;13051:16;13100:3;13091:6;13086:3;13082:16;13079:25;13076:112;;;13107:79;;:::i;:::-;13076:112;13197:41;13231:6;13226:3;13221;13197:41;:::i;:::-;12916:328;12832:412;;;;;:::o;13264:340::-;13320:5;13369:3;13362:4;13354:6;13350:17;13346:27;13336:122;;13377:79;;:::i;:::-;13336:122;13494:6;13481:20;13519:79;13594:3;13586:6;13579:4;13571:6;13567:17;13519:79;:::i;:::-;13510:88;;13326:278;13264:340;;;;:::o;13610:509::-;13679:6;13728:2;13716:9;13707:7;13703:23;13699:32;13696:119;;;13734:79;;:::i;:::-;13696:119;13882:1;13871:9;13867:17;13854:31;13912:18;13904:6;13901:30;13898:117;;;13934:79;;:::i;:::-;13898:117;14039:63;14094:7;14085:6;14074:9;14070:22;14039:63;:::i;:::-;14029:73;;13825:287;13610:509;;;;:::o;14125:122::-;14198:24;14216:5;14198:24;:::i;:::-;14191:5;14188:35;14178:63;;14237:1;14234;14227:12;14178:63;14125:122;:::o;14253:139::-;14299:5;14337:6;14324:20;14315:29;;14353:33;14380:5;14353:33;:::i;:::-;14253:139;;;;:::o;14398:329::-;14457:6;14506:2;14494:9;14485:7;14481:23;14477:32;14474:119;;;14512:79;;:::i;:::-;14474:119;14632:1;14657:53;14702:7;14693:6;14682:9;14678:22;14657:53;:::i;:::-;14647:63;;14603:117;14398:329;;;;:::o;14733:116::-;14803:21;14818:5;14803:21;:::i;:::-;14796:5;14793:32;14783:60;;14839:1;14836;14829:12;14783:60;14733:116;:::o;14855:133::-;14898:5;14936:6;14923:20;14914:29;;14952:30;14976:5;14952:30;:::i;:::-;14855:133;;;;:::o;14994:468::-;15059:6;15067;15116:2;15104:9;15095:7;15091:23;15087:32;15084:119;;;15122:79;;:::i;:::-;15084:119;15242:1;15267:53;15312:7;15303:6;15292:9;15288:22;15267:53;:::i;:::-;15257:63;;15213:117;15369:2;15395:50;15437:7;15428:6;15417:9;15413:22;15395:50;:::i;:::-;15385:60;;15340:115;14994:468;;;;;:::o;15468:307::-;15529:4;15619:18;15611:6;15608:30;15605:56;;;15641:18;;:::i;:::-;15605:56;15679:29;15701:6;15679:29;:::i;:::-;15671:37;;15763:4;15757;15753:15;15745:23;;15468:307;;;:::o;15781:410::-;15858:5;15883:65;15899:48;15940:6;15899:48;:::i;:::-;15883:65;:::i;:::-;15874:74;;15971:6;15964:5;15957:21;16009:4;16002:5;15998:16;16047:3;16038:6;16033:3;16029:16;16026:25;16023:112;;;16054:79;;:::i;:::-;16023:112;16144:41;16178:6;16173:3;16168;16144:41;:::i;:::-;15864:327;15781:410;;;;;:::o;16210:338::-;16265:5;16314:3;16307:4;16299:6;16295:17;16291:27;16281:122;;16322:79;;:::i;:::-;16281:122;16439:6;16426:20;16464:78;16538:3;16530:6;16523:4;16515:6;16511:17;16464:78;:::i;:::-;16455:87;;16271:277;16210:338;;;;:::o;16554:943::-;16649:6;16657;16665;16673;16722:3;16710:9;16701:7;16697:23;16693:33;16690:120;;;16729:79;;:::i;:::-;16690:120;16849:1;16874:53;16919:7;16910:6;16899:9;16895:22;16874:53;:::i;:::-;16864:63;;16820:117;16976:2;17002:53;17047:7;17038:6;17027:9;17023:22;17002:53;:::i;:::-;16992:63;;16947:118;17104:2;17130:53;17175:7;17166:6;17155:9;17151:22;17130:53;:::i;:::-;17120:63;;17075:118;17260:2;17249:9;17245:18;17232:32;17291:18;17283:6;17280:30;17277:117;;;17313:79;;:::i;:::-;17277:117;17418:62;17472:7;17463:6;17452:9;17448:22;17418:62;:::i;:::-;17408:72;;17203:287;16554:943;;;;;;;:::o;17503:474::-;17571:6;17579;17628:2;17616:9;17607:7;17603:23;17599:32;17596:119;;;17634:79;;:::i;:::-;17596:119;17754:1;17779:53;17824:7;17815:6;17804:9;17800:22;17779:53;:::i;:::-;17769:63;;17725:117;17881:2;17907:53;17952:7;17943:6;17932:9;17928:22;17907:53;:::i;:::-;17897:63;;17852:118;17503:474;;;;;:::o;17983:94::-;18016:8;18064:5;18060:2;18056:14;18035:35;;17983:94;;;:::o;18083:::-;18122:7;18151:20;18165:5;18151:20;:::i;:::-;18140:31;;18083:94;;;:::o;18183:100::-;18222:7;18251:26;18271:5;18251:26;:::i;:::-;18240:37;;18183:100;;;:::o;18289:157::-;18394:45;18414:24;18432:5;18414:24;:::i;:::-;18394:45;:::i;:::-;18389:3;18382:58;18289:157;;:::o;18452:256::-;18564:3;18579:75;18650:3;18641:6;18579:75;:::i;:::-;18679:2;18674:3;18670:12;18663:19;;18699:3;18692:10;;18452:256;;;;:::o;18714:180::-;18762:77;18759:1;18752:88;18859:4;18856:1;18849:15;18883:4;18880:1;18873:15;18900:348;18940:7;18963:20;18981:1;18963:20;:::i;:::-;18958:25;;18997:20;19015:1;18997:20;:::i;:::-;18992:25;;19185:1;19117:66;19113:74;19110:1;19107:81;19102:1;19095:9;19088:17;19084:105;19081:131;;;19192:18;;:::i;:::-;19081:131;19240:1;19237;19233:9;19222:20;;18900:348;;;;:::o;19254:180::-;19302:77;19299:1;19292:88;19399:4;19396:1;19389:15;19423:4;19420:1;19413:15;19440:320;19484:6;19521:1;19515:4;19511:12;19501:22;;19568:1;19562:4;19558:12;19589:18;19579:81;;19645:4;19637:6;19633:17;19623:27;;19579:81;19707:2;19699:6;19696:14;19676:18;19673:38;19670:84;;;19726:18;;:::i;:::-;19670:84;19491:269;19440:320;;;:::o;19766:232::-;19906:34;19902:1;19894:6;19890:14;19883:58;19975:15;19970:2;19962:6;19958:15;19951:40;19766:232;:::o;20004:366::-;20146:3;20167:67;20231:2;20226:3;20167:67;:::i;:::-;20160:74;;20243:93;20332:3;20243:93;:::i;:::-;20361:2;20356:3;20352:12;20345:19;;20004:366;;;:::o;20376:419::-;20542:4;20580:2;20569:9;20565:18;20557:26;;20629:9;20623:4;20619:20;20615:1;20604:9;20600:17;20593:47;20657:131;20783:4;20657:131;:::i;:::-;20649:139;;20376:419;;;:::o;20801:221::-;20941:34;20937:1;20929:6;20925:14;20918:58;21010:4;21005:2;20997:6;20993:15;20986:29;20801:221;:::o;21028:366::-;21170:3;21191:67;21255:2;21250:3;21191:67;:::i;:::-;21184:74;;21267:93;21356:3;21267:93;:::i;:::-;21385:2;21380:3;21376:12;21369:19;;21028:366;;;:::o;21400:419::-;21566:4;21604:2;21593:9;21589:18;21581:26;;21653:9;21647:4;21643:20;21639:1;21628:9;21624:17;21617:47;21681:131;21807:4;21681:131;:::i;:::-;21673:139;;21400:419;;;:::o;21825:244::-;21965:34;21961:1;21953:6;21949:14;21942:58;22034:27;22029:2;22021:6;22017:15;22010:52;21825:244;:::o;22075:366::-;22217:3;22238:67;22302:2;22297:3;22238:67;:::i;:::-;22231:74;;22314:93;22403:3;22314:93;:::i;:::-;22432:2;22427:3;22423:12;22416:19;;22075:366;;;:::o;22447:419::-;22613:4;22651:2;22640:9;22636:18;22628:26;;22700:9;22694:4;22690:20;22686:1;22675:9;22671:17;22664:47;22728:131;22854:4;22728:131;:::i;:::-;22720:139;;22447:419;;;:::o;22872:171::-;23012:23;23008:1;23000:6;22996:14;22989:47;22872:171;:::o;23049:366::-;23191:3;23212:67;23276:2;23271:3;23212:67;:::i;:::-;23205:74;;23288:93;23377:3;23288:93;:::i;:::-;23406:2;23401:3;23397:12;23390:19;;23049:366;;;:::o;23421:419::-;23587:4;23625:2;23614:9;23610:18;23602:26;;23674:9;23668:4;23664:20;23660:1;23649:9;23645:17;23638:47;23702:131;23828:4;23702:131;:::i;:::-;23694:139;;23421:419;;;:::o;23846:181::-;23986:33;23982:1;23974:6;23970:14;23963:57;23846:181;:::o;24033:366::-;24175:3;24196:67;24260:2;24255:3;24196:67;:::i;:::-;24189:74;;24272:93;24361:3;24272:93;:::i;:::-;24390:2;24385:3;24381:12;24374:19;;24033:366;;;:::o;24405:419::-;24571:4;24609:2;24598:9;24594:18;24586:26;;24658:9;24652:4;24648:20;24644:1;24633:9;24629:17;24622:47;24686:131;24812:4;24686:131;:::i;:::-;24678:139;;24405:419;;;:::o;24830:167::-;24970:19;24966:1;24958:6;24954:14;24947:43;24830:167;:::o;25003:366::-;25145:3;25166:67;25230:2;25225:3;25166:67;:::i;:::-;25159:74;;25242:93;25331:3;25242:93;:::i;:::-;25360:2;25355:3;25351:12;25344:19;;25003:366;;;:::o;25375:419::-;25541:4;25579:2;25568:9;25564:18;25556:26;;25628:9;25622:4;25618:20;25614:1;25603:9;25599:17;25592:47;25656:131;25782:4;25656:131;:::i;:::-;25648:139;;25375:419;;;:::o;25800:180::-;25848:77;25845:1;25838:88;25945:4;25942:1;25935:15;25969:4;25966:1;25959:15;25986:185;26026:1;26043:20;26061:1;26043:20;:::i;:::-;26038:25;;26077:20;26095:1;26077:20;:::i;:::-;26072:25;;26116:1;26106:35;;26121:18;;:::i;:::-;26106:35;26163:1;26160;26156:9;26151:14;;25986:185;;;;:::o;26177:221::-;26317:34;26313:1;26305:6;26301:14;26294:58;26386:4;26381:2;26373:6;26369:15;26362:29;26177:221;:::o;26404:366::-;26546:3;26567:67;26631:2;26626:3;26567:67;:::i;:::-;26560:74;;26643:93;26732:3;26643:93;:::i;:::-;26761:2;26756:3;26752:12;26745:19;;26404:366;;;:::o;26776:419::-;26942:4;26980:2;26969:9;26965:18;26957:26;;27029:9;27023:4;27019:20;27015:1;27004:9;27000:17;26993:47;27057:131;27183:4;27057:131;:::i;:::-;27049:139;;26776:419;;;:::o;27201:233::-;27240:3;27263:24;27281:5;27263:24;:::i;:::-;27254:33;;27309:66;27302:5;27299:77;27296:103;;;27379:18;;:::i;:::-;27296:103;27426:1;27419:5;27415:13;27408:20;;27201:233;;;:::o;27440:::-;27580:34;27576:1;27568:6;27564:14;27557:58;27649:16;27644:2;27636:6;27632:15;27625:41;27440:233;:::o;27679:366::-;27821:3;27842:67;27906:2;27901:3;27842:67;:::i;:::-;27835:74;;27918:93;28007:3;27918:93;:::i;:::-;28036:2;28031:3;28027:12;28020:19;;27679:366;;;:::o;28051:419::-;28217:4;28255:2;28244:9;28240:18;28232:26;;28304:9;28298:4;28294:20;28290:1;28279:9;28275:17;28268:47;28332:131;28458:4;28332:131;:::i;:::-;28324:139;;28051:419;;;:::o;28476:222::-;28616:34;28612:1;28604:6;28600:14;28593:58;28685:5;28680:2;28672:6;28668:15;28661:30;28476:222;:::o;28704:366::-;28846:3;28867:67;28931:2;28926:3;28867:67;:::i;:::-;28860:74;;28943:93;29032:3;28943:93;:::i;:::-;29061:2;29056:3;29052:12;29045:19;;28704:366;;;:::o;29076:419::-;29242:4;29280:2;29269:9;29265:18;29257:26;;29329:9;29323:4;29319:20;29315:1;29304:9;29300:17;29293:47;29357:131;29483:4;29357:131;:::i;:::-;29349:139;;29076:419;;;:::o;29501:230::-;29641:34;29637:1;29629:6;29625:14;29618:58;29710:13;29705:2;29697:6;29693:15;29686:38;29501:230;:::o;29737:366::-;29879:3;29900:67;29964:2;29959:3;29900:67;:::i;:::-;29893:74;;29976:93;30065:3;29976:93;:::i;:::-;30094:2;30089:3;30085:12;30078:19;;29737:366;;;:::o;30109:419::-;30275:4;30313:2;30302:9;30298:18;30290:26;;30362:9;30356:4;30352:20;30348:1;30337:9;30333:17;30326:47;30390:131;30516:4;30390:131;:::i;:::-;30382:139;;30109:419;;;:::o;30534:305::-;30574:3;30593:20;30611:1;30593:20;:::i;:::-;30588:25;;30627:20;30645:1;30627:20;:::i;:::-;30622:25;;30781:1;30713:66;30709:74;30706:1;30703:81;30700:107;;;30787:18;;:::i;:::-;30700:107;30831:1;30828;30824:9;30817:16;;30534:305;;;;:::o;30845:177::-;30985:29;30981:1;30973:6;30969:14;30962:53;30845:177;:::o;31028:366::-;31170:3;31191:67;31255:2;31250:3;31191:67;:::i;:::-;31184:74;;31267:93;31356:3;31267:93;:::i;:::-;31385:2;31380:3;31376:12;31369:19;;31028:366;;;:::o;31400:419::-;31566:4;31604:2;31593:9;31589:18;31581:26;;31653:9;31647:4;31643:20;31639:1;31628:9;31624:17;31617:47;31681:131;31807:4;31681:131;:::i;:::-;31673:139;;31400:419;;;:::o;31825:180::-;31873:77;31870:1;31863:88;31970:4;31967:1;31960:15;31994:4;31991:1;31984:15;32011:176;32151:28;32147:1;32139:6;32135:14;32128:52;32011:176;:::o;32193:366::-;32335:3;32356:67;32420:2;32415:3;32356:67;:::i;:::-;32349:74;;32432:93;32521:3;32432:93;:::i;:::-;32550:2;32545:3;32541:12;32534:19;;32193:366;;;:::o;32565:419::-;32731:4;32769:2;32758:9;32754:18;32746:26;;32818:9;32812:4;32808:20;32804:1;32793:9;32789:17;32782:47;32846:131;32972:4;32846:131;:::i;:::-;32838:139;;32565:419;;;:::o;32990:169::-;33130:21;33126:1;33118:6;33114:14;33107:45;32990:169;:::o;33165:366::-;33307:3;33328:67;33392:2;33387:3;33328:67;:::i;:::-;33321:74;;33404:93;33493:3;33404:93;:::i;:::-;33522:2;33517:3;33513:12;33506:19;;33165:366;;;:::o;33537:419::-;33703:4;33741:2;33730:9;33726:18;33718:26;;33790:9;33784:4;33780:20;33776:1;33765:9;33761:17;33754:47;33818:131;33944:4;33818:131;:::i;:::-;33810:139;;33537:419;;;:::o;33962:174::-;34102:26;34098:1;34090:6;34086:14;34079:50;33962:174;:::o;34142:366::-;34284:3;34305:67;34369:2;34364:3;34305:67;:::i;:::-;34298:74;;34381:93;34470:3;34381:93;:::i;:::-;34499:2;34494:3;34490:12;34483:19;;34142:366;;;:::o;34514:419::-;34680:4;34718:2;34707:9;34703:18;34695:26;;34767:9;34761:4;34757:20;34753:1;34742:9;34738:17;34731:47;34795:131;34921:4;34795:131;:::i;:::-;34787:139;;34514:419;;;:::o;34939:172::-;35079:24;35075:1;35067:6;35063:14;35056:48;34939:172;:::o;35117:366::-;35259:3;35280:67;35344:2;35339:3;35280:67;:::i;:::-;35273:74;;35356:93;35445:3;35356:93;:::i;:::-;35474:2;35469:3;35465:12;35458:19;;35117:366;;;:::o;35489:419::-;35655:4;35693:2;35682:9;35678:18;35670:26;;35742:9;35736:4;35732:20;35728:1;35717:9;35713:17;35706:47;35770:131;35896:4;35770:131;:::i;:::-;35762:139;;35489:419;;;:::o;35914:167::-;36054:19;36050:1;36042:6;36038:14;36031:43;35914:167;:::o;36087:366::-;36229:3;36250:67;36314:2;36309:3;36250:67;:::i;:::-;36243:74;;36326:93;36415:3;36326:93;:::i;:::-;36444:2;36439:3;36435:12;36428:19;;36087:366;;;:::o;36459:419::-;36625:4;36663:2;36652:9;36648:18;36640:26;;36712:9;36706:4;36702:20;36698:1;36687:9;36683:17;36676:47;36740:131;36866:4;36740:131;:::i;:::-;36732:139;;36459:419;;;:::o;36884:166::-;37024:18;37020:1;37012:6;37008:14;37001:42;36884:166;:::o;37056:366::-;37198:3;37219:67;37283:2;37278:3;37219:67;:::i;:::-;37212:74;;37295:93;37384:3;37295:93;:::i;:::-;37413:2;37408:3;37404:12;37397:19;;37056:366;;;:::o;37428:419::-;37594:4;37632:2;37621:9;37617:18;37609:26;;37681:9;37675:4;37671:20;37667:1;37656:9;37652:17;37645:47;37709:131;37835:4;37709:131;:::i;:::-;37701:139;;37428:419;;;:::o;37853:191::-;37893:4;37913:20;37931:1;37913:20;:::i;:::-;37908:25;;37947:20;37965:1;37947:20;:::i;:::-;37942:25;;37986:1;37983;37980:8;37977:34;;;37991:18;;:::i;:::-;37977:34;38036:1;38033;38029:9;38021:17;;37853:191;;;;:::o;38050:238::-;38190:34;38186:1;38178:6;38174:14;38167:58;38259:21;38254:2;38246:6;38242:15;38235:46;38050:238;:::o;38294:366::-;38436:3;38457:67;38521:2;38516:3;38457:67;:::i;:::-;38450:74;;38533:93;38622:3;38533:93;:::i;:::-;38651:2;38646:3;38642:12;38635:19;;38294:366;;;:::o;38666:419::-;38832:4;38870:2;38859:9;38855:18;38847:26;;38919:9;38913:4;38909:20;38905:1;38894:9;38890:17;38883:47;38947:131;39073:4;38947:131;:::i;:::-;38939:139;;38666:419;;;:::o;39091:171::-;39231:23;39227:1;39219:6;39215:14;39208:47;39091:171;:::o;39268:366::-;39410:3;39431:67;39495:2;39490:3;39431:67;:::i;:::-;39424:74;;39507:93;39596:3;39507:93;:::i;:::-;39625:2;39620:3;39616:12;39609:19;;39268:366;;;:::o;39640:419::-;39806:4;39844:2;39833:9;39829:18;39821:26;;39893:9;39887:4;39883:20;39879:1;39868:9;39864:17;39857:47;39921:131;40047:4;39921:131;:::i;:::-;39913:139;;39640:419;;;:::o;40065:148::-;40167:11;40204:3;40189:18;;40065:148;;;;:::o;40219:141::-;40268:4;40291:3;40283:11;;40314:3;40311:1;40304:14;40348:4;40345:1;40335:18;40327:26;;40219:141;;;:::o;40390:845::-;40493:3;40530:5;40524:12;40559:36;40585:9;40559:36;:::i;:::-;40611:89;40693:6;40688:3;40611:89;:::i;:::-;40604:96;;40731:1;40720:9;40716:17;40747:1;40742:137;;;;40893:1;40888:341;;;;40709:520;;40742:137;40826:4;40822:9;40811;40807:25;40802:3;40795:38;40862:6;40857:3;40853:16;40846:23;;40742:137;;40888:341;40955:38;40987:5;40955:38;:::i;:::-;41015:1;41029:154;41043:6;41040:1;41037:13;41029:154;;;41117:7;41111:14;41107:1;41102:3;41098:11;41091:35;41167:1;41158:7;41154:15;41143:26;;41065:4;41062:1;41058:12;41053:17;;41029:154;;;41212:6;41207:3;41203:16;41196:23;;40895:334;;40709:520;;40497:738;;40390:845;;;;:::o;41241:377::-;41347:3;41375:39;41408:5;41375:39;:::i;:::-;41430:89;41512:6;41507:3;41430:89;:::i;:::-;41423:96;;41528:52;41573:6;41568:3;41561:4;41554:5;41550:16;41528:52;:::i;:::-;41605:6;41600:3;41596:16;41589:23;;41351:267;41241:377;;;;:::o;41624:429::-;41801:3;41823:92;41911:3;41902:6;41823:92;:::i;:::-;41816:99;;41932:95;42023:3;42014:6;41932:95;:::i;:::-;41925:102;;42044:3;42037:10;;41624:429;;;;;:::o;42059:155::-;42199:7;42195:1;42187:6;42183:14;42176:31;42059:155;:::o;42220:400::-;42380:3;42401:84;42483:1;42478:3;42401:84;:::i;:::-;42394:91;;42494:93;42583:3;42494:93;:::i;:::-;42612:1;42607:3;42603:11;42596:18;;42220:400;;;:::o;42626:695::-;42904:3;42926:92;43014:3;43005:6;42926:92;:::i;:::-;42919:99;;43035:95;43126:3;43117:6;43035:95;:::i;:::-;43028:102;;43147:148;43291:3;43147:148;:::i;:::-;43140:155;;43312:3;43305:10;;42626:695;;;;;:::o;43327:225::-;43467:34;43463:1;43455:6;43451:14;43444:58;43536:8;43531:2;43523:6;43519:15;43512:33;43327:225;:::o;43558:366::-;43700:3;43721:67;43785:2;43780:3;43721:67;:::i;:::-;43714:74;;43797:93;43886:3;43797:93;:::i;:::-;43915:2;43910:3;43906:12;43899:19;;43558:366;;;:::o;43930:419::-;44096:4;44134:2;44123:9;44119:18;44111:26;;44183:9;44177:4;44173:20;44169:1;44158:9;44154:17;44147:47;44211:131;44337:4;44211:131;:::i;:::-;44203:139;;43930:419;;;:::o;44355:237::-;44495:34;44491:1;44483:6;44479:14;44472:58;44564:20;44559:2;44551:6;44547:15;44540:45;44355:237;:::o;44598:366::-;44740:3;44761:67;44825:2;44820:3;44761:67;:::i;:::-;44754:74;;44837:93;44926:3;44837:93;:::i;:::-;44955:2;44950:3;44946:12;44939:19;;44598:366;;;:::o;44970:419::-;45136:4;45174:2;45163:9;45159:18;45151:26;;45223:9;45217:4;45213:20;45209:1;45198:9;45194:17;45187:47;45251:131;45377:4;45251:131;:::i;:::-;45243:139;;44970:419;;;:::o;45395:225::-;45535:34;45531:1;45523:6;45519:14;45512:58;45604:8;45599:2;45591:6;45587:15;45580:33;45395:225;:::o;45626:366::-;45768:3;45789:67;45853:2;45848:3;45789:67;:::i;:::-;45782:74;;45865:93;45954:3;45865:93;:::i;:::-;45983:2;45978:3;45974:12;45967:19;;45626:366;;;:::o;45998:419::-;46164:4;46202:2;46191:9;46187:18;46179:26;;46251:9;46245:4;46241:20;46237:1;46226:9;46222:17;46215:47;46279:131;46405:4;46279:131;:::i;:::-;46271:139;;45998:419;;;:::o;46423:224::-;46563:34;46559:1;46551:6;46547:14;46540:58;46632:7;46627:2;46619:6;46615:15;46608:32;46423:224;:::o;46653:366::-;46795:3;46816:67;46880:2;46875:3;46816:67;:::i;:::-;46809:74;;46892:93;46981:3;46892:93;:::i;:::-;47010:2;47005:3;47001:12;46994:19;;46653:366;;;:::o;47025:419::-;47191:4;47229:2;47218:9;47214:18;47206:26;;47278:9;47272:4;47268:20;47264:1;47253:9;47249:17;47242:47;47306:131;47432:4;47306:131;:::i;:::-;47298:139;;47025:419;;;:::o;47450:118::-;47487:7;47527:34;47520:5;47516:46;47505:57;;47450:118;;;:::o;47574:191::-;47614:4;47634:20;47652:1;47634:20;:::i;:::-;47629:25;;47668:20;47686:1;47668:20;:::i;:::-;47663:25;;47707:1;47704;47701:8;47698:34;;;47712:18;;:::i;:::-;47698:34;47757:1;47754;47750:9;47742:17;;47574:191;;;;:::o;47771:273::-;47811:3;47830:20;47848:1;47830:20;:::i;:::-;47825:25;;47864:20;47882:1;47864:20;:::i;:::-;47859:25;;47986:1;47950:34;47946:42;47943:1;47940:49;47937:75;;;47992:18;;:::i;:::-;47937:75;48036:1;48033;48029:9;48022:16;;47771:273;;;;:::o;48050:236::-;48190:34;48186:1;48178:6;48174:14;48167:58;48259:19;48254:2;48246:6;48242:15;48235:44;48050:236;:::o;48292:366::-;48434:3;48455:67;48519:2;48514:3;48455:67;:::i;:::-;48448:74;;48531:93;48620:3;48531:93;:::i;:::-;48649:2;48644:3;48640:12;48633:19;;48292:366;;;:::o;48664:419::-;48830:4;48868:2;48857:9;48853:18;48845:26;;48917:9;48911:4;48907:20;48903:1;48892:9;48888:17;48881:47;48945:131;49071:4;48945:131;:::i;:::-;48937:139;;48664:419;;;:::o;49089:229::-;49229:34;49225:1;49217:6;49213:14;49206:58;49298:12;49293:2;49285:6;49281:15;49274:37;49089:229;:::o;49324:366::-;49466:3;49487:67;49551:2;49546:3;49487:67;:::i;:::-;49480:74;;49563:93;49652:3;49563:93;:::i;:::-;49681:2;49676:3;49672:12;49665:19;;49324:366;;;:::o;49696:419::-;49862:4;49900:2;49889:9;49885:18;49877:26;;49949:9;49943:4;49939:20;49935:1;49924:9;49920:17;49913:47;49977:131;50103:4;49977:131;:::i;:::-;49969:139;;49696:419;;;:::o;50121:171::-;50160:3;50183:24;50201:5;50183:24;:::i;:::-;50174:33;;50229:4;50222:5;50219:15;50216:41;;;50237:18;;:::i;:::-;50216:41;50284:1;50277:5;50273:13;50266:20;;50121:171;;;:::o;50298:234::-;50438:34;50434:1;50426:6;50422:14;50415:58;50507:17;50502:2;50494:6;50490:15;50483:42;50298:234;:::o;50538:366::-;50680:3;50701:67;50765:2;50760:3;50701:67;:::i;:::-;50694:74;;50777:93;50866:3;50777:93;:::i;:::-;50895:2;50890:3;50886:12;50879:19;;50538:366;;;:::o;50910:419::-;51076:4;51114:2;51103:9;51099:18;51091:26;;51163:9;51157:4;51153:20;51149:1;51138:9;51134:17;51127:47;51191:131;51317:4;51191:131;:::i;:::-;51183:139;;50910:419;;;:::o;51335:98::-;51386:6;51420:5;51414:12;51404:22;;51335:98;;;:::o;51439:168::-;51522:11;51556:6;51551:3;51544:19;51596:4;51591:3;51587:14;51572:29;;51439:168;;;;:::o;51613:360::-;51699:3;51727:38;51759:5;51727:38;:::i;:::-;51781:70;51844:6;51839:3;51781:70;:::i;:::-;51774:77;;51860:52;51905:6;51900:3;51893:4;51886:5;51882:16;51860:52;:::i;:::-;51937:29;51959:6;51937:29;:::i;:::-;51932:3;51928:39;51921:46;;51703:270;51613:360;;;;:::o;51979:640::-;52174:4;52212:3;52201:9;52197:19;52189:27;;52226:71;52294:1;52283:9;52279:17;52270:6;52226:71;:::i;:::-;52307:72;52375:2;52364:9;52360:18;52351:6;52307:72;:::i;:::-;52389;52457:2;52446:9;52442:18;52433:6;52389:72;:::i;:::-;52508:9;52502:4;52498:20;52493:2;52482:9;52478:18;52471:48;52536:76;52607:4;52598:6;52536:76;:::i;:::-;52528:84;;51979:640;;;;;;;:::o;52625:141::-;52681:5;52712:6;52706:13;52697:22;;52728:32;52754:5;52728:32;:::i;:::-;52625:141;;;;:::o;52772:349::-;52841:6;52890:2;52878:9;52869:7;52865:23;52861:32;52858:119;;;52896:79;;:::i;:::-;52858:119;53016:1;53041:63;53096:7;53087:6;53076:9;53072:22;53041:63;:::i;:::-;53031:73;;52987:127;52772:349;;;;:::o;53127:176::-;53159:1;53176:20;53194:1;53176:20;:::i;:::-;53171:25;;53210:20;53228:1;53210:20;:::i;:::-;53205:25;;53249:1;53239:35;;53254:18;;:::i;:::-;53239:35;53295:1;53292;53288:9;53283:14;;53127:176;;;;:::o;53309:180::-;53357:77;53354:1;53347:88;53454:4;53451:1;53444:15;53478:4;53475:1;53468:15;53495:220;53635:34;53631:1;53623:6;53619:14;53612:58;53704:3;53699:2;53691:6;53687:15;53680:28;53495:220;:::o;53721:366::-;53863:3;53884:67;53948:2;53943:3;53884:67;:::i;:::-;53877:74;;53960:93;54049:3;53960:93;:::i;:::-;54078:2;54073:3;54069:12;54062:19;;53721:366;;;:::o;54093:419::-;54259:4;54297:2;54286:9;54282:18;54274:26;;54346:9;54340:4;54336:20;54332:1;54321:9;54317:17;54310:47;54374:131;54500:4;54374:131;:::i;:::-;54366:139;;54093:419;;;:::o;54518:179::-;54658:31;54654:1;54646:6;54642:14;54635:55;54518:179;:::o;54703:366::-;54845:3;54866:67;54930:2;54925:3;54866:67;:::i;:::-;54859:74;;54942:93;55031:3;54942:93;:::i;:::-;55060:2;55055:3;55051:12;55044:19;;54703:366;;;:::o;55075:419::-;55241:4;55279:2;55268:9;55264:18;55256:26;;55328:9;55322:4;55318:20;55314:1;55303:9;55299:17;55292:47;55356:131;55482:4;55356:131;:::i;:::-;55348:139;;55075:419;;;:::o;55500:221::-;55640:34;55636:1;55628:6;55624:14;55617:58;55709:4;55704:2;55696:6;55692:15;55685:29;55500:221;:::o;55727:366::-;55869:3;55890:67;55954:2;55949:3;55890:67;:::i;:::-;55883:74;;55966:93;56055:3;55966:93;:::i;:::-;56084:2;56079:3;56075:12;56068:19;;55727:366;;;:::o;56099:419::-;56265:4;56303:2;56292:9;56288:18;56280:26;;56352:9;56346:4;56342:20;56338:1;56327:9;56323:17;56316:47;56380:131;56506:4;56380:131;:::i;:::-;56372:139;;56099:419;;;:::o

Swarm Source

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