ETH Price: $3,452.57 (-0.72%)
Gas: 2 Gwei

Token

TheEights (EIGHTS)
 

Overview

Max Total Supply

900 EIGHTS

Holders

335

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
siddha.eth
Balance
3 EIGHTS
0xb91A23971cAbcE0dB9dbde18F554E47F8fF6F9F3
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:
TheEights

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 13: TheEights.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import 'ERC721.sol';
import 'ERC721Enumerable.sol';
import 'Ownable.sol';

contract TheEights is ERC721Enumerable, Ownable {
  using Strings for uint256;

  uint256 public constant EIGHTS_GIFT = 90;
  uint256 public constant EIGHTS_PRIVATE = 150;
  uint256 public constant EIGHTS_PUBLIC = 648;
  uint256 private EIGHTS_MAGIC = 0;

  uint256 public constant EIGHTS_PRICE = 0.08 ether;
  uint256 public constant EIGHTS_PER_MINT = 5;

  mapping(string => bool) private _usedNonces;

  mapping(address => uint256) public presalerListPurchases;

  string private _contractURI;
  string private _tokenBaseURI = '';

  address private _mainAddress = 0xa4B7100a1316c442d4337B0f6c3b9a5D37076B98;

  string public proof;
  uint256 public giftedAmount;
  uint256 public privateAmountMinted;
  uint256 public presalePurchaseLimit = 2;
  bool public privateSaleLive = true;
  bool public publicSaleLive = false;
  bool public locked;

  constructor() ERC721('TheEights', 'EIGHTS') {}

  modifier notLocked() {
    require(!locked, 'Contract metadata methods are locked');
    _;
  }

  function privateSaleBuy(uint256 tokenQuantity) external payable {
    require(privateSaleLive, 'SALE_CLOSED');
    require(totalSupply() < EIGHTS_GIFT + EIGHTS_PRIVATE + EIGHTS_PUBLIC + EIGHTS_MAGIC, 'OUT_OF_STOCK');
    require(tokenQuantity <= EIGHTS_PER_MINT, 'EXCEED_EIGHTS_PER_MINT');
    require(EIGHTS_PRICE * tokenQuantity <= msg.value, 'INSUFFICIENT_ETH');
    require(presalerListPurchases[msg.sender] + tokenQuantity <= presalePurchaseLimit, "EXCEED_ALLOC");

    for (uint256 i = 0; i < tokenQuantity; i++) {
            presalerListPurchases[msg.sender]++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
  }

  function publicSaleBuy(uint256 tokenQuantity) external payable {
    require(publicSaleLive, 'SALE_CLOSED');
    require(totalSupply() < EIGHTS_GIFT + EIGHTS_PRIVATE + EIGHTS_PUBLIC + EIGHTS_MAGIC, 'OUT_OF_STOCK');
    require(tokenQuantity <= EIGHTS_PER_MINT, 'EXCEED_EIGHTS_PER_MINT');
    require(EIGHTS_PRICE * tokenQuantity <= msg.value, 'INSUFFICIENT_ETH');

    for (uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
  }

  function gift(address[] calldata receivers) external {
    require(msg.sender == _mainAddress, 'PERMISSION_DENIED');
    require(totalSupply() + receivers.length <= EIGHTS_GIFT + EIGHTS_PRIVATE + EIGHTS_PUBLIC + EIGHTS_MAGIC, 'MAX_MINT');
    require(giftedAmount + receivers.length <= EIGHTS_GIFT, 'GIFTS_EMPTY');

    for (uint256 i = 0; i < receivers.length; i++) {
      giftedAmount++;
      _safeMint(receivers[i], totalSupply() + 1);
    }
  }

  function withdraw() external {
    require(msg.sender == _mainAddress, 'PERMISSION_DENIED');
    payable(_mainAddress).transfer(address(this).balance);
  }

  function lockMetadata() external onlyOwner {
    locked = true;
  }

  function togglePrivateSale() external {
    require(msg.sender == _mainAddress, 'PERMISSION_DENIED');

    privateSaleLive = !privateSaleLive;
  }

  function togglePublicSale() external {
    require(msg.sender == _mainAddress, 'PERMISSION_DENIED');

    publicSaleLive = !publicSaleLive;
  }

  function setSignerAddress(address addr) external onlyOwner {
    _mainAddress = addr;
  }


  function setContractURI(string calldata URI) external notLocked {
     require(msg.sender == _mainAddress, 'PERMISSION_DENIED');
    _contractURI = URI;
  }

  function setBaseURI(string calldata URI) external notLocked {
     require(msg.sender == _mainAddress, 'PERMISSION_DENIED');
    _tokenBaseURI = URI;
  }

  function setMagic(uint256 magicNumber) external notLocked {
     require(msg.sender == _mainAddress, 'PERMISSION_DENIED');
    EIGHTS_MAGIC = magicNumber;
  }

  function contractURI() public view returns (string memory) {
    return _contractURI;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
    string memory base = _tokenBaseURI;
    string memory _tokenURI = Strings.toString(_tokenId);

    if (bytes(base).length == 0) {
      return _tokenURI;
    }

    return string(abi.encodePacked(base, _tokenURI));
  }

  function checkTotalMintable()
    public
    view
    returns (uint256)
  {
   return EIGHTS_GIFT + EIGHTS_PRIVATE + EIGHTS_PUBLIC + EIGHTS_MAGIC;
  }

  function checkMinted()
    public
    view
    returns (uint256)
  {
   return totalSupply();
  }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 13: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import './IERC165.sol';

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

File 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import 'IERC721.sol';
import 'IERC721Receiver.sol';
import 'IERC721Metadata.sol';
import 'IERC721Enumerable.sol';
import 'Address.sol';
import 'Context.sol';
import 'Strings.sol';
import 'ERC165.sol';

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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 { }
}

File 5 of 13: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "ERC721.sol";
import "IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 9 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

File 10 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 12 of 13: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EIGHTS_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIGHTS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIGHTS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIGHTS_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIGHTS_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkTotalMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"privateSaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"publicSaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"magicNumber","type":"uint256"}],"name":"setMagic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","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":[],"name":"togglePrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b5560405180602001604052806000815250600f9080519060200190620000309291906200022e565b5073a4b7100a1316c442d4337b0f6c3b9a5d37076b98601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060026014556001601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff021916908315150217905550348015620000ce57600080fd5b506040518060400160405280600981526020017f54686545696768747300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f45494748545300000000000000000000000000000000000000000000000000008152508160009080519060200190620001539291906200022e565b5080600190805190602001906200016c9291906200022e565b5050506000620001816200022660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000343565b600033905090565b8280546200023c90620002de565b90600052602060002090601f016020900481019282620002605760008555620002ac565b82601f106200027b57805160ff1916838001178555620002ac565b82800160010185558215620002ac579182015b82811115620002ab5782518255916020019190600101906200028e565b5b509050620002bb9190620002bf565b5090565b5b80821115620002da576000816000905550600101620002c0565b5090565b60006002820490506001821680620002f757607f821691505b602082108114156200030e576200030d62000314565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614dd980620003536000396000f3fe60806040526004361061027c5760003560e01c806362780fdf1161014f578063bb2233cf116100c1578063e8a3d4851161007a578063e8a3d48514610933578063e985e9c51461095e578063f2fde38b1461099b578063f4743070146109c4578063f82c099d146109ef578063faf924cf14610a1a5761027c565b8063bb2233cf14610856578063c0a0e10d14610872578063c87b56dd1461089d578063cf309012146108da578063dfe5dd6814610905578063e222c7f91461091c5761027c565b8063938e3d7b11610113578063938e3d7b1461075c57806395d89b4114610785578063989bdbb6146107b05780639bf80316146107c7578063a22cb46514610804578063b88d4fde1461082d5761027c565b806362780fdf146106755780636352211e146106a057806370a08231146106dd578063715018a61461071a5780638da5cb5b146107315761027c565b80631b57190e116101f357806342842e0e116101ac57806342842e0e14610576578063494677c51461059f5780634f6ccce7146105c857806352188a391461060557806355f804b31461062157806359a12ad51461064a5761027c565b80631b57190e146104785780631c053769146104a357806323b872dd146104ce57806326d93800146104f75780632f745c59146105225780633ccfd60b1461055f5761027c565b80630600918e116102455780630600918e1461036857806306fdde0314610393578063081812fc146103be578063095ea7b3146103fb578063163e1e611461042457806318160ddd1461044d5761027c565b80620b91031461028157806301ffc9a7146102ac57806304675ee0146102e9578063046dc1661461031457806305c9f30c1461033d575b600080fd5b34801561028d57600080fd5b50610296610a45565b6040516102a39190614264565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce919061392a565b610a54565b6040516102e09190613ee7565b60405180910390f35b3480156102f557600080fd5b506102fe610ace565b60405161030b9190614264565b60405180910390f35b34801561032057600080fd5b5061033b6004803603810190610336919061371a565b610ad4565b005b34801561034957600080fd5b50610352610b94565b60405161035f9190613ee7565b60405180910390f35b34801561037457600080fd5b5061037d610ba7565b60405161038a9190614264565b60405180910390f35b34801561039f57600080fd5b506103a8610bac565b6040516103b59190613f02565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e091906139d1565b610c3e565b6040516103f29190613e80565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d919061389d565b610cc3565b005b34801561043057600080fd5b5061044b600480360381019061044691906138dd565b610ddb565b005b34801561045957600080fd5b50610462610fc0565b60405161046f9190614264565b60405180910390f35b34801561048457600080fd5b5061048d610fcd565b60405161049a9190614264565b60405180910390f35b3480156104af57600080fd5b506104b8610fd3565b6040516104c59190614264565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613787565b610fd8565b005b34801561050357600080fd5b5061050c611038565b6040516105199190613ee7565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061389d565b61104b565b6040516105569190614264565b60405180910390f35b34801561056b57600080fd5b506105746110f0565b005b34801561058257600080fd5b5061059d60048036038101906105989190613787565b6111eb565b005b3480156105ab57600080fd5b506105c660048036038101906105c191906139d1565b61120b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906139d1565b6112f5565b6040516105fc9190614264565b60405180910390f35b61061f600480360381019061061a91906139d1565b611366565b005b34801561062d57600080fd5b5061064860048036038101906106439190613984565b6114fe565b005b34801561065657600080fd5b5061065f6115f4565b60405161066c9190614264565b60405180910390f35b34801561068157600080fd5b5061068a6115fa565b6040516106979190614264565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c291906139d1565b6115ff565b6040516106d49190613e80565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff919061371a565b6116b1565b6040516107119190614264565b60405180910390f35b34801561072657600080fd5b5061072f611769565b005b34801561073d57600080fd5b506107466118a6565b6040516107539190613e80565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613984565b6118d0565b005b34801561079157600080fd5b5061079a6119c6565b6040516107a79190613f02565b60405180910390f35b3480156107bc57600080fd5b506107c5611a58565b005b3480156107d357600080fd5b506107ee60048036038101906107e9919061371a565b611af1565b6040516107fb9190614264565b60405180910390f35b34801561081057600080fd5b5061082b6004803603810190610826919061385d565b611b09565b005b34801561083957600080fd5b50610854600480360381019061084f91906137da565b611c8a565b005b610870600480360381019061086b91906139d1565b611cec565b005b34801561087e57600080fd5b50610887611f68565b6040516108949190614264565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf91906139d1565b611f74565b6040516108d19190613f02565b60405180910390f35b3480156108e657600080fd5b506108ef612052565b6040516108fc9190613ee7565b60405180910390f35b34801561091157600080fd5b5061091a612065565b005b34801561092857600080fd5b50610931612121565b005b34801561093f57600080fd5b506109486121dd565b6040516109559190613f02565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190613747565b61226f565b6040516109929190613ee7565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd919061371a565b612303565b005b3480156109d057600080fd5b506109d96124af565b6040516109e69190614264565b60405180910390f35b3480156109fb57600080fd5b50610a046124b5565b604051610a119190614264565b60405180910390f35b348015610a2657600080fd5b50610a2f6124e4565b604051610a3c9190613f02565b60405180910390f35b6000610a4f610fc0565b905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac75750610ac682612572565b5b9050919050565b61028881565b610adc612654565b73ffffffffffffffffffffffffffffffffffffffff16610afa6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790614124565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900460ff1681565b605a81565b606060008054610bbb906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610be7906144e3565b8015610c345780601f10610c0957610100808354040283529160200191610c34565b820191906000526020600020905b815481529060010190602001808311610c1757829003601f168201915b5050505050905090565b6000610c498261265c565b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614104565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cce826115ff565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906141a4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5e612654565b73ffffffffffffffffffffffffffffffffffffffff161480610d8d5750610d8c81610d87612654565b61226f565b5b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390614064565b60405180910390fd5b610dd683836126c8565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614044565b60405180910390fd5b600b546102886096605a610e7f9190614318565b610e899190614318565b610e939190614318565b82829050610e9f610fc0565b610ea99190614318565b1115610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee1906140c4565b60405180910390fd5b605a82829050601254610efd9190614318565b1115610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614144565b60405180910390fd5b60005b82829050811015610fbb5760126000815480929190610f5f90614546565b9190505550610fa8838383818110610f7a57610f7961467c565b5b9050602002016020810190610f8f919061371a565b6001610f99610fc0565b610fa39190614318565b612781565b8080610fb390614546565b915050610f41565b505050565b6000600880549050905090565b60125481565b609681565b610fe9610fe3612654565b8261279f565b611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f906141c4565b60405180910390fd5b61103383838361287d565b505050565b601560019054906101000a900460ff1681565b6000611056836116b1565b8210611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613f24565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614044565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e8573d6000803e3d6000fd5b50565b61120683838360405180602001604052806000815250611c8a565b505050565b601560029054906101000a900460ff161561125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290614044565b60405180910390fd5b80600b8190555050565b60006112ff610fc0565b8210611340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611337906141e4565b60405180910390fd5b600882815481106113545761135361467c565b5b90600052602060002001549050919050565b601560019054906101000a900460ff166113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90614004565b60405180910390fd5b600b546102886096605a6113c99190614318565b6113d39190614318565b6113dd9190614318565b6113e5610fc0565b10611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90613fe4565b60405180910390fd5b6005811115611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614204565b60405180910390fd5b348167011c37937e08000061147e919061439f565b11156114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690614244565b60405180910390fd5b60005b818110156114fa576114e73360016114d8610fc0565b6114e29190614318565b612781565b80806114f290614546565b9150506114c2565b5050565b601560029054906101000a900460ff161561154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d590614044565b60405180910390fd5b8181600f91906115ef9291906134f2565b505050565b60135481565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906140a4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614084565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611771612654565b73ffffffffffffffffffffffffffffffffffffffff1661178f6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614124565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560029054906101000a900460ff1615611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790614044565b60405180910390fd5b8181600e91906119c19291906134f2565b505050565b6060600180546119d5906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a01906144e3565b8015611a4e5780601f10611a2357610100808354040283529160200191611a4e565b820191906000526020600020905b815481529060010190602001808311611a3157829003601f168201915b5050505050905090565b611a60612654565b73ffffffffffffffffffffffffffffffffffffffff16611a7e6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614124565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b611b11612654565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690613fc4565b60405180910390fd5b8060056000611b8c612654565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c39612654565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7e9190613ee7565b60405180910390a35050565b611c9b611c95612654565b8361279f565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd1906141c4565b60405180910390fd5b611ce684848484612ad9565b50505050565b601560009054906101000a900460ff16611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290614004565b60405180910390fd5b600b546102886096605a611d4f9190614318565b611d599190614318565b611d639190614318565b611d6b610fc0565b10611dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da290613fe4565b60405180910390fd5b6005811115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614204565b60405180910390fd5b348167011c37937e080000611e04919061439f565b1115611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614244565b60405180910390fd5b60145481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e939190614318565b1115611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90614224565b60405180910390fd5b60005b81811015611f6457600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611f2f90614546565b9190505550611f51336001611f42610fc0565b611f4c9190614318565b612781565b8080611f5c90614546565b915050611ed7565b5050565b67011c37937e08000081565b60606000600f8054611f85906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb1906144e3565b8015611ffe5780601f10611fd357610100808354040283529160200191611ffe565b820191906000526020600020905b815481529060010190602001808311611fe157829003601f168201915b50505050509050600061201084612b35565b905060008251141561202657809250505061204d565b8181604051602001612039929190613e5c565b604051602081830303815290604052925050505b919050565b601560029054906101000a900460ff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90614044565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614044565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6060600e80546121ec906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612218906144e3565b80156122655780601f1061223a57610100808354040283529160200191612265565b820191906000526020600020905b81548152906001019060200180831161224857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61230b612654565b73ffffffffffffffffffffffffffffffffffffffff166123296118a6565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614124565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e690613f64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b6000600b546102886096605a6124cb9190614318565b6124d59190614318565b6124df9190614318565b905090565b601180546124f1906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461251d906144e3565b801561256a5780601f1061253f5761010080835404028352916020019161256a565b820191906000526020600020905b81548152906001019060200180831161254d57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061264d575061264c82612c96565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661273b836115ff565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61279b828260405180602001604052806000815250612d00565b5050565b60006127aa8261265c565b6127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090614024565b60405180910390fd5b60006127f4836115ff565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061286357508373ffffffffffffffffffffffffffffffffffffffff1661284b84610c3e565b73ffffffffffffffffffffffffffffffffffffffff16145b806128745750612873818561226f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661289d826115ff565b73ffffffffffffffffffffffffffffffffffffffff16146128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614164565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90613fa4565b60405180910390fd5b61296e838383612d5b565b6129796000826126c8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c991906143f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a209190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ae484848461287d565b612af084848484612e6f565b612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2690613f44565b60405180910390fd5b50505050565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c91565b600082905060005b60008214612baf578080612b9890614546565b915050600a82612ba8919061436e565b9150612b85565b60008167ffffffffffffffff811115612bcb57612bca6146ab565b5b6040519080825280601f01601f191660200182016040528015612bfd5781602001600182028036833780820191505090505b5090505b60008514612c8a57600182612c1691906143f9565b9150600a85612c25919061458f565b6030612c319190614318565b60f81b818381518110612c4757612c4661467c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c83919061436e565b9450612c01565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d0a8383613006565b612d176000848484612e6f565b612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d90613f44565b60405180910390fd5b505050565b612d668383836131d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da957612da4816131d9565b612de8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de757612de68382613222565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2b57612e268161338f565b612e6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6957612e688282613460565b5b5b505050565b6000612e908473ffffffffffffffffffffffffffffffffffffffff166134df565b15612ff9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb9612654565b8786866040518563ffffffff1660e01b8152600401612edb9493929190613e9b565b602060405180830381600087803b158015612ef557600080fd5b505af1925050508015612f2657506040513d601f19601f82011682018060405250810190612f239190613957565b60015b612fa9573d8060008114612f56576040519150601f19603f3d011682016040523d82523d6000602084013e612f5b565b606091505b50600081511415612fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9890613f44565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffe565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d906140e4565b60405180910390fd5b61307f8161265c565b156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690613f84565b60405180910390fd5b6130cb60008383612d5b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311b9190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161322f846116b1565b61323991906143f9565b905060006007600084815260200190815260200160002054905081811461331e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133a391906143f9565b90506000600960008481526020019081526020016000205490506000600883815481106133d3576133d261467c565b5b9060005260206000200154905080600883815481106133f5576133f461467c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134445761344361464d565b5b6001900381819060005260206000200160009055905550505050565b600061346b836116b1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546134fe906144e3565b90600052602060002090601f0160209004810192826135205760008555613567565b82601f1061353957803560ff1916838001178555613567565b82800160010185558215613567579182015b8281111561356657823582559160200191906001019061354b565b5b5090506135749190613578565b5090565b5b80821115613591576000816000905550600101613579565b5090565b60006135a86135a3846142a4565b61427f565b9050828152602081018484840111156135c4576135c36146e9565b5b6135cf8482856144a1565b509392505050565b6000813590506135e681614d47565b92915050565b60008083601f840112613602576136016146df565b5b8235905067ffffffffffffffff81111561361f5761361e6146da565b5b60208301915083602082028301111561363b5761363a6146e4565b5b9250929050565b60008135905061365181614d5e565b92915050565b60008135905061366681614d75565b92915050565b60008151905061367b81614d75565b92915050565b600082601f830112613696576136956146df565b5b81356136a6848260208601613595565b91505092915050565b60008083601f8401126136c5576136c46146df565b5b8235905067ffffffffffffffff8111156136e2576136e16146da565b5b6020830191508360018202830111156136fe576136fd6146e4565b5b9250929050565b60008135905061371481614d8c565b92915050565b6000602082840312156137305761372f6146f3565b5b600061373e848285016135d7565b91505092915050565b6000806040838503121561375e5761375d6146f3565b5b600061376c858286016135d7565b925050602061377d858286016135d7565b9150509250929050565b6000806000606084860312156137a05761379f6146f3565b5b60006137ae868287016135d7565b93505060206137bf868287016135d7565b92505060406137d086828701613705565b9150509250925092565b600080600080608085870312156137f4576137f36146f3565b5b6000613802878288016135d7565b9450506020613813878288016135d7565b935050604061382487828801613705565b925050606085013567ffffffffffffffff811115613845576138446146ee565b5b61385187828801613681565b91505092959194509250565b60008060408385031215613874576138736146f3565b5b6000613882858286016135d7565b925050602061389385828601613642565b9150509250929050565b600080604083850312156138b4576138b36146f3565b5b60006138c2858286016135d7565b92505060206138d385828601613705565b9150509250929050565b600080602083850312156138f4576138f36146f3565b5b600083013567ffffffffffffffff811115613912576139116146ee565b5b61391e858286016135ec565b92509250509250929050565b6000602082840312156139405761393f6146f3565b5b600061394e84828501613657565b91505092915050565b60006020828403121561396d5761396c6146f3565b5b600061397b8482850161366c565b91505092915050565b6000806020838503121561399b5761399a6146f3565b5b600083013567ffffffffffffffff8111156139b9576139b86146ee565b5b6139c5858286016136af565b92509250509250929050565b6000602082840312156139e7576139e66146f3565b5b60006139f584828501613705565b91505092915050565b613a078161442d565b82525050565b613a168161443f565b82525050565b6000613a27826142d5565b613a3181856142eb565b9350613a418185602086016144b0565b613a4a816146f8565b840191505092915050565b6000613a60826142e0565b613a6a81856142fc565b9350613a7a8185602086016144b0565b613a83816146f8565b840191505092915050565b6000613a99826142e0565b613aa3818561430d565b9350613ab38185602086016144b0565b80840191505092915050565b6000613acc602b836142fc565b9150613ad782614709565b604082019050919050565b6000613aef6032836142fc565b9150613afa82614758565b604082019050919050565b6000613b126026836142fc565b9150613b1d826147a7565b604082019050919050565b6000613b35601c836142fc565b9150613b40826147f6565b602082019050919050565b6000613b586024836142fc565b9150613b638261481f565b604082019050919050565b6000613b7b6019836142fc565b9150613b868261486e565b602082019050919050565b6000613b9e600c836142fc565b9150613ba982614897565b602082019050919050565b6000613bc1600b836142fc565b9150613bcc826148c0565b602082019050919050565b6000613be4602c836142fc565b9150613bef826148e9565b604082019050919050565b6000613c076011836142fc565b9150613c1282614938565b602082019050919050565b6000613c2a6038836142fc565b9150613c3582614961565b604082019050919050565b6000613c4d602a836142fc565b9150613c58826149b0565b604082019050919050565b6000613c706029836142fc565b9150613c7b826149ff565b604082019050919050565b6000613c936008836142fc565b9150613c9e82614a4e565b602082019050919050565b6000613cb66020836142fc565b9150613cc182614a77565b602082019050919050565b6000613cd9602c836142fc565b9150613ce482614aa0565b604082019050919050565b6000613cfc6020836142fc565b9150613d0782614aef565b602082019050919050565b6000613d1f600b836142fc565b9150613d2a82614b18565b602082019050919050565b6000613d426029836142fc565b9150613d4d82614b41565b604082019050919050565b6000613d656024836142fc565b9150613d7082614b90565b604082019050919050565b6000613d886021836142fc565b9150613d9382614bdf565b604082019050919050565b6000613dab6031836142fc565b9150613db682614c2e565b604082019050919050565b6000613dce602c836142fc565b9150613dd982614c7d565b604082019050919050565b6000613df16016836142fc565b9150613dfc82614ccc565b602082019050919050565b6000613e14600c836142fc565b9150613e1f82614cf5565b602082019050919050565b6000613e376010836142fc565b9150613e4282614d1e565b602082019050919050565b613e5681614497565b82525050565b6000613e688285613a8e565b9150613e748284613a8e565b91508190509392505050565b6000602082019050613e9560008301846139fe565b92915050565b6000608082019050613eb060008301876139fe565b613ebd60208301866139fe565b613eca6040830185613e4d565b8181036060830152613edc8184613a1c565b905095945050505050565b6000602082019050613efc6000830184613a0d565b92915050565b60006020820190508181036000830152613f1c8184613a55565b905092915050565b60006020820190508181036000830152613f3d81613abf565b9050919050565b60006020820190508181036000830152613f5d81613ae2565b9050919050565b60006020820190508181036000830152613f7d81613b05565b9050919050565b60006020820190508181036000830152613f9d81613b28565b9050919050565b60006020820190508181036000830152613fbd81613b4b565b9050919050565b60006020820190508181036000830152613fdd81613b6e565b9050919050565b60006020820190508181036000830152613ffd81613b91565b9050919050565b6000602082019050818103600083015261401d81613bb4565b9050919050565b6000602082019050818103600083015261403d81613bd7565b9050919050565b6000602082019050818103600083015261405d81613bfa565b9050919050565b6000602082019050818103600083015261407d81613c1d565b9050919050565b6000602082019050818103600083015261409d81613c40565b9050919050565b600060208201905081810360008301526140bd81613c63565b9050919050565b600060208201905081810360008301526140dd81613c86565b9050919050565b600060208201905081810360008301526140fd81613ca9565b9050919050565b6000602082019050818103600083015261411d81613ccc565b9050919050565b6000602082019050818103600083015261413d81613cef565b9050919050565b6000602082019050818103600083015261415d81613d12565b9050919050565b6000602082019050818103600083015261417d81613d35565b9050919050565b6000602082019050818103600083015261419d81613d58565b9050919050565b600060208201905081810360008301526141bd81613d7b565b9050919050565b600060208201905081810360008301526141dd81613d9e565b9050919050565b600060208201905081810360008301526141fd81613dc1565b9050919050565b6000602082019050818103600083015261421d81613de4565b9050919050565b6000602082019050818103600083015261423d81613e07565b9050919050565b6000602082019050818103600083015261425d81613e2a565b9050919050565b60006020820190506142796000830184613e4d565b92915050565b600061428961429a565b90506142958282614515565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bf576142be6146ab565b5b6142c8826146f8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061432382614497565b915061432e83614497565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614363576143626145c0565b5b828201905092915050565b600061437982614497565b915061438483614497565b925082614394576143936145ef565b5b828204905092915050565b60006143aa82614497565b91506143b583614497565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ee576143ed6145c0565b5b828202905092915050565b600061440482614497565b915061440f83614497565b925082821015614422576144216145c0565b5b828203905092915050565b600061443882614477565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156144ce5780820151818401526020810190506144b3565b838111156144dd576000848401525b50505050565b600060028204905060018216806144fb57607f821691505b6020821081141561450f5761450e61461e565b5b50919050565b61451e826146f8565b810181811067ffffffffffffffff8211171561453d5761453c6146ab565b5b80604052505050565b600061455182614497565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614584576145836145c0565b5b600182019050919050565b600061459a82614497565b91506145a583614497565b9250826145b5576145b46145ef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5045524d495353494f4e5f44454e494544000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f47494654535f454d505459000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f4549474854535f5045525f4d494e5400000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b614d508161442d565b8114614d5b57600080fd5b50565b614d678161443f565b8114614d7257600080fd5b50565b614d7e8161444b565b8114614d8957600080fd5b50565b614d9581614497565b8114614da057600080fd5b5056fea2646970667358221220ec509132df9d03677f24523605a32fe575c939344e46eb627beee1a137d65d3e64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027c5760003560e01c806362780fdf1161014f578063bb2233cf116100c1578063e8a3d4851161007a578063e8a3d48514610933578063e985e9c51461095e578063f2fde38b1461099b578063f4743070146109c4578063f82c099d146109ef578063faf924cf14610a1a5761027c565b8063bb2233cf14610856578063c0a0e10d14610872578063c87b56dd1461089d578063cf309012146108da578063dfe5dd6814610905578063e222c7f91461091c5761027c565b8063938e3d7b11610113578063938e3d7b1461075c57806395d89b4114610785578063989bdbb6146107b05780639bf80316146107c7578063a22cb46514610804578063b88d4fde1461082d5761027c565b806362780fdf146106755780636352211e146106a057806370a08231146106dd578063715018a61461071a5780638da5cb5b146107315761027c565b80631b57190e116101f357806342842e0e116101ac57806342842e0e14610576578063494677c51461059f5780634f6ccce7146105c857806352188a391461060557806355f804b31461062157806359a12ad51461064a5761027c565b80631b57190e146104785780631c053769146104a357806323b872dd146104ce57806326d93800146104f75780632f745c59146105225780633ccfd60b1461055f5761027c565b80630600918e116102455780630600918e1461036857806306fdde0314610393578063081812fc146103be578063095ea7b3146103fb578063163e1e611461042457806318160ddd1461044d5761027c565b80620b91031461028157806301ffc9a7146102ac57806304675ee0146102e9578063046dc1661461031457806305c9f30c1461033d575b600080fd5b34801561028d57600080fd5b50610296610a45565b6040516102a39190614264565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce919061392a565b610a54565b6040516102e09190613ee7565b60405180910390f35b3480156102f557600080fd5b506102fe610ace565b60405161030b9190614264565b60405180910390f35b34801561032057600080fd5b5061033b6004803603810190610336919061371a565b610ad4565b005b34801561034957600080fd5b50610352610b94565b60405161035f9190613ee7565b60405180910390f35b34801561037457600080fd5b5061037d610ba7565b60405161038a9190614264565b60405180910390f35b34801561039f57600080fd5b506103a8610bac565b6040516103b59190613f02565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e091906139d1565b610c3e565b6040516103f29190613e80565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d919061389d565b610cc3565b005b34801561043057600080fd5b5061044b600480360381019061044691906138dd565b610ddb565b005b34801561045957600080fd5b50610462610fc0565b60405161046f9190614264565b60405180910390f35b34801561048457600080fd5b5061048d610fcd565b60405161049a9190614264565b60405180910390f35b3480156104af57600080fd5b506104b8610fd3565b6040516104c59190614264565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613787565b610fd8565b005b34801561050357600080fd5b5061050c611038565b6040516105199190613ee7565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061389d565b61104b565b6040516105569190614264565b60405180910390f35b34801561056b57600080fd5b506105746110f0565b005b34801561058257600080fd5b5061059d60048036038101906105989190613787565b6111eb565b005b3480156105ab57600080fd5b506105c660048036038101906105c191906139d1565b61120b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906139d1565b6112f5565b6040516105fc9190614264565b60405180910390f35b61061f600480360381019061061a91906139d1565b611366565b005b34801561062d57600080fd5b5061064860048036038101906106439190613984565b6114fe565b005b34801561065657600080fd5b5061065f6115f4565b60405161066c9190614264565b60405180910390f35b34801561068157600080fd5b5061068a6115fa565b6040516106979190614264565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c291906139d1565b6115ff565b6040516106d49190613e80565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff919061371a565b6116b1565b6040516107119190614264565b60405180910390f35b34801561072657600080fd5b5061072f611769565b005b34801561073d57600080fd5b506107466118a6565b6040516107539190613e80565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613984565b6118d0565b005b34801561079157600080fd5b5061079a6119c6565b6040516107a79190613f02565b60405180910390f35b3480156107bc57600080fd5b506107c5611a58565b005b3480156107d357600080fd5b506107ee60048036038101906107e9919061371a565b611af1565b6040516107fb9190614264565b60405180910390f35b34801561081057600080fd5b5061082b6004803603810190610826919061385d565b611b09565b005b34801561083957600080fd5b50610854600480360381019061084f91906137da565b611c8a565b005b610870600480360381019061086b91906139d1565b611cec565b005b34801561087e57600080fd5b50610887611f68565b6040516108949190614264565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf91906139d1565b611f74565b6040516108d19190613f02565b60405180910390f35b3480156108e657600080fd5b506108ef612052565b6040516108fc9190613ee7565b60405180910390f35b34801561091157600080fd5b5061091a612065565b005b34801561092857600080fd5b50610931612121565b005b34801561093f57600080fd5b506109486121dd565b6040516109559190613f02565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190613747565b61226f565b6040516109929190613ee7565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd919061371a565b612303565b005b3480156109d057600080fd5b506109d96124af565b6040516109e69190614264565b60405180910390f35b3480156109fb57600080fd5b50610a046124b5565b604051610a119190614264565b60405180910390f35b348015610a2657600080fd5b50610a2f6124e4565b604051610a3c9190613f02565b60405180910390f35b6000610a4f610fc0565b905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac75750610ac682612572565b5b9050919050565b61028881565b610adc612654565b73ffffffffffffffffffffffffffffffffffffffff16610afa6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790614124565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601560009054906101000a900460ff1681565b605a81565b606060008054610bbb906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610be7906144e3565b8015610c345780601f10610c0957610100808354040283529160200191610c34565b820191906000526020600020905b815481529060010190602001808311610c1757829003601f168201915b5050505050905090565b6000610c498261265c565b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614104565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cce826115ff565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906141a4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5e612654565b73ffffffffffffffffffffffffffffffffffffffff161480610d8d5750610d8c81610d87612654565b61226f565b5b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390614064565b60405180910390fd5b610dd683836126c8565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614044565b60405180910390fd5b600b546102886096605a610e7f9190614318565b610e899190614318565b610e939190614318565b82829050610e9f610fc0565b610ea99190614318565b1115610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee1906140c4565b60405180910390fd5b605a82829050601254610efd9190614318565b1115610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614144565b60405180910390fd5b60005b82829050811015610fbb5760126000815480929190610f5f90614546565b9190505550610fa8838383818110610f7a57610f7961467c565b5b9050602002016020810190610f8f919061371a565b6001610f99610fc0565b610fa39190614318565b612781565b8080610fb390614546565b915050610f41565b505050565b6000600880549050905090565b60125481565b609681565b610fe9610fe3612654565b8261279f565b611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f906141c4565b60405180910390fd5b61103383838361287d565b505050565b601560019054906101000a900460ff1681565b6000611056836116b1565b8210611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613f24565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614044565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e8573d6000803e3d6000fd5b50565b61120683838360405180602001604052806000815250611c8a565b505050565b601560029054906101000a900460ff161561125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290614044565b60405180910390fd5b80600b8190555050565b60006112ff610fc0565b8210611340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611337906141e4565b60405180910390fd5b600882815481106113545761135361467c565b5b90600052602060002001549050919050565b601560019054906101000a900460ff166113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90614004565b60405180910390fd5b600b546102886096605a6113c99190614318565b6113d39190614318565b6113dd9190614318565b6113e5610fc0565b10611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90613fe4565b60405180910390fd5b6005811115611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614204565b60405180910390fd5b348167011c37937e08000061147e919061439f565b11156114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690614244565b60405180910390fd5b60005b818110156114fa576114e73360016114d8610fc0565b6114e29190614318565b612781565b80806114f290614546565b9150506114c2565b5050565b601560029054906101000a900460ff161561154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d590614044565b60405180910390fd5b8181600f91906115ef9291906134f2565b505050565b60135481565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906140a4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614084565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611771612654565b73ffffffffffffffffffffffffffffffffffffffff1661178f6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614124565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560029054906101000a900460ff1615611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790614184565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790614044565b60405180910390fd5b8181600e91906119c19291906134f2565b505050565b6060600180546119d5906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a01906144e3565b8015611a4e5780601f10611a2357610100808354040283529160200191611a4e565b820191906000526020600020905b815481529060010190602001808311611a3157829003601f168201915b5050505050905090565b611a60612654565b73ffffffffffffffffffffffffffffffffffffffff16611a7e6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614124565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b611b11612654565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690613fc4565b60405180910390fd5b8060056000611b8c612654565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c39612654565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7e9190613ee7565b60405180910390a35050565b611c9b611c95612654565b8361279f565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd1906141c4565b60405180910390fd5b611ce684848484612ad9565b50505050565b601560009054906101000a900460ff16611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290614004565b60405180910390fd5b600b546102886096605a611d4f9190614318565b611d599190614318565b611d639190614318565b611d6b610fc0565b10611dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da290613fe4565b60405180910390fd5b6005811115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614204565b60405180910390fd5b348167011c37937e080000611e04919061439f565b1115611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614244565b60405180910390fd5b60145481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e939190614318565b1115611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90614224565b60405180910390fd5b60005b81811015611f6457600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611f2f90614546565b9190505550611f51336001611f42610fc0565b611f4c9190614318565b612781565b8080611f5c90614546565b915050611ed7565b5050565b67011c37937e08000081565b60606000600f8054611f85906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb1906144e3565b8015611ffe5780601f10611fd357610100808354040283529160200191611ffe565b820191906000526020600020905b815481529060010190602001808311611fe157829003601f168201915b50505050509050600061201084612b35565b905060008251141561202657809250505061204d565b8181604051602001612039929190613e5c565b604051602081830303815290604052925050505b919050565b601560029054906101000a900460ff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90614044565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614044565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6060600e80546121ec906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612218906144e3565b80156122655780601f1061223a57610100808354040283529160200191612265565b820191906000526020600020905b81548152906001019060200180831161224857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61230b612654565b73ffffffffffffffffffffffffffffffffffffffff166123296118a6565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614124565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e690613f64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b6000600b546102886096605a6124cb9190614318565b6124d59190614318565b6124df9190614318565b905090565b601180546124f1906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461251d906144e3565b801561256a5780601f1061253f5761010080835404028352916020019161256a565b820191906000526020600020905b81548152906001019060200180831161254d57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061264d575061264c82612c96565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661273b836115ff565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61279b828260405180602001604052806000815250612d00565b5050565b60006127aa8261265c565b6127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090614024565b60405180910390fd5b60006127f4836115ff565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061286357508373ffffffffffffffffffffffffffffffffffffffff1661284b84610c3e565b73ffffffffffffffffffffffffffffffffffffffff16145b806128745750612873818561226f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661289d826115ff565b73ffffffffffffffffffffffffffffffffffffffff16146128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614164565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90613fa4565b60405180910390fd5b61296e838383612d5b565b6129796000826126c8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c991906143f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a209190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ae484848461287d565b612af084848484612e6f565b612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2690613f44565b60405180910390fd5b50505050565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c91565b600082905060005b60008214612baf578080612b9890614546565b915050600a82612ba8919061436e565b9150612b85565b60008167ffffffffffffffff811115612bcb57612bca6146ab565b5b6040519080825280601f01601f191660200182016040528015612bfd5781602001600182028036833780820191505090505b5090505b60008514612c8a57600182612c1691906143f9565b9150600a85612c25919061458f565b6030612c319190614318565b60f81b818381518110612c4757612c4661467c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c83919061436e565b9450612c01565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d0a8383613006565b612d176000848484612e6f565b612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d90613f44565b60405180910390fd5b505050565b612d668383836131d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da957612da4816131d9565b612de8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de757612de68382613222565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2b57612e268161338f565b612e6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6957612e688282613460565b5b5b505050565b6000612e908473ffffffffffffffffffffffffffffffffffffffff166134df565b15612ff9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb9612654565b8786866040518563ffffffff1660e01b8152600401612edb9493929190613e9b565b602060405180830381600087803b158015612ef557600080fd5b505af1925050508015612f2657506040513d601f19601f82011682018060405250810190612f239190613957565b60015b612fa9573d8060008114612f56576040519150601f19603f3d011682016040523d82523d6000602084013e612f5b565b606091505b50600081511415612fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9890613f44565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffe565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d906140e4565b60405180910390fd5b61307f8161265c565b156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690613f84565b60405180910390fd5b6130cb60008383612d5b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311b9190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161322f846116b1565b61323991906143f9565b905060006007600084815260200190815260200160002054905081811461331e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133a391906143f9565b90506000600960008481526020019081526020016000205490506000600883815481106133d3576133d261467c565b5b9060005260206000200154905080600883815481106133f5576133f461467c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134445761344361464d565b5b6001900381819060005260206000200160009055905550505050565b600061346b836116b1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546134fe906144e3565b90600052602060002090601f0160209004810192826135205760008555613567565b82601f1061353957803560ff1916838001178555613567565b82800160010185558215613567579182015b8281111561356657823582559160200191906001019061354b565b5b5090506135749190613578565b5090565b5b80821115613591576000816000905550600101613579565b5090565b60006135a86135a3846142a4565b61427f565b9050828152602081018484840111156135c4576135c36146e9565b5b6135cf8482856144a1565b509392505050565b6000813590506135e681614d47565b92915050565b60008083601f840112613602576136016146df565b5b8235905067ffffffffffffffff81111561361f5761361e6146da565b5b60208301915083602082028301111561363b5761363a6146e4565b5b9250929050565b60008135905061365181614d5e565b92915050565b60008135905061366681614d75565b92915050565b60008151905061367b81614d75565b92915050565b600082601f830112613696576136956146df565b5b81356136a6848260208601613595565b91505092915050565b60008083601f8401126136c5576136c46146df565b5b8235905067ffffffffffffffff8111156136e2576136e16146da565b5b6020830191508360018202830111156136fe576136fd6146e4565b5b9250929050565b60008135905061371481614d8c565b92915050565b6000602082840312156137305761372f6146f3565b5b600061373e848285016135d7565b91505092915050565b6000806040838503121561375e5761375d6146f3565b5b600061376c858286016135d7565b925050602061377d858286016135d7565b9150509250929050565b6000806000606084860312156137a05761379f6146f3565b5b60006137ae868287016135d7565b93505060206137bf868287016135d7565b92505060406137d086828701613705565b9150509250925092565b600080600080608085870312156137f4576137f36146f3565b5b6000613802878288016135d7565b9450506020613813878288016135d7565b935050604061382487828801613705565b925050606085013567ffffffffffffffff811115613845576138446146ee565b5b61385187828801613681565b91505092959194509250565b60008060408385031215613874576138736146f3565b5b6000613882858286016135d7565b925050602061389385828601613642565b9150509250929050565b600080604083850312156138b4576138b36146f3565b5b60006138c2858286016135d7565b92505060206138d385828601613705565b9150509250929050565b600080602083850312156138f4576138f36146f3565b5b600083013567ffffffffffffffff811115613912576139116146ee565b5b61391e858286016135ec565b92509250509250929050565b6000602082840312156139405761393f6146f3565b5b600061394e84828501613657565b91505092915050565b60006020828403121561396d5761396c6146f3565b5b600061397b8482850161366c565b91505092915050565b6000806020838503121561399b5761399a6146f3565b5b600083013567ffffffffffffffff8111156139b9576139b86146ee565b5b6139c5858286016136af565b92509250509250929050565b6000602082840312156139e7576139e66146f3565b5b60006139f584828501613705565b91505092915050565b613a078161442d565b82525050565b613a168161443f565b82525050565b6000613a27826142d5565b613a3181856142eb565b9350613a418185602086016144b0565b613a4a816146f8565b840191505092915050565b6000613a60826142e0565b613a6a81856142fc565b9350613a7a8185602086016144b0565b613a83816146f8565b840191505092915050565b6000613a99826142e0565b613aa3818561430d565b9350613ab38185602086016144b0565b80840191505092915050565b6000613acc602b836142fc565b9150613ad782614709565b604082019050919050565b6000613aef6032836142fc565b9150613afa82614758565b604082019050919050565b6000613b126026836142fc565b9150613b1d826147a7565b604082019050919050565b6000613b35601c836142fc565b9150613b40826147f6565b602082019050919050565b6000613b586024836142fc565b9150613b638261481f565b604082019050919050565b6000613b7b6019836142fc565b9150613b868261486e565b602082019050919050565b6000613b9e600c836142fc565b9150613ba982614897565b602082019050919050565b6000613bc1600b836142fc565b9150613bcc826148c0565b602082019050919050565b6000613be4602c836142fc565b9150613bef826148e9565b604082019050919050565b6000613c076011836142fc565b9150613c1282614938565b602082019050919050565b6000613c2a6038836142fc565b9150613c3582614961565b604082019050919050565b6000613c4d602a836142fc565b9150613c58826149b0565b604082019050919050565b6000613c706029836142fc565b9150613c7b826149ff565b604082019050919050565b6000613c936008836142fc565b9150613c9e82614a4e565b602082019050919050565b6000613cb66020836142fc565b9150613cc182614a77565b602082019050919050565b6000613cd9602c836142fc565b9150613ce482614aa0565b604082019050919050565b6000613cfc6020836142fc565b9150613d0782614aef565b602082019050919050565b6000613d1f600b836142fc565b9150613d2a82614b18565b602082019050919050565b6000613d426029836142fc565b9150613d4d82614b41565b604082019050919050565b6000613d656024836142fc565b9150613d7082614b90565b604082019050919050565b6000613d886021836142fc565b9150613d9382614bdf565b604082019050919050565b6000613dab6031836142fc565b9150613db682614c2e565b604082019050919050565b6000613dce602c836142fc565b9150613dd982614c7d565b604082019050919050565b6000613df16016836142fc565b9150613dfc82614ccc565b602082019050919050565b6000613e14600c836142fc565b9150613e1f82614cf5565b602082019050919050565b6000613e376010836142fc565b9150613e4282614d1e565b602082019050919050565b613e5681614497565b82525050565b6000613e688285613a8e565b9150613e748284613a8e565b91508190509392505050565b6000602082019050613e9560008301846139fe565b92915050565b6000608082019050613eb060008301876139fe565b613ebd60208301866139fe565b613eca6040830185613e4d565b8181036060830152613edc8184613a1c565b905095945050505050565b6000602082019050613efc6000830184613a0d565b92915050565b60006020820190508181036000830152613f1c8184613a55565b905092915050565b60006020820190508181036000830152613f3d81613abf565b9050919050565b60006020820190508181036000830152613f5d81613ae2565b9050919050565b60006020820190508181036000830152613f7d81613b05565b9050919050565b60006020820190508181036000830152613f9d81613b28565b9050919050565b60006020820190508181036000830152613fbd81613b4b565b9050919050565b60006020820190508181036000830152613fdd81613b6e565b9050919050565b60006020820190508181036000830152613ffd81613b91565b9050919050565b6000602082019050818103600083015261401d81613bb4565b9050919050565b6000602082019050818103600083015261403d81613bd7565b9050919050565b6000602082019050818103600083015261405d81613bfa565b9050919050565b6000602082019050818103600083015261407d81613c1d565b9050919050565b6000602082019050818103600083015261409d81613c40565b9050919050565b600060208201905081810360008301526140bd81613c63565b9050919050565b600060208201905081810360008301526140dd81613c86565b9050919050565b600060208201905081810360008301526140fd81613ca9565b9050919050565b6000602082019050818103600083015261411d81613ccc565b9050919050565b6000602082019050818103600083015261413d81613cef565b9050919050565b6000602082019050818103600083015261415d81613d12565b9050919050565b6000602082019050818103600083015261417d81613d35565b9050919050565b6000602082019050818103600083015261419d81613d58565b9050919050565b600060208201905081810360008301526141bd81613d7b565b9050919050565b600060208201905081810360008301526141dd81613d9e565b9050919050565b600060208201905081810360008301526141fd81613dc1565b9050919050565b6000602082019050818103600083015261421d81613de4565b9050919050565b6000602082019050818103600083015261423d81613e07565b9050919050565b6000602082019050818103600083015261425d81613e2a565b9050919050565b60006020820190506142796000830184613e4d565b92915050565b600061428961429a565b90506142958282614515565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bf576142be6146ab565b5b6142c8826146f8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061432382614497565b915061432e83614497565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614363576143626145c0565b5b828201905092915050565b600061437982614497565b915061438483614497565b925082614394576143936145ef565b5b828204905092915050565b60006143aa82614497565b91506143b583614497565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ee576143ed6145c0565b5b828202905092915050565b600061440482614497565b915061440f83614497565b925082821015614422576144216145c0565b5b828203905092915050565b600061443882614477565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156144ce5780820151818401526020810190506144b3565b838111156144dd576000848401525b50505050565b600060028204905060018216806144fb57607f821691505b6020821081141561450f5761450e61461e565b5b50919050565b61451e826146f8565b810181811067ffffffffffffffff8211171561453d5761453c6146ab565b5b80604052505050565b600061455182614497565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614584576145836145c0565b5b600182019050919050565b600061459a82614497565b91506145a583614497565b9250826145b5576145b46145ef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5045524d495353494f4e5f44454e494544000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f47494654535f454d505459000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f4549474854535f5045525f4d494e5400000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b614d508161442d565b8114614d5b57600080fd5b50565b614d678161443f565b8114614d7257600080fd5b50565b614d7e8161444b565b8114614d8957600080fd5b50565b614d9581614497565b8114614da057600080fd5b5056fea2646970667358221220ec509132df9d03677f24523605a32fe575c939344e46eb627beee1a137d65d3e64736f6c63430008070033

