ETH Price: $3,480.35 (-1.35%)
Gas: 3 Gwei

MetaPiggyBanks (MPB)
 

Overview

TokenID

16

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetaPiggyBanks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)
// MetaPiggyBanks.io

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 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++) {
      bytes32 proofElement = proof[i];
      if (computedHash <= proofElement) {
        // Hash(current computed hash + current element of the proof)
        computedHash = _efficientHash(computedHash, proofElement);
      } else {
        // Hash(current element of the proof + current computed hash)
        computedHash = _efficientHash(proofElement, computedHash);
      }
    }
    return computedHash;
  }

  function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
    assembly {
      mstore(0x00, a)
      mstore(0x20, b)
      value := keccak256(0x00, 0x40)
    }
  }
}

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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Token base URI
  string private _baseURI;

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

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

  // Mapping from owner to list of owned token IDs
  mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) private _ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] private _allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) private _allTokensIndex;

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

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

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

  /**
   * @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 virtual override returns (uint256) {
    require(owner != address(0), "ERC721: balance query for the zero address");
    return _balances[owner];
  }

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

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

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

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

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

  /**
   * @dev Set baseURI
   */
  function setBaseURI(string memory baseURI_) public virtual onlyOwner {
    _baseURI = baseURI_;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
    require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
    return _ownedTokens[owner][index];
  }

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

    _transfer(from, to, tokenId);
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _beforeTokenTransfer(from, to, tokenId);

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

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

    emit Transfer(from, to, tokenId);
  }

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

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

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

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

  /**
   * @dev Private function to add a token to this extension's ownership-tracking data structures.
   * @param to address representing the new owner of the given token ID
   * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
    uint256 length = ERC721.balanceOf(to);
    _ownedTokens[to][length] = tokenId;
    _ownedTokensIndex[tokenId] = length;
  }

  /**
   * @dev Private function to add a token to this extension's token tracking data structures.
   * @param tokenId uint256 ID of the token to be added to the tokens list
   */
  function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
    _allTokensIndex[tokenId] = _allTokens.length;
    _allTokens.push(tokenId);
  }

  /**
   * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
   * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
   * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
   * This has O(1) time complexity, but alters the order of the _ownedTokens array.
   * @param from address representing the previous owner of the given token ID
   * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
    // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
    // then delete the last slot (swap and pop).

    uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
    uint256 tokenIndex = _ownedTokensIndex[tokenId];

    // When the token to delete is the last token, the swap operation is unnecessary
    if (tokenIndex != lastTokenIndex) {
      uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

      _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
      _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
    }

    // This also deletes the contents at the last position of the array
    delete _ownedTokensIndex[tokenId];
    delete _ownedTokens[from][lastTokenIndex];
  }

  /**
   * @dev Private function to remove a token from this extension's token tracking data structures.
   * This has O(1) time complexity, but alters the order of the _allTokens array.
   * @param tokenId uint256 ID of the token to be removed from the tokens list
   */
  function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
    // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
    // then delete the last slot (swap and pop).

    uint256 lastTokenIndex = _allTokens.length - 1;
    uint256 tokenIndex = _allTokensIndex[tokenId];

    // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
    // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
    // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
    uint256 lastTokenId = _allTokens[lastTokenIndex];

    _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
    _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

    // This also deletes the contents at the last position of the array
    delete _allTokensIndex[tokenId];
    _allTokens.pop();
  }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
}

contract MetaPiggyBanks is ERC721("MetaPiggyBanks", "MPB", "https://metapiggybanks.io/api/metadata/") {
  using Counters for Counters.Counter;

  Counters.Counter private _tokenIds;
  Counters.Counter private _salesCounter;

  uint256 public publicMintStartAt = 1646780400;
  uint256 public whitelistMintStartAt = 1646773200;

  uint256 public maxSupply = 8888;
  uint256 public saleSupply = 800;
  uint256 public publicMintPrice = 0.0888 ether;
  uint256 public whitelistMintPrice = 0.0888 ether;
  uint256 public maxBatchMint = 2;

  bytes32 public merkleRoot = 0x0;
  uint256 public whitelistRound = 0;
  uint256 public whitelistLimitPerAccount = 2;
  mapping(uint256 => mapping(address => uint256)) public whitelistMinted;

  function setPublicMintStartAt(uint256 publicMintStartAt_) external onlyOwner {
    publicMintStartAt = publicMintStartAt_;
  }

  function setWhitelistMintStartAt(uint256 whitelistMintStartAt_) external onlyOwner {
    whitelistMintStartAt = whitelistMintStartAt_;
  }

  function setSaleSupply(uint256 saleSupply_) external onlyOwner {
    require(saleSupply_ <= maxSupply, "Sale supply can't be higher than max supply.");
    saleSupply = saleSupply_;
  }

  function setPublicMintPrice(uint256 publicMintPrice_) external onlyOwner {
    publicMintPrice = publicMintPrice_;
  }

  function setWhitelistMintPrice(uint256 whitelistMintPrice_) external onlyOwner {
    whitelistMintPrice = whitelistMintPrice_;
  }

  function setMaxBatchMint(uint256 maxBatchMint_) external onlyOwner {
    maxBatchMint = maxBatchMint_;
  }

  function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
    merkleRoot = merkleRoot_;
  }

  function setWhitelistRound(uint256 whitelistRound_) external onlyOwner {
    whitelistRound = whitelistRound_;
  }

  function setWhitelistLimitPerAccount(uint256 whitelistLimitPerAccount_) external onlyOwner {
    whitelistLimitPerAccount = whitelistLimitPerAccount_;
  }

  function salesCounter() external view returns (uint256) {
    return _salesCounter.current();
  }

  function mint(address to) external payable returns (uint256) {
    require(block.timestamp >= publicMintStartAt, "Public mint not started yet.");
    require(_salesCounter.current() < saleSupply, "Sale supply reached.");
    require(msg.value >= publicMintPrice, "Insufficient funds.");

    _salesCounter.increment();

    return safeMint(to);
  }

  function batchMint(address to, uint256 amount) external payable returns (uint256[] memory) {
    require(block.timestamp >= publicMintStartAt, "Public mint not started yet.");
    require(_salesCounter.current() < saleSupply, "Sale supply reached.");
    require(_salesCounter.current() + amount <= saleSupply, "Not enough NFTs available for mint.");
    require(amount > 0 && amount <= maxBatchMint, "Invalid amount.");
    require(msg.value >= publicMintPrice * amount, "Insufficient funds.");

    uint256[] memory tokensMinted = new uint256[](amount);

    for (uint256 i = 0; i < amount; i++) {
      _salesCounter.increment();
      tokensMinted[i] = safeMint(to);
    }

    return tokensMinted;
  }

  function whitelistMint(bytes32[] calldata merkleProof, uint256 amount) external payable returns (uint256[] memory) {
    require(block.timestamp > whitelistMintStartAt, "Whitelist mint not started yet.");
    require(amount > 0, "Invalid amount.");
    require(_salesCounter.current() + amount <= saleSupply, "Not enough NFTs available for mint.");
    require(msg.value >= whitelistMintPrice * amount, "Insufficient funds.");

    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "Invalid proof.");

    require(whitelistMinted[whitelistRound][_msgSender()] + amount <= whitelistLimitPerAccount, "Limit per account exceeded.");
    whitelistMinted[whitelistRound][_msgSender()] = whitelistMinted[whitelistRound][_msgSender()] + amount;

    uint256[] memory tokensMinted = new uint256[](amount);

    for (uint256 i = 0; i < amount; i++) {
      _salesCounter.increment();
      tokensMinted[i] = safeMint(_msgSender());
    }

    return tokensMinted;
  }

  function teamMint(address to) external onlyOwner returns (uint256) {
    return safeMint(to);
  }

  function teamBatchMint(address to, uint256 amount) external onlyOwner returns (uint256[] memory) {
    require(amount > 0, "Invalid amount.");

    uint256[] memory tokensMinted = new uint256[](amount);

    for (uint256 i = 0; i < amount; i++) {
      tokensMinted[i] = safeMint(to);
    }

    return tokensMinted;
  }

  function safeMint(address to) private returns (uint256) {
    require(_tokenIds.current() < maxSupply, "Mint supply reached.");

    _tokenIds.increment();

    uint256 newId = _tokenIds.current();
    _safeMint(to, newId);

    return newId;
  }

  function withdraw() external payable onlyOwner {
    (bool payment, ) = payable(owner()).call{value: address(this).balance}("");
    require(payment);
  }

  function withdrawToken(address tokenAddress) external onlyOwner {
    IERC20 tokenContract = IERC20(tokenAddress);
    uint256 balance = tokenContract.balanceOf(address(this));
    require(balance > 0, "Insufficient funds.");

    tokenContract.transfer(owner(), balance);
  }
}

Contract Security Audit

Contract ABI