Deployed Bytecode Sourcemap

132:4352:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4385:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;905:234:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;306:43:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3238:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;882:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;214:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2361:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3780:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3324:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2257:450:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1542:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;770:27:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;258:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;920:34:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1218:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2711:155:12;;;;;;;;;;;;;:::i;:::-;;5010:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3649:158:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1725:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1771:482:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3492:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;801:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;443:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2064:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1802:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1691:145:10;;;;;;;;;;;;;:::i;:::-;;1059:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3332:156:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2523:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2870:67:12;;;;;;;;;;;;;:::i;:::-;;539:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4064:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5225:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1130:637:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;390:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3904:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;958:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2941:146;;;;;;;;;;;;;:::i;:::-;;3091:143;;;;;;;;;;;;;:::i;:::-;;3811:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4420:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1985:240:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;839:39:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4231:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;747:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4385:97;4441:7;4464:13;:11;:13::i;:::-;4457:20;;4385:97;:::o;905:234:4:-;1007:4;1045:35;1030:50;;;:11;:50;;;;:102;;;;1096:36;1120:11;1096:23;:36::i;:::-;1030:102;1023:109;;905:234;;;:::o;306:43:12:-;346:3;306:43;:::o;3238:89::-;1282:12:10;:10;:12::i;:::-;1271:23;;:7;:5;:7::i;:::-;:23;;;1263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3318:4:12::1;3303:12;;:19;;;;;;;;;;;;;;;;;;3238:89:::0;:::o;882:34::-;;;;;;;;;;;;;:::o;214:40::-;252:2;214:40;:::o;2361:98:3:-;2415:13;2447:5;2440:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2361:98;:::o;3780:217::-;3856:7;3883:16;3891:7;3883;:16::i;:::-;3875:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3966:15;:24;3982:7;3966:24;;;;;;;;;;;;;;;;;;;;;3959:31;;3780:217;;;:::o;3324:395::-;3404:13;3420:23;3435:7;3420:14;:23::i;:::-;3404:39;;3467:5;3461:11;;:2;:11;;;;3453:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3545:5;3529:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;3554:44;3578:5;3585:12;:10;:12::i;:::-;3554:23;:44::i;:::-;3529:69;3521:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:21;3700:2;3704:7;3691:8;:21::i;:::-;3394:325;3324:395;;:::o;2257:450:12:-;2338:12;;;;;;;;;;;2324:26;;:10;:26;;;2316:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2469:12;;346:3;299;252:2;2422:28;;;;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;2402:9;;:16;;2386:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:95;;2378:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;252:2;2523:9;;:16;;2508:12;;:31;;;;:::i;:::-;:46;;2500:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2582:9;2577:126;2601:9;;:16;;2597:1;:20;2577:126;;;2632:12;;:14;;;;;;;;;:::i;:::-;;;;;;2654:42;2664:9;;2674:1;2664:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2694:1;2678:13;:11;:13::i;:::-;:17;;;;:::i;:::-;2654:9;:42::i;:::-;2619:3;;;;;:::i;:::-;;;;2577:126;;;;2257:450;;:::o;1542:111:4:-;1603:7;1629:10;:17;;;;1622:24;;1542:111;:::o;770:27:12:-;;;;:::o;258:44::-;299:3;258:44;:::o;4644:300:3:-;4803:41;4822:12;:10;:12::i;:::-;4836:7;4803:18;:41::i;:::-;4795:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4909:28;4919:4;4925:2;4929:7;4909:9;:28::i;:::-;4644:300;;;:::o;920:34:12:-;;;;;;;;;;;;;:::o;1218:253:4:-;1315:7;1350:23;1367:5;1350:16;:23::i;:::-;1342:5;:31;1334:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1438:12;:19;1451:5;1438:19;;;;;;;;;;;;;;;:26;1458:5;1438:26;;;;;;;;;;;;1431:33;;1218:253;;;;:::o;2711:155:12:-;2768:12;;;;;;;;;;;2754:26;;:10;:26;;;2746:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2816:12;;;;;;;;;;;2808:30;;:53;2839:21;2808:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2711:155::o;5010:149:3:-;5113:39;5130:4;5136:2;5140:7;5113:39;;;;;;;;;;;;:16;:39::i;:::-;5010:149;;;:::o;3649:158:12:-;1067:6;;;;;;;;;;;1066:7;1058:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3736:12:::1;;;;;;;;;;;3722:26;;:10;:26;;;3714:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3791:11;3776:12;:26;;;;3649:158:::0;:::o;1725:230:4:-;1800:7;1835:30;:28;:30::i;:::-;1827:5;:38;1819:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:10;1942:5;1931:17;;;;;;;;:::i;:::-;;;;;;;;;;1924:24;;1725:230;;;:::o;1771:482:12:-;1848:14;;;;;;;;;;;1840:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1955:12;;346:3;299;252:2;1908:28;;;;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;1892:13;:11;:13::i;:::-;:75;1884:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;485:1;1998:13;:32;;1990:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2103:9;2086:13;429:10;2071:28;;;;:::i;:::-;:41;;2063:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2145:9;2140:109;2164:13;2160:1;:17;2140:109;;;2198:40;2208:10;2236:1;2220:13;:11;:13::i;:::-;:17;;;;:::i;:::-;2198:9;:40::i;:::-;2179:3;;;;;:::i;:::-;;;;2140:109;;;;1771:482;:::o;3492:153::-;1067:6;;;;;;;;;;;1066:7;1058:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3581:12:::1;;;;;;;;;;;3567:26;;:10;:26;;;3559:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3637:3;;3621:13;:19;;;;;;;:::i;:::-;;3492:153:::0;;:::o;801:34::-;;;;:::o;443:43::-;485:1;443:43;:::o;2064:235:3:-;2136:7;2155:13;2171:7;:16;2179:7;2171:16;;;;;;;;;;;;;;;;;;;;;2155:32;;2222:1;2205:19;;:5;:19;;;;2197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2287:5;2280:12;;;2064:235;;;:::o;1802:205::-;1874:7;1918:1;1901:19;;:5;:19;;;;1893:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1984:9;:16;1994:5;1984:16;;;;;;;;;;;;;;;;1977:23;;1802:205;;;:::o;1691:145:10:-;1282:12;:10;:12::i;:::-;1271:23;;:7;:5;:7::i;:::-;:23;;;1263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1797:1:::1;1760:40;;1781:6;;;;;;;;;;;1760:40;;;;;;;;;;;;1827:1;1810:6;;:19;;;;;;;;;;;;;;;;;;1691:145::o:0;1059:85::-;1105:7;1131:6;;;;;;;;;;;1124:13;;1059:85;:::o;3332:156:12:-;1067:6;;;;;;;;;;;1066:7;1058:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3425:12:::1;;;;;;;;;;;3411:26;;:10;:26;;;3403:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3480:3;;3465:12;:18;;;;;;;:::i;:::-;;3332:156:::0;;:::o;2523:102:3:-;2579:13;2611:7;2604:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2523:102;:::o;2870:67:12:-;1282:12:10;:10;:12::i;:::-;1271:23;;:7;:5;:7::i;:::-;:23;;;1263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2928:4:12::1;2919:6;;:13;;;;;;;;;;;;;;;;;;2870:67::o:0;539:56::-;;;;;;;;;;;;;;;;;:::o;4064:290:3:-;4178:12;:10;:12::i;:::-;4166:24;;:8;:24;;;;4158:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4276:8;4231:18;:32;4250:12;:10;:12::i;:::-;4231:32;;;;;;;;;;;;;;;:42;4264:8;4231:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4328:8;4299:48;;4314:12;:10;:12::i;:::-;4299:48;;;4338:8;4299:48;;;;;;:::i;:::-;;;;;;;;4064:290;;:::o;5225:282::-;5356:41;5375:12;:10;:12::i;:::-;5389:7;5356:18;:41::i;:::-;5348:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5461:39;5475:4;5481:2;5485:7;5494:5;5461:13;:39::i;:::-;5225:282;;;;:::o;1130:637:12:-;1208:15;;;;;;;;;;;1200:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;1316:12;;346:3;299;252:2;1269:28;;;;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;1253:13;:11;:13::i;:::-;:75;1245:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;485:1;1359:13;:32;;1351:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1464:9;1447:13;429:10;1432:28;;;;:::i;:::-;:41;;1424:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1561:20;;1544:13;1508:21;:33;1530:10;1508:33;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:73;;1500:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1610:9;1605:158;1629:13;1625:1;:17;1605:158;;;1663:21;:33;1685:10;1663:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;1712:40;1722:10;1750:1;1734:13;:11;:13::i;:::-;:17;;;;:::i;:::-;1712:9;:40::i;:::-;1644:3;;;;;:::i;:::-;;;;1605:158;;;;1130:637;:::o;390:49::-;429:10;390:49;:::o;3904:323::-;3986:13;4009:18;4030:13;4009:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4049:23;4075:26;4092:8;4075:16;:26::i;:::-;4049:52;;4134:1;4118:4;4112:18;:23;4108:60;;;4152:9;4145:16;;;;;;4108:60;4205:4;4211:9;4188:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4174:48;;;;3904:323;;;;:::o;958:18::-;;;;;;;;;;;;;:::o;2941:146::-;3007:12;;;;;;;;;;;2993:26;;:10;:26;;;2985:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3067:15;;;;;;;;;;;3066:16;3048:15;;:34;;;;;;;;;;;;;;;;;;2941:146::o;3091:143::-;3156:12;;;;;;;;;;;3142:26;;:10;:26;;;3134:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3215:14;;;;;;;;;;;3214:15;3197:14;;:32;;;;;;;;;;;;;;;;;;3091:143::o;3811:89::-;3855:13;3883:12;3876:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3811:89;:::o;4420:162:3:-;4517:4;4540:18;:25;4559:5;4540:25;;;;;;;;;;;;;;;:35;4566:8;4540:35;;;;;;;;;;;;;;;;;;;;;;;;;4533:42;;4420:162;;;;:::o;1985:240:10:-;1282:12;:10;:12::i;:::-;1271:23;;:7;:5;:7::i;:::-;:23;;;1263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2093:1:::1;2073:22;;:8;:22;;;;2065:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2182:8;2153:38;;2174:6;;;;;;;;;;;2153:38;;;;;;;;;;;;2210:8;2201:6;;:17;;;;;;;;;;;;;;;;;;1985:240:::0;:::o;839:39:12:-;;;;:::o;4231:150::-;4294:7;4364:12;;346:3;299;252:2;4317:28;;;;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;4310:66;;4231:150;:::o;747:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1455:288:3:-;1557:4;1595:25;1580:40;;;:11;:40;;;;:104;;;;1651:33;1636:48;;;:11;:48;;;;1580:104;:156;;;;1700:36;1724:11;1700:23;:36::i;:::-;1580:156;1573:163;;1455:288;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;6941:125:3:-;7006:4;7057:1;7029:30;;:7;:16;7037:7;7029:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7022:37;;6941:125;;;:::o;10705:171::-;10806:2;10779:15;:24;10795:7;10779:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10861:7;10857:2;10823:46;;10832:23;10847:7;10832:14;:23::i;:::-;10823:46;;;;;;;;;;;;10705:171;;:::o;7905:108::-;7980:26;7990:2;7994:7;7980:26;;;;;;;;;;;;:9;:26::i;:::-;7905:108;;:::o;7224:351::-;7317:4;7341:16;7349:7;7341;:16::i;:::-;7333:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7416:13;7432:23;7447:7;7432:14;:23::i;:::-;7416:39;;7484:5;7473:16;;:7;:16;;;:51;;;;7517:7;7493:31;;:20;7505:7;7493:11;:20::i;:::-;:31;;;7473:51;:94;;;;7528:39;7552:5;7559:7;7528:23;:39::i;:::-;7473:94;7465:103;;;7224:351;;;;:::o;10064:530::-;10188:4;10161:31;;:23;10176:7;10161:14;:23::i;:::-;:31;;;10153:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10270:1;10256:16;;:2;:16;;;;10248:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10324:39;10345:4;10351:2;10355:7;10324:20;:39::i;:::-;10425:29;10442:1;10446:7;10425:8;:29::i;:::-;10484:1;10465:9;:15;10475:4;10465:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10512:1;10495:9;:13;10505:2;10495:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10542:2;10523:7;:16;10531:7;10523:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10579:7;10575:2;10560:27;;10569:4;10560:27;;;;;;;;;;;;10064:530;;;:::o;6369:269::-;6482:28;6492:4;6498:2;6502:7;6482:9;:28::i;:::-;6528:48;6551:4;6557:2;6561:7;6570:5;6528:22;:48::i;:::-;6520:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6369:269;;;;:::o;271:703:11:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8234:247:3:-;8329:18;8335:2;8339:7;8329:5;:18::i;:::-;8365:54;8396:1;8400:2;8404:7;8413:5;8365:22;:54::i;:::-;8357:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8234:247;;;:::o;2551:542:4:-;2660:45;2687:4;2693:2;2697:7;2660:26;:45::i;:::-;2736:1;2720:18;;:4;:18;;;2716:183;;;2754:40;2786:7;2754:31;:40::i;:::-;2716:183;;;2823:2;2815:10;;:4;:10;;;2811:88;;2841:47;2874:4;2880:7;2841:32;:47::i;:::-;2811:88;2716:183;2926:1;2912:16;;:2;:16;;;2908:179;;;2944:45;2981:7;2944:36;:45::i;:::-;2908:179;;;3016:4;3010:10;;:2;:10;;;3006:81;;3036:40;3064:2;3068:7;3036:27;:40::i;:::-;3006:81;2908:179;2551:542;;;:::o;11429:824:3:-;11549:4;11573:15;:2;:13;;;:15::i;:::-;11569:678;;;11624:2;11608:36;;;11645:12;:10;:12::i;:::-;11659:4;11665:7;11674:5;11608:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11604:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11868:1;11851:6;:13;:18;11847:334;;;11893:60;;;;;;;;;;:::i;:::-;;;;;;;;11847:334;12133:6;12127:13;12118:6;12114:2;12110:15;12103:38;11604:591;11740:45;;;11730:55;;;:6;:55;;;;11723:62;;;;;11569:678;12232:4;12225:11;;11429:824;;;;;;;:::o;8803:372::-;8896:1;8882:16;;:2;:16;;;;8874:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8954:16;8962:7;8954;:16::i;:::-;8953:17;8945:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:45;9043:1;9047:2;9051:7;9014:20;:45::i;:::-;9087:1;9070:9;:13;9080:2;9070:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9117:2;9098:7;:16;9106:7;9098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9160:7;9156:2;9135:33;;9152:1;9135:33;;;;;;;;;;;;8803:372;;:::o;12849:93::-;;;;:::o;3799:161:4:-;3902:10;:17;;;;3875:15;:24;3891:7;3875:24;;;;;;;;;;;:44;;;;3929:10;3945:7;3929:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3799:161;:::o;4577:970::-;4839:22;4889:1;4864:22;4881:4;4864:16;:22::i;:::-;:26;;;;:::i;:::-;4839:51;;4900:18;4921:17;:26;4939:7;4921:26;;;;;;;;;;;;4900:47;;5065:14;5051:10;:28;5047:323;;5095:19;5117:12;:18;5130:4;5117:18;;;;;;;;;;;;;;;:34;5136:14;5117:34;;;;;;;;;;;;5095:56;;5199:11;5166:12;:18;5179:4;5166:18;;;;;;;;;;;;;;;:30;5185:10;5166:30;;;;;;;;;;;:44;;;;5315:10;5282:17;:30;5300:11;5282:30;;;;;;;;;;;:43;;;;5081:289;5047:323;5463:17;:26;5481:7;5463:26;;;;;;;;;;;5456:33;;;5506:12;:18;5519:4;5506:18;;;;;;;;;;;;;;;:34;5525:14;5506:34;;;;;;;;;;;5499:41;;;4658:889;;4577:970;;:::o;5835:1061::-;6084:22;6129:1;6109:10;:17;;;;:21;;;;:::i;:::-;6084:46;;6140:18;6161:15;:24;6177:7;6161:24;;;;;;;;;;;;6140:45;;6507:19;6529:10;6540:14;6529:26;;;;;;;;:::i;:::-;;;;;;;;;;6507:48;;6591:11;6566:10;6577;6566:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6701:10;6670:15;:28;6686:11;6670:28;;;;;;;;;;;:41;;;;6839:15;:24;6855:7;6839:24;;;;;;;;;;;6832:31;;;6873:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5906:990;;;5835:1061;:::o;3387:217::-;3471:14;3488:20;3505:2;3488:16;:20::i;:::-;3471:37;;3545:7;3518:12;:16;3531:2;3518:16;;;;;;;;;;;;;;;:24;3535:6;3518:24;;;;;;;;;;;:34;;;;3591:6;3562:17;:26;3580:7;3562:26;;;;;;;;;;;:35;;;;3461:143;3387:217;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:13:-;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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:329::-;2722:6;2771:2;2759:9;2750:7;2746:23;2742:32;2739:119;;;2777:79;;:::i;:::-;2739:119;2897:1;2922:53;2967:7;2958:6;2947:9;2943:22;2922:53;:::i;:::-;2912:63;;2868:117;2663:329;;;;:::o;2998:474::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;2998:474;;;;;:::o;3478:619::-;3555:6;3563;3571;3620:2;3608:9;3599:7;3595:23;3591:32;3588:119;;;3626:79;;:::i;:::-;3588:119;3746:1;3771:53;3816:7;3807:6;3796:9;3792:22;3771:53;:::i;:::-;3761:63;;3717:117;3873:2;3899:53;3944:7;3935:6;3924:9;3920:22;3899:53;:::i;:::-;3889:63;;3844:118;4001:2;4027:53;4072:7;4063:6;4052:9;4048:22;4027:53;:::i;:::-;4017:63;;3972:118;3478:619;;;;;:::o;4103:943::-;4198:6;4206;4214;4222;4271:3;4259:9;4250:7;4246:23;4242:33;4239:120;;;4278:79;;:::i;:::-;4239:120;4398:1;4423:53;4468:7;4459:6;4448:9;4444:22;4423:53;:::i;:::-;4413:63;;4369:117;4525:2;4551:53;4596:7;4587:6;4576:9;4572:22;4551:53;:::i;:::-;4541:63;;4496:118;4653:2;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4624:118;4809:2;4798:9;4794:18;4781:32;4840:18;4832:6;4829:30;4826:117;;;4862:79;;:::i;:::-;4826:117;4967:62;5021:7;5012:6;5001:9;4997:22;4967:62;:::i;:::-;4957:72;;4752:287;4103:943;;;;;;;:::o;5052:468::-;5117:6;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5271:117;5427:2;5453:50;5495:7;5486:6;5475:9;5471:22;5453:50;:::i;:::-;5443:60;;5398:115;5052:468;;;;;:::o;5526:474::-;5594:6;5602;5651:2;5639:9;5630:7;5626:23;5622:32;5619:119;;;5657:79;;:::i;:::-;5619:119;5777:1;5802:53;5847:7;5838:6;5827:9;5823:22;5802:53;:::i;:::-;5792:63;;5748:117;5904:2;5930:53;5975:7;5966:6;5955:9;5951:22;5930:53;:::i;:::-;5920:63;;5875:118;5526:474;;;;;:::o;6006:559::-;6092:6;6100;6149:2;6137:9;6128:7;6124:23;6120:32;6117:119;;;6155:79;;:::i;:::-;6117:119;6303:1;6292:9;6288:17;6275:31;6333:18;6325:6;6322:30;6319:117;;;6355:79;;:::i;:::-;6319:117;6468:80;6540:7;6531:6;6520:9;6516:22;6468:80;:::i;:::-;6450:98;;;;6246:312;6006:559;;;;;:::o;6571:327::-;6629:6;6678:2;6666:9;6657:7;6653:23;6649:32;6646:119;;;6684:79;;:::i;:::-;6646:119;6804:1;6829:52;6873:7;6864:6;6853:9;6849:22;6829:52;:::i;:::-;6819:62;;6775:116;6571:327;;;;:::o;6904:349::-;6973:6;7022:2;7010:9;7001:7;6997:23;6993:32;6990:119;;;7028:79;;:::i;:::-;6990:119;7148:1;7173:63;7228:7;7219:6;7208:9;7204:22;7173:63;:::i;:::-;7163:73;;7119:127;6904:349;;;;:::o;7259:529::-;7330:6;7338;7387:2;7375:9;7366:7;7362:23;7358:32;7355:119;;;7393:79;;:::i;:::-;7355:119;7541:1;7530:9;7526:17;7513:31;7571:18;7563:6;7560:30;7557:117;;;7593:79;;:::i;:::-;7557:117;7706:65;7763:7;7754:6;7743:9;7739:22;7706:65;:::i;:::-;7688:83;;;;7484:297;7259:529;;;;;:::o;7794:329::-;7853:6;7902:2;7890:9;7881:7;7877:23;7873:32;7870:119;;;7908:79;;:::i;:::-;7870:119;8028:1;8053:53;8098:7;8089:6;8078:9;8074:22;8053:53;:::i;:::-;8043:63;;7999:117;7794:329;;;;:::o;8129:118::-;8216:24;8234:5;8216:24;:::i;:::-;8211:3;8204:37;8129:118;;:::o;8253:109::-;8334:21;8349:5;8334:21;:::i;:::-;8329:3;8322:34;8253:109;;:::o;8368:360::-;8454:3;8482:38;8514:5;8482:38;:::i;:::-;8536:70;8599:6;8594:3;8536:70;:::i;:::-;8529:77;;8615:52;8660:6;8655:3;8648:4;8641:5;8637:16;8615:52;:::i;:::-;8692:29;8714:6;8692:29;:::i;:::-;8687:3;8683:39;8676:46;;8458:270;8368:360;;;;:::o;8734:364::-;8822:3;8850:39;8883:5;8850:39;:::i;:::-;8905:71;8969:6;8964:3;8905:71;:::i;:::-;8898:78;;8985:52;9030:6;9025:3;9018:4;9011:5;9007:16;8985:52;:::i;:::-;9062:29;9084:6;9062:29;:::i;:::-;9057:3;9053:39;9046:46;;8826:272;8734:364;;;;:::o;9104:377::-;9210:3;9238:39;9271:5;9238:39;:::i;:::-;9293:89;9375:6;9370:3;9293:89;:::i;:::-;9286:96;;9391:52;9436:6;9431:3;9424:4;9417:5;9413:16;9391:52;:::i;:::-;9468:6;9463:3;9459:16;9452:23;;9214:267;9104:377;;;;:::o;9487:366::-;9629:3;9650:67;9714:2;9709:3;9650:67;:::i;:::-;9643:74;;9726:93;9815:3;9726:93;:::i;:::-;9844:2;9839:3;9835:12;9828:19;;9487:366;;;:::o;9859:::-;10001:3;10022:67;10086:2;10081:3;10022:67;:::i;:::-;10015:74;;10098:93;10187:3;10098:93;:::i;:::-;10216:2;10211:3;10207:12;10200:19;;9859:366;;;:::o;10231:::-;10373:3;10394:67;10458:2;10453:3;10394:67;:::i;:::-;10387:74;;10470:93;10559:3;10470:93;:::i;:::-;10588:2;10583:3;10579:12;10572:19;;10231:366;;;:::o;10603:::-;10745:3;10766:67;10830:2;10825:3;10766:67;:::i;:::-;10759:74;;10842:93;10931:3;10842:93;:::i;:::-;10960:2;10955:3;10951:12;10944:19;;10603:366;;;:::o;10975:::-;11117:3;11138:67;11202:2;11197:3;11138:67;:::i;:::-;11131:74;;11214:93;11303:3;11214:93;:::i;:::-;11332:2;11327:3;11323:12;11316:19;;10975:366;;;:::o;11347:::-;11489:3;11510:67;11574:2;11569:3;11510:67;:::i;:::-;11503:74;;11586:93;11675:3;11586:93;:::i;:::-;11704:2;11699:3;11695:12;11688:19;;11347:366;;;:::o;11719:::-;11861:3;11882:67;11946:2;11941:3;11882:67;:::i;:::-;11875:74;;11958:93;12047:3;11958:93;:::i;:::-;12076:2;12071:3;12067:12;12060:19;;11719:366;;;:::o;12091:::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:365::-;14465:3;14486:66;14550:1;14545:3;14486:66;:::i;:::-;14479:73;;14561:93;14650:3;14561:93;:::i;:::-;14679:2;14674:3;14670:12;14663:19;;14323:365;;;:::o;14694:366::-;14836:3;14857:67;14921:2;14916:3;14857:67;:::i;:::-;14850:74;;14933:93;15022:3;14933:93;:::i;:::-;15051:2;15046:3;15042:12;15035:19;;14694:366;;;:::o;15066:::-;15208:3;15229:67;15293:2;15288:3;15229:67;:::i;:::-;15222:74;;15305:93;15394:3;15305:93;:::i;:::-;15423:2;15418:3;15414:12;15407:19;;15066:366;;;:::o;15438:::-;15580:3;15601:67;15665:2;15660:3;15601:67;:::i;:::-;15594:74;;15677:93;15766:3;15677:93;:::i;:::-;15795:2;15790:3;15786:12;15779:19;;15438:366;;;:::o;15810:::-;15952:3;15973:67;16037:2;16032:3;15973:67;:::i;:::-;15966:74;;16049:93;16138:3;16049:93;:::i;:::-;16167:2;16162:3;16158:12;16151:19;;15810:366;;;:::o;16182:::-;16324:3;16345:67;16409:2;16404:3;16345:67;:::i;:::-;16338:74;;16421:93;16510:3;16421:93;:::i;:::-;16539:2;16534:3;16530:12;16523:19;;16182:366;;;:::o;16554:::-;16696:3;16717:67;16781:2;16776:3;16717:67;:::i;:::-;16710:74;;16793:93;16882:3;16793:93;:::i;:::-;16911:2;16906:3;16902:12;16895:19;;16554:366;;;:::o;16926:::-;17068:3;17089:67;17153:2;17148:3;17089:67;:::i;:::-;17082:74;;17165:93;17254:3;17165:93;:::i;:::-;17283:2;17278:3;17274:12;17267:19;;16926:366;;;:::o;17298:::-;17440:3;17461:67;17525:2;17520:3;17461:67;:::i;:::-;17454:74;;17537:93;17626:3;17537:93;:::i;:::-;17655:2;17650:3;17646:12;17639:19;;17298:366;;;:::o;17670:::-;17812:3;17833:67;17897:2;17892:3;17833:67;:::i;:::-;17826:74;;17909:93;17998:3;17909:93;:::i;:::-;18027:2;18022:3;18018:12;18011:19;;17670:366;;;:::o;18042:::-;18184:3;18205:67;18269:2;18264:3;18205:67;:::i;:::-;18198:74;;18281:93;18370:3;18281:93;:::i;:::-;18399:2;18394:3;18390:12;18383:19;;18042:366;;;:::o;18414:::-;18556:3;18577:67;18641:2;18636:3;18577:67;:::i;:::-;18570:74;;18653:93;18742:3;18653:93;:::i;:::-;18771:2;18766:3;18762:12;18755:19;;18414:366;;;:::o;18786:::-;18928:3;18949:67;19013:2;19008:3;18949:67;:::i;:::-;18942:74;;19025:93;19114:3;19025:93;:::i;:::-;19143:2;19138:3;19134:12;19127:19;;18786:366;;;:::o;19158:118::-;19245:24;19263:5;19245:24;:::i;:::-;19240:3;19233:37;19158:118;;:::o;19282:435::-;19462:3;19484:95;19575:3;19566:6;19484:95;:::i;:::-;19477:102;;19596:95;19687:3;19678:6;19596:95;:::i;:::-;19589:102;;19708:3;19701:10;;19282:435;;;;;:::o;19723:222::-;19816:4;19854:2;19843:9;19839:18;19831:26;;19867:71;19935:1;19924:9;19920:17;19911:6;19867:71;:::i;:::-;19723:222;;;;:::o;19951:640::-;20146:4;20184:3;20173:9;20169:19;20161:27;;20198:71;20266:1;20255:9;20251:17;20242:6;20198:71;:::i;:::-;20279:72;20347:2;20336:9;20332:18;20323:6;20279:72;:::i;:::-;20361;20429:2;20418:9;20414:18;20405:6;20361:72;:::i;:::-;20480:9;20474:4;20470:20;20465:2;20454:9;20450:18;20443:48;20508:76;20579:4;20570:6;20508:76;:::i;:::-;20500:84;;19951:640;;;;;;;:::o;20597:210::-;20684:4;20722:2;20711:9;20707:18;20699:26;;20735:65;20797:1;20786:9;20782:17;20773:6;20735:65;:::i;:::-;20597:210;;;;:::o;20813:313::-;20926:4;20964:2;20953:9;20949:18;20941:26;;21013:9;21007:4;21003:20;20999:1;20988:9;20984:17;20977:47;21041:78;21114:4;21105:6;21041:78;:::i;:::-;21033:86;;20813:313;;;;:::o;21132:419::-;21298:4;21336:2;21325:9;21321:18;21313:26;;21385:9;21379:4;21375:20;21371:1;21360:9;21356:17;21349:47;21413:131;21539:4;21413:131;:::i;:::-;21405:139;;21132:419;;;:::o;21557:::-;21723:4;21761:2;21750:9;21746:18;21738:26;;21810:9;21804:4;21800:20;21796:1;21785:9;21781:17;21774:47;21838:131;21964:4;21838:131;:::i;:::-;21830:139;;21557:419;;;:::o;21982:::-;22148:4;22186:2;22175:9;22171:18;22163:26;;22235:9;22229:4;22225:20;22221:1;22210:9;22206:17;22199:47;22263:131;22389:4;22263:131;:::i;:::-;22255:139;;21982:419;;;:::o;22407:::-;22573:4;22611:2;22600:9;22596:18;22588:26;;22660:9;22654:4;22650:20;22646:1;22635:9;22631:17;22624:47;22688:131;22814:4;22688:131;:::i;:::-;22680:139;;22407:419;;;:::o;22832:::-;22998:4;23036:2;23025:9;23021:18;23013:26;;23085:9;23079:4;23075:20;23071:1;23060:9;23056:17;23049:47;23113:131;23239:4;23113:131;:::i;:::-;23105:139;;22832:419;;;:::o;23257:::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:131;23664:4;23538:131;:::i;:::-;23530:139;;23257:419;;;:::o;23682:::-;23848:4;23886:2;23875:9;23871:18;23863:26;;23935:9;23929:4;23925:20;23921:1;23910:9;23906:17;23899:47;23963:131;24089:4;23963:131;:::i;:::-;23955:139;;23682:419;;;:::o;24107:::-;24273:4;24311:2;24300:9;24296:18;24288:26;;24360:9;24354:4;24350:20;24346:1;24335:9;24331:17;24324:47;24388:131;24514:4;24388:131;:::i;:::-;24380:139;;24107:419;;;:::o;24532:::-;24698:4;24736:2;24725:9;24721:18;24713:26;;24785:9;24779:4;24775:20;24771:1;24760:9;24756:17;24749:47;24813:131;24939:4;24813:131;:::i;:::-;24805:139;;24532:419;;;:::o;24957:::-;25123:4;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;24957:419;;;:::o;25382:::-;25548:4;25586:2;25575:9;25571:18;25563:26;;25635:9;25629:4;25625:20;25621:1;25610:9;25606:17;25599:47;25663:131;25789:4;25663:131;:::i;:::-;25655:139;;25382:419;;;:::o;25807:::-;25973:4;26011:2;26000:9;25996:18;25988:26;;26060:9;26054:4;26050:20;26046:1;26035:9;26031:17;26024:47;26088:131;26214:4;26088:131;:::i;:::-;26080:139;;25807:419;;;:::o;26232:::-;26398:4;26436:2;26425:9;26421:18;26413:26;;26485:9;26479:4;26475:20;26471:1;26460:9;26456:17;26449:47;26513:131;26639:4;26513:131;:::i;:::-;26505:139;;26232:419;;;:::o;26657:::-;26823:4;26861:2;26850:9;26846:18;26838:26;;26910:9;26904:4;26900:20;26896:1;26885:9;26881:17;26874:47;26938:131;27064:4;26938:131;:::i;:::-;26930:139;;26657:419;;;:::o;27082:::-;27248:4;27286:2;27275:9;27271:18;27263:26;;27335:9;27329:4;27325:20;27321:1;27310:9;27306:17;27299:47;27363:131;27489:4;27363:131;:::i;:::-;27355:139;;27082:419;;;:::o;27507:::-;27673:4;27711:2;27700:9;27696:18;27688:26;;27760:9;27754:4;27750:20;27746:1;27735:9;27731:17;27724:47;27788:131;27914:4;27788:131;:::i;:::-;27780:139;;27507:419;;;:::o;27932:::-;28098:4;28136:2;28125:9;28121:18;28113:26;;28185:9;28179:4;28175:20;28171:1;28160:9;28156:17;28149:47;28213:131;28339:4;28213:131;:::i;:::-;28205:139;;27932:419;;;:::o;28357:::-;28523:4;28561:2;28550:9;28546:18;28538:26;;28610:9;28604:4;28600:20;28596:1;28585:9;28581:17;28574:47;28638:131;28764:4;28638:131;:::i;:::-;28630:139;;28357:419;;;:::o;28782:::-;28948:4;28986:2;28975:9;28971:18;28963:26;;29035:9;29029:4;29025:20;29021:1;29010:9;29006:17;28999:47;29063:131;29189:4;29063:131;:::i;:::-;29055:139;;28782:419;;;:::o;29207:::-;29373:4;29411:2;29400:9;29396:18;29388:26;;29460:9;29454:4;29450:20;29446:1;29435:9;29431:17;29424:47;29488:131;29614:4;29488:131;:::i;:::-;29480:139;;29207:419;;;:::o;29632:::-;29798:4;29836:2;29825:9;29821:18;29813:26;;29885:9;29879:4;29875:20;29871:1;29860:9;29856:17;29849:47;29913:131;30039:4;29913:131;:::i;:::-;29905:139;;29632:419;;;:::o;30057:::-;30223:4;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30057:419;;;:::o;30482:::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:::-;31073:4;31111:2;31100:9;31096:18;31088:26;;31160:9;31154:4;31150:20;31146:1;31135:9;31131:17;31124:47;31188:131;31314:4;31188:131;:::i;:::-;31180:139;;30907:419;;;:::o;31332:::-;31498:4;31536:2;31525:9;31521:18;31513:26;;31585:9;31579:4;31575:20;31571:1;31560:9;31556:17;31549:47;31613:131;31739:4;31613:131;:::i;:::-;31605:139;;31332:419;;;:::o;31757:::-;31923:4;31961:2;31950:9;31946:18;31938:26;;32010:9;32004:4;32000:20;31996:1;31985:9;31981:17;31974:47;32038:131;32164:4;32038:131;:::i;:::-;32030:139;;31757:419;;;:::o;32182:222::-;32275:4;32313:2;32302:9;32298:18;32290:26;;32326:71;32394:1;32383:9;32379:17;32370:6;32326:71;:::i;:::-;32182:222;;;;:::o;32410:129::-;32444:6;32471:20;;:::i;:::-;32461:30;;32500:33;32528:4;32520:6;32500:33;:::i;:::-;32410:129;;;:::o;32545:75::-;32578:6;32611:2;32605:9;32595:19;;32545:75;:::o;32626:307::-;32687:4;32777:18;32769:6;32766:30;32763:56;;;32799:18;;:::i;:::-;32763:56;32837:29;32859:6;32837:29;:::i;:::-;32829:37;;32921:4;32915;32911:15;32903:23;;32626:307;;;:::o;32939:98::-;32990:6;33024:5;33018:12;33008:22;;32939:98;;;:::o;33043:99::-;33095:6;33129:5;33123:12;33113:22;;33043:99;;;:::o;33148:168::-;33231:11;33265:6;33260:3;33253:19;33305:4;33300:3;33296:14;33281:29;;33148:168;;;;:::o;33322:169::-;33406:11;33440:6;33435:3;33428:19;33480:4;33475:3;33471:14;33456:29;;33322:169;;;;:::o;33497:148::-;33599:11;33636:3;33621:18;;33497:148;;;;:::o;33651:305::-;33691:3;33710:20;33728:1;33710:20;:::i;:::-;33705:25;;33744:20;33762:1;33744:20;:::i;:::-;33739:25;;33898:1;33830:66;33826:74;33823:1;33820:81;33817:107;;;33904:18;;:::i;:::-;33817:107;33948:1;33945;33941:9;33934:16;;33651:305;;;;:::o;33962:185::-;34002:1;34019:20;34037:1;34019:20;:::i;:::-;34014:25;;34053:20;34071:1;34053:20;:::i;:::-;34048:25;;34092:1;34082:35;;34097:18;;:::i;:::-;34082:35;34139:1;34136;34132:9;34127:14;;33962:185;;;;:::o;34153:348::-;34193:7;34216:20;34234:1;34216:20;:::i;:::-;34211:25;;34250:20;34268:1;34250:20;:::i;:::-;34245:25;;34438:1;34370:66;34366:74;34363:1;34360:81;34355:1;34348:9;34341:17;34337:105;34334:131;;;34445:18;;:::i;:::-;34334:131;34493:1;34490;34486:9;34475:20;;34153:348;;;;:::o;34507:191::-;34547:4;34567:20;34585:1;34567:20;:::i;:::-;34562:25;;34601:20;34619:1;34601:20;:::i;:::-;34596:25;;34640:1;34637;34634:8;34631:34;;;34645:18;;:::i;:::-;34631:34;34690:1;34687;34683:9;34675:17;;34507:191;;;;:::o;34704:96::-;34741:7;34770:24;34788:5;34770:24;:::i;:::-;34759:35;;34704:96;;;:::o;34806:90::-;34840:7;34883:5;34876:13;34869:21;34858:32;;34806:90;;;:::o;34902:149::-;34938:7;34978:66;34971:5;34967:78;34956:89;;34902:149;;;:::o;35057:126::-;35094:7;35134:42;35127:5;35123:54;35112:65;;35057:126;;;:::o;35189:77::-;35226:7;35255:5;35244:16;;35189:77;;;:::o;35272:154::-;35356:6;35351:3;35346;35333:30;35418:1;35409:6;35404:3;35400:16;35393:27;35272:154;;;:::o;35432:307::-;35500:1;35510:113;35524:6;35521:1;35518:13;35510:113;;;35609:1;35604:3;35600:11;35594:18;35590:1;35585:3;35581:11;35574:39;35546:2;35543:1;35539:10;35534:15;;35510:113;;;35641:6;35638:1;35635:13;35632:101;;;35721:1;35712:6;35707:3;35703:16;35696:27;35632:101;35481:258;35432:307;;;:::o;35745:320::-;35789:6;35826:1;35820:4;35816:12;35806:22;;35873:1;35867:4;35863:12;35894:18;35884:81;;35950:4;35942:6;35938:17;35928:27;;35884:81;36012:2;36004:6;36001:14;35981:18;35978:38;35975:84;;;36031:18;;:::i;:::-;35975:84;35796:269;35745:320;;;:::o;36071:281::-;36154:27;36176:4;36154:27;:::i;:::-;36146:6;36142:40;36284:6;36272:10;36269:22;36248:18;36236:10;36233:34;36230:62;36227:88;;;36295:18;;:::i;:::-;36227:88;36335:10;36331:2;36324:22;36114:238;36071:281;;:::o;36358:233::-;36397:3;36420:24;36438:5;36420:24;:::i;:::-;36411:33;;36466:66;36459:5;36456:77;36453:103;;;36536:18;;:::i;:::-;36453:103;36583:1;36576:5;36572:13;36565:20;;36358:233;;;:::o;36597:176::-;36629:1;36646:20;36664:1;36646:20;:::i;:::-;36641:25;;36680:20;36698:1;36680:20;:::i;:::-;36675:25;;36719:1;36709:35;;36724:18;;:::i;:::-;36709:35;36765:1;36762;36758:9;36753:14;;36597:176;;;;:::o;36779:180::-;36827:77;36824:1;36817:88;36924:4;36921:1;36914:15;36948:4;36945:1;36938:15;36965:180;37013:77;37010:1;37003:88;37110:4;37107:1;37100:15;37134:4;37131:1;37124:15;37151:180;37199:77;37196:1;37189:88;37296:4;37293:1;37286:15;37320:4;37317:1;37310:15;37337:180;37385:77;37382:1;37375:88;37482:4;37479:1;37472:15;37506:4;37503:1;37496:15;37523:180;37571:77;37568:1;37561:88;37668:4;37665:1;37658:15;37692:4;37689:1;37682:15;37709:180;37757:77;37754:1;37747:88;37854:4;37851:1;37844:15;37878:4;37875:1;37868:15;37895:117;38004:1;38001;37994:12;38018:117;38127:1;38124;38117:12;38141:117;38250:1;38247;38240:12;38264:117;38373:1;38370;38363:12;38387:117;38496:1;38493;38486:12;38510:117;38619:1;38616;38609:12;38633:102;38674:6;38725:2;38721:7;38716:2;38709:5;38705:14;38701:28;38691:38;;38633:102;;;:::o;38741:230::-;38881:34;38877:1;38869:6;38865:14;38858:58;38950:13;38945:2;38937:6;38933:15;38926:38;38741:230;:::o;38977:237::-;39117:34;39113:1;39105:6;39101:14;39094:58;39186:20;39181:2;39173:6;39169:15;39162:45;38977:237;:::o;39220:225::-;39360:34;39356:1;39348:6;39344:14;39337:58;39429:8;39424:2;39416:6;39412:15;39405:33;39220:225;:::o;39451:178::-;39591:30;39587:1;39579:6;39575:14;39568:54;39451:178;:::o;39635:223::-;39775:34;39771:1;39763:6;39759:14;39752:58;39844:6;39839:2;39831:6;39827:15;39820:31;39635:223;:::o;39864:175::-;40004:27;40000:1;39992:6;39988:14;39981:51;39864:175;:::o;40045:162::-;40185:14;40181:1;40173:6;40169:14;40162:38;40045:162;:::o;40213:161::-;40353:13;40349:1;40341:6;40337:14;40330:37;40213:161;:::o;40380:231::-;40520:34;40516:1;40508:6;40504:14;40497:58;40589:14;40584:2;40576:6;40572:15;40565:39;40380:231;:::o;40617:167::-;40757:19;40753:1;40745:6;40741:14;40734:43;40617:167;:::o;40790:243::-;40930:34;40926:1;40918:6;40914:14;40907:58;40999:26;40994:2;40986:6;40982:15;40975:51;40790:243;:::o;41039:229::-;41179:34;41175:1;41167:6;41163:14;41156:58;41248:12;41243:2;41235:6;41231:15;41224:37;41039:229;:::o;41274:228::-;41414:34;41410:1;41402:6;41398:14;41391:58;41483:11;41478:2;41470:6;41466:15;41459:36;41274:228;:::o;41508:158::-;41648:10;41644:1;41636:6;41632:14;41625:34;41508:158;:::o;41672:182::-;41812:34;41808:1;41800:6;41796:14;41789:58;41672:182;:::o;41860:231::-;42000:34;41996:1;41988:6;41984:14;41977:58;42069:14;42064:2;42056:6;42052:15;42045:39;41860:231;:::o;42097:182::-;42237:34;42233:1;42225:6;42221:14;42214:58;42097:182;:::o;42285:161::-;42425:13;42421:1;42413:6;42409:14;42402:37;42285:161;:::o;42452:228::-;42592:34;42588:1;42580:6;42576:14;42569:58;42661:11;42656:2;42648:6;42644:15;42637:36;42452:228;:::o;42686:223::-;42826:34;42822:1;42814:6;42810:14;42803:58;42895:6;42890:2;42882:6;42878:15;42871:31;42686:223;:::o;42915:220::-;43055:34;43051:1;43043:6;43039:14;43032:58;43124:3;43119:2;43111:6;43107:15;43100:28;42915:220;:::o;43141:236::-;43281:34;43277:1;43269:6;43265:14;43258:58;43350:19;43345:2;43337:6;43333:15;43326:44;43141:236;:::o;43383:231::-;43523:34;43519:1;43511:6;43507:14;43500:58;43592:14;43587:2;43579:6;43575:15;43568:39;43383:231;:::o;43620:172::-;43760:24;43756:1;43748:6;43744:14;43737:48;43620:172;:::o;43798:162::-;43938:14;43934:1;43926:6;43922:14;43915:38;43798:162;:::o;43966:166::-;44106:18;44102:1;44094:6;44090:14;44083:42;43966:166;:::o;44138:122::-;44211:24;44229:5;44211:24;:::i;:::-;44204:5;44201:35;44191:63;;44250:1;44247;44240:12;44191:63;44138:122;:::o;44266:116::-;44336:21;44351:5;44336:21;:::i;:::-;44329:5;44326:32;44316:60;;44372:1;44369;44362:12;44316:60;44266:116;:::o;44388:120::-;44460:23;44477:5;44460:23;:::i;:::-;44453:5;44450:34;44440:62;;44498:1;44495;44488:12;44440:62;44388:120;:::o;44514:122::-;44587:24;44605:5;44587:24;:::i;:::-;44580:5;44577:35;44567:63;;44626:1;44623;44616:12;44567:63;44514:122;:::o

Swarm Source

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

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