[{"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"batchMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salesCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBatchMint_","type":"uint256"}],"name":"setMaxBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicMintPrice_","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicMintStartAt_","type":"uint256"}],"name":"setPublicMintStartAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleSupply_","type":"uint256"}],"name":"setSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistLimitPerAccount_","type":"uint256"}],"name":"setWhitelistLimitPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistMintPrice_","type":"uint256"}],"name":"setWhitelistMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistMintStartAt_","type":"uint256"}],"name":"setWhitelistMintStartAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistRound_","type":"uint256"}],"name":"setWhitelistRound","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"teamBatchMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"teamMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistLimitPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintStartAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052636227dff0600e55636227c3d0600f556122b860105561032060115567013b7b21280e000060125567013b7b21280e000060135560026014556000801b601555600060165560026017553480156200005b57600080fd5b506040518060400160405280600e81526020017f4d657461506967677942616e6b730000000000000000000000000000000000008152506040518060400160405280600381526020017f4d5042000000000000000000000000000000000000000000000000000000000081525060405180606001604052806027815260200162005aeb6027913962000102620000f66200015660201b60201c565b6200015e60201b60201c565b82600190805190602001906200011a92919062000222565b5081600290805190602001906200013392919062000222565b5080600390805190602001906200014c92919062000222565b5050505062000337565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023090620002d2565b90600052602060002090601f016020900481019282620002545760008555620002a0565b82601f106200026f57805160ff1916838001178555620002a0565b82800160010185558215620002a0579182015b828111156200029f57825182559160200191906001019062000282565b5b509050620002af9190620002b3565b5090565b5b80821115620002ce576000816000905550600101620002b4565b5090565b60006002820490506001821680620002eb57607f821691505b6020821081141562000302576200030162000308565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6157a480620003476000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063b6a1dba1116100c1578063d5abeb011161007a578063d5abeb01146109f0578063dc53fd9214610a1b578063e985e9c514610a46578063f2fde38b14610a83578063f629c43014610aac578063fbd3970e14610ae957610293565b8063b6a1dba1146108d0578063b83f045c1461090d578063b88d4fde14610936578063c40800231461095f578063c87b56dd1461098a578063d31f9395146109c757610293565b80638e71e08f116101135780638e71e08f146107d457806395d89b41146107fd578063a22cb46514610828578063a402129914610851578063a611708e1461087c578063a96af0f4146108a557610293565b8063715018a6146106ec5780637cb64759146107035780637f37b9051461072c57806389476069146107575780638cccc67b146107805780638da5cb5b146107a957610293565b806335c6aaf8116101fe57806355f804b3116101b757806355f804b3146105c55780635d82cf6e146105ee5780635dc2ba39146106175780636352211e146106425780636a6278421461067f57806370a08231146106af57610293565b806335c6aaf8146104d15780633bc3c866146104fc5780633ccfd60b1461052557806342842e0e1461052f57806343508b05146105585780634f6ccce71461058857610293565b80630a916fd6116102505780630a916fd6146103ba57806318160ddd146103e557806323b872dd146104105780632904e6d9146104395780632eb4a7ab146104695780632f745c591461049457610293565b806301ffc9a71461029857806304db5eed146102d557806306fdde03146102fe578063081812fc14610329578063095ea7b31461036657806309a3a9c11461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613ea6565b610b26565b6040516102cc91906146da565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613f49565b610c70565b005b34801561030a57600080fd5b50610313610d3b565b6040516103209190614710565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613f49565b610dcd565b60405161035d9190614628565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613dac565b610e52565b005b34801561039b57600080fd5b506103a4610f6a565b6040516103b19190614ab2565b60405180910390f35b3480156103c657600080fd5b506103cf610f70565b6040516103dc9190614ab2565b60405180910390f35b3480156103f157600080fd5b506103fa610f76565b6040516104079190614ab2565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190613c96565b610f83565b005b610453600480360381019061044e9190613dec565b610fe3565b60405161046091906146b8565b60405180910390f35b34801561047557600080fd5b5061047e6113f0565b60405161048b91906146f5565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613dac565b6113f6565b6040516104c89190614ab2565b60405180910390f35b3480156104dd57600080fd5b506104e661149b565b6040516104f39190614ab2565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613f49565b6114a1565b005b61052d611527565b005b34801561053b57600080fd5b5061055660048036038101906105519190613c96565b611623565b005b610572600480360381019061056d9190613dac565b611643565b60405161057f91906146b8565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613f49565b611879565b6040516105bc9190614ab2565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613f00565b6118ea565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613f49565b611980565b005b34801561062357600080fd5b5061062c611a06565b6040516106399190614ab2565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190613f49565b611a0c565b6040516106769190614628565b60405180910390f35b61069960048036038101906106949190613c29565b611abe565b6040516106a69190614ab2565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613c29565b611bb1565b6040516106e39190614ab2565b60405180910390f35b3480156106f857600080fd5b50610701611c69565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613e79565b611cf1565b005b34801561073857600080fd5b50610741611d77565b60405161074e9190614ab2565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190613c29565b611d88565b005b34801561078c57600080fd5b506107a760048036038101906107a29190613f49565b611f73565b005b3480156107b557600080fd5b506107be611ff9565b6040516107cb9190614628565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190613f49565b612022565b005b34801561080957600080fd5b506108126120a8565b60405161081f9190614710565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613d6c565b61213a565b005b34801561085d57600080fd5b50610866612150565b6040516108739190614ab2565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613f49565b612156565b005b3480156108b157600080fd5b506108ba6121dc565b6040516108c79190614ab2565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190613c29565b6121e2565b6040516109049190614ab2565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190613f49565b612270565b005b34801561094257600080fd5b5061095d60048036038101906109589190613ce9565b6122f6565b005b34801561096b57600080fd5b50610974612358565b6040516109819190614ab2565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190613f49565b61235e565b6040516109be9190614710565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190613f49565b612406565b005b3480156109fc57600080fd5b50610a0561248c565b604051610a129190614ab2565b60405180910390f35b348015610a2757600080fd5b50610a30612492565b604051610a3d9190614ab2565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190613c56565b612498565b604051610a7a91906146da565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613c29565b61252c565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190613fa3565b612624565b604051610ae09190614ab2565b60405180910390f35b348015610af557600080fd5b50610b106004803603810190610b0b9190613dac565b612649565b604051610b1d91906146b8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c5957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c695750610c68826127a8565b5b9050919050565b610c78612812565b73ffffffffffffffffffffffffffffffffffffffff16610c96611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390614952565b60405180910390fd5b601054811115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614a72565b60405180910390fd5b8060118190555050565b606060018054610d4a90614dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690614dc5565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b6000610dd88261281a565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614932565b60405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e5d82611a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec5906149b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eed612812565b73ffffffffffffffffffffffffffffffffffffffff161480610f1c5750610f1b81610f16612812565b612498565b5b610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5290614872565b60405180910390fd5b610f658383612886565b505050565b60145481565b600e5481565b6000600880549050905090565b610f94610f8e612812565b8261293f565b610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614a12565b60405180910390fd5b610fde838383612a1d565b505050565b6060600f544211611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906148d2565b60405180910390fd5b6000821161106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390614732565b60405180910390fd5b6011548261107a600d612c79565b6110849190614bf0565b11156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614832565b60405180910390fd5b816013546110d39190614c77565b341015611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614a92565b60405180910390fd5b600061111f612812565b60405160200161112f91906145d4565b604051602081830303815290604052805190602001209050611195858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483612c87565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90614a52565b60405180910390fd5b6017548360186000601654815260200190815260200160002060006111f7612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461123c9190614bf0565b111561127d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611274906149f2565b60405180910390fd5b82601860006016548152602001908152602001600020600061129d612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112e29190614bf0565b6018600060165481526020019081526020016000206000611301612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008367ffffffffffffffff81111561135b5761135a614fb1565b5b6040519080825280602002602001820160405280156113895781602001602082028036833780820191505090505b50905060005b848110156113e3576113a1600d612c9e565b6113b16113ac612812565b612cb4565b8282815181106113c4576113c3614f82565b5b60200260200101818152505080806113db90614e28565b91505061138f565b5080925050509392505050565b60155481565b600061140183611bb1565b8210611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614752565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60135481565b6114a9612812565b73ffffffffffffffffffffffffffffffffffffffff166114c7611ff9565b73ffffffffffffffffffffffffffffffffffffffff161461151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614952565b60405180910390fd5b80600e8190555050565b61152f612812565b73ffffffffffffffffffffffffffffffffffffffff1661154d611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614952565b60405180910390fd5b60006115ad611ff9565b73ffffffffffffffffffffffffffffffffffffffff16476040516115d090614613565b60006040518083038185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b505090508061162057600080fd5b50565b61163e838383604051806020016040528060008152506122f6565b505050565b6060600e5442101561168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906147d2565b60405180910390fd5b601154611697600d612c79565b106116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906149d2565b60405180910390fd5b601154826116e5600d612c79565b6116ef9190614bf0565b1115611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790614832565b60405180910390fd5b60008211801561174257506014548211155b611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614732565b60405180910390fd5b8160125461178f9190614c77565b3410156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614a92565b60405180910390fd5b60008267ffffffffffffffff8111156117ed576117ec614fb1565b5b60405190808252806020026020018201604052801561181b5781602001602082028036833780820191505090505b50905060005b8381101561186e57611833600d612c9e565b61183c85612cb4565b82828151811061184f5761184e614f82565b5b602002602001018181525050808061186690614e28565b915050611821565b508091505092915050565b6000611883610f76565b82106118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90614a32565b60405180910390fd5b600882815481106118d8576118d7614f82565b5b90600052602060002001549050919050565b6118f2612812565b73ffffffffffffffffffffffffffffffffffffffff16611910611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614952565b60405180910390fd5b806003908051906020019061197c9291906139a8565b5050565b611988612812565b73ffffffffffffffffffffffffffffffffffffffff166119a6611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390614952565b60405180910390fd5b8060128190555050565b600f5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac906148b2565b60405180910390fd5b80915050919050565b6000600e54421015611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc906147d2565b60405180910390fd5b601154611b12600d612c79565b10611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906149d2565b60405180910390fd5b601254341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614a92565b60405180910390fd5b611ba1600d612c9e565b611baa82612cb4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990614892565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c71612812565b73ffffffffffffffffffffffffffffffffffffffff16611c8f611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90614952565b60405180910390fd5b611cef6000612d2e565b565b611cf9612812565b73ffffffffffffffffffffffffffffffffffffffff16611d17611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490614952565b60405180910390fd5b8060158190555050565b6000611d83600d612c79565b905090565b611d90612812565b73ffffffffffffffffffffffffffffffffffffffff16611dae611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614952565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e449190614628565b60206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e949190613f76565b905060008111611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614a92565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611efd611ff9565b836040518363ffffffff1660e01b8152600401611f1b92919061468f565b602060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190613e4c565b50505050565b611f7b612812565b73ffffffffffffffffffffffffffffffffffffffff16611f99611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614952565b60405180910390fd5b80600f8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61202a612812565b73ffffffffffffffffffffffffffffffffffffffff16612048611ff9565b73ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590614952565b60405180910390fd5b8060178190555050565b6060600280546120b790614dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546120e390614dc5565b80156121305780601f1061210557610100808354040283529160200191612130565b820191906000526020600020905b81548152906001019060200180831161211357829003601f168201915b5050505050905090565b61214c612145612812565b8383612df2565b5050565b60165481565b61215e612812565b73ffffffffffffffffffffffffffffffffffffffff1661217c611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c990614952565b60405180910390fd5b8060138190555050565b60115481565b60006121ec612812565b73ffffffffffffffffffffffffffffffffffffffff1661220a611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614952565b60405180910390fd5b61226982612cb4565b9050919050565b612278612812565b73ffffffffffffffffffffffffffffffffffffffff16612296611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390614952565b60405180910390fd5b8060168190555050565b612307612301612812565b8361293f565b612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d90614a12565b60405180910390fd5b61235284848484612f5f565b50505050565b60175481565b60606123698261281a565b6123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614992565b60405180910390fd5b6000600380546123b790614dc5565b9050116123d357604051806020016040528060008152506123ff565b60036123de83612fbb565b6040516020016123ef9291906145ef565b6040516020818303038152906040525b9050919050565b61240e612812565b73ffffffffffffffffffffffffffffffffffffffff1661242c611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990614952565b60405180910390fd5b8060148190555050565b60105481565b60125481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612534612812565b73ffffffffffffffffffffffffffffffffffffffff16612552611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f90614952565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614792565b60405180910390fd5b61262181612d2e565b50565b6018602052816000526040600020602052806000526040600020600091509150505481565b6060612653612812565b73ffffffffffffffffffffffffffffffffffffffff16612671611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be90614952565b60405180910390fd5b6000821161270a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270190614732565b60405180910390fd5b60008267ffffffffffffffff81111561272657612725614fb1565b5b6040519080825280602002602001820160405280156127545781602001602082028036833780820191505090505b50905060005b8381101561279d5761276b85612cb4565b82828151811061277e5761277d614f82565b5b602002602001018181525050808061279590614e28565b91505061275a565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128f983611a0c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061294a8261281a565b612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090614852565b60405180910390fd5b600061299483611a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0357508373ffffffffffffffffffffffffffffffffffffffff166129eb84610dcd565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a145750612a138185612498565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a3d82611a0c565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614972565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa906147f2565b60405180910390fd5b612b0e83838361311c565b612b19600082612886565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b699190614cd1565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc09190614bf0565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b600082612c948584613225565b1490509392505050565b6001816000016000828254019250508190555050565b6000601054612cc3600c612c79565b10612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa90614912565b60405180910390fd5b612d0d600c612c9e565b6000612d19600c612c79565b9050612d25838261329a565b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890614812565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f5291906146da565b60405180910390a3505050565b612f6a848484612a1d565b612f76848484846132b8565b612fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fac90614772565b60405180910390fd5b50505050565b60606000821415613003576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613117565b600082905060005b6000821461303557808061301e90614e28565b915050600a8261302e9190614c46565b915061300b565b60008167ffffffffffffffff81111561305157613050614fb1565b5b6040519080825280601f01601f1916602001820160405280156130835781602001600182028036833780820191505090505b5090505b600085146131105760018261309c9190614cd1565b9150600a856130ab9190614e95565b60306130b79190614bf0565b60f81b8183815181106130cd576130cc614f82565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131099190614c46565b9450613087565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561315f5761315a8161344f565b61319e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461319d5761319c8382613498565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131e1576131dc81613605565b613220565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461321f5761321e82826136d6565b5b5b505050565b60008082905060005b845181101561328f57600085828151811061324c5761324b614f82565b5b6020026020010151905080831161326e576132678382613755565b925061327b565b6132788184613755565b92505b50808061328790614e28565b91505061322e565b508091505092915050565b6132b482826040518060200160405280600081525061376c565b5050565b60006132d98473ffffffffffffffffffffffffffffffffffffffff166137c7565b15613442578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613302612812565b8786866040518563ffffffff1660e01b81526004016133249493929190614643565b602060405180830381600087803b15801561333e57600080fd5b505af192505050801561336f57506040513d601f19601f8201168201806040525081019061336c9190613ed3565b60015b6133f2573d806000811461339f576040519150601f19603f3d011682016040523d82523d6000602084013e6133a4565b606091505b506000815114156133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190614772565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613447565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134a584611bb1565b6134af9190614cd1565b9050600060076000848152602001908152602001600020549050818114613594576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136199190614cd1565b905060006009600084815260200190815260200160002054905060006008838154811061364957613648614f82565b5b90600052602060002001549050806008838154811061366b5761366a614f82565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136ba576136b9614f53565b5b6001900381819060005260206000200160009055905550505050565b60006136e183611bb1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b61377683836137da565b61378360008484846132b8565b6137c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b990614772565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561384a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613841906148f2565b60405180910390fd5b6138538161281a565b15613893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388a906147b2565b60405180910390fd5b61389f6000838361311c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138ef9190614bf0565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139b490614dc5565b90600052602060002090601f0160209004810192826139d65760008555613a1d565b82601f106139ef57805160ff1916838001178555613a1d565b82800160010185558215613a1d579182015b82811115613a1c578251825591602001919060010190613a01565b5b509050613a2a9190613a2e565b5090565b5b80821115613a47576000816000905550600101613a2f565b5090565b6000613a5e613a5984614af2565b614acd565b905082815260208101848484011115613a7a57613a79614fef565b5b613a85848285614d83565b509392505050565b6000613aa0613a9b84614b23565b614acd565b905082815260208101848484011115613abc57613abb614fef565b5b613ac7848285614d83565b509392505050565b600081359050613ade816156fb565b92915050565b60008083601f840112613afa57613af9614fe5565b5b8235905067ffffffffffffffff811115613b1757613b16614fe0565b5b602083019150836020820283011115613b3357613b32614fea565b5b9250929050565b600081359050613b4981615712565b92915050565b600081519050613b5e81615712565b92915050565b600081359050613b7381615729565b92915050565b600081359050613b8881615740565b92915050565b600081519050613b9d81615740565b92915050565b600082601f830112613bb857613bb7614fe5565b5b8135613bc8848260208601613a4b565b91505092915050565b600082601f830112613be657613be5614fe5565b5b8135613bf6848260208601613a8d565b91505092915050565b600081359050613c0e81615757565b92915050565b600081519050613c2381615757565b92915050565b600060208284031215613c3f57613c3e614ff9565b5b6000613c4d84828501613acf565b91505092915050565b60008060408385031215613c6d57613c6c614ff9565b5b6000613c7b85828601613acf565b9250506020613c8c85828601613acf565b9150509250929050565b600080600060608486031215613caf57613cae614ff9565b5b6000613cbd86828701613acf565b9350506020613cce86828701613acf565b9250506040613cdf86828701613bff565b9150509250925092565b60008060008060808587031215613d0357613d02614ff9565b5b6000613d1187828801613acf565b9450506020613d2287828801613acf565b9350506040613d3387828801613bff565b925050606085013567ffffffffffffffff811115613d5457613d53614ff4565b5b613d6087828801613ba3565b91505092959194509250565b60008060408385031215613d8357613d82614ff9565b5b6000613d9185828601613acf565b9250506020613da285828601613b3a565b9150509250929050565b60008060408385031215613dc357613dc2614ff9565b5b6000613dd185828601613acf565b9250506020613de285828601613bff565b9150509250929050565b600080600060408486031215613e0557613e04614ff9565b5b600084013567ffffffffffffffff811115613e2357613e22614ff4565b5b613e2f86828701613ae4565b93509350506020613e4286828701613bff565b9150509250925092565b600060208284031215613e6257613e61614ff9565b5b6000613e7084828501613b4f565b91505092915050565b600060208284031215613e8f57613e8e614ff9565b5b6000613e9d84828501613b64565b91505092915050565b600060208284031215613ebc57613ebb614ff9565b5b6000613eca84828501613b79565b91505092915050565b600060208284031215613ee957613ee8614ff9565b5b6000613ef784828501613b8e565b91505092915050565b600060208284031215613f1657613f15614ff9565b5b600082013567ffffffffffffffff811115613f3457613f33614ff4565b5b613f4084828501613bd1565b91505092915050565b600060208284031215613f5f57613f5e614ff9565b5b6000613f6d84828501613bff565b91505092915050565b600060208284031215613f8c57613f8b614ff9565b5b6000613f9a84828501613c14565b91505092915050565b60008060408385031215613fba57613fb9614ff9565b5b6000613fc885828601613bff565b9250506020613fd985828601613acf565b9150509250929050565b6000613fef83836145b6565b60208301905092915050565b61400481614d05565b82525050565b61401b61401682614d05565b614e71565b82525050565b600061402c82614b79565b6140368185614ba7565b935061404183614b54565b8060005b838110156140725781516140598882613fe3565b975061406483614b9a565b925050600181019050614045565b5085935050505092915050565b61408881614d17565b82525050565b61409781614d23565b82525050565b60006140a882614b84565b6140b28185614bb8565b93506140c2818560208601614d92565b6140cb81614ffe565b840191505092915050565b60006140e182614b8f565b6140eb8185614bd4565b93506140fb818560208601614d92565b61410481614ffe565b840191505092915050565b600061411a82614b8f565b6141248185614be5565b9350614134818560208601614d92565b80840191505092915050565b6000815461414d81614dc5565b6141578186614be5565b945060018216600081146141725760018114614183576141b6565b60ff198316865281860193506141b6565b61418c85614b64565b60005b838110156141ae5781548189015260018201915060208101905061418f565b838801955050505b50505092915050565b60006141cc600f83614bd4565b91506141d78261501c565b602082019050919050565b60006141ef602b83614bd4565b91506141fa82615045565b604082019050919050565b6000614212603283614bd4565b915061421d82615094565b604082019050919050565b6000614235602683614bd4565b9150614240826150e3565b604082019050919050565b6000614258601c83614bd4565b915061426382615132565b602082019050919050565b600061427b601c83614bd4565b91506142868261515b565b602082019050919050565b600061429e602483614bd4565b91506142a982615184565b604082019050919050565b60006142c1601983614bd4565b91506142cc826151d3565b602082019050919050565b60006142e4602383614bd4565b91506142ef826151fc565b604082019050919050565b6000614307602c83614bd4565b91506143128261524b565b604082019050919050565b600061432a603883614bd4565b91506143358261529a565b604082019050919050565b600061434d602a83614bd4565b9150614358826152e9565b604082019050919050565b6000614370602983614bd4565b915061437b82615338565b604082019050919050565b6000614393601f83614bd4565b915061439e82615387565b602082019050919050565b60006143b6602083614bd4565b91506143c1826153b0565b602082019050919050565b60006143d9601483614bd4565b91506143e4826153d9565b602082019050919050565b60006143fc602c83614bd4565b915061440782615402565b604082019050919050565b600061441f602083614bd4565b915061442a82615451565b602082019050919050565b6000614442602983614bd4565b915061444d8261547a565b604082019050919050565b6000614465602f83614bd4565b9150614470826154c9565b604082019050919050565b6000614488602183614bd4565b915061449382615518565b604082019050919050565b60006144ab601483614bd4565b91506144b682615567565b602082019050919050565b60006144ce600083614bc9565b91506144d982615590565b600082019050919050565b60006144f1601b83614bd4565b91506144fc82615593565b602082019050919050565b6000614514603183614bd4565b915061451f826155bc565b604082019050919050565b6000614537602c83614bd4565b91506145428261560b565b604082019050919050565b600061455a600e83614bd4565b91506145658261565a565b602082019050919050565b600061457d602c83614bd4565b915061458882615683565b604082019050919050565b60006145a0601383614bd4565b91506145ab826156d2565b602082019050919050565b6145bf81614d79565b82525050565b6145ce81614d79565b82525050565b60006145e0828461400a565b60148201915081905092915050565b60006145fb8285614140565b9150614607828461410f565b91508190509392505050565b600061461e826144c1565b9150819050919050565b600060208201905061463d6000830184613ffb565b92915050565b60006080820190506146586000830187613ffb565b6146656020830186613ffb565b61467260408301856145c5565b8181036060830152614684818461409d565b905095945050505050565b60006040820190506146a46000830185613ffb565b6146b160208301846145c5565b9392505050565b600060208201905081810360008301526146d28184614021565b905092915050565b60006020820190506146ef600083018461407f565b92915050565b600060208201905061470a600083018461408e565b92915050565b6000602082019050818103600083015261472a81846140d6565b905092915050565b6000602082019050818103600083015261474b816141bf565b9050919050565b6000602082019050818103600083015261476b816141e2565b9050919050565b6000602082019050818103600083015261478b81614205565b9050919050565b600060208201905081810360008301526147ab81614228565b9050919050565b600060208201905081810360008301526147cb8161424b565b9050919050565b600060208201905081810360008301526147eb8161426e565b9050919050565b6000602082019050818103600083015261480b81614291565b9050919050565b6000602082019050818103600083015261482b816142b4565b9050919050565b6000602082019050818103600083015261484b816142d7565b9050919050565b6000602082019050818103600083015261486b816142fa565b9050919050565b6000602082019050818103600083015261488b8161431d565b9050919050565b600060208201905081810360008301526148ab81614340565b9050919050565b600060208201905081810360008301526148cb81614363565b9050919050565b600060208201905081810360008301526148eb81614386565b9050919050565b6000602082019050818103600083015261490b816143a9565b9050919050565b6000602082019050818103600083015261492b816143cc565b9050919050565b6000602082019050818103600083015261494b816143ef565b9050919050565b6000602082019050818103600083015261496b81614412565b9050919050565b6000602082019050818103600083015261498b81614435565b9050919050565b600060208201905081810360008301526149ab81614458565b9050919050565b600060208201905081810360008301526149cb8161447b565b9050919050565b600060208201905081810360008301526149eb8161449e565b9050919050565b60006020820190508181036000830152614a0b816144e4565b9050919050565b60006020820190508181036000830152614a2b81614507565b9050919050565b60006020820190508181036000830152614a4b8161452a565b9050919050565b60006020820190508181036000830152614a6b8161454d565b9050919050565b60006020820190508181036000830152614a8b81614570565b9050919050565b60006020820190508181036000830152614aab81614593565b9050919050565b6000602082019050614ac760008301846145c5565b92915050565b6000614ad7614ae8565b9050614ae38282614df7565b919050565b6000604051905090565b600067ffffffffffffffff821115614b0d57614b0c614fb1565b5b614b1682614ffe565b9050602081019050919050565b600067ffffffffffffffff821115614b3e57614b3d614fb1565b5b614b4782614ffe565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bfb82614d79565b9150614c0683614d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c3b57614c3a614ec6565b5b828201905092915050565b6000614c5182614d79565b9150614c5c83614d79565b925082614c6c57614c6b614ef5565b5b828204905092915050565b6000614c8282614d79565b9150614c8d83614d79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cc657614cc5614ec6565b5b828202905092915050565b6000614cdc82614d79565b9150614ce783614d79565b925082821015614cfa57614cf9614ec6565b5b828203905092915050565b6000614d1082614d59565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614db0578082015181840152602081019050614d95565b83811115614dbf576000848401525b50505050565b60006002820490506001821680614ddd57607f821691505b60208210811415614df157614df0614f24565b5b50919050565b614e0082614ffe565b810181811067ffffffffffffffff82111715614e1f57614e1e614fb1565b5b80604052505050565b6000614e3382614d79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6657614e65614ec6565b5b600182019050919050565b6000614e7c82614e83565b9050919050565b6000614e8e8261500f565b9050919050565b6000614ea082614d79565b9150614eab83614d79565b925082614ebb57614eba614ef5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c696420616d6f756e742e0000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963206d696e74206e6f742073746172746564207965742e00000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e46547320617661696c61626c6520666f72206d6960008201527f6e742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374206d696e74206e6f742073746172746564207965742e00600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e7420737570706c7920726561636865642e000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520737570706c7920726561636865642e000000000000000000000000600082015250565b50565b7f4c696d697420706572206163636f756e742065786365656465642e0000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b7f53616c6520737570706c792063616e277420626520686967686572207468616e60008201527f206d617820737570706c792e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b61570481614d05565b811461570f57600080fd5b50565b61571b81614d17565b811461572657600080fd5b50565b61573281614d23565b811461573d57600080fd5b50565b61574981614d2d565b811461575457600080fd5b50565b61576081614d79565b811461576b57600080fd5b5056fea2646970667358221220df1bad0c7cd203f019ec163b5747cb59a572c122d78a43813a36d8feb1f32b7b64736f6c6343000807003368747470733a2f2f6d657461706967677962616e6b732e696f2f6170692f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063715018a61161015a578063b6a1dba1116100c1578063d5abeb011161007a578063d5abeb01146109f0578063dc53fd9214610a1b578063e985e9c514610a46578063f2fde38b14610a83578063f629c43014610aac578063fbd3970e14610ae957610293565b8063b6a1dba1146108d0578063b83f045c1461090d578063b88d4fde14610936578063c40800231461095f578063c87b56dd1461098a578063d31f9395146109c757610293565b80638e71e08f116101135780638e71e08f146107d457806395d89b41146107fd578063a22cb46514610828578063a402129914610851578063a611708e1461087c578063a96af0f4146108a557610293565b8063715018a6146106ec5780637cb64759146107035780637f37b9051461072c57806389476069146107575780638cccc67b146107805780638da5cb5b146107a957610293565b806335c6aaf8116101fe57806355f804b3116101b757806355f804b3146105c55780635d82cf6e146105ee5780635dc2ba39146106175780636352211e146106425780636a6278421461067f57806370a08231146106af57610293565b806335c6aaf8146104d15780633bc3c866146104fc5780633ccfd60b1461052557806342842e0e1461052f57806343508b05146105585780634f6ccce71461058857610293565b80630a916fd6116102505780630a916fd6146103ba57806318160ddd146103e557806323b872dd146104105780632904e6d9146104395780632eb4a7ab146104695780632f745c591461049457610293565b806301ffc9a71461029857806304db5eed146102d557806306fdde03146102fe578063081812fc14610329578063095ea7b31461036657806309a3a9c11461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613ea6565b610b26565b6040516102cc91906146da565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613f49565b610c70565b005b34801561030a57600080fd5b50610313610d3b565b6040516103209190614710565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613f49565b610dcd565b60405161035d9190614628565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613dac565b610e52565b005b34801561039b57600080fd5b506103a4610f6a565b6040516103b19190614ab2565b60405180910390f35b3480156103c657600080fd5b506103cf610f70565b6040516103dc9190614ab2565b60405180910390f35b3480156103f157600080fd5b506103fa610f76565b6040516104079190614ab2565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190613c96565b610f83565b005b610453600480360381019061044e9190613dec565b610fe3565b60405161046091906146b8565b60405180910390f35b34801561047557600080fd5b5061047e6113f0565b60405161048b91906146f5565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613dac565b6113f6565b6040516104c89190614ab2565b60405180910390f35b3480156104dd57600080fd5b506104e661149b565b6040516104f39190614ab2565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613f49565b6114a1565b005b61052d611527565b005b34801561053b57600080fd5b5061055660048036038101906105519190613c96565b611623565b005b610572600480360381019061056d9190613dac565b611643565b60405161057f91906146b8565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613f49565b611879565b6040516105bc9190614ab2565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613f00565b6118ea565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613f49565b611980565b005b34801561062357600080fd5b5061062c611a06565b6040516106399190614ab2565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190613f49565b611a0c565b6040516106769190614628565b60405180910390f35b61069960048036038101906106949190613c29565b611abe565b6040516106a69190614ab2565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613c29565b611bb1565b6040516106e39190614ab2565b60405180910390f35b3480156106f857600080fd5b50610701611c69565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613e79565b611cf1565b005b34801561073857600080fd5b50610741611d77565b60405161074e9190614ab2565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190613c29565b611d88565b005b34801561078c57600080fd5b506107a760048036038101906107a29190613f49565b611f73565b005b3480156107b557600080fd5b506107be611ff9565b6040516107cb9190614628565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190613f49565b612022565b005b34801561080957600080fd5b506108126120a8565b60405161081f9190614710565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613d6c565b61213a565b005b34801561085d57600080fd5b50610866612150565b6040516108739190614ab2565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613f49565b612156565b005b3480156108b157600080fd5b506108ba6121dc565b6040516108c79190614ab2565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190613c29565b6121e2565b6040516109049190614ab2565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190613f49565b612270565b005b34801561094257600080fd5b5061095d60048036038101906109589190613ce9565b6122f6565b005b34801561096b57600080fd5b50610974612358565b6040516109819190614ab2565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190613f49565b61235e565b6040516109be9190614710565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190613f49565b612406565b005b3480156109fc57600080fd5b50610a0561248c565b604051610a129190614ab2565b60405180910390f35b348015610a2757600080fd5b50610a30612492565b604051610a3d9190614ab2565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190613c56565b612498565b604051610a7a91906146da565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613c29565b61252c565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190613fa3565b612624565b604051610ae09190614ab2565b60405180910390f35b348015610af557600080fd5b50610b106004803603810190610b0b9190613dac565b612649565b604051610b1d91906146b8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c5957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c695750610c68826127a8565b5b9050919050565b610c78612812565b73ffffffffffffffffffffffffffffffffffffffff16610c96611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390614952565b60405180910390fd5b601054811115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614a72565b60405180910390fd5b8060118190555050565b606060018054610d4a90614dc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690614dc5565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b6000610dd88261281a565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614932565b60405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e5d82611a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec5906149b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eed612812565b73ffffffffffffffffffffffffffffffffffffffff161480610f1c5750610f1b81610f16612812565b612498565b5b610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5290614872565b60405180910390fd5b610f658383612886565b505050565b60145481565b600e5481565b6000600880549050905090565b610f94610f8e612812565b8261293f565b610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614a12565b60405180910390fd5b610fde838383612a1d565b505050565b6060600f544211611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906148d2565b60405180910390fd5b6000821161106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390614732565b60405180910390fd5b6011548261107a600d612c79565b6110849190614bf0565b11156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614832565b60405180910390fd5b816013546110d39190614c77565b341015611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614a92565b60405180910390fd5b600061111f612812565b60405160200161112f91906145d4565b604051602081830303815290604052805190602001209050611195858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483612c87565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90614a52565b60405180910390fd5b6017548360186000601654815260200190815260200160002060006111f7612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461123c9190614bf0565b111561127d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611274906149f2565b60405180910390fd5b82601860006016548152602001908152602001600020600061129d612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112e29190614bf0565b6018600060165481526020019081526020016000206000611301612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008367ffffffffffffffff81111561135b5761135a614fb1565b5b6040519080825280602002602001820160405280156113895781602001602082028036833780820191505090505b50905060005b848110156113e3576113a1600d612c9e565b6113b16113ac612812565b612cb4565b8282815181106113c4576113c3614f82565b5b60200260200101818152505080806113db90614e28565b91505061138f565b5080925050509392505050565b60155481565b600061140183611bb1565b8210611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614752565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60135481565b6114a9612812565b73ffffffffffffffffffffffffffffffffffffffff166114c7611ff9565b73ffffffffffffffffffffffffffffffffffffffff161461151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614952565b60405180910390fd5b80600e8190555050565b61152f612812565b73ffffffffffffffffffffffffffffffffffffffff1661154d611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614952565b60405180910390fd5b60006115ad611ff9565b73ffffffffffffffffffffffffffffffffffffffff16476040516115d090614613565b60006040518083038185875af1925050503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b505090508061162057600080fd5b50565b61163e838383604051806020016040528060008152506122f6565b505050565b6060600e5442101561168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906147d2565b60405180910390fd5b601154611697600d612c79565b106116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906149d2565b60405180910390fd5b601154826116e5600d612c79565b6116ef9190614bf0565b1115611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790614832565b60405180910390fd5b60008211801561174257506014548211155b611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614732565b60405180910390fd5b8160125461178f9190614c77565b3410156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614a92565b60405180910390fd5b60008267ffffffffffffffff8111156117ed576117ec614fb1565b5b60405190808252806020026020018201604052801561181b5781602001602082028036833780820191505090505b50905060005b8381101561186e57611833600d612c9e565b61183c85612cb4565b82828151811061184f5761184e614f82565b5b602002602001018181525050808061186690614e28565b915050611821565b508091505092915050565b6000611883610f76565b82106118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90614a32565b60405180910390fd5b600882815481106118d8576118d7614f82565b5b90600052602060002001549050919050565b6118f2612812565b73ffffffffffffffffffffffffffffffffffffffff16611910611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614952565b60405180910390fd5b806003908051906020019061197c9291906139a8565b5050565b611988612812565b73ffffffffffffffffffffffffffffffffffffffff166119a6611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390614952565b60405180910390fd5b8060128190555050565b600f5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac906148b2565b60405180910390fd5b80915050919050565b6000600e54421015611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc906147d2565b60405180910390fd5b601154611b12600d612c79565b10611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906149d2565b60405180910390fd5b601254341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614a92565b60405180910390fd5b611ba1600d612c9e565b611baa82612cb4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990614892565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c71612812565b73ffffffffffffffffffffffffffffffffffffffff16611c8f611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90614952565b60405180910390fd5b611cef6000612d2e565b565b611cf9612812565b73ffffffffffffffffffffffffffffffffffffffff16611d17611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490614952565b60405180910390fd5b8060158190555050565b6000611d83600d612c79565b905090565b611d90612812565b73ffffffffffffffffffffffffffffffffffffffff16611dae611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614952565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e449190614628565b60206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e949190613f76565b905060008111611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614a92565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611efd611ff9565b836040518363ffffffff1660e01b8152600401611f1b92919061468f565b602060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190613e4c565b50505050565b611f7b612812565b73ffffffffffffffffffffffffffffffffffffffff16611f99611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614952565b60405180910390fd5b80600f8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61202a612812565b73ffffffffffffffffffffffffffffffffffffffff16612048611ff9565b73ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590614952565b60405180910390fd5b8060178190555050565b6060600280546120b790614dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546120e390614dc5565b80156121305780601f1061210557610100808354040283529160200191612130565b820191906000526020600020905b81548152906001019060200180831161211357829003601f168201915b5050505050905090565b61214c612145612812565b8383612df2565b5050565b60165481565b61215e612812565b73ffffffffffffffffffffffffffffffffffffffff1661217c611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c990614952565b60405180910390fd5b8060138190555050565b60115481565b60006121ec612812565b73ffffffffffffffffffffffffffffffffffffffff1661220a611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614952565b60405180910390fd5b61226982612cb4565b9050919050565b612278612812565b73ffffffffffffffffffffffffffffffffffffffff16612296611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390614952565b60405180910390fd5b8060168190555050565b612307612301612812565b8361293f565b612346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d90614a12565b60405180910390fd5b61235284848484612f5f565b50505050565b60175481565b60606123698261281a565b6123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614992565b60405180910390fd5b6000600380546123b790614dc5565b9050116123d357604051806020016040528060008152506123ff565b60036123de83612fbb565b6040516020016123ef9291906145ef565b6040516020818303038152906040525b9050919050565b61240e612812565b73ffffffffffffffffffffffffffffffffffffffff1661242c611ff9565b73ffffffffffffffffffffffffffffffffffffffff1614612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990614952565b60405180910390fd5b8060148190555050565b60105481565b60125481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612534612812565b73ffffffffffffffffffffffffffffffffffffffff16612552611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f90614952565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614792565b60405180910390fd5b61262181612d2e565b50565b6018602052816000526040600020602052806000526040600020600091509150505481565b6060612653612812565b73ffffffffffffffffffffffffffffffffffffffff16612671611ff9565b73ffffffffffffffffffffffffffffffffffffffff16146126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be90614952565b60405180910390fd5b6000821161270a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270190614732565b60405180910390fd5b60008267ffffffffffffffff81111561272657612725614fb1565b5b6040519080825280602002602001820160405280156127545781602001602082028036833780820191505090505b50905060005b8381101561279d5761276b85612cb4565b82828151811061277e5761277d614f82565b5b602002602001018181525050808061279590614e28565b91505061275a565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128f983611a0c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061294a8261281a565b612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090614852565b60405180910390fd5b600061299483611a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0357508373ffffffffffffffffffffffffffffffffffffffff166129eb84610dcd565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a145750612a138185612498565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a3d82611a0c565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614972565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa906147f2565b60405180910390fd5b612b0e83838361311c565b612b19600082612886565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b699190614cd1565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc09190614bf0565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b600082612c948584613225565b1490509392505050565b6001816000016000828254019250508190555050565b6000601054612cc3600c612c79565b10612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa90614912565b60405180910390fd5b612d0d600c612c9e565b6000612d19600c612c79565b9050612d25838261329a565b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890614812565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f5291906146da565b60405180910390a3505050565b612f6a848484612a1d565b612f76848484846132b8565b612fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fac90614772565b60405180910390fd5b50505050565b60606000821415613003576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613117565b600082905060005b6000821461303557808061301e90614e28565b915050600a8261302e9190614c46565b915061300b565b60008167ffffffffffffffff81111561305157613050614fb1565b5b6040519080825280601f01601f1916602001820160405280156130835781602001600182028036833780820191505090505b5090505b600085146131105760018261309c9190614cd1565b9150600a856130ab9190614e95565b60306130b79190614bf0565b60f81b8183815181106130cd576130cc614f82565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131099190614c46565b9450613087565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561315f5761315a8161344f565b61319e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461319d5761319c8382613498565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131e1576131dc81613605565b613220565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461321f5761321e82826136d6565b5b5b505050565b60008082905060005b845181101561328f57600085828151811061324c5761324b614f82565b5b6020026020010151905080831161326e576132678382613755565b925061327b565b6132788184613755565b92505b50808061328790614e28565b91505061322e565b508091505092915050565b6132b482826040518060200160405280600081525061376c565b5050565b60006132d98473ffffffffffffffffffffffffffffffffffffffff166137c7565b15613442578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613302612812565b8786866040518563ffffffff1660e01b81526004016133249493929190614643565b602060405180830381600087803b15801561333e57600080fd5b505af192505050801561336f57506040513d601f19601f8201168201806040525081019061336c9190613ed3565b60015b6133f2573d806000811461339f576040519150601f19603f3d011682016040523d82523d6000602084013e6133a4565b606091505b506000815114156133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190614772565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613447565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134a584611bb1565b6134af9190614cd1565b9050600060076000848152602001908152602001600020549050818114613594576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136199190614cd1565b905060006009600084815260200190815260200160002054905060006008838154811061364957613648614f82565b5b90600052602060002001549050806008838154811061366b5761366a614f82565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136ba576136b9614f53565b5b6001900381819060005260206000200160009055905550505050565b60006136e183611bb1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b61377683836137da565b61378360008484846132b8565b6137c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b990614772565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561384a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613841906148f2565b60405180910390fd5b6138538161281a565b15613893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388a906147b2565b60405180910390fd5b61389f6000838361311c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138ef9190614bf0565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139b490614dc5565b90600052602060002090601f0160209004810192826139d65760008555613a1d565b82601f106139ef57805160ff1916838001178555613a1d565b82800160010185558215613a1d579182015b82811115613a1c578251825591602001919060010190613a01565b5b509050613a2a9190613a2e565b5090565b5b80821115613a47576000816000905550600101613a2f565b5090565b6000613a5e613a5984614af2565b614acd565b905082815260208101848484011115613a7a57613a79614fef565b5b613a85848285614d83565b509392505050565b6000613aa0613a9b84614b23565b614acd565b905082815260208101848484011115613abc57613abb614fef565b5b613ac7848285614d83565b509392505050565b600081359050613ade816156fb565b92915050565b60008083601f840112613afa57613af9614fe5565b5b8235905067ffffffffffffffff811115613b1757613b16614fe0565b5b602083019150836020820283011115613b3357613b32614fea565b5b9250929050565b600081359050613b4981615712565b92915050565b600081519050613b5e81615712565b92915050565b600081359050613b7381615729565b92915050565b600081359050613b8881615740565b92915050565b600081519050613b9d81615740565b92915050565b600082601f830112613bb857613bb7614fe5565b5b8135613bc8848260208601613a4b565b91505092915050565b600082601f830112613be657613be5614fe5565b5b8135613bf6848260208601613a8d565b91505092915050565b600081359050613c0e81615757565b92915050565b600081519050613c2381615757565b92915050565b600060208284031215613c3f57613c3e614ff9565b5b6000613c4d84828501613acf565b91505092915050565b60008060408385031215613c6d57613c6c614ff9565b5b6000613c7b85828601613acf565b9250506020613c8c85828601613acf565b9150509250929050565b600080600060608486031215613caf57613cae614ff9565b5b6000613cbd86828701613acf565b9350506020613cce86828701613acf565b9250506040613cdf86828701613bff565b9150509250925092565b60008060008060808587031215613d0357613d02614ff9565b5b6000613d1187828801613acf565b9450506020613d2287828801613acf565b9350506040613d3387828801613bff565b925050606085013567ffffffffffffffff811115613d5457613d53614ff4565b5b613d6087828801613ba3565b91505092959194509250565b60008060408385031215613d8357613d82614ff9565b5b6000613d9185828601613acf565b9250506020613da285828601613b3a565b9150509250929050565b60008060408385031215613dc357613dc2614ff9565b5b6000613dd185828601613acf565b9250506020613de285828601613bff565b9150509250929050565b600080600060408486031215613e0557613e04614ff9565b5b600084013567ffffffffffffffff811115613e2357613e22614ff4565b5b613e2f86828701613ae4565b93509350506020613e4286828701613bff565b9150509250925092565b600060208284031215613e6257613e61614ff9565b5b6000613e7084828501613b4f565b91505092915050565b600060208284031215613e8f57613e8e614ff9565b5b6000613e9d84828501613b64565b91505092915050565b600060208284031215613ebc57613ebb614ff9565b5b6000613eca84828501613b79565b91505092915050565b600060208284031215613ee957613ee8614ff9565b5b6000613ef784828501613b8e565b91505092915050565b600060208284031215613f1657613f15614ff9565b5b600082013567ffffffffffffffff811115613f3457613f33614ff4565b5b613f4084828501613bd1565b91505092915050565b600060208284031215613f5f57613f5e614ff9565b5b6000613f6d84828501613bff565b91505092915050565b600060208284031215613f8c57613f8b614ff9565b5b6000613f9a84828501613c14565b91505092915050565b60008060408385031215613fba57613fb9614ff9565b5b6000613fc885828601613bff565b9250506020613fd985828601613acf565b9150509250929050565b6000613fef83836145b6565b60208301905092915050565b61400481614d05565b82525050565b61401b61401682614d05565b614e71565b82525050565b600061402c82614b79565b6140368185614ba7565b935061404183614b54565b8060005b838110156140725781516140598882613fe3565b975061406483614b9a565b925050600181019050614045565b5085935050505092915050565b61408881614d17565b82525050565b61409781614d23565b82525050565b60006140a882614b84565b6140b28185614bb8565b93506140c2818560208601614d92565b6140cb81614ffe565b840191505092915050565b60006140e182614b8f565b6140eb8185614bd4565b93506140fb818560208601614d92565b61410481614ffe565b840191505092915050565b600061411a82614b8f565b6141248185614be5565b9350614134818560208601614d92565b80840191505092915050565b6000815461414d81614dc5565b6141578186614be5565b945060018216600081146141725760018114614183576141b6565b60ff198316865281860193506141b6565b61418c85614b64565b60005b838110156141ae5781548189015260018201915060208101905061418f565b838801955050505b50505092915050565b60006141cc600f83614bd4565b91506141d78261501c565b602082019050919050565b60006141ef602b83614bd4565b91506141fa82615045565b604082019050919050565b6000614212603283614bd4565b915061421d82615094565b604082019050919050565b6000614235602683614bd4565b9150614240826150e3565b604082019050919050565b6000614258601c83614bd4565b915061426382615132565b602082019050919050565b600061427b601c83614bd4565b91506142868261515b565b602082019050919050565b600061429e602483614bd4565b91506142a982615184565b604082019050919050565b60006142c1601983614bd4565b91506142cc826151d3565b602082019050919050565b60006142e4602383614bd4565b91506142ef826151fc565b604082019050919050565b6000614307602c83614bd4565b91506143128261524b565b604082019050919050565b600061432a603883614bd4565b91506143358261529a565b604082019050919050565b600061434d602a83614bd4565b9150614358826152e9565b604082019050919050565b6000614370602983614bd4565b915061437b82615338565b604082019050919050565b6000614393601f83614bd4565b915061439e82615387565b602082019050919050565b60006143b6602083614bd4565b91506143c1826153b0565b602082019050919050565b60006143d9601483614bd4565b91506143e4826153d9565b602082019050919050565b60006143fc602c83614bd4565b915061440782615402565b604082019050919050565b600061441f602083614bd4565b915061442a82615451565b602082019050919050565b6000614442602983614bd4565b915061444d8261547a565b604082019050919050565b6000614465602f83614bd4565b9150614470826154c9565b604082019050919050565b6000614488602183614bd4565b915061449382615518565b604082019050919050565b60006144ab601483614bd4565b91506144b682615567565b602082019050919050565b60006144ce600083614bc9565b91506144d982615590565b600082019050919050565b60006144f1601b83614bd4565b91506144fc82615593565b602082019050919050565b6000614514603183614bd4565b915061451f826155bc565b604082019050919050565b6000614537602c83614bd4565b91506145428261560b565b604082019050919050565b600061455a600e83614bd4565b91506145658261565a565b602082019050919050565b600061457d602c83614bd4565b915061458882615683565b604082019050919050565b60006145a0601383614bd4565b91506145ab826156d2565b602082019050919050565b6145bf81614d79565b82525050565b6145ce81614d79565b82525050565b60006145e0828461400a565b60148201915081905092915050565b60006145fb8285614140565b9150614607828461410f565b91508190509392505050565b600061461e826144c1565b9150819050919050565b600060208201905061463d6000830184613ffb565b92915050565b60006080820190506146586000830187613ffb565b6146656020830186613ffb565b61467260408301856145c5565b8181036060830152614684818461409d565b905095945050505050565b60006040820190506146a46000830185613ffb565b6146b160208301846145c5565b9392505050565b600060208201905081810360008301526146d28184614021565b905092915050565b60006020820190506146ef600083018461407f565b92915050565b600060208201905061470a600083018461408e565b92915050565b6000602082019050818103600083015261472a81846140d6565b905092915050565b6000602082019050818103600083015261474b816141bf565b9050919050565b6000602082019050818103600083015261476b816141e2565b9050919050565b6000602082019050818103600083015261478b81614205565b9050919050565b600060208201905081810360008301526147ab81614228565b9050919050565b600060208201905081810360008301526147cb8161424b565b9050919050565b600060208201905081810360008301526147eb8161426e565b9050919050565b6000602082019050818103600083015261480b81614291565b9050919050565b6000602082019050818103600083015261482b816142b4565b9050919050565b6000602082019050818103600083015261484b816142d7565b9050919050565b6000602082019050818103600083015261486b816142fa565b9050919050565b6000602082019050818103600083015261488b8161431d565b9050919050565b600060208201905081810360008301526148ab81614340565b9050919050565b600060208201905081810360008301526148cb81614363565b9050919050565b600060208201905081810360008301526148eb81614386565b9050919050565b6000602082019050818103600083015261490b816143a9565b9050919050565b6000602082019050818103600083015261492b816143cc565b9050919050565b6000602082019050818103600083015261494b816143ef565b9050919050565b6000602082019050818103600083015261496b81614412565b9050919050565b6000602082019050818103600083015261498b81614435565b9050919050565b600060208201905081810360008301526149ab81614458565b9050919050565b600060208201905081810360008301526149cb8161447b565b9050919050565b600060208201905081810360008301526149eb8161449e565b9050919050565b60006020820190508181036000830152614a0b816144e4565b9050919050565b60006020820190508181036000830152614a2b81614507565b9050919050565b60006020820190508181036000830152614a4b8161452a565b9050919050565b60006020820190508181036000830152614a6b8161454d565b9050919050565b60006020820190508181036000830152614a8b81614570565b9050919050565b60006020820190508181036000830152614aab81614593565b9050919050565b6000602082019050614ac760008301846145c5565b92915050565b6000614ad7614ae8565b9050614ae38282614df7565b919050565b6000604051905090565b600067ffffffffffffffff821115614b0d57614b0c614fb1565b5b614b1682614ffe565b9050602081019050919050565b600067ffffffffffffffff821115614b3e57614b3d614fb1565b5b614b4782614ffe565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bfb82614d79565b9150614c0683614d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c3b57614c3a614ec6565b5b828201905092915050565b6000614c5182614d79565b9150614c5c83614d79565b925082614c6c57614c6b614ef5565b5b828204905092915050565b6000614c8282614d79565b9150614c8d83614d79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cc657614cc5614ec6565b5b828202905092915050565b6000614cdc82614d79565b9150614ce783614d79565b925082821015614cfa57614cf9614ec6565b5b828203905092915050565b6000614d1082614d59565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614db0578082015181840152602081019050614d95565b83811115614dbf576000848401525b50505050565b60006002820490506001821680614ddd57607f821691505b60208210811415614df157614df0614f24565b5b50919050565b614e0082614ffe565b810181811067ffffffffffffffff82111715614e1f57614e1e614fb1565b5b80604052505050565b6000614e3382614d79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6657614e65614ec6565b5b600182019050919050565b6000614e7c82614e83565b9050919050565b6000614e8e8261500f565b9050919050565b6000614ea082614d79565b9150614eab83614d79565b925082614ebb57614eba614ef5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c696420616d6f756e742e0000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963206d696e74206e6f742073746172746564207965742e00000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e46547320617661696c61626c6520666f72206d6960008201527f6e742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374206d696e74206e6f742073746172746564207965742e00600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e7420737570706c7920726561636865642e000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520737570706c7920726561636865642e000000000000000000000000600082015250565b50565b7f4c696d697420706572206163636f756e742065786365656465642e0000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b7f53616c6520737570706c792063616e277420626520686967686572207468616e60008201527f206d617820737570706c792e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b61570481614d05565b811461570f57600080fd5b50565b61571b81614d17565b811461572657600080fd5b50565b61573281614d23565b811461573d57600080fd5b50565b61574981614d2d565b811461575457600080fd5b50565b61576081614d79565b811461576b57600080fd5b5056fea2646970667358221220df1bad0c7cd203f019ec163b5747cb59a572c122d78a43813a36d8feb1f32b7b64736f6c63430008070033

Deployed Bytecode Sourcemap

42469:5391:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26056:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43499:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26982:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28991:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28556:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42982:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42702:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28113:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29695:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45655:1049;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43020:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27799:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42929:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43219:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47412:157;;;:::i;:::-;;30069:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44928:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28289:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27622:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43693:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42752:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26698:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44566:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26446:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21168:97;;;;;;;;;;;;;:::i;:::-;;44071:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44461:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47575:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43353:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20557:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44299:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27137:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29266:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43056:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43819:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42843:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46710:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44177:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30297:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43094:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27298:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43957:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42807:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42879:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29478:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21410:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43142:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46815:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26056:334;26158:4;26198:25;26183:40;;;:11;:40;;;;:97;;;;26247:33;26232:48;;;:11;:48;;;;26183:97;:156;;;;26304:35;26289:50;;;:11;:50;;;;26183:156;:201;;;;26348:36;26372:11;26348:23;:36::i;:::-;26183:201;26171:213;;26056:334;;;:::o;43499:188::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43592:9:::1;;43577:11;:24;;43569:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43670:11;43657:10;:24;;;;43499:188:::0;:::o;26982:94::-;27036:13;27065:5;27058:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26982:94;:::o;28991:211::-;29067:7;29091:16;29099:7;29091;:16::i;:::-;29083:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29172:15;:24;29188:7;29172:24;;;;;;;;;;;;;;;;;;;;;29165:31;;28991:211;;;:::o;28556:377::-;28633:13;28649:23;28664:7;28649:14;:23::i;:::-;28633:39;;28693:5;28687:11;;:2;:11;;;;28679:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28777:5;28761:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28786:37;28803:5;28810:12;:10;:12::i;:::-;28786:16;:37::i;:::-;28761:62;28745:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;28906:21;28915:2;28919:7;28906:8;:21::i;:::-;28626:307;28556:377;;:::o;42982:31::-;;;;:::o;42702:45::-;;;;:::o;28113:107::-;28174:7;28197:10;:17;;;;28190:24;;28113:107;:::o;29695:311::-;29868:41;29887:12;:10;:12::i;:::-;29901:7;29868:18;:41::i;:::-;29860:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29972:28;29982:4;29988:2;29992:7;29972:9;:28::i;:::-;29695:311;;;:::o;45655:1049::-;45752:16;45803:20;;45785:15;:38;45777:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;45883:1;45874:6;:10;45866:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45955:10;;45945:6;45919:23;:13;:21;:23::i;:::-;:32;;;;:::i;:::-;:46;;45911:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;46054:6;46033:18;;:27;;;;:::i;:::-;46020:9;:40;;46012:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46093:12;46135;:10;:12::i;:::-;46118:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;46108:41;;;;;;46093:56;;46164:49;46183:11;;46164:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46196:10;;46208:4;46164:18;:49::i;:::-;46156:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46307:24;;46297:6;46249:15;:31;46265:14;;46249:31;;;;;;;;;;;:45;46281:12;:10;:12::i;:::-;46249:45;;;;;;;;;;;;;;;;:54;;;;:::i;:::-;:82;;46241:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;46466:6;46418:15;:31;46434:14;;46418:31;;;;;;;;;;;:45;46450:12;:10;:12::i;:::-;46418:45;;;;;;;;;;;;;;;;:54;;;;:::i;:::-;46370:15;:31;46386:14;;46370:31;;;;;;;;;;;:45;46402:12;:10;:12::i;:::-;46370:45;;;;;;;;;;;;;;;:102;;;;46481:29;46527:6;46513:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46481:53;;46548:9;46543:128;46567:6;46563:1;:10;46543:128;;;46589:25;:13;:23;:25::i;:::-;46641:22;46650:12;:10;:12::i;:::-;46641:8;:22::i;:::-;46623:12;46636:1;46623:15;;;;;;;;:::i;:::-;;;;;;;:40;;;;;46575:3;;;;;:::i;:::-;;;;46543:128;;;;46686:12;46679:19;;;;45655:1049;;;;;:::o;43020:31::-;;;;:::o;27799:246::-;27896:7;27928:23;27945:5;27928:16;:23::i;:::-;27920:5;:31;27912:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:12;:19;28026:5;28013:19;;;;;;;;;;;;;;;:26;28033:5;28013:26;;;;;;;;;;;;28006:33;;27799:246;;;;:::o;42929:48::-;;;;:::o;43219:128::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43323:18:::1;43303:17;:38;;;;43219:128:::0;:::o;47412:157::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47467:12:::1;47493:7;:5;:7::i;:::-;47485:21;;47514;47485:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47466:74;;;47555:7;47547:16;;;::::0;::::1;;47459:110;47412:157::o:0;30069:165::-;30189:39;30206:4;30212:2;30216:7;30189:39;;;;;;;;;;;;:16;:39::i;:::-;30069:165;;;:::o;44928:721::-;45001:16;45053:17;;45034:15;:36;;45026:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45144:10;;45118:23;:13;:21;:23::i;:::-;:36;45110:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45230:10;;45220:6;45194:23;:13;:21;:23::i;:::-;:32;;;;:::i;:::-;:46;;45186:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;45304:1;45295:6;:10;:36;;;;;45319:12;;45309:6;:22;;45295:36;45287:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45397:6;45379:15;;:24;;;;:::i;:::-;45366:9;:37;;45358:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45436:29;45482:6;45468:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45436:53;;45503:9;45498:118;45522:6;45518:1;:10;45498:118;;;45544:25;:13;:23;:25::i;:::-;45596:12;45605:2;45596:8;:12::i;:::-;45578;45591:1;45578:15;;;;;;;;:::i;:::-;;;;;;;:30;;;;;45530:3;;;;;:::i;:::-;;;;45498:118;;;;45631:12;45624:19;;;44928:721;;;;:::o;28289:213::-;28364:7;28396:20;:18;:20::i;:::-;28388:5;:28;28380:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28479:10;28490:5;28479:17;;;;;;;;:::i;:::-;;;;;;;;;;28472:24;;28289:213;;;:::o;27622:101::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27709:8:::1;27698;:19;;;;;;;;;;;;:::i;:::-;;27622:101:::0;:::o;43693:120::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43791:16:::1;43773:15;:34;;;;43693:120:::0;:::o;42752:48::-;;;;:::o;26698:225::-;26770:7;26786:13;26802:7;:16;26810:7;26802:16;;;;;;;;;;;;;;;;;;;;;26786:32;;26850:1;26833:19;;:5;:19;;;;26825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26912:5;26905:12;;;26698:225;;;:::o;44566:356::-;44618:7;44661:17;;44642:15;:36;;44634:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44752:10;;44726:23;:13;:21;:23::i;:::-;:36;44718:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44815:15;;44802:9;:28;;44794:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44863:25;:13;:23;:25::i;:::-;44904:12;44913:2;44904:8;:12::i;:::-;44897:19;;44566:356;;;:::o;26446:198::-;26518:7;26559:1;26542:19;;:5;:19;;;;26534:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26622:9;:16;26632:5;26622:16;;;;;;;;;;;;;;;;26615:23;;26446:198;;;:::o;21168:97::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21229:30:::1;21256:1;21229:18;:30::i;:::-;21168:97::o:0;44071:100::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44154:11:::1;44141:10;:24;;;;44071:100:::0;:::o;44461:99::-;44508:7;44531:23;:13;:21;:23::i;:::-;44524:30;;44461:99;:::o;47575:282::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47646:20:::1;47676:12;47646:43;;47696:15;47714:13;:23;;;47746:4;47714:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47696:56;;47777:1;47767:7;:11;47759:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47811:13;:22;;;47834:7;:5;:7::i;:::-;47843;47811:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47639:218;;47575:282:::0;:::o;43353:140::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43466:21:::1;43443:20;:44;;;;43353:140:::0;:::o;20557:81::-;20603:7;20626:6;;;;;;;;;;;20619:13;;20557:81;:::o;44299:156::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44424:25:::1;44397:24;:52;;;;44299:156:::0;:::o;27137:98::-;27193:13;27222:7;27215:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27137:98;:::o;29266:149::-;29357:52;29376:12;:10;:12::i;:::-;29390:8;29400;29357:18;:52::i;:::-;29266:149;;:::o;43056:33::-;;;;:::o;43819:132::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43926:19:::1;43905:18;:40;;;;43819:132:::0;:::o;42843:31::-;;;;:::o;46710:99::-;46768:7;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46791:12:::1;46800:2;46791:8;:12::i;:::-;46784:19;;46710:99:::0;;;:::o;44177:116::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44272:15:::1;44255:14;:32;;;;44177:116:::0;:::o;30297:300::-;30450:41;30469:12;:10;:12::i;:::-;30483:7;30450:18;:41::i;:::-;30442:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30552:39;30566:4;30572:2;30576:7;30585:5;30552:13;:39::i;:::-;30297:300;;;;:::o;43094:43::-;;;;:::o;27298:281::-;27371:13;27401:16;27409:7;27401;:16::i;:::-;27393:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27510:1;27491:8;27485:22;;;;;:::i;:::-;;;:26;:88;;;;;;;;;;;;;;;;;27538:8;27548:18;:7;:16;:18::i;:::-;27521:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27485:88;27478:95;;27298:281;;;:::o;43957:108::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44046:13:::1;44031:12;:28;;;;43957:108:::0;:::o;42807:31::-;;;;:::o;42879:45::-;;;;:::o;29478:158::-;29575:4;29595:18;:25;29614:5;29595:25;;;;;;;;;;;;;;;:35;29621:8;29595:35;;;;;;;;;;;;;;;;;;;;;;;;;29588:42;;29478:158;;;;:::o;21410:191::-;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21515:1:::1;21495:22;;:8;:22;;;;21487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21567:28;21586:8;21567:18;:28::i;:::-;21410:191:::0;:::o;43142:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46815:330::-;46894:16;20770:12;:10;:12::i;:::-;20759:23;;:7;:5;:7::i;:::-;:23;;;20751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46936:1:::1;46927:6;:10;46919:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46966:29;47012:6;46998:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46966:53;;47033:9;47028:84;47052:6;47048:1;:10;47028:84;;;47092:12;47101:2;47092:8;:12::i;:::-;47074;47087:1;47074:15;;;;;;;;:::i;:::-;;;;;;;:30;;;::::0;::::1;47060:3;;;;;:::i;:::-;;;;47028:84;;;;47127:12;47120:19;;;46815:330:::0;;;;:::o;1566:151::-;1651:4;1686:25;1671:40;;;:11;:40;;;;1664:47;;1566:151;;;:::o;15601:92::-;15654:7;15677:10;15670:17;;15601:92;:::o;32023:121::-;32088:4;32136:1;32108:30;;:7;:16;32116:7;32108:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32101:37;;32023:121;;;:::o;35699:164::-;35797:2;35770:15;:24;35786:7;35770:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35849:7;35845:2;35811:46;;35820:23;35835:7;35820:14;:23::i;:::-;35811:46;;;;;;;;;;;;35699:164;;:::o;32295:334::-;32388:4;32409:16;32417:7;32409;:16::i;:::-;32401:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32481:13;32497:23;32512:7;32497:14;:23::i;:::-;32481:39;;32546:5;32535:16;;:7;:16;;;:51;;;;32579:7;32555:31;;:20;32567:7;32555:11;:20::i;:::-;:31;;;32535:51;:87;;;;32590:32;32607:5;32614:7;32590:16;:32::i;:::-;32535:87;32527:96;;;32295:334;;;;:::o;35067:526::-;35208:4;35181:31;;:23;35196:7;35181:14;:23::i;:::-;:31;;;35173:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35287:1;35273:16;;:2;:16;;;;35265:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35339:39;35360:4;35366:2;35370:7;35339:20;:39::i;:::-;35435:29;35452:1;35456:7;35435:8;:29::i;:::-;35492:1;35473:9;:15;35483:4;35473:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35517:1;35500:9;:13;35510:2;35500:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35544:2;35525:7;:16;35533:7;35525:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35579:7;35575:2;35560:27;;35569:4;35560:27;;;;;;;;;;;;35067:526;;;:::o;18293:108::-;18358:7;18381;:14;;;18374:21;;18293:108;;;:::o;22961:170::-;23072:4;23121;23092:25;23105:5;23112:4;23092:12;:25::i;:::-;:33;23085:40;;22961:170;;;;;:::o;18407:105::-;18500:1;18482:7;:14;;;:19;;;;;;;;;;;18407:105;:::o;47151:255::-;47198:7;47244:9;;47222:19;:9;:17;:19::i;:::-;:31;47214:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;47287:21;:9;:19;:21::i;:::-;47317:13;47333:19;:9;:17;:19::i;:::-;47317:35;;47359:20;47369:2;47373:5;47359:9;:20::i;:::-;47395:5;47388:12;;;47151:255;;;:::o;21751:177::-;21821:16;21840:6;;;;;;;;;;;21821:25;;21862:8;21853:6;;:17;;;;;;;;;;;;;;;;;;21913:8;21882:40;;21903:8;21882:40;;;;;;;;;;;;21814:114;21751:177;:::o;35993:287::-;36130:8;36121:17;;:5;:17;;;;36113:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36213:8;36175:18;:25;36194:5;36175:25;;;;;;;;;;;;;;;:35;36201:8;36175:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36255:8;36233:41;;36248:5;36233:41;;;36265:8;36233:41;;;;;;:::i;:::-;;;;;;;;35993:287;;;:::o;31441:::-;31576:28;31586:4;31592:2;31596:7;31576:9;:28::i;:::-;31619:48;31642:4;31648:2;31652:7;31661:5;31619:22;:48::i;:::-;31611:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31441:287;;;;:::o;16017:637::-;16073:13;16291:1;16282:5;:10;16278:43;;;16303:10;;;;;;;;;;;;;;;;;;;;;16278:43;16327:12;16342:5;16327:20;;16354:14;16375:62;16390:1;16382:4;:9;16375:62;;16402:8;;;;;:::i;:::-;;;;16427:2;16419:10;;;;;:::i;:::-;;;16375:62;;;16443:19;16475:6;16465:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16443:39;;16489:132;16505:1;16496:5;:10;16489:132;;16527:1;16517:11;;;;;:::i;:::-;;;16588:2;16580:5;:10;;;;:::i;:::-;16567:2;:24;;;;:::i;:::-;16554:39;;16537:6;16544;16537:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16611:2;16602:11;;;;;:::i;:::-;;;16489:132;;;16641:6;16627:21;;;;;16017:637;;;;:::o;38073:458::-;38210:1;38194:18;;:4;:18;;;38190:167;;;38223:40;38255:7;38223:31;:40::i;:::-;38190:167;;;38289:2;38281:10;;:4;:10;;;38277:80;;38302:47;38335:4;38341:7;38302:32;:47::i;:::-;38277:80;38190:167;38381:1;38367:16;;:2;:16;;;38363:163;;;38394:45;38431:7;38394:36;:45::i;:::-;38363:163;;;38463:4;38457:10;;:2;:10;;;38453:73;;38478:40;38506:2;38510:7;38478:27;:40::i;:::-;38453:73;38363:163;38073:458;;;:::o;23486:601::-;23569:7;23585:20;23608:4;23585:27;;23624:9;23619:437;23643:5;:12;23639:1;:16;23619:437;;;23671:20;23694:5;23700:1;23694:8;;;;;;;;:::i;:::-;;;;;;;;23671:31;;23731:12;23715;:28;23711:338;;23842:42;23857:12;23871;23842:14;:42::i;:::-;23827:57;;23711:338;;;23997:42;24012:12;24026;23997:14;:42::i;:::-;23982:57;;23711:338;23662:394;23657:3;;;;;:::i;:::-;;;;23619:437;;;;24069:12;24062:19;;;23486:601;;;;:::o;32949:104::-;33021:26;33031:2;33035:7;33021:26;;;;;;;;;;;;:9;:26::i;:::-;32949:104;;:::o;36823:669::-;36960:4;36977:15;:2;:13;;;:15::i;:::-;36973:514;;;37023:2;37007:36;;;37044:12;:10;:12::i;:::-;37058:4;37064:7;37073:5;37007:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37003:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37244:1;37227:6;:13;:18;37223:214;;;37260:60;;;;;;;;;;:::i;:::-;;;;;;;;37223:214;37405:6;37399:13;37390:6;37386:2;37382:15;37375:38;37003:443;37132:41;;;37122:51;;;:6;:51;;;;37115:58;;;;;36973:514;37475:4;37468:11;;36823:669;;;;;;;:::o;39218:154::-;39318:10;:17;;;;39291:15;:24;39307:7;39291:24;;;;;;;;;;;:44;;;;39342:10;39358:7;39342:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39218:154;:::o;39981:928::-;40235:22;40285:1;40260:22;40277:4;40260:16;:22::i;:::-;:26;;;;:::i;:::-;40235:51;;40293:18;40314:17;:26;40332:7;40314:26;;;;;;;;;;;;40293:47;;40453:14;40439:10;:28;40435:306;;40478:19;40500:12;:18;40513:4;40500:18;;;;;;;;;;;;;;;:34;40519:14;40500:34;;;;;;;;;;;;40478:56;;40578:11;40545:12;:18;40558:4;40545:18;;;;;;;;;;;;;;;:30;40564:10;40545:30;;;;;;;;;;;:44;;;;40689:10;40656:17;:30;40674:11;40656:30;;;;;;;;;;;:43;;;;40469:272;40435:306;40829:17;:26;40847:7;40829:26;;;;;;;;;;;40822:33;;;40869:12;:18;40882:4;40869:18;;;;;;;;;;;;;;;:34;40888:14;40869:34;;;;;;;;;;;40862:41;;;40062:847;;39981:928;;:::o;41192:1025::-;41433:22;41478:1;41458:10;:17;;;;:21;;;;:::i;:::-;41433:46;;41486:18;41507:15;:24;41523:7;41507:24;;;;;;;;;;;;41486:45;;41842:19;41864:10;41875:14;41864:26;;;;;;;;:::i;:::-;;;;;;;;;;41842:48;;41924:11;41899:10;41910;41899:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42031:10;42000:15;:28;42016:11;42000:28;;;;;;;;;;;:41;;;;42164:15;:24;42180:7;42164:24;;;;;;;;;;;42157:31;;;42195:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41263:954;;;41192:1025;:::o;38820:207::-;38901:14;38918:20;38935:2;38918:16;:20::i;:::-;38901:37;;38972:7;38945:12;:16;38958:2;38945:16;;;;;;;;;;;;;;;:24;38962:6;38945:24;;;;;;;;;;;:34;;;;39015:6;38986:17;:26;39004:7;38986:26;;;;;;;;;;;:35;;;;38894:133;38820:207;;:::o;24093:196::-;24161:13;24214:1;24208:4;24201:15;24237:1;24231:4;24224:15;24272:4;24266;24256:21;24247:30;;24093:196;;;;:::o;33270:281::-;33382:18;33388:2;33392:7;33382:5;:18::i;:::-;33423:54;33454:1;33458:2;33462:7;33471:5;33423:22;:54::i;:::-;33407:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;33270:281;;;:::o;8236:351::-;8296:4;8488:12;8545:7;8533:20;8525:28;;8580:1;8573:4;:8;8566:15;;;8236:351;;;:::o;33861:356::-;33951:1;33937:16;;:2;:16;;;;33929:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34006:16;34014:7;34006;:16::i;:::-;34005:17;33997:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34064:45;34093:1;34097:2;34101:7;34064:20;:45::i;:::-;34135:1;34118:9;:13;34128:2;34118:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34162:2;34143:7;:16;34151:7;34143:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34203:7;34199:2;34178:33;;34195:1;34178:33;;;;;;;;;;;;33861:356;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:139::-;1905:5;1943:6;1930:20;1921:29;;1959:33;1986:5;1959:33;:::i;:::-;1859:139;;;;:::o;2004:137::-;2049:5;2087:6;2074:20;2065:29;;2103:32;2129:5;2103:32;:::i;:::-;2004:137;;;;:::o;2147:141::-;2203:5;2234:6;2228:13;2219:22;;2250:32;2276:5;2250:32;:::i;:::-;2147:141;;;;:::o;2307:338::-;2362:5;2411:3;2404:4;2396:6;2392:17;2388:27;2378:122;;2419:79;;:::i;:::-;2378:122;2536:6;2523:20;2561:78;2635:3;2627:6;2620:4;2612:6;2608:17;2561:78;:::i;:::-;2552:87;;2368:277;2307:338;;;;:::o;2665:340::-;2721:5;2770:3;2763:4;2755:6;2751:17;2747:27;2737:122;;2778:79;;:::i;:::-;2737:122;2895:6;2882:20;2920:79;2995:3;2987:6;2980:4;2972:6;2968:17;2920:79;:::i;:::-;2911:88;;2727:278;2665:340;;;;:::o;3011:139::-;3057:5;3095:6;3082:20;3073:29;;3111:33;3138:5;3111:33;:::i;:::-;3011:139;;;;:::o;3156:143::-;3213:5;3244:6;3238:13;3229:22;;3260:33;3287:5;3260:33;:::i;:::-;3156:143;;;;:::o;3305:329::-;3364:6;3413:2;3401:9;3392:7;3388:23;3384:32;3381:119;;;3419:79;;:::i;:::-;3381:119;3539:1;3564:53;3609:7;3600:6;3589:9;3585:22;3564:53;:::i;:::-;3554:63;;3510:117;3305:329;;;;:::o;3640:474::-;3708:6;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:119;;;3771:79;;:::i;:::-;3733:119;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;3640:474;;;;;:::o;4120:619::-;4197:6;4205;4213;4262:2;4250:9;4241:7;4237:23;4233:32;4230:119;;;4268:79;;:::i;:::-;4230:119;4388:1;4413:53;4458:7;4449:6;4438:9;4434:22;4413:53;:::i;:::-;4403:63;;4359:117;4515:2;4541:53;4586:7;4577:6;4566:9;4562:22;4541:53;:::i;:::-;4531:63;;4486:118;4643:2;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4614:118;4120:619;;;;;:::o;4745:943::-;4840:6;4848;4856;4864;4913:3;4901:9;4892:7;4888:23;4884:33;4881:120;;;4920:79;;:::i;:::-;4881:120;5040:1;5065:53;5110:7;5101:6;5090:9;5086:22;5065:53;:::i;:::-;5055:63;;5011:117;5167:2;5193:53;5238:7;5229:6;5218:9;5214:22;5193:53;:::i;:::-;5183:63;;5138:118;5295:2;5321:53;5366:7;5357:6;5346:9;5342:22;5321:53;:::i;:::-;5311:63;;5266:118;5451:2;5440:9;5436:18;5423:32;5482:18;5474:6;5471:30;5468:117;;;5504:79;;:::i;:::-;5468:117;5609:62;5663:7;5654:6;5643:9;5639:22;5609:62;:::i;:::-;5599:72;;5394:287;4745:943;;;;;;;:::o;5694:468::-;5759:6;5767;5816:2;5804:9;5795:7;5791:23;5787:32;5784:119;;;5822:79;;:::i;:::-;5784:119;5942:1;5967:53;6012:7;6003:6;5992:9;5988:22;5967:53;:::i;:::-;5957:63;;5913:117;6069:2;6095:50;6137:7;6128:6;6117:9;6113:22;6095:50;:::i;:::-;6085:60;;6040:115;5694:468;;;;;:::o;6168:474::-;6236:6;6244;6293:2;6281:9;6272:7;6268:23;6264:32;6261:119;;;6299:79;;:::i;:::-;6261:119;6419:1;6444:53;6489:7;6480:6;6469:9;6465:22;6444:53;:::i;:::-;6434:63;;6390:117;6546:2;6572:53;6617:7;6608:6;6597:9;6593:22;6572:53;:::i;:::-;6562:63;;6517:118;6168:474;;;;;:::o;6648:704::-;6743:6;6751;6759;6808:2;6796:9;6787:7;6783:23;6779:32;6776:119;;;6814:79;;:::i;:::-;6776:119;6962:1;6951:9;6947:17;6934:31;6992:18;6984:6;6981:30;6978:117;;;7014:79;;:::i;:::-;6978:117;7127:80;7199:7;7190:6;7179:9;7175:22;7127:80;:::i;:::-;7109:98;;;;6905:312;7256:2;7282:53;7327:7;7318:6;7307:9;7303:22;7282:53;:::i;:::-;7272:63;;7227:118;6648:704;;;;;:::o;7358:345::-;7425:6;7474:2;7462:9;7453:7;7449:23;7445:32;7442:119;;;7480:79;;:::i;:::-;7442:119;7600:1;7625:61;7678:7;7669:6;7658:9;7654:22;7625:61;:::i;:::-;7615:71;;7571:125;7358:345;;;;:::o;7709:329::-;7768:6;7817:2;7805:9;7796:7;7792:23;7788:32;7785:119;;;7823:79;;:::i;:::-;7785:119;7943:1;7968:53;8013:7;8004:6;7993:9;7989:22;7968:53;:::i;:::-;7958:63;;7914:117;7709:329;;;;:::o;8044:327::-;8102:6;8151:2;8139:9;8130:7;8126:23;8122:32;8119:119;;;8157:79;;:::i;:::-;8119:119;8277:1;8302:52;8346:7;8337:6;8326:9;8322:22;8302:52;:::i;:::-;8292:62;;8248:116;8044:327;;;;:::o;8377:349::-;8446:6;8495:2;8483:9;8474:7;8470:23;8466:32;8463:119;;;8501:79;;:::i;:::-;8463:119;8621:1;8646:63;8701:7;8692:6;8681:9;8677:22;8646:63;:::i;:::-;8636:73;;8592:127;8377:349;;;;:::o;8732:509::-;8801:6;8850:2;8838:9;8829:7;8825:23;8821:32;8818:119;;;8856:79;;:::i;:::-;8818:119;9004:1;8993:9;8989:17;8976:31;9034:18;9026:6;9023:30;9020:117;;;9056:79;;:::i;:::-;9020:117;9161:63;9216:7;9207:6;9196:9;9192:22;9161:63;:::i;:::-;9151:73;;8947:287;8732:509;;;;:::o;9247:329::-;9306:6;9355:2;9343:9;9334:7;9330:23;9326:32;9323:119;;;9361:79;;:::i;:::-;9323:119;9481:1;9506:53;9551:7;9542:6;9531:9;9527:22;9506:53;:::i;:::-;9496:63;;9452:117;9247:329;;;;:::o;9582:351::-;9652:6;9701:2;9689:9;9680:7;9676:23;9672:32;9669:119;;;9707:79;;:::i;:::-;9669:119;9827:1;9852:64;9908:7;9899:6;9888:9;9884:22;9852:64;:::i;:::-;9842:74;;9798:128;9582:351;;;;:::o;9939:474::-;10007:6;10015;10064:2;10052:9;10043:7;10039:23;10035:32;10032:119;;;10070:79;;:::i;:::-;10032:119;10190:1;10215:53;10260:7;10251:6;10240:9;10236:22;10215:53;:::i;:::-;10205:63;;10161:117;10317:2;10343:53;10388:7;10379:6;10368:9;10364:22;10343:53;:::i;:::-;10333:63;;10288:118;9939:474;;;;;:::o;10419:179::-;10488:10;10509:46;10551:3;10543:6;10509:46;:::i;:::-;10587:4;10582:3;10578:14;10564:28;;10419:179;;;;:::o;10604:118::-;10691:24;10709:5;10691:24;:::i;:::-;10686:3;10679:37;10604:118;;:::o;10728:157::-;10833:45;10853:24;10871:5;10853:24;:::i;:::-;10833:45;:::i;:::-;10828:3;10821:58;10728:157;;:::o;10921:732::-;11040:3;11069:54;11117:5;11069:54;:::i;:::-;11139:86;11218:6;11213:3;11139:86;:::i;:::-;11132:93;;11249:56;11299:5;11249:56;:::i;:::-;11328:7;11359:1;11344:284;11369:6;11366:1;11363:13;11344:284;;;11445:6;11439:13;11472:63;11531:3;11516:13;11472:63;:::i;:::-;11465:70;;11558:60;11611:6;11558:60;:::i;:::-;11548:70;;11404:224;11391:1;11388;11384:9;11379:14;;11344:284;;;11348:14;11644:3;11637:10;;11045:608;;;10921:732;;;;:::o;11659:109::-;11740:21;11755:5;11740:21;:::i;:::-;11735:3;11728:34;11659:109;;:::o;11774:118::-;11861:24;11879:5;11861:24;:::i;:::-;11856:3;11849:37;11774:118;;:::o;11898:360::-;11984:3;12012:38;12044:5;12012:38;:::i;:::-;12066:70;12129:6;12124:3;12066:70;:::i;:::-;12059:77;;12145:52;12190:6;12185:3;12178:4;12171:5;12167:16;12145:52;:::i;:::-;12222:29;12244:6;12222:29;:::i;:::-;12217:3;12213:39;12206:46;;11988:270;11898:360;;;;:::o;12264:364::-;12352:3;12380:39;12413:5;12380:39;:::i;:::-;12435:71;12499:6;12494:3;12435:71;:::i;:::-;12428:78;;12515:52;12560:6;12555:3;12548:4;12541:5;12537:16;12515:52;:::i;:::-;12592:29;12614:6;12592:29;:::i;:::-;12587:3;12583:39;12576:46;;12356:272;12264:364;;;;:::o;12634:377::-;12740:3;12768:39;12801:5;12768:39;:::i;:::-;12823:89;12905:6;12900:3;12823:89;:::i;:::-;12816:96;;12921:52;12966:6;12961:3;12954:4;12947:5;12943:16;12921:52;:::i;:::-;12998:6;12993:3;12989:16;12982:23;;12744:267;12634:377;;;;:::o;13041:845::-;13144:3;13181:5;13175:12;13210:36;13236:9;13210:36;:::i;:::-;13262:89;13344:6;13339:3;13262:89;:::i;:::-;13255:96;;13382:1;13371:9;13367:17;13398:1;13393:137;;;;13544:1;13539:341;;;;13360:520;;13393:137;13477:4;13473:9;13462;13458:25;13453:3;13446:38;13513:6;13508:3;13504:16;13497:23;;13393:137;;13539:341;13606:38;13638:5;13606:38;:::i;:::-;13666:1;13680:154;13694:6;13691:1;13688:13;13680:154;;;13768:7;13762:14;13758:1;13753:3;13749:11;13742:35;13818:1;13809:7;13805:15;13794:26;;13716:4;13713:1;13709:12;13704:17;;13680:154;;;13863:6;13858:3;13854:16;13847:23;;13546:334;;13360:520;;13148:738;;13041:845;;;;:::o;13892:366::-;14034:3;14055:67;14119:2;14114:3;14055:67;:::i;:::-;14048:74;;14131:93;14220:3;14131:93;:::i;:::-;14249:2;14244:3;14240:12;14233:19;;13892:366;;;:::o;14264:::-;14406:3;14427:67;14491:2;14486:3;14427:67;:::i;:::-;14420:74;;14503:93;14592:3;14503:93;:::i;:::-;14621:2;14616:3;14612:12;14605:19;;14264:366;;;:::o;14636:::-;14778:3;14799:67;14863:2;14858:3;14799:67;:::i;:::-;14792:74;;14875:93;14964:3;14875:93;:::i;:::-;14993:2;14988:3;14984:12;14977:19;;14636:366;;;:::o;15008:::-;15150:3;15171:67;15235:2;15230:3;15171:67;:::i;:::-;15164:74;;15247:93;15336:3;15247:93;:::i;:::-;15365:2;15360:3;15356:12;15349:19;;15008:366;;;:::o;15380:::-;15522:3;15543:67;15607:2;15602:3;15543:67;:::i;:::-;15536:74;;15619:93;15708:3;15619:93;:::i;:::-;15737:2;15732:3;15728:12;15721:19;;15380:366;;;:::o;15752:::-;15894:3;15915:67;15979:2;15974:3;15915:67;:::i;:::-;15908:74;;15991:93;16080:3;15991:93;:::i;:::-;16109:2;16104:3;16100:12;16093:19;;15752:366;;;:::o;16124:::-;16266:3;16287:67;16351:2;16346:3;16287:67;:::i;:::-;16280:74;;16363:93;16452:3;16363:93;:::i;:::-;16481:2;16476:3;16472:12;16465:19;;16124:366;;;:::o;16496:::-;16638:3;16659:67;16723:2;16718:3;16659:67;:::i;:::-;16652:74;;16735:93;16824:3;16735:93;:::i;:::-;16853:2;16848:3;16844:12;16837:19;;16496:366;;;:::o;16868:::-;17010:3;17031:67;17095:2;17090:3;17031:67;:::i;:::-;17024:74;;17107:93;17196:3;17107:93;:::i;:::-;17225:2;17220:3;17216:12;17209:19;;16868:366;;;:::o;17240:::-;17382:3;17403:67;17467:2;17462:3;17403:67;:::i;:::-;17396:74;;17479:93;17568:3;17479:93;:::i;:::-;17597:2;17592:3;17588:12;17581:19;;17240:366;;;:::o;17612:::-;17754:3;17775:67;17839:2;17834:3;17775:67;:::i;:::-;17768:74;;17851:93;17940:3;17851:93;:::i;:::-;17969:2;17964:3;17960:12;17953:19;;17612:366;;;:::o;17984:::-;18126:3;18147:67;18211:2;18206:3;18147:67;:::i;:::-;18140:74;;18223:93;18312:3;18223:93;:::i;:::-;18341:2;18336:3;18332:12;18325:19;;17984:366;;;:::o;18356:::-;18498:3;18519:67;18583:2;18578:3;18519:67;:::i;:::-;18512:74;;18595:93;18684:3;18595:93;:::i;:::-;18713:2;18708:3;18704:12;18697:19;;18356:366;;;:::o;18728:::-;18870:3;18891:67;18955:2;18950:3;18891:67;:::i;:::-;18884:74;;18967:93;19056:3;18967:93;:::i;:::-;19085:2;19080:3;19076:12;19069:19;;18728:366;;;:::o;19100:::-;19242:3;19263:67;19327:2;19322:3;19263:67;:::i;:::-;19256:74;;19339:93;19428:3;19339:93;:::i;:::-;19457:2;19452:3;19448:12;19441:19;;19100:366;;;:::o;19472:::-;19614:3;19635:67;19699:2;19694:3;19635:67;:::i;:::-;19628:74;;19711:93;19800:3;19711:93;:::i;:::-;19829:2;19824:3;19820:12;19813:19;;19472:366;;;:::o;19844:::-;19986:3;20007:67;20071:2;20066:3;20007:67;:::i;:::-;20000:74;;20083:93;20172:3;20083:93;:::i;:::-;20201:2;20196:3;20192:12;20185:19;;19844:366;;;:::o;20216:::-;20358:3;20379:67;20443:2;20438:3;20379:67;:::i;:::-;20372:74;;20455:93;20544:3;20455:93;:::i;:::-;20573:2;20568:3;20564:12;20557:19;;20216:366;;;:::o;20588:::-;20730:3;20751:67;20815:2;20810:3;20751:67;:::i;:::-;20744:74;;20827:93;20916:3;20827:93;:::i;:::-;20945:2;20940:3;20936:12;20929:19;;20588:366;;;:::o;20960:::-;21102:3;21123:67;21187:2;21182:3;21123:67;:::i;:::-;21116:74;;21199:93;21288:3;21199:93;:::i;:::-;21317:2;21312:3;21308:12;21301:19;;20960:366;;;:::o;21332:::-;21474:3;21495:67;21559:2;21554:3;21495:67;:::i;:::-;21488:74;;21571:93;21660:3;21571:93;:::i;:::-;21689:2;21684:3;21680:12;21673:19;;21332:366;;;:::o;21704:::-;21846:3;21867:67;21931:2;21926:3;21867:67;:::i;:::-;21860:74;;21943:93;22032:3;21943:93;:::i;:::-;22061:2;22056:3;22052:12;22045:19;;21704:366;;;:::o;22076:398::-;22235:3;22256:83;22337:1;22332:3;22256:83;:::i;:::-;22249:90;;22348:93;22437:3;22348:93;:::i;:::-;22466:1;22461:3;22457:11;22450:18;;22076:398;;;:::o;22480:366::-;22622:3;22643:67;22707:2;22702:3;22643:67;:::i;:::-;22636:74;;22719:93;22808:3;22719:93;:::i;:::-;22837:2;22832:3;22828:12;22821:19;;22480:366;;;:::o;22852:::-;22994:3;23015:67;23079:2;23074:3;23015:67;:::i;:::-;23008:74;;23091:93;23180:3;23091:93;:::i;:::-;23209:2;23204:3;23200:12;23193:19;;22852:366;;;:::o;23224:::-;23366:3;23387:67;23451:2;23446:3;23387:67;:::i;:::-;23380:74;;23463:93;23552:3;23463:93;:::i;:::-;23581:2;23576:3;23572:12;23565:19;;23224:366;;;:::o;23596:::-;23738:3;23759:67;23823:2;23818:3;23759:67;:::i;:::-;23752:74;;23835:93;23924:3;23835:93;:::i;:::-;23953:2;23948:3;23944:12;23937:19;;23596:366;;;:::o;23968:::-;24110:3;24131:67;24195:2;24190:3;24131:67;:::i;:::-;24124:74;;24207:93;24296:3;24207:93;:::i;:::-;24325:2;24320:3;24316:12;24309:19;;23968:366;;;:::o;24340:::-;24482:3;24503:67;24567:2;24562:3;24503:67;:::i;:::-;24496:74;;24579:93;24668:3;24579:93;:::i;:::-;24697:2;24692:3;24688:12;24681:19;;24340:366;;;:::o;24712:108::-;24789:24;24807:5;24789:24;:::i;:::-;24784:3;24777:37;24712:108;;:::o;24826:118::-;24913:24;24931:5;24913:24;:::i;:::-;24908:3;24901:37;24826:118;;:::o;24950:256::-;25062:3;25077:75;25148:3;25139:6;25077:75;:::i;:::-;25177:2;25172:3;25168:12;25161:19;;25197:3;25190:10;;24950:256;;;;:::o;25212:429::-;25389:3;25411:92;25499:3;25490:6;25411:92;:::i;:::-;25404:99;;25520:95;25611:3;25602:6;25520:95;:::i;:::-;25513:102;;25632:3;25625:10;;25212:429;;;;;:::o;25647:379::-;25831:3;25853:147;25996:3;25853:147;:::i;:::-;25846:154;;26017:3;26010:10;;25647:379;;;:::o;26032:222::-;26125:4;26163:2;26152:9;26148:18;26140:26;;26176:71;26244:1;26233:9;26229:17;26220:6;26176:71;:::i;:::-;26032:222;;;;:::o;26260:640::-;26455:4;26493:3;26482:9;26478:19;26470:27;;26507:71;26575:1;26564:9;26560:17;26551:6;26507:71;:::i;:::-;26588:72;26656:2;26645:9;26641:18;26632:6;26588:72;:::i;:::-;26670;26738:2;26727:9;26723:18;26714:6;26670:72;:::i;:::-;26789:9;26783:4;26779:20;26774:2;26763:9;26759:18;26752:48;26817:76;26888:4;26879:6;26817:76;:::i;:::-;26809:84;;26260:640;;;;;;;:::o;26906:332::-;27027:4;27065:2;27054:9;27050:18;27042:26;;27078:71;27146:1;27135:9;27131:17;27122:6;27078:71;:::i;:::-;27159:72;27227:2;27216:9;27212:18;27203:6;27159:72;:::i;:::-;26906:332;;;;;:::o;27244:373::-;27387:4;27425:2;27414:9;27410:18;27402:26;;27474:9;27468:4;27464:20;27460:1;27449:9;27445:17;27438:47;27502:108;27605:4;27596:6;27502:108;:::i;:::-;27494:116;;27244:373;;;;:::o;27623:210::-;27710:4;27748:2;27737:9;27733:18;27725:26;;27761:65;27823:1;27812:9;27808:17;27799:6;27761:65;:::i;:::-;27623:210;;;;:::o;27839:222::-;27932:4;27970:2;27959:9;27955:18;27947:26;;27983:71;28051:1;28040:9;28036:17;28027:6;27983:71;:::i;:::-;27839:222;;;;:::o;28067:313::-;28180:4;28218:2;28207:9;28203:18;28195:26;;28267:9;28261:4;28257:20;28253:1;28242:9;28238:17;28231:47;28295:78;28368:4;28359:6;28295:78;:::i;:::-;28287:86;;28067:313;;;;:::o;28386:419::-;28552:4;28590:2;28579:9;28575:18;28567:26;;28639:9;28633:4;28629:20;28625:1;28614:9;28610:17;28603:47;28667:131;28793:4;28667:131;:::i;:::-;28659:139;;28386:419;;;:::o;28811:::-;28977:4;29015:2;29004:9;29000:18;28992:26;;29064:9;29058:4;29054:20;29050:1;29039:9;29035:17;29028:47;29092:131;29218:4;29092:131;:::i;:::-;29084:139;;28811:419;;;:::o;29236:::-;29402:4;29440:2;29429:9;29425:18;29417:26;;29489:9;29483:4;29479:20;29475:1;29464:9;29460:17;29453:47;29517:131;29643:4;29517:131;:::i;:::-;29509:139;;29236:419;;;:::o;29661:::-;29827:4;29865:2;29854:9;29850:18;29842:26;;29914:9;29908:4;29904:20;29900:1;29889:9;29885:17;29878:47;29942:131;30068:4;29942:131;:::i;:::-;29934:139;;29661:419;;;:::o;30086:::-;30252:4;30290:2;30279:9;30275:18;30267:26;;30339:9;30333:4;30329:20;30325:1;30314:9;30310:17;30303:47;30367:131;30493:4;30367:131;:::i;:::-;30359:139;;30086:419;;;:::o;30511:::-;30677:4;30715:2;30704:9;30700:18;30692:26;;30764:9;30758:4;30754:20;30750:1;30739:9;30735:17;30728:47;30792:131;30918:4;30792:131;:::i;:::-;30784:139;;30511:419;;;:::o;30936:::-;31102:4;31140:2;31129:9;31125:18;31117:26;;31189:9;31183:4;31179:20;31175:1;31164:9;31160:17;31153:47;31217:131;31343:4;31217:131;:::i;:::-;31209:139;;30936:419;;;:::o;31361:::-;31527:4;31565:2;31554:9;31550:18;31542:26;;31614:9;31608:4;31604:20;31600:1;31589:9;31585:17;31578:47;31642:131;31768:4;31642:131;:::i;:::-;31634:139;;31361:419;;;:::o;31786:::-;31952:4;31990:2;31979:9;31975:18;31967:26;;32039:9;32033:4;32029:20;32025:1;32014:9;32010:17;32003:47;32067:131;32193:4;32067:131;:::i;:::-;32059:139;;31786:419;;;:::o;32211:::-;32377:4;32415:2;32404:9;32400:18;32392:26;;32464:9;32458:4;32454:20;32450:1;32439:9;32435:17;32428:47;32492:131;32618:4;32492:131;:::i;:::-;32484:139;;32211:419;;;:::o;32636:::-;32802:4;32840:2;32829:9;32825:18;32817:26;;32889:9;32883:4;32879:20;32875:1;32864:9;32860:17;32853:47;32917:131;33043:4;32917:131;:::i;:::-;32909:139;;32636:419;;;:::o;33061:::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33314:9;33308:4;33304:20;33300:1;33289:9;33285:17;33278:47;33342:131;33468:4;33342:131;:::i;:::-;33334:139;;33061:419;;;:::o;33486:::-;33652:4;33690:2;33679:9;33675:18;33667:26;;33739:9;33733:4;33729:20;33725:1;33714:9;33710:17;33703:47;33767:131;33893:4;33767:131;:::i;:::-;33759:139;;33486:419;;;:::o;33911:::-;34077:4;34115:2;34104:9;34100:18;34092:26;;34164:9;34158:4;34154:20;34150:1;34139:9;34135:17;34128:47;34192:131;34318:4;34192:131;:::i;:::-;34184:139;;33911:419;;;:::o;34336:::-;34502:4;34540:2;34529:9;34525:18;34517:26;;34589:9;34583:4;34579:20;34575:1;34564:9;34560:17;34553:47;34617:131;34743:4;34617:131;:::i;:::-;34609:139;;34336:419;;;:::o;34761:::-;34927:4;34965:2;34954:9;34950:18;34942:26;;35014:9;35008:4;35004:20;35000:1;34989:9;34985:17;34978:47;35042:131;35168:4;35042:131;:::i;:::-;35034:139;;34761:419;;;:::o;35186:::-;35352:4;35390:2;35379:9;35375:18;35367:26;;35439:9;35433:4;35429:20;35425:1;35414:9;35410:17;35403:47;35467:131;35593:4;35467:131;:::i;:::-;35459:139;;35186:419;;;:::o;35611:::-;35777:4;35815:2;35804:9;35800:18;35792:26;;35864:9;35858:4;35854:20;35850:1;35839:9;35835:17;35828:47;35892:131;36018:4;35892:131;:::i;:::-;35884:139;;35611:419;;;:::o;36036:::-;36202:4;36240:2;36229:9;36225:18;36217:26;;36289:9;36283:4;36279:20;36275:1;36264:9;36260:17;36253:47;36317:131;36443:4;36317:131;:::i;:::-;36309:139;;36036:419;;;:::o;36461:::-;36627:4;36665:2;36654:9;36650:18;36642:26;;36714:9;36708:4;36704:20;36700:1;36689:9;36685:17;36678:47;36742:131;36868:4;36742:131;:::i;:::-;36734:139;;36461:419;;;:::o;36886:::-;37052:4;37090:2;37079:9;37075:18;37067:26;;37139:9;37133:4;37129:20;37125:1;37114:9;37110:17;37103:47;37167:131;37293:4;37167:131;:::i;:::-;37159:139;;36886:419;;;:::o;37311:::-;37477:4;37515:2;37504:9;37500:18;37492:26;;37564:9;37558:4;37554:20;37550:1;37539:9;37535:17;37528:47;37592:131;37718:4;37592:131;:::i;:::-;37584:139;;37311:419;;;:::o;37736:::-;37902:4;37940:2;37929:9;37925:18;37917:26;;37989:9;37983:4;37979:20;37975:1;37964:9;37960:17;37953:47;38017:131;38143:4;38017:131;:::i;:::-;38009:139;;37736:419;;;:::o;38161:::-;38327:4;38365:2;38354:9;38350:18;38342:26;;38414:9;38408:4;38404:20;38400:1;38389:9;38385:17;38378:47;38442:131;38568:4;38442:131;:::i;:::-;38434:139;;38161:419;;;:::o;38586:::-;38752:4;38790:2;38779:9;38775:18;38767:26;;38839:9;38833:4;38829:20;38825:1;38814:9;38810:17;38803:47;38867:131;38993:4;38867:131;:::i;:::-;38859:139;;38586:419;;;:::o;39011:::-;39177:4;39215:2;39204:9;39200:18;39192:26;;39264:9;39258:4;39254:20;39250:1;39239:9;39235:17;39228:47;39292:131;39418:4;39292:131;:::i;:::-;39284:139;;39011:419;;;:::o;39436:::-;39602:4;39640:2;39629:9;39625:18;39617:26;;39689:9;39683:4;39679:20;39675:1;39664:9;39660:17;39653:47;39717:131;39843:4;39717:131;:::i;:::-;39709:139;;39436:419;;;:::o;39861:::-;40027:4;40065:2;40054:9;40050:18;40042:26;;40114:9;40108:4;40104:20;40100:1;40089:9;40085:17;40078:47;40142:131;40268:4;40142:131;:::i;:::-;40134:139;;39861:419;;;:::o;40286:222::-;40379:4;40417:2;40406:9;40402:18;40394:26;;40430:71;40498:1;40487:9;40483:17;40474:6;40430:71;:::i;:::-;40286:222;;;;:::o;40514:129::-;40548:6;40575:20;;:::i;:::-;40565:30;;40604:33;40632:4;40624:6;40604:33;:::i;:::-;40514:129;;;:::o;40649:75::-;40682:6;40715:2;40709:9;40699:19;;40649:75;:::o;40730:307::-;40791:4;40881:18;40873:6;40870:30;40867:56;;;40903:18;;:::i;:::-;40867:56;40941:29;40963:6;40941:29;:::i;:::-;40933:37;;41025:4;41019;41015:15;41007:23;;40730:307;;;:::o;41043:308::-;41105:4;41195:18;41187:6;41184:30;41181:56;;;41217:18;;:::i;:::-;41181:56;41255:29;41277:6;41255:29;:::i;:::-;41247:37;;41339:4;41333;41329:15;41321:23;;41043:308;;;:::o;41357:132::-;41424:4;41447:3;41439:11;;41477:4;41472:3;41468:14;41460:22;;41357:132;;;:::o;41495:141::-;41544:4;41567:3;41559:11;;41590:3;41587:1;41580:14;41624:4;41621:1;41611:18;41603:26;;41495:141;;;:::o;41642:114::-;41709:6;41743:5;41737:12;41727:22;;41642:114;;;:::o;41762:98::-;41813:6;41847:5;41841:12;41831:22;;41762:98;;;:::o;41866:99::-;41918:6;41952:5;41946:12;41936:22;;41866:99;;;:::o;41971:113::-;42041:4;42073;42068:3;42064:14;42056:22;;41971:113;;;:::o;42090:184::-;42189:11;42223:6;42218:3;42211:19;42263:4;42258:3;42254:14;42239:29;;42090:184;;;;:::o;42280:168::-;42363:11;42397:6;42392:3;42385:19;42437:4;42432:3;42428:14;42413:29;;42280:168;;;;:::o;42454:147::-;42555:11;42592:3;42577:18;;42454:147;;;;:::o;42607:169::-;42691:11;42725:6;42720:3;42713:19;42765:4;42760:3;42756:14;42741:29;;42607:169;;;;:::o;42782:148::-;42884:11;42921:3;42906:18;;42782:148;;;;:::o;42936:305::-;42976:3;42995:20;43013:1;42995:20;:::i;:::-;42990:25;;43029:20;43047:1;43029:20;:::i;:::-;43024:25;;43183:1;43115:66;43111:74;43108:1;43105:81;43102:107;;;43189:18;;:::i;:::-;43102:107;43233:1;43230;43226:9;43219:16;;42936:305;;;;:::o;43247:185::-;43287:1;43304:20;43322:1;43304:20;:::i;:::-;43299:25;;43338:20;43356:1;43338:20;:::i;:::-;43333:25;;43377:1;43367:35;;43382:18;;:::i;:::-;43367:35;43424:1;43421;43417:9;43412:14;;43247:185;;;;:::o;43438:348::-;43478:7;43501:20;43519:1;43501:20;:::i;:::-;43496:25;;43535:20;43553:1;43535:20;:::i;:::-;43530:25;;43723:1;43655:66;43651:74;43648:1;43645:81;43640:1;43633:9;43626:17;43622:105;43619:131;;;43730:18;;:::i;:::-;43619:131;43778:1;43775;43771:9;43760:20;;43438:348;;;;:::o;43792:191::-;43832:4;43852:20;43870:1;43852:20;:::i;:::-;43847:25;;43886:20;43904:1;43886:20;:::i;:::-;43881:25;;43925:1;43922;43919:8;43916:34;;;43930:18;;:::i;:::-;43916:34;43975:1;43972;43968:9;43960:17;;43792:191;;;;:::o;43989:96::-;44026:7;44055:24;44073:5;44055:24;:::i;:::-;44044:35;;43989:96;;;:::o;44091:90::-;44125:7;44168:5;44161:13;44154:21;44143:32;;44091:90;;;:::o;44187:77::-;44224:7;44253:5;44242:16;;44187:77;;;:::o;44270:149::-;44306:7;44346:66;44339:5;44335:78;44324:89;;44270:149;;;:::o;44425:126::-;44462:7;44502:42;44495:5;44491:54;44480:65;;44425:126;;;:::o;44557:77::-;44594:7;44623:5;44612:16;;44557:77;;;:::o;44640:154::-;44724:6;44719:3;44714;44701:30;44786:1;44777:6;44772:3;44768:16;44761:27;44640:154;;;:::o;44800:307::-;44868:1;44878:113;44892:6;44889:1;44886:13;44878:113;;;44977:1;44972:3;44968:11;44962:18;44958:1;44953:3;44949:11;44942:39;44914:2;44911:1;44907:10;44902:15;;44878:113;;;45009:6;45006:1;45003:13;45000:101;;;45089:1;45080:6;45075:3;45071:16;45064:27;45000:101;44849:258;44800:307;;;:::o;45113:320::-;45157:6;45194:1;45188:4;45184:12;45174:22;;45241:1;45235:4;45231:12;45262:18;45252:81;;45318:4;45310:6;45306:17;45296:27;;45252:81;45380:2;45372:6;45369:14;45349:18;45346:38;45343:84;;;45399:18;;:::i;:::-;45343:84;45164:269;45113:320;;;:::o;45439:281::-;45522:27;45544:4;45522:27;:::i;:::-;45514:6;45510:40;45652:6;45640:10;45637:22;45616:18;45604:10;45601:34;45598:62;45595:88;;;45663:18;;:::i;:::-;45595:88;45703:10;45699:2;45692:22;45482:238;45439:281;;:::o;45726:233::-;45765:3;45788:24;45806:5;45788:24;:::i;:::-;45779:33;;45834:66;45827:5;45824:77;45821:103;;;45904:18;;:::i;:::-;45821:103;45951:1;45944:5;45940:13;45933:20;;45726:233;;;:::o;45965:100::-;46004:7;46033:26;46053:5;46033:26;:::i;:::-;46022:37;;45965:100;;;:::o;46071:94::-;46110:7;46139:20;46153:5;46139:20;:::i;:::-;46128:31;;46071:94;;;:::o;46171:176::-;46203:1;46220:20;46238:1;46220:20;:::i;:::-;46215:25;;46254:20;46272:1;46254:20;:::i;:::-;46249:25;;46293:1;46283:35;;46298:18;;:::i;:::-;46283:35;46339:1;46336;46332:9;46327:14;;46171:176;;;;:::o;46353:180::-;46401:77;46398:1;46391:88;46498:4;46495:1;46488:15;46522:4;46519:1;46512:15;46539:180;46587:77;46584:1;46577:88;46684:4;46681:1;46674:15;46708:4;46705:1;46698:15;46725:180;46773:77;46770:1;46763:88;46870:4;46867:1;46860:15;46894:4;46891:1;46884:15;46911:180;46959:77;46956:1;46949:88;47056:4;47053:1;47046:15;47080:4;47077:1;47070:15;47097:180;47145:77;47142:1;47135:88;47242:4;47239:1;47232:15;47266:4;47263:1;47256:15;47283:180;47331:77;47328:1;47321:88;47428:4;47425:1;47418:15;47452:4;47449:1;47442:15;47469:117;47578:1;47575;47568:12;47592:117;47701:1;47698;47691:12;47715:117;47824:1;47821;47814:12;47838:117;47947:1;47944;47937:12;47961:117;48070:1;48067;48060:12;48084:117;48193:1;48190;48183:12;48207:102;48248:6;48299:2;48295:7;48290:2;48283:5;48279:14;48275:28;48265:38;;48207:102;;;:::o;48315:94::-;48348:8;48396:5;48392:2;48388:14;48367:35;;48315:94;;;:::o;48415:165::-;48555:17;48551:1;48543:6;48539:14;48532:41;48415:165;:::o;48586:230::-;48726:34;48722:1;48714:6;48710:14;48703:58;48795:13;48790:2;48782:6;48778:15;48771:38;48586:230;:::o;48822:237::-;48962:34;48958:1;48950:6;48946:14;48939:58;49031:20;49026:2;49018:6;49014:15;49007:45;48822:237;:::o;49065:225::-;49205:34;49201:1;49193:6;49189:14;49182:58;49274:8;49269:2;49261:6;49257:15;49250:33;49065:225;:::o;49296:178::-;49436:30;49432:1;49424:6;49420:14;49413:54;49296:178;:::o;49480:::-;49620:30;49616:1;49608:6;49604:14;49597:54;49480:178;:::o;49664:223::-;49804:34;49800:1;49792:6;49788:14;49781:58;49873:6;49868:2;49860:6;49856:15;49849:31;49664:223;:::o;49893:175::-;50033:27;50029:1;50021:6;50017:14;50010:51;49893:175;:::o;50074:222::-;50214:34;50210:1;50202:6;50198:14;50191:58;50283:5;50278:2;50270:6;50266:15;50259:30;50074:222;:::o;50302:231::-;50442:34;50438:1;50430:6;50426:14;50419:58;50511:14;50506:2;50498:6;50494:15;50487:39;50302:231;:::o;50539:243::-;50679:34;50675:1;50667:6;50663:14;50656:58;50748:26;50743:2;50735:6;50731:15;50724:51;50539:243;:::o;50788:229::-;50928:34;50924:1;50916:6;50912:14;50905:58;50997:12;50992:2;50984:6;50980:15;50973:37;50788:229;:::o;51023:228::-;51163:34;51159:1;51151:6;51147:14;51140:58;51232:11;51227:2;51219:6;51215:15;51208:36;51023:228;:::o;51257:181::-;51397:33;51393:1;51385:6;51381:14;51374:57;51257:181;:::o;51444:182::-;51584:34;51580:1;51572:6;51568:14;51561:58;51444:182;:::o;51632:170::-;51772:22;51768:1;51760:6;51756:14;51749:46;51632:170;:::o;51808:231::-;51948:34;51944:1;51936:6;51932:14;51925:58;52017:14;52012:2;52004:6;52000:15;51993:39;51808:231;:::o;52045:182::-;52185:34;52181:1;52173:6;52169:14;52162:58;52045:182;:::o;52233:228::-;52373:34;52369:1;52361:6;52357:14;52350:58;52442:11;52437:2;52429:6;52425:15;52418:36;52233:228;:::o;52467:234::-;52607:34;52603:1;52595:6;52591:14;52584:58;52676:17;52671:2;52663:6;52659:15;52652:42;52467:234;:::o;52707:220::-;52847:34;52843:1;52835:6;52831:14;52824:58;52916:3;52911:2;52903:6;52899:15;52892:28;52707:220;:::o;52933:170::-;53073:22;53069:1;53061:6;53057:14;53050:46;52933:170;:::o;53109:114::-;;:::o;53229:177::-;53369:29;53365:1;53357:6;53353:14;53346:53;53229:177;:::o;53412:236::-;53552:34;53548:1;53540:6;53536:14;53529:58;53621:19;53616:2;53608:6;53604:15;53597:44;53412:236;:::o;53654:231::-;53794:34;53790:1;53782:6;53778:14;53771:58;53863:14;53858:2;53850:6;53846:15;53839:39;53654:231;:::o;53891:164::-;54031:16;54027:1;54019:6;54015:14;54008:40;53891:164;:::o;54061:231::-;54201:34;54197:1;54189:6;54185:14;54178:58;54270:14;54265:2;54257:6;54253:15;54246:39;54061:231;:::o;54298:169::-;54438:21;54434:1;54426:6;54422:14;54415:45;54298:169;:::o;54473:122::-;54546:24;54564:5;54546:24;:::i;:::-;54539:5;54536:35;54526:63;;54585:1;54582;54575:12;54526:63;54473:122;:::o;54601:116::-;54671:21;54686:5;54671:21;:::i;:::-;54664:5;54661:32;54651:60;;54707:1;54704;54697:12;54651:60;54601:116;:::o;54723:122::-;54796:24;54814:5;54796:24;:::i;:::-;54789:5;54786:35;54776:63;;54835:1;54832;54825:12;54776:63;54723:122;:::o;54851:120::-;54923:23;54940:5;54923:23;:::i;:::-;54916:5;54913:34;54903:62;;54961:1;54958;54951:12;54903:62;54851:120;:::o;54977:122::-;55050:24;55068:5;55050:24;:::i;:::-;55043:5;55040:35;55030:63;;55089:1;55086;55079:12;55030:63;54977:122;:::o

Swarm Source

ipfs://df1bad0c7cd203f019ec163b5747cb59a572c122d78a43813a36d8feb1f32b7b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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