ETH Price: $3,266.91 (+1.01%)

Token

Beetle Game (BEETLE)
 

Overview

Max Total Supply

6 BEETLE

Holders

4

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0x003.eth
Balance
1 BEETLE
0x003f35595dce3187b4fff2b5a2c4303f7158208a
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:
BeetleGame

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.10;

library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param _addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address _addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

}

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

}


/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}


/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}


/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}


/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender does not own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }
  
  function ownerOfInternal(
    uint256 _tokenId
  )
    internal
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}



/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;


  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */


}


contract BeetleGame is NFTokenMetadata, Ownable 
{
    // Properties
    address payable feeAddress;
    uint constant public beetlePrice = 0.2 ether;
    uint constant public maxBeetles = 4444;    // Total Beetle Supply

    // Switches
    bool public isMintingActive = true;        // Is minting open? Yes or no.
    bool public isWhiteListActive = false;       // Is the public sale open or is it only whitelisted?

    // Mappings
    mapping(address => bool) private whiteList; // Map of addresses on the whitelist.
    mapping(address => uint256) public beetlesClaimed; // Map of how many Beetles are minted per address.

    // Vars
    uint256 public current_minted = 0;
    uint public mintLimit = 22;
    
    // URI Data
    string private metaAddress = "https://api.beetlegame.io/metadata/";
    string constant private jsonAppend = ".json";

    // Events
    event Minted(address sender, uint256 count);

    constructor()
    {
        nftName = "Beetle Game";
        nftSymbol = "BEETLE";
        feeAddress = payable(msg.sender);
    }

    function tokenURI(uint tokenID) external view returns (string memory)
    {   // @dev Token URIs are generated dynamically on view requests. 
        // This is to allow easy server changes and reduce gas fees for minting. -ssa2
        require(tokenID > 0, "Token does not exist.");
        require(tokenID <= current_minted, "Token hasn't been minted yet.");

        bytes32 thisToken;
        bytes memory concat;
        thisToken = uintToBytes(tokenID);
        concat = abi.encodePacked(metaAddress, thisToken, jsonAppend);
        return string(concat);
    }

    // Toggle whether any beetles can be minted at all.
    function toggleMinting() public onlyOwner
    {
        isMintingActive = !isMintingActive;
    }

    // Toggle if we're in the Whitelist or Public Sale.
    function toggleWhiteList() public onlyOwner
    {
        isWhiteListActive = !isWhiteListActive;
    }

    // Add a list of wallet addresses to the Whitelist.
    function addToWhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add the null address");

            whiteList[addresses[i]] = true;
        }
    }

    // Tells the world if a given address is whitelisted or not.
    function onWhiteList(address addr) external view returns (bool) {
        return whiteList[addr];
    }

    // guh
    function removeFromwhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cant add null address");

            whiteList[addresses[i]] = false;
        }
    }

    // Tells the world how many Beetles a given address has minted.
    function claimedBy(address owner) external view returns (uint256) {
        require(owner != address(0), 'The zero address cannot mint anything.');

        return beetlesClaimed[owner];
    }

    // Address  ETH gets sent to when withdrawing.
    function updateRecipient(address payable _newAddress) public onlyOwner
    {
        feeAddress = _newAddress;
    }

    // Takes care of converting an integer into the raw bytes of it's abi-encodable string.
    function uintToBytes(uint v) private pure returns (bytes32 ret) {
        if (v == 0)
        {
            ret = '0';
        }
        else
        {
            while (v > 0) 
            {
                ret = bytes32(uint(ret) / (2 ** 8));
                ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31));
                v /= 10;
            }
        }
        return ret;
    }

    // Public Sale minting function
    function mint(uint8 _mintNum) public payable
    {
        require(isMintingActive, "It's not time yet.");
        require(_mintNum > 0, "Not enough beetles.");
        require(_mintNum + beetlesClaimed[msg.sender] <= mintLimit, "Cant mint more than 4 Beetles.");
        require(msg.value >= beetlePrice * _mintNum, "Need more ETH juice.");
        require(current_minted + _mintNum <= maxBeetles, "Beetles out of stock.");
        if(isWhiteListActive)
        {
            require(whiteList[msg.sender], "You're not on the lovelist.");
        }

        for(uint i = 0; i < _mintNum; i++)
        {
            current_minted += 1;
            super._mint(msg.sender, current_minted);
            beetlesClaimed[msg.sender] += 1;
        }

        emit Minted(msg.sender, _mintNum);
    }

    // Emergency Devmint function if something gets messed up.
    function devMint(uint8 _mintNum) external onlyOwner 
    {
        require(_mintNum + current_minted <= maxBeetles, "Cannot mint more the total supply.");
        for(uint256 i = 0; i < _mintNum; i++) 
        {
            current_minted += 1;
            beetlesClaimed[msg.sender] += 1;
            super._mint(msg.sender, current_minted);
        }
    }

    // Withdraw the ETH stored in the contract.
    function withdrawETH() external onlyOwner 
    {
        feeAddress.transfer(address(this).balance);
    }

    // Update the metadata URI to a new server or IPFS if needed.
    function updateURI(string calldata _URI) external onlyOwner 
    {
        metaAddress = _URI;
    }

    // Update how many can be purchased at a time if need be.
    function updateLimit(uint newLimit) external onlyOwner
    {
        mintLimit = newLimit;
    }

    // Get how many Beetles are minted right now.
    function totalSupply() public view returns(uint) 
    {
        return current_minted;
    }

    // Get how many Beetles MAX can be minted.    
    function maxSupply() public pure returns(uint) 
    {
        return maxBeetles;
    }
}

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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Minted","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":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","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":"beetlePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"beetlesClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"current_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"isMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBeetles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromwhiteList","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":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteList","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newAddress","type":"address"}],"name":"updateRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506000600b556016600c5560405180606001604052806023815260200162004e1d60239139600d9080519060200190620000759291906200029b565b503480156200008357600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600b81526020017f426565746c652047616d6500000000000000000000000000000000000000000081525060059080519060200190620002059291906200029b565b506040518060400160405280600681526020017f424545544c45000000000000000000000000000000000000000000000000000081525060069080519060200190620002539291906200029b565b5033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003b0565b828054620002a9906200037a565b90600052602060002090601f016020900481019282620002cd576000855562000319565b82601f10620002e857805160ff191683800117855562000319565b8280016001018555821562000319579182015b8281111562000318578251825591602001919060010190620002fb565b5b5090506200032891906200032c565b5090565b5b80821115620003475760008160009055506001016200032d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039357607f821691505b60208210811415620003aa57620003a96200034b565b5b50919050565b614a5d80620003c06000396000f3fe6080604052600436106102255760003560e01c8063860d248a11610123578063c30f4a5a116100ab578063e985e9c51161006f578063e985e9c5146107e8578063f2fde38b14610825578063f3fe3bc31461084e578063fae0959a14610879578063feec756c146108a257610225565b8063c30f4a5a14610715578063c87b56dd1461073e578063d5abeb011461077b578063e086e5ec146107a6578063e1fbf991146107bd57610225565b8063974fbca8116100f2578063974fbca814610632578063996517cf1461065b578063a22cb46514610686578063b22d0c83146106af578063b88d4fde146106ec57610225565b8063860d248a146105745780638da5cb5b1461059f5780638da8a21f146105ca57806395d89b411461060757610225565b80633497d165116101b15780636ac437b0116101755780636ac437b0146104b05780636ecd2306146104db57806370a08231146104f7578063740d73f3146105345780637d55094d1461055d57610225565b80633497d165146103df57806342842e0e14610408578063573f5dae1461043157806363430b381461045c5780636352211e1461047357610225565b806318160ddd116101f857806318160ddd146102f85780631fb26d5b14610323578063221330bb1461034e57806323b872dd1461037957806329998d4b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613934565b6108cb565b60405161025e919061397c565b60405180910390f35b34801561027357600080fd5b5061027c610932565b6040516102899190613a30565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613a88565b6109c4565b6040516102c69190613af6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613b3d565b610adf565b005b34801561030457600080fd5b5061030d610ec2565b60405161031a9190613b8c565b60405180910390f35b34801561032f57600080fd5b50610338610ecc565b6040516103459190613b8c565b60405180910390f35b34801561035a57600080fd5b50610363610ed2565b6040516103709190613b8c565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613ba7565b610ede565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613bfa565b611330565b6040516103d69190613b8c565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190613c60565b6113e8565b005b34801561041457600080fd5b5061042f600480360381019061042a9190613ba7565b6115a8565b005b34801561043d57600080fd5b506104466115c8565b604051610453919061397c565b60405180910390f35b34801561046857600080fd5b506104716115db565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613a88565b6116d0565b6040516104a79190613af6565b60405180910390f35b3480156104bc57600080fd5b506104c56117b6565b6040516104d2919061397c565b60405180910390f35b6104f560048036038101906104f09190613c60565b6117c9565b005b34801561050357600080fd5b5061051e60048036038101906105199190613bfa565b611b1b565b60405161052b9190613b8c565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190613cf2565b611bd5565b005b34801561056957600080fd5b50610572611dda565b005b34801561058057600080fd5b50610589611ecf565b6040516105969190613a30565b60405180910390f35b3480156105ab57600080fd5b506105b4611f08565b6040516105c19190613af6565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190613bfa565b611f2e565b6040516105fe9190613b8c565b60405180910390f35b34801561061357600080fd5b5061061c611f46565b6040516106299190613a30565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613cf2565b611fd8565b005b34801561066757600080fd5b506106706121dd565b60405161067d9190613b8c565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613d6b565b6121e3565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613bfa565b6122e0565b6040516106e3919061397c565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613e01565b612336565b005b34801561072157600080fd5b5061073c60048036038101906107379190613edf565b61238d565b005b34801561074a57600080fd5b5061076560048036038101906107609190613a88565b61246c565b6040516107729190613a30565b60405180910390f35b34801561078757600080fd5b5061079061256b565b60405161079d9190613b8c565b60405180910390f35b3480156107b257600080fd5b506107bb612575565b005b3480156107c957600080fd5b506107d26126a9565b6040516107df9190613b8c565b60405180910390f35b3480156107f457600080fd5b5061080f600480360381019061080a9190613f2c565b6126af565b60405161081c919061397c565b60405180910390f35b34801561083157600080fd5b5061084c60048036038101906108479190613bfa565b612743565b005b34801561085a57600080fd5b50610863612975565b6040516108709190613a30565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613a88565b6129ae565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190613faa565b612a81565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461094190614006565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90614006565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999190613a30565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bd85750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c469190613a30565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d239190613a30565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e039190613a30565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600b54905090565b600b5481565b6702c68af0bb14000081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610faf57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806110405750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae9190613a30565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b9190613a30565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139190613a30565b60405180910390fd5b506113278686612b8e565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906140aa565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79190613a30565b60405180910390fd5b5061115c600b548260ff166114c591906140f9565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd906141c1565b60405180910390fd5b60005b8160ff168110156115a4576001600b600082825461152791906140f9565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157e91906140f9565b9250508190555061159133600b54612c43565b808061159c906141e1565b915050611509565b5050565b6115c383838360405180602001604052806000815250612e31565b505050565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a9190613a30565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a79190613a30565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b600860149054906101000a900460ff16611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614276565b60405180910390fd5b60008160ff161161185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906142e2565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260ff166118af91906140f9565b11156118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e79061434e565b60405180910390fd5b8060ff166702c68af0bb140000611907919061436e565b341015611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090614414565b60405180910390fd5b61115c8160ff16600b5461195d91906140f9565b111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614480565b60405180910390fd5b600860159054906101000a900460ff1615611a4057600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906144ec565b60405180910390fd5b5b60005b8160ff16811015611ade576001600b6000828254611a6191906140f9565b92505081905550611a7433600b54612c43565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac491906140f9565b925050819055508080611ad6906141e1565b915050611a43565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051611b10929190614547565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb9190613a30565b60405180910390fd5b50611bce826133f0565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c949190613a30565b60405180910390fd5b5060005b82829050811015611dd557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611cd757611cd6614570565b5b9050602002016020810190611cec9190613bfa565b73ffffffffffffffffffffffffffffffffffffffff161415611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a906145eb565b60405180910390fd5b600160096000858585818110611d5c57611d5b614570565b5b9050602002016020810190611d719190613bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611dcd906141e1565b915050611ca1565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999190613a30565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b606060068054611f5590614006565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8190614006565b8015611fce5780601f10611fa357610100808354040283529160200191611fce565b820191906000526020600020905b815481529060010190602001808311611fb157829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120979190613a30565b60405180910390fd5b5060005b828290508110156121d857600073ffffffffffffffffffffffffffffffffffffffff168383838181106120da576120d9614570565b5b90506020020160208101906120ef9190613bfa565b73ffffffffffffffffffffffffffffffffffffffff161415612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90614657565b60405180910390fd5b60006009600085858581811061215f5761215e614570565b5b90506020020160208101906121749190613bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121d0906141e1565b9150506120a4565b505050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122d4919061397c565b60405180910390a35050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61238685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e31565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c9190613a30565b60405180910390fd5b508181600d919061246792919061382f565b505050565b6060600082116124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a8906146c3565b60405180910390fd5b600b548211156124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed9061472f565b60405180910390fd5b6000606061250384613439565b9150600d826040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016125509392919061484a565b60405160208183030381529060405290508092505050919050565b600061115c905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061263d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126349190613a30565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156126a6573d6000803e3d6000fd5b50565b61115c81565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061280b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128029190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab9190613a30565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6d9190613a30565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b409190613a30565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612bcf826134f0565b612bd98183613529565b612be38383613694565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce29190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbd9190613a30565b60405180910390fd5b50612dd18282613694565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f0257503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612f935750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303400000000000000000000000000000000000000000000000000008152509061300a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130019190613a30565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130de9190613a30565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd9190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061326f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132669190613a30565b60405180910390fd5b5061327a8787612b8e565b6132998773ffffffffffffffffffffffffffffffffffffffff1661381c565b156133e65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016132df94939291906148d4565b6020604051808303816000875af11580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133229190614935565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da9190613a30565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082141561346b577f300000000000000000000000000000000000000000000000000000000000000090506134eb565b5b60008211156134ea576101008160001c6134869190614991565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a846134bb91906149c2565b6134c591906140f9565b6134cf919061436e565b60001b81179050600a826134e39190614991565b915061346c565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f99190613a30565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461365391906149f3565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061376e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137659190613a30565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461381191906140f9565b925050819055505050565b600080823b905060008111915050919050565b82805461383b90614006565b90600052602060002090601f01602090048101928261385d57600085556138a4565b82601f1061387657803560ff19168380011785556138a4565b828001600101855582156138a4579182015b828111156138a3578235825591602001919060010190613888565b5b5090506138b191906138b5565b5090565b5b808211156138ce5760008160009055506001016138b6565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613911816138dc565b811461391c57600080fd5b50565b60008135905061392e81613908565b92915050565b60006020828403121561394a576139496138d2565b5b60006139588482850161391f565b91505092915050565b60008115159050919050565b61397681613961565b82525050565b6000602082019050613991600083018461396d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139d15780820151818401526020810190506139b6565b838111156139e0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a0282613997565b613a0c81856139a2565b9350613a1c8185602086016139b3565b613a25816139e6565b840191505092915050565b60006020820190508181036000830152613a4a81846139f7565b905092915050565b6000819050919050565b613a6581613a52565b8114613a7057600080fd5b50565b600081359050613a8281613a5c565b92915050565b600060208284031215613a9e57613a9d6138d2565b5b6000613aac84828501613a73565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae082613ab5565b9050919050565b613af081613ad5565b82525050565b6000602082019050613b0b6000830184613ae7565b92915050565b613b1a81613ad5565b8114613b2557600080fd5b50565b600081359050613b3781613b11565b92915050565b60008060408385031215613b5457613b536138d2565b5b6000613b6285828601613b28565b9250506020613b7385828601613a73565b9150509250929050565b613b8681613a52565b82525050565b6000602082019050613ba16000830184613b7d565b92915050565b600080600060608486031215613bc057613bbf6138d2565b5b6000613bce86828701613b28565b9350506020613bdf86828701613b28565b9250506040613bf086828701613a73565b9150509250925092565b600060208284031215613c1057613c0f6138d2565b5b6000613c1e84828501613b28565b91505092915050565b600060ff82169050919050565b613c3d81613c27565b8114613c4857600080fd5b50565b600081359050613c5a81613c34565b92915050565b600060208284031215613c7657613c756138d2565b5b6000613c8484828501613c4b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613cb257613cb1613c8d565b5b8235905067ffffffffffffffff811115613ccf57613cce613c92565b5b602083019150836020820283011115613ceb57613cea613c97565b5b9250929050565b60008060208385031215613d0957613d086138d2565b5b600083013567ffffffffffffffff811115613d2757613d266138d7565b5b613d3385828601613c9c565b92509250509250929050565b613d4881613961565b8114613d5357600080fd5b50565b600081359050613d6581613d3f565b92915050565b60008060408385031215613d8257613d816138d2565b5b6000613d9085828601613b28565b9250506020613da185828601613d56565b9150509250929050565b60008083601f840112613dc157613dc0613c8d565b5b8235905067ffffffffffffffff811115613dde57613ddd613c92565b5b602083019150836001820283011115613dfa57613df9613c97565b5b9250929050565b600080600080600060808688031215613e1d57613e1c6138d2565b5b6000613e2b88828901613b28565b9550506020613e3c88828901613b28565b9450506040613e4d88828901613a73565b935050606086013567ffffffffffffffff811115613e6e57613e6d6138d7565b5b613e7a88828901613dab565b92509250509295509295909350565b60008083601f840112613e9f57613e9e613c8d565b5b8235905067ffffffffffffffff811115613ebc57613ebb613c92565b5b602083019150836001820283011115613ed857613ed7613c97565b5b9250929050565b60008060208385031215613ef657613ef56138d2565b5b600083013567ffffffffffffffff811115613f1457613f136138d7565b5b613f2085828601613e89565b92509250509250929050565b60008060408385031215613f4357613f426138d2565b5b6000613f5185828601613b28565b9250506020613f6285828601613b28565b9150509250929050565b6000613f7782613ab5565b9050919050565b613f8781613f6c565b8114613f9257600080fd5b50565b600081359050613fa481613f7e565b92915050565b600060208284031215613fc057613fbf6138d2565b5b6000613fce84828501613f95565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401e57607f821691505b6020821081141561403257614031613fd7565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b60006140946026836139a2565b915061409f82614038565b604082019050919050565b600060208201905081810360008301526140c381614087565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410482613a52565b915061410f83613a52565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436140ca565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ab6022836139a2565b91506141b68261414f565b604082019050919050565b600060208201905081810360008301526141da8161419e565b9050919050565b60006141ec82613a52565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421f5761421e6140ca565b5b600182019050919050565b7f49742773206e6f742074696d65207965742e0000000000000000000000000000600082015250565b60006142606012836139a2565b915061426b8261422a565b602082019050919050565b6000602082019050818103600083015261428f81614253565b9050919050565b7f4e6f7420656e6f75676820626565746c65732e00000000000000000000000000600082015250565b60006142cc6013836139a2565b91506142d782614296565b602082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f43616e74206d696e74206d6f7265207468616e203420426565746c65732e0000600082015250565b6000614338601e836139a2565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b600061437982613a52565b915061438483613a52565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143bd576143bc6140ca565b5b828202905092915050565b7f4e656564206d6f726520455448206a756963652e000000000000000000000000600082015250565b60006143fe6014836139a2565b9150614409826143c8565b602082019050919050565b6000602082019050818103600083015261442d816143f1565b9050919050565b7f426565746c6573206f7574206f662073746f636b2e0000000000000000000000600082015250565b600061446a6015836139a2565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f596f75277265206e6f74206f6e20746865206c6f76656c6973742e0000000000600082015250565b60006144d6601b836139a2565b91506144e1826144a0565b602082019050919050565b60006020820190508181036000830152614505816144c9565b9050919050565b6000819050919050565b600061453161452c61452784613c27565b61450c565b613a52565b9050919050565b61454181614516565b82525050565b600060408201905061455c6000830185613ae7565b6145696020830184614538565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006145d5601b836139a2565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b60006146416015836139a2565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006146ad6015836139a2565b91506146b882614677565b602082019050919050565b600060208201905081810360008301526146dc816146a0565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000614719601d836139a2565b9150614724826146e3565b602082019050919050565b600060208201905081810360008301526147488161470c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461477c81614006565b614786818661474f565b945060018216600081146147a157600181146147b2576147e5565b60ff198316865281860193506147e5565b6147bb8561475a565b60005b838110156147dd578154818901526001820191506020810190506147be565b838801955050505b50505092915050565b6000819050919050565b6000819050919050565b61481361480e826147ee565b6147f8565b82525050565b600061482482613997565b61482e818561474f565b935061483e8185602086016139b3565b80840191505092915050565b6000614856828661476f565b91506148628285614802565b6020820191506148728284614819565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006148a68261487f565b6148b0818561488a565b93506148c08185602086016139b3565b6148c9816139e6565b840191505092915050565b60006080820190506148e96000830187613ae7565b6148f66020830186613ae7565b6149036040830185613b7d565b8181036060830152614915818461489b565b905095945050505050565b60008151905061492f81613908565b92915050565b60006020828403121561494b5761494a6138d2565b5b600061495984828501614920565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061499c82613a52565b91506149a783613a52565b9250826149b7576149b6614962565b5b828204905092915050565b60006149cd82613a52565b91506149d883613a52565b9250826149e8576149e7614962565b5b828206905092915050565b60006149fe82613a52565b9150614a0983613a52565b925082821015614a1c57614a1b6140ca565b5b82820390509291505056fea2646970667358221220e8af1f9489cab191de4d96dd7214fba2ea2489057e0e86b1a543b00cff4110ca64736f6c634300080a003368747470733a2f2f6170692e626565746c6567616d652e696f2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063860d248a11610123578063c30f4a5a116100ab578063e985e9c51161006f578063e985e9c5146107e8578063f2fde38b14610825578063f3fe3bc31461084e578063fae0959a14610879578063feec756c146108a257610225565b8063c30f4a5a14610715578063c87b56dd1461073e578063d5abeb011461077b578063e086e5ec146107a6578063e1fbf991146107bd57610225565b8063974fbca8116100f2578063974fbca814610632578063996517cf1461065b578063a22cb46514610686578063b22d0c83146106af578063b88d4fde146106ec57610225565b8063860d248a146105745780638da5cb5b1461059f5780638da8a21f146105ca57806395d89b411461060757610225565b80633497d165116101b15780636ac437b0116101755780636ac437b0146104b05780636ecd2306146104db57806370a08231146104f7578063740d73f3146105345780637d55094d1461055d57610225565b80633497d165146103df57806342842e0e14610408578063573f5dae1461043157806363430b381461045c5780636352211e1461047357610225565b806318160ddd116101f857806318160ddd146102f85780631fb26d5b14610323578063221330bb1461034e57806323b872dd1461037957806329998d4b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613934565b6108cb565b60405161025e919061397c565b60405180910390f35b34801561027357600080fd5b5061027c610932565b6040516102899190613a30565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613a88565b6109c4565b6040516102c69190613af6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613b3d565b610adf565b005b34801561030457600080fd5b5061030d610ec2565b60405161031a9190613b8c565b60405180910390f35b34801561032f57600080fd5b50610338610ecc565b6040516103459190613b8c565b60405180910390f35b34801561035a57600080fd5b50610363610ed2565b6040516103709190613b8c565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613ba7565b610ede565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613bfa565b611330565b6040516103d69190613b8c565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190613c60565b6113e8565b005b34801561041457600080fd5b5061042f600480360381019061042a9190613ba7565b6115a8565b005b34801561043d57600080fd5b506104466115c8565b604051610453919061397c565b60405180910390f35b34801561046857600080fd5b506104716115db565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613a88565b6116d0565b6040516104a79190613af6565b60405180910390f35b3480156104bc57600080fd5b506104c56117b6565b6040516104d2919061397c565b60405180910390f35b6104f560048036038101906104f09190613c60565b6117c9565b005b34801561050357600080fd5b5061051e60048036038101906105199190613bfa565b611b1b565b60405161052b9190613b8c565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190613cf2565b611bd5565b005b34801561056957600080fd5b50610572611dda565b005b34801561058057600080fd5b50610589611ecf565b6040516105969190613a30565b60405180910390f35b3480156105ab57600080fd5b506105b4611f08565b6040516105c19190613af6565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190613bfa565b611f2e565b6040516105fe9190613b8c565b60405180910390f35b34801561061357600080fd5b5061061c611f46565b6040516106299190613a30565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613cf2565b611fd8565b005b34801561066757600080fd5b506106706121dd565b60405161067d9190613b8c565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613d6b565b6121e3565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613bfa565b6122e0565b6040516106e3919061397c565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613e01565b612336565b005b34801561072157600080fd5b5061073c60048036038101906107379190613edf565b61238d565b005b34801561074a57600080fd5b5061076560048036038101906107609190613a88565b61246c565b6040516107729190613a30565b60405180910390f35b34801561078757600080fd5b5061079061256b565b60405161079d9190613b8c565b60405180910390f35b3480156107b257600080fd5b506107bb612575565b005b3480156107c957600080fd5b506107d26126a9565b6040516107df9190613b8c565b60405180910390f35b3480156107f457600080fd5b5061080f600480360381019061080a9190613f2c565b6126af565b60405161081c919061397c565b60405180910390f35b34801561083157600080fd5b5061084c60048036038101906108479190613bfa565b612743565b005b34801561085a57600080fd5b50610863612975565b6040516108709190613a30565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613a88565b6129ae565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190613faa565b612a81565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606005805461094190614006565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90614006565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999190613a30565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bd85750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c469190613a30565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d239190613a30565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e039190613a30565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600b54905090565b600b5481565b6702c68af0bb14000081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610faf57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806110405750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae9190613a30565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b9190613a30565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139190613a30565b60405180910390fd5b506113278686612b8e565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906140aa565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79190613a30565b60405180910390fd5b5061115c600b548260ff166114c591906140f9565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd906141c1565b60405180910390fd5b60005b8160ff168110156115a4576001600b600082825461152791906140f9565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157e91906140f9565b9250508190555061159133600b54612c43565b808061159c906141e1565b915050611509565b5050565b6115c383838360405180602001604052806000815250612e31565b505050565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a9190613a30565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a79190613a30565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b600860149054906101000a900460ff16611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614276565b60405180910390fd5b60008160ff161161185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906142e2565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260ff166118af91906140f9565b11156118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e79061434e565b60405180910390fd5b8060ff166702c68af0bb140000611907919061436e565b341015611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090614414565b60405180910390fd5b61115c8160ff16600b5461195d91906140f9565b111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614480565b60405180910390fd5b600860159054906101000a900460ff1615611a4057600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906144ec565b60405180910390fd5b5b60005b8160ff16811015611ade576001600b6000828254611a6191906140f9565b92505081905550611a7433600b54612c43565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac491906140f9565b925050819055508080611ad6906141e1565b915050611a43565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051611b10929190614547565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb9190613a30565b60405180910390fd5b50611bce826133f0565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c949190613a30565b60405180910390fd5b5060005b82829050811015611dd557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611cd757611cd6614570565b5b9050602002016020810190611cec9190613bfa565b73ffffffffffffffffffffffffffffffffffffffff161415611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a906145eb565b60405180910390fd5b600160096000858585818110611d5c57611d5b614570565b5b9050602002016020810190611d719190613bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611dcd906141e1565b915050611ca1565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999190613a30565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915090505481565b606060068054611f5590614006565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8190614006565b8015611fce5780601f10611fa357610100808354040283529160200191611fce565b820191906000526020600020905b815481529060010190602001808311611fb157829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120979190613a30565b60405180910390fd5b5060005b828290508110156121d857600073ffffffffffffffffffffffffffffffffffffffff168383838181106120da576120d9614570565b5b90506020020160208101906120ef9190613bfa565b73ffffffffffffffffffffffffffffffffffffffff161415612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90614657565b60405180910390fd5b60006009600085858581811061215f5761215e614570565b5b90506020020160208101906121749190613bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121d0906141e1565b9150506120a4565b505050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122d4919061397c565b60405180910390a35050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61238685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e31565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c9190613a30565b60405180910390fd5b508181600d919061246792919061382f565b505050565b6060600082116124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a8906146c3565b60405180910390fd5b600b548211156124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed9061472f565b60405180910390fd5b6000606061250384613439565b9150600d826040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016125509392919061484a565b60405160208183030381529060405290508092505050919050565b600061115c905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061263d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126349190613a30565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156126a6573d6000803e3d6000fd5b50565b61115c81565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061280b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128029190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab9190613a30565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6d9190613a30565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b409190613a30565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612bcf826134f0565b612bd98183613529565b612be38383613694565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce29190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbd9190613a30565b60405180910390fd5b50612dd18282613694565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f0257503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612f935750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303400000000000000000000000000000000000000000000000000008152509061300a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130019190613a30565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130de9190613a30565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd9190613a30565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061326f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132669190613a30565b60405180910390fd5b5061327a8787612b8e565b6132998773ffffffffffffffffffffffffffffffffffffffff1661381c565b156133e65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016132df94939291906148d4565b6020604051808303816000875af11580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133229190614935565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da9190613a30565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082141561346b577f300000000000000000000000000000000000000000000000000000000000000090506134eb565b5b60008211156134ea576101008160001c6134869190614991565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a846134bb91906149c2565b6134c591906140f9565b6134cf919061436e565b60001b81179050600a826134e39190614991565b915061346c565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f99190613a30565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461365391906149f3565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303600000000000000000000000000000000000000000000000000008152509061376e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137659190613a30565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461381191906140f9565b925050819055505050565b600080823b905060008111915050919050565b82805461383b90614006565b90600052602060002090601f01602090048101928261385d57600085556138a4565b82601f1061387657803560ff19168380011785556138a4565b828001600101855582156138a4579182015b828111156138a3578235825591602001919060010190613888565b5b5090506138b191906138b5565b5090565b5b808211156138ce5760008160009055506001016138b6565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613911816138dc565b811461391c57600080fd5b50565b60008135905061392e81613908565b92915050565b60006020828403121561394a576139496138d2565b5b60006139588482850161391f565b91505092915050565b60008115159050919050565b61397681613961565b82525050565b6000602082019050613991600083018461396d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139d15780820151818401526020810190506139b6565b838111156139e0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a0282613997565b613a0c81856139a2565b9350613a1c8185602086016139b3565b613a25816139e6565b840191505092915050565b60006020820190508181036000830152613a4a81846139f7565b905092915050565b6000819050919050565b613a6581613a52565b8114613a7057600080fd5b50565b600081359050613a8281613a5c565b92915050565b600060208284031215613a9e57613a9d6138d2565b5b6000613aac84828501613a73565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae082613ab5565b9050919050565b613af081613ad5565b82525050565b6000602082019050613b0b6000830184613ae7565b92915050565b613b1a81613ad5565b8114613b2557600080fd5b50565b600081359050613b3781613b11565b92915050565b60008060408385031215613b5457613b536138d2565b5b6000613b6285828601613b28565b9250506020613b7385828601613a73565b9150509250929050565b613b8681613a52565b82525050565b6000602082019050613ba16000830184613b7d565b92915050565b600080600060608486031215613bc057613bbf6138d2565b5b6000613bce86828701613b28565b9350506020613bdf86828701613b28565b9250506040613bf086828701613a73565b9150509250925092565b600060208284031215613c1057613c0f6138d2565b5b6000613c1e84828501613b28565b91505092915050565b600060ff82169050919050565b613c3d81613c27565b8114613c4857600080fd5b50565b600081359050613c5a81613c34565b92915050565b600060208284031215613c7657613c756138d2565b5b6000613c8484828501613c4b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613cb257613cb1613c8d565b5b8235905067ffffffffffffffff811115613ccf57613cce613c92565b5b602083019150836020820283011115613ceb57613cea613c97565b5b9250929050565b60008060208385031215613d0957613d086138d2565b5b600083013567ffffffffffffffff811115613d2757613d266138d7565b5b613d3385828601613c9c565b92509250509250929050565b613d4881613961565b8114613d5357600080fd5b50565b600081359050613d6581613d3f565b92915050565b60008060408385031215613d8257613d816138d2565b5b6000613d9085828601613b28565b9250506020613da185828601613d56565b9150509250929050565b60008083601f840112613dc157613dc0613c8d565b5b8235905067ffffffffffffffff811115613dde57613ddd613c92565b5b602083019150836001820283011115613dfa57613df9613c97565b5b9250929050565b600080600080600060808688031215613e1d57613e1c6138d2565b5b6000613e2b88828901613b28565b9550506020613e3c88828901613b28565b9450506040613e4d88828901613a73565b935050606086013567ffffffffffffffff811115613e6e57613e6d6138d7565b5b613e7a88828901613dab565b92509250509295509295909350565b60008083601f840112613e9f57613e9e613c8d565b5b8235905067ffffffffffffffff811115613ebc57613ebb613c92565b5b602083019150836001820283011115613ed857613ed7613c97565b5b9250929050565b60008060208385031215613ef657613ef56138d2565b5b600083013567ffffffffffffffff811115613f1457613f136138d7565b5b613f2085828601613e89565b92509250509250929050565b60008060408385031215613f4357613f426138d2565b5b6000613f5185828601613b28565b9250506020613f6285828601613b28565b9150509250929050565b6000613f7782613ab5565b9050919050565b613f8781613f6c565b8114613f9257600080fd5b50565b600081359050613fa481613f7e565b92915050565b600060208284031215613fc057613fbf6138d2565b5b6000613fce84828501613f95565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401e57607f821691505b6020821081141561403257614031613fd7565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b60006140946026836139a2565b915061409f82614038565b604082019050919050565b600060208201905081810360008301526140c381614087565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410482613a52565b915061410f83613a52565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436140ca565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ab6022836139a2565b91506141b68261414f565b604082019050919050565b600060208201905081810360008301526141da8161419e565b9050919050565b60006141ec82613a52565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421f5761421e6140ca565b5b600182019050919050565b7f49742773206e6f742074696d65207965742e0000000000000000000000000000600082015250565b60006142606012836139a2565b915061426b8261422a565b602082019050919050565b6000602082019050818103600083015261428f81614253565b9050919050565b7f4e6f7420656e6f75676820626565746c65732e00000000000000000000000000600082015250565b60006142cc6013836139a2565b91506142d782614296565b602082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f43616e74206d696e74206d6f7265207468616e203420426565746c65732e0000600082015250565b6000614338601e836139a2565b915061434382614302565b602082019050919050565b600060208201905081810360008301526143678161432b565b9050919050565b600061437982613a52565b915061438483613a52565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143bd576143bc6140ca565b5b828202905092915050565b7f4e656564206d6f726520455448206a756963652e000000000000000000000000600082015250565b60006143fe6014836139a2565b9150614409826143c8565b602082019050919050565b6000602082019050818103600083015261442d816143f1565b9050919050565b7f426565746c6573206f7574206f662073746f636b2e0000000000000000000000600082015250565b600061446a6015836139a2565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f596f75277265206e6f74206f6e20746865206c6f76656c6973742e0000000000600082015250565b60006144d6601b836139a2565b91506144e1826144a0565b602082019050919050565b60006020820190508181036000830152614505816144c9565b9050919050565b6000819050919050565b600061453161452c61452784613c27565b61450c565b613a52565b9050919050565b61454181614516565b82525050565b600060408201905061455c6000830185613ae7565b6145696020830184614538565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006145d5601b836139a2565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b60006146416015836139a2565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006146ad6015836139a2565b91506146b882614677565b602082019050919050565b600060208201905081810360008301526146dc816146a0565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000614719601d836139a2565b9150614724826146e3565b602082019050919050565b600060208201905081810360008301526147488161470c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461477c81614006565b614786818661474f565b945060018216600081146147a157600181146147b2576147e5565b60ff198316865281860193506147e5565b6147bb8561475a565b60005b838110156147dd578154818901526001820191506020810190506147be565b838801955050505b50505092915050565b6000819050919050565b6000819050919050565b61481361480e826147ee565b6147f8565b82525050565b600061482482613997565b61482e818561474f565b935061483e8185602086016139b3565b80840191505092915050565b6000614856828661476f565b91506148628285614802565b6020820191506148728284614819565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006148a68261487f565b6148b0818561488a565b93506148c08185602086016139b3565b6148c9816139e6565b840191505092915050565b60006080820190506148e96000830187613ae7565b6148f66020830186613ae7565b6149036040830185613b7d565b8181036060830152614915818461489b565b905095945050505050565b60008151905061492f81613908565b92915050565b60006020828403121561494b5761494a6138d2565b5b600061495984828501614920565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061499c82613a52565b91506149a783613a52565b9250826149b7576149b6614962565b5b828204905092915050565b60006149cd82613a52565b91506149d883613a52565b9250826149e8576149e7614962565b5b828206905092915050565b60006149fe82613a52565b9150614a0983613a52565b925082821015614a1c57614a1b6140ca565b5b82820390509291505056fea2646970667358221220e8af1f9489cab191de4d96dd7214fba2ea2489057e0e86b1a543b00cff4110ca64736f6c634300080a0033

Deployed Bytecode Sourcemap

26552:5898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10259:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26026:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20242:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17816:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32203:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27213:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26661:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17042:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29456:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31263:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16287:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26881:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28453:106;;;;;;;;;;;;;:::i;:::-;;19580:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26802:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30377:814;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19106:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28624:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28288:100;;;;;;;;;;;;;:::i;:::-;;10868:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10988:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27091:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26262:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29101:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27253:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18580:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28976:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15667:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31871:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27645:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32358:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31687:109;;;;;;;;;;;;;:::i;:::-;;26712:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20694:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11813:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10812:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32045:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29712:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10259:172;10369:4;10392:19;:33;10412:12;10392:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10385:40;;10259:172;;;:::o;26026:120::-;26094:19;26133:7;26125:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:120;:::o;20242:183::-;20371:7;20347:8;14630:1;14599:33;;:9;:19;14609:8;14599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14634:13;;;;;;;;;;;;;;;;;14591:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20397:12:::1;:22;20410:8;20397:22;;;;;;;;;;;;;;;;;;;;;20390:29;;20242:183:::0;;;;:::o;17816:352::-;17929:8;13783:18;13804:9;:19;13814:8;13804:19;;;;;;;;;;;;;;;;;;;;;13783:40;;13860:10;13846:24;;:10;:24;;;:68;;;;13874:16;:28;13891:10;13874:28;;;;;;;;;;;;;;;:40;13903:10;13874:40;;;;;;;;;;;;;;;;;;;;;;;;;13846:68;13923:21;;;;;;;;;;;;;;;;;13830:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17957:8:::1;14630:1;14599:33;;:9;:19;14609:8;14599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14634:13;;;;;;;;;;;;;;;;::::0;14591:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17977:18:::2;17998:9;:19;18008:8;17998:19;;;;;;;;;;;;;;;;;;;;;17977:40;;18045:10;18032:23;;:9;:23;;;;18057:8;;;;;;;;;;;;;;;;::::0;18024:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18100:9;18075:12;:22;18088:8;18075:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;18153:8;18142:9;18121:41;;18130:10;18121:41;;;;;;;;;;;;17970:198;13958:1:::1;13776:189:::0;17816:352;;;:::o;32203:95::-;32246:4;32276:14;;32269:21;;32203:95;:::o;27213:33::-;;;;:::o;26661:44::-;26696:9;26661:44;:::o;17042:353::-;17175:8;14163:18;14184:9;:19;14194:8;14184:19;;;;;;;;;;;;;;;;;;;;;14163:40;;14240:10;14226:24;;:10;:24;;;:71;;;;14287:10;14261:36;;:12;:22;14274:8;14261:22;;;;;;;;;;;;;;;;;;;;;:36;;;14226:71;:122;;;;14308:16;:28;14325:10;14308:28;;;;;;;;;;;;;;;:40;14337:10;14308:40;;;;;;;;;;;;;;;;;;;;;;;;;14226:122;14357:30;;;;;;;;;;;;;;;;;14210:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17203:8:::1;14630:1;14599:33;;:9;:19;14609:8;14599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14634:13;;;;;;;;;;;;;;;;::::0;14591:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17223:18:::2;17244:9;:19;17254:8;17244:19;;;;;;;;;;;;;;;;;;;;;17223:40;;17292:5;17278:19;;:10;:19;;;17299:9;;;;;;;;;;;;;;;;::::0;17270:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17339:1;17324:17;;:3;:17;;;;17343:12;;;;;;;;;;;;;;;;::::0;17316:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17365:24;17375:3;17380:8;17365:9;:24::i;:::-;17216:179;14401:1:::1;14156:252:::0;17042:353;;;;:::o;29456:196::-;29513:7;29558:1;29541:19;;:5;:19;;;;29533:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29623:14;:21;29638:5;29623:21;;;;;;;;;;;;;;;;29616:28;;29456:196;;;:::o;31263:367::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26746:4:::1;31351:14;;31340:8;:25;;;;;;:::i;:::-;:39;;31332:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;31433:9;31429:194;31452:8;31448:12;;:1;:12;31429:194;;;31510:1;31492:14;;:19;;;;;;;:::i;:::-;;;;;;;;31556:1;31526:14;:26;31541:10;31526:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;31572:39;31584:10;31596:14;;31572:11;:39::i;:::-;31462:3;;;;;:::i;:::-;;;;31429:194;;;;31263:367:::0;:::o;16287:179::-;16417:43;16435:5;16442:3;16447:8;16417:43;;;;;;;;;;;;:17;:43::i;:::-;16287:179;;;:::o;26881:37::-;;;;;;;;;;;;;:::o;28453:106::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28534:17:::1;;;;;;;;;;;28533:18;28513:17;;:38;;;;;;;;;;;;;;;;;;28453:106::o:0;19580:208::-;19677:14;19712:9;:19;19722:8;19712:19;;;;;;;;;;;;;;;;;;;;;19703:28;;19764:1;19746:20;;:6;:20;;;;19768:13;;;;;;;;;;;;;;;;;19738:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19580:208;;;:::o;26802:34::-;;;;;;;;;;;;;:::o;30377:814::-;30446:15;;;;;;;;;;;30438:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;30514:1;30503:8;:12;;;30495:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;30599:9;;30569:14;:26;30584:10;30569:26;;;;;;;;;;;;;;;;30558:8;:37;;;;;;:::i;:::-;:50;;30550:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;30689:8;30675:22;;26696:9;30675:22;;;;:::i;:::-;30662:9;:35;;30654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26746:4;30758:8;30741:25;;:14;;:25;;;;:::i;:::-;:39;;30733:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30820:17;;;;;;;;;;;30817:119;;;30871:9;:21;30881:10;30871:21;;;;;;;;;;;;;;;;;;;;;;;;;30863:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30817:119;30952:6;30948:190;30968:8;30964:12;;:1;:12;30948:190;;;31025:1;31007:14;;:19;;;;;;;:::i;:::-;;;;;;;;31041:39;31053:10;31065:14;;31041:11;:39::i;:::-;31125:1;31095:14;:26;31110:10;31095:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;30978:3;;;;;:::i;:::-;;;;30948:190;;;;31155:28;31162:10;31174:8;31155:28;;;;;;;:::i;:::-;;;;;;;;30377:814;:::o;19106:204::-;19203:7;19248:1;19230:20;;:6;:20;;;;19252:12;;;;;;;;;;;;;;;;;19222:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19279:25;19297:6;19279:17;:25::i;:::-;19272:32;;19106:204;;;:::o;28624:278::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28713:9:::1;28708:187;28732:9;;:16;;28728:1;:20;28708:187;;;28802:1;28778:26;;:9;;28788:1;28778:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;28770:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28879:4;28853:9;:23;28863:9;;28873:1;28863:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;28853:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;28750:3;;;;;:::i;:::-;;;;28708:187;;;;28624:278:::0;;:::o;28288:100::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28365:15:::1;;;;;;;;;;;28364:16;28346:15;;:34;;;;;;;;;;;;;;;;;;28288:100::o:0;10868:65::-;;;;;;;;;;;;;;;;;;;:::o;10988:20::-;;;;;;;;;;;;;:::o;27091:49::-;;;;;;;;;;;;;;;;;:::o;26262:128::-;26332:21;26375:9;26365:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26262:128;:::o;29101:278::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29195:9:::1;29190:182;29214:9;;:16;;29210:1;:20;29190:182;;;29284:1;29260:26;;:9;;29270:1;29260:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;29252:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;29355:5;29329:9;:23;29339:9;;29349:1;29339:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29329:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;29232:3;;;;;:::i;:::-;;;;29190:182;;;;29101:278:::0;;:::o;27253:26::-;;;;:::o;18580:232::-;18737:9;18695:16;:28;18712:10;18695:28;;;;;;;;;;;;;;;:39;18724:9;18695:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;18785:9;18758:48;;18773:10;18758:48;;;18796:9;18758:48;;;;;;:::i;:::-;;;;;;;;18580:232;;:::o;28976:105::-;29034:4;29058:9;:15;29068:4;29058:15;;;;;;;;;;;;;;;;;;;;;;;;;29051:22;;28976:105;;;:::o;15667:209::-;15824:46;15842:5;15849:3;15854:8;15864:5;;15824:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;15667:209;;;;;:::o;31871:103::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31962:4:::1;;31948:11;:18;;;;;;;:::i;:::-;;31871:103:::0;;:::o;27645:578::-;27700:13;27903:1;27893:7;:11;27885:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27960:14;;27949:7;:25;;27941:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:17;28049:19;28091:20;28103:7;28091:11;:20::i;:::-;28079:32;;28148:11;28161:9;28172:10;;;;;;;;;;;;;;;;;28131:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28122:61;;28208:6;28194:21;;;;27645:578;;;:::o;32358:89::-;32399:4;26746;32422:17;;32358:89;:::o;31687:109::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31746:10:::1;;;;;;;;;;;:19;;:42;31766:21;31746:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;31687:109::o:0;26712:38::-;26746:4;26712:38;:::o;20694:192::-;20822:4;20845:16;:24;20862:6;20845:24;;;;;;;;;;;;;;;:35;20870:9;20845:35;;;;;;;;;;;;;;;;;;;;;;;;;20838:42;;20694:192;;;;:::o;11813:238::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11935:1:::1;11914:23;;:9;:23;;;;11939:31;;;;;;;;;;;;;;;;::::0;11906:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12011:9;11983:38;;12004:5;;;;;;;;;;;11983:38;;;;;;;;;;;;12036:9;12028:5;;:17;;;;;;;;;;;;;;;;;;11813:238:::0;:::o;10812:51::-;;;;;;;;;;;;;;;;;;;:::o;32045:99::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;32128:8:::1;32116:9;:20;;;;32045:99:::0;:::o;29712:119::-;11606:5;;;;;;;;;;;11592:19;;:10;:19;;;11613:17;;;;;;;;;;;;;;;;;11584:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29812:11:::1;29799:10;;:24;;;;;;;;;;;;;;;;;;29712:119:::0;:::o;21077:275::-;21166:12;21181:9;:19;21191:8;21181:19;;;;;;;;;;;;;;;;;;;;;21166:34;;21207:24;21222:8;21207:14;:24::i;:::-;21240:30;21255:4;21261:8;21240:14;:30::i;:::-;21277:26;21289:3;21294:8;21277:11;:26::i;:::-;21337:8;21332:3;21317:29;;21326:4;21317:29;;;;;;;;;;;;21159:193;21077:275;;:::o;21743:297::-;21864:1;21849:17;;:3;:17;;;;21868:12;;;;;;;;;;;;;;;;;21841:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21927:1;21896:33;;:9;:19;21906:8;21896:19;;;;;;;;;;;;;;;;;;;;;:33;;;21931:18;;;;;;;;;;;;;;;;;21888:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21959:26;21971:3;21976:8;21959:11;:26::i;:::-;22025:8;22020:3;21999:35;;22016:1;21999:35;;;;;;;;;;;;21743:297;;:::o;24479:590::-;24627:8;14163:18;14184:9;:19;14194:8;14184:19;;;;;;;;;;;;;;;;;;;;;14163:40;;14240:10;14226:24;;:10;:24;;;:71;;;;14287:10;14261:36;;:12;:22;14274:8;14261:22;;;;;;;;;;;;;;;;;;;;;:36;;;14226:71;:122;;;;14308:16;:28;14325:10;14308:28;;;;;;;;;;;;;;;:40;14337:10;14308:40;;;;;;;;;;;;;;;;;;;;;;;;;14226:122;14357:30;;;;;;;;;;;;;;;;;14210:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24655:8:::1;14630:1;14599:33;;:9;:19;14609:8;14599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14634:13;;;;;;;;;;;;;;;;::::0;14591:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24675:18:::2;24696:9;:19;24706:8;24696:19;;;;;;;;;;;;;;;;;;;;;24675:40;;24744:5;24730:19;;:10;:19;;;24751:9;;;;;;;;;;;;;;;;::::0;24722:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24791:1;24776:17;;:3;:17;;;;24795:12;;;;;;;;;;;;;;;;::::0;24768:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24817:24;24827:3;24832:8;24817:9;:24::i;:::-;24854:16;:3;:14;;;:16::i;:::-;24850:214;;;24886:13;24922:3;24902:41;;;24944:10;24956:5;24963:8;24973:5;24902:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24886:93;;13001:10;25006:24;;24996:34;;;:6;:34;;;;25032:23;;;;;;;;;;;;;;;;::::0;24988:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24877:187;24850:214;24668:401;14401:1:::1;14156:252:::0;24479:590;;;;;:::o;24038:163::-;24142:7;24168:19;:27;24188:6;24168:27;;;;;;;;;;;;;;;;24161:34;;24038:163;;;:::o;29932:400::-;29983:11;30016:1;30011;:6;30007:297;;;30043:9;;;30007:297;;;30103:190;30114:1;30110;:5;30103:190;;;30177:6;30169:3;30164:9;;:20;;;;:::i;:::-;30156:29;;30150:35;;30237:13;30231:2;30225;30221:1;:6;;;;:::i;:::-;30220:13;;;;:::i;:::-;30219:31;;;;:::i;:::-;30211:40;;30204:47;;;;30275:2;30270:7;;;;;:::i;:::-;;;30103:190;;;30007:297;29932:400;;;:::o;25202:110::-;25284:12;:22;25297:8;25284:22;;;;;;;;;;;;25277:29;;;;;;;;;;;25202:110;:::o;23000:234::-;23140:5;23117:28;;:9;:19;23127:8;23117:19;;;;;;;;;;;;;;;;;;;;;:28;;;23147:9;;;;;;;;;;;;;;;;;23109:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23194:1;23164:19;:26;23184:5;23164:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;23209:9;:19;23219:8;23209:19;;;;;;;;;;;;23202:26;;;;;;;;;;;23000:234;;:::o;23501:242::-;23644:1;23613:33;;:9;:19;23623:8;23613:19;;;;;;;;;;;;;;;;;;;;;:33;;;23648:18;;;;;;;;;;;;;;;;;23605:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23698:3;23676:9;:19;23686:8;23676:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;23736:1;23708:19;:24;23728:3;23708:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;23501:242;;:::o;427:589::-;485:4;498:12;981:5;969:18;961:26;;1009:1;1002:4;:8;995:15;;;427:589;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:86::-;6285:7;6325:4;6318:5;6314:16;6303:27;;6250:86;;;:::o;6342:118::-;6413:22;6429:5;6413:22;:::i;:::-;6406:5;6403:33;6393:61;;6450:1;6447;6440:12;6393:61;6342:118;:::o;6466:135::-;6510:5;6548:6;6535:20;6526:29;;6564:31;6589:5;6564:31;:::i;:::-;6466:135;;;;:::o;6607:325::-;6664:6;6713:2;6701:9;6692:7;6688:23;6684:32;6681:119;;;6719:79;;:::i;:::-;6681:119;6839:1;6864:51;6907:7;6898:6;6887:9;6883:22;6864:51;:::i;:::-;6854:61;;6810:115;6607:325;;;;:::o;6938:117::-;7047:1;7044;7037:12;7061:117;7170:1;7167;7160:12;7184:117;7293:1;7290;7283:12;7324:568;7397:8;7407:6;7457:3;7450:4;7442:6;7438:17;7434:27;7424:122;;7465:79;;:::i;:::-;7424:122;7578:6;7565:20;7555:30;;7608:18;7600:6;7597:30;7594:117;;;7630:79;;:::i;:::-;7594:117;7744:4;7736:6;7732:17;7720:29;;7798:3;7790:4;7782:6;7778:17;7768:8;7764:32;7761:41;7758:128;;;7805:79;;:::i;:::-;7758:128;7324:568;;;;;:::o;7898:559::-;7984:6;7992;8041:2;8029:9;8020:7;8016:23;8012:32;8009:119;;;8047:79;;:::i;:::-;8009:119;8195:1;8184:9;8180:17;8167:31;8225:18;8217:6;8214:30;8211:117;;;8247:79;;:::i;:::-;8211:117;8360:80;8432:7;8423:6;8412:9;8408:22;8360:80;:::i;:::-;8342:98;;;;8138:312;7898:559;;;;;:::o;8463:116::-;8533:21;8548:5;8533:21;:::i;:::-;8526:5;8523:32;8513:60;;8569:1;8566;8559:12;8513:60;8463:116;:::o;8585:133::-;8628:5;8666:6;8653:20;8644:29;;8682:30;8706:5;8682:30;:::i;:::-;8585:133;;;;:::o;8724:468::-;8789:6;8797;8846:2;8834:9;8825:7;8821:23;8817:32;8814:119;;;8852:79;;:::i;:::-;8814:119;8972:1;8997:53;9042:7;9033:6;9022:9;9018:22;8997:53;:::i;:::-;8987:63;;8943:117;9099:2;9125:50;9167:7;9158:6;9147:9;9143:22;9125:50;:::i;:::-;9115:60;;9070:115;8724:468;;;;;:::o;9211:552::-;9268:8;9278:6;9328:3;9321:4;9313:6;9309:17;9305:27;9295:122;;9336:79;;:::i;:::-;9295:122;9449:6;9436:20;9426:30;;9479:18;9471:6;9468:30;9465:117;;;9501:79;;:::i;:::-;9465:117;9615:4;9607:6;9603:17;9591:29;;9669:3;9661:4;9653:6;9649:17;9639:8;9635:32;9632:41;9629:128;;;9676:79;;:::i;:::-;9629:128;9211:552;;;;;:::o;9769:963::-;9866:6;9874;9882;9890;9898;9947:3;9935:9;9926:7;9922:23;9918:33;9915:120;;;9954:79;;:::i;:::-;9915:120;10074:1;10099:53;10144:7;10135:6;10124:9;10120:22;10099:53;:::i;:::-;10089:63;;10045:117;10201:2;10227:53;10272:7;10263:6;10252:9;10248:22;10227:53;:::i;:::-;10217:63;;10172:118;10329:2;10355:53;10400:7;10391:6;10380:9;10376:22;10355:53;:::i;:::-;10345:63;;10300:118;10485:2;10474:9;10470:18;10457:32;10516:18;10508:6;10505:30;10502:117;;;10538:79;;:::i;:::-;10502:117;10651:64;10707:7;10698:6;10687:9;10683:22;10651:64;:::i;:::-;10633:82;;;;10428:297;9769:963;;;;;;;;:::o;10752:553::-;10810:8;10820:6;10870:3;10863:4;10855:6;10851:17;10847:27;10837:122;;10878:79;;:::i;:::-;10837:122;10991:6;10978:20;10968:30;;11021:18;11013:6;11010:30;11007:117;;;11043:79;;:::i;:::-;11007:117;11157:4;11149:6;11145:17;11133:29;;11211:3;11203:4;11195:6;11191:17;11181:8;11177:32;11174:41;11171:128;;;11218:79;;:::i;:::-;11171:128;10752:553;;;;;:::o;11311:529::-;11382:6;11390;11439:2;11427:9;11418:7;11414:23;11410:32;11407:119;;;11445:79;;:::i;:::-;11407:119;11593:1;11582:9;11578:17;11565:31;11623:18;11615:6;11612:30;11609:117;;;11645:79;;:::i;:::-;11609:117;11758:65;11815:7;11806:6;11795:9;11791:22;11758:65;:::i;:::-;11740:83;;;;11536:297;11311:529;;;;;:::o;11846:474::-;11914:6;11922;11971:2;11959:9;11950:7;11946:23;11942:32;11939:119;;;11977:79;;:::i;:::-;11939:119;12097:1;12122:53;12167:7;12158:6;12147:9;12143:22;12122:53;:::i;:::-;12112:63;;12068:117;12224:2;12250:53;12295:7;12286:6;12275:9;12271:22;12250:53;:::i;:::-;12240:63;;12195:118;11846:474;;;;;:::o;12326:104::-;12371:7;12400:24;12418:5;12400:24;:::i;:::-;12389:35;;12326:104;;;:::o;12436:138::-;12517:32;12543:5;12517:32;:::i;:::-;12510:5;12507:43;12497:71;;12564:1;12561;12554:12;12497:71;12436:138;:::o;12580:155::-;12634:5;12672:6;12659:20;12650:29;;12688:41;12723:5;12688:41;:::i;:::-;12580:155;;;;:::o;12741:345::-;12808:6;12857:2;12845:9;12836:7;12832:23;12828:32;12825:119;;;12863:79;;:::i;:::-;12825:119;12983:1;13008:61;13061:7;13052:6;13041:9;13037:22;13008:61;:::i;:::-;12998:71;;12954:125;12741:345;;;;:::o;13092:180::-;13140:77;13137:1;13130:88;13237:4;13234:1;13227:15;13261:4;13258:1;13251:15;13278:320;13322:6;13359:1;13353:4;13349:12;13339:22;;13406:1;13400:4;13396:12;13427:18;13417:81;;13483:4;13475:6;13471:17;13461:27;;13417:81;13545:2;13537:6;13534:14;13514:18;13511:38;13508:84;;;13564:18;;:::i;:::-;13508:84;13329:269;13278:320;;;:::o;13604:225::-;13744:34;13740:1;13732:6;13728:14;13721:58;13813:8;13808:2;13800:6;13796:15;13789:33;13604:225;:::o;13835:366::-;13977:3;13998:67;14062:2;14057:3;13998:67;:::i;:::-;13991:74;;14074:93;14163:3;14074:93;:::i;:::-;14192:2;14187:3;14183:12;14176:19;;13835:366;;;:::o;14207:419::-;14373:4;14411:2;14400:9;14396:18;14388:26;;14460:9;14454:4;14450:20;14446:1;14435:9;14431:17;14424:47;14488:131;14614:4;14488:131;:::i;:::-;14480:139;;14207:419;;;:::o;14632:180::-;14680:77;14677:1;14670:88;14777:4;14774:1;14767:15;14801:4;14798:1;14791:15;14818:305;14858:3;14877:20;14895:1;14877:20;:::i;:::-;14872:25;;14911:20;14929:1;14911:20;:::i;:::-;14906:25;;15065:1;14997:66;14993:74;14990:1;14987:81;14984:107;;;15071:18;;:::i;:::-;14984:107;15115:1;15112;15108:9;15101:16;;14818:305;;;;:::o;15129:221::-;15269:34;15265:1;15257:6;15253:14;15246:58;15338:4;15333:2;15325:6;15321:15;15314:29;15129:221;:::o;15356:366::-;15498:3;15519:67;15583:2;15578:3;15519:67;:::i;:::-;15512:74;;15595:93;15684:3;15595:93;:::i;:::-;15713:2;15708:3;15704:12;15697:19;;15356:366;;;:::o;15728:419::-;15894:4;15932:2;15921:9;15917:18;15909:26;;15981:9;15975:4;15971:20;15967:1;15956:9;15952:17;15945:47;16009:131;16135:4;16009:131;:::i;:::-;16001:139;;15728:419;;;:::o;16153:233::-;16192:3;16215:24;16233:5;16215:24;:::i;:::-;16206:33;;16261:66;16254:5;16251:77;16248:103;;;16331:18;;:::i;:::-;16248:103;16378:1;16371:5;16367:13;16360:20;;16153:233;;;:::o;16392:168::-;16532:20;16528:1;16520:6;16516:14;16509:44;16392:168;:::o;16566:366::-;16708:3;16729:67;16793:2;16788:3;16729:67;:::i;:::-;16722:74;;16805:93;16894:3;16805:93;:::i;:::-;16923:2;16918:3;16914:12;16907:19;;16566:366;;;:::o;16938:419::-;17104:4;17142:2;17131:9;17127:18;17119:26;;17191:9;17185:4;17181:20;17177:1;17166:9;17162:17;17155:47;17219:131;17345:4;17219:131;:::i;:::-;17211:139;;16938:419;;;:::o;17363:169::-;17503:21;17499:1;17491:6;17487:14;17480:45;17363:169;:::o;17538:366::-;17680:3;17701:67;17765:2;17760:3;17701:67;:::i;:::-;17694:74;;17777:93;17866:3;17777:93;:::i;:::-;17895:2;17890:3;17886:12;17879:19;;17538:366;;;:::o;17910:419::-;18076:4;18114:2;18103:9;18099:18;18091:26;;18163:9;18157:4;18153:20;18149:1;18138:9;18134:17;18127:47;18191:131;18317:4;18191:131;:::i;:::-;18183:139;;17910:419;;;:::o;18335:180::-;18475:32;18471:1;18463:6;18459:14;18452:56;18335:180;:::o;18521:366::-;18663:3;18684:67;18748:2;18743:3;18684:67;:::i;:::-;18677:74;;18760:93;18849:3;18760:93;:::i;:::-;18878:2;18873:3;18869:12;18862:19;;18521:366;;;:::o;18893:419::-;19059:4;19097:2;19086:9;19082:18;19074:26;;19146:9;19140:4;19136:20;19132:1;19121:9;19117:17;19110:47;19174:131;19300:4;19174:131;:::i;:::-;19166:139;;18893:419;;;:::o;19318:348::-;19358:7;19381:20;19399:1;19381:20;:::i;:::-;19376:25;;19415:20;19433:1;19415:20;:::i;:::-;19410:25;;19603:1;19535:66;19531:74;19528:1;19525:81;19520:1;19513:9;19506:17;19502:105;19499:131;;;19610:18;;:::i;:::-;19499:131;19658:1;19655;19651:9;19640:20;;19318:348;;;;:::o;19672:170::-;19812:22;19808:1;19800:6;19796:14;19789:46;19672:170;:::o;19848:366::-;19990:3;20011:67;20075:2;20070:3;20011:67;:::i;:::-;20004:74;;20087:93;20176:3;20087:93;:::i;:::-;20205:2;20200:3;20196:12;20189:19;;19848:366;;;:::o;20220:419::-;20386:4;20424:2;20413:9;20409:18;20401:26;;20473:9;20467:4;20463:20;20459:1;20448:9;20444:17;20437:47;20501:131;20627:4;20501:131;:::i;:::-;20493:139;;20220:419;;;:::o;20645:171::-;20785:23;20781:1;20773:6;20769:14;20762:47;20645:171;:::o;20822:366::-;20964:3;20985:67;21049:2;21044:3;20985:67;:::i;:::-;20978:74;;21061:93;21150:3;21061:93;:::i;:::-;21179:2;21174:3;21170:12;21163:19;;20822:366;;;:::o;21194:419::-;21360:4;21398:2;21387:9;21383:18;21375:26;;21447:9;21441:4;21437:20;21433:1;21422:9;21418:17;21411:47;21475:131;21601:4;21475:131;:::i;:::-;21467:139;;21194:419;;;:::o;21619:177::-;21759:29;21755:1;21747:6;21743:14;21736:53;21619:177;:::o;21802:366::-;21944:3;21965:67;22029:2;22024:3;21965:67;:::i;:::-;21958:74;;22041:93;22130:3;22041:93;:::i;:::-;22159:2;22154:3;22150:12;22143:19;;21802:366;;;:::o;22174:419::-;22340:4;22378:2;22367:9;22363:18;22355:26;;22427:9;22421:4;22417:20;22413:1;22402:9;22398:17;22391:47;22455:131;22581:4;22455:131;:::i;:::-;22447:139;;22174:419;;;:::o;22599:60::-;22627:3;22648:5;22641:12;;22599:60;;;:::o;22665:138::-;22713:9;22746:51;22764:32;22773:22;22789:5;22773:22;:::i;:::-;22764:32;:::i;:::-;22746:51;:::i;:::-;22733:64;;22665:138;;;:::o;22809:127::-;22894:35;22923:5;22894:35;:::i;:::-;22889:3;22882:48;22809:127;;:::o;22942:328::-;23061:4;23099:2;23088:9;23084:18;23076:26;;23112:71;23180:1;23169:9;23165:17;23156:6;23112:71;:::i;:::-;23193:70;23259:2;23248:9;23244:18;23235:6;23193:70;:::i;:::-;22942:328;;;;;:::o;23276:180::-;23324:77;23321:1;23314:88;23421:4;23418:1;23411:15;23445:4;23442:1;23435:15;23462:177;23602:29;23598:1;23590:6;23586:14;23579:53;23462:177;:::o;23645:366::-;23787:3;23808:67;23872:2;23867:3;23808:67;:::i;:::-;23801:74;;23884:93;23973:3;23884:93;:::i;:::-;24002:2;23997:3;23993:12;23986:19;;23645:366;;;:::o;24017:419::-;24183:4;24221:2;24210:9;24206:18;24198:26;;24270:9;24264:4;24260:20;24256:1;24245:9;24241:17;24234:47;24298:131;24424:4;24298:131;:::i;:::-;24290:139;;24017:419;;;:::o;24442:171::-;24582:23;24578:1;24570:6;24566:14;24559:47;24442:171;:::o;24619:366::-;24761:3;24782:67;24846:2;24841:3;24782:67;:::i;:::-;24775:74;;24858:93;24947:3;24858:93;:::i;:::-;24976:2;24971:3;24967:12;24960:19;;24619:366;;;:::o;24991:419::-;25157:4;25195:2;25184:9;25180:18;25172:26;;25244:9;25238:4;25234:20;25230:1;25219:9;25215:17;25208:47;25272:131;25398:4;25272:131;:::i;:::-;25264:139;;24991:419;;;:::o;25416:171::-;25556:23;25552:1;25544:6;25540:14;25533:47;25416:171;:::o;25593:366::-;25735:3;25756:67;25820:2;25815:3;25756:67;:::i;:::-;25749:74;;25832:93;25921:3;25832:93;:::i;:::-;25950:2;25945:3;25941:12;25934:19;;25593:366;;;:::o;25965:419::-;26131:4;26169:2;26158:9;26154:18;26146:26;;26218:9;26212:4;26208:20;26204:1;26193:9;26189:17;26182:47;26246:131;26372:4;26246:131;:::i;:::-;26238:139;;25965:419;;;:::o;26390:179::-;26530:31;26526:1;26518:6;26514:14;26507:55;26390:179;:::o;26575:366::-;26717:3;26738:67;26802:2;26797:3;26738:67;:::i;:::-;26731:74;;26814:93;26903:3;26814:93;:::i;:::-;26932:2;26927:3;26923:12;26916:19;;26575:366;;;:::o;26947:419::-;27113:4;27151:2;27140:9;27136:18;27128:26;;27200:9;27194:4;27190:20;27186:1;27175:9;27171:17;27164:47;27228:131;27354:4;27228:131;:::i;:::-;27220:139;;26947:419;;;:::o;27372:148::-;27474:11;27511:3;27496:18;;27372:148;;;;:::o;27526:141::-;27575:4;27598:3;27590:11;;27621:3;27618:1;27611:14;27655:4;27652:1;27642:18;27634:26;;27526:141;;;:::o;27697:845::-;27800:3;27837:5;27831:12;27866:36;27892:9;27866:36;:::i;:::-;27918:89;28000:6;27995:3;27918:89;:::i;:::-;27911:96;;28038:1;28027:9;28023:17;28054:1;28049:137;;;;28200:1;28195:341;;;;28016:520;;28049:137;28133:4;28129:9;28118;28114:25;28109:3;28102:38;28169:6;28164:3;28160:16;28153:23;;28049:137;;28195:341;28262:38;28294:5;28262:38;:::i;:::-;28322:1;28336:154;28350:6;28347:1;28344:13;28336:154;;;28424:7;28418:14;28414:1;28409:3;28405:11;28398:35;28474:1;28465:7;28461:15;28450:26;;28372:4;28369:1;28365:12;28360:17;;28336:154;;;28519:6;28514:3;28510:16;28503:23;;28202:334;;28016:520;;27804:738;;27697:845;;;;:::o;28548:77::-;28585:7;28614:5;28603:16;;28548:77;;;:::o;28631:79::-;28670:7;28699:5;28688:16;;28631:79;;;:::o;28716:157::-;28821:45;28841:24;28859:5;28841:24;:::i;:::-;28821:45;:::i;:::-;28816:3;28809:58;28716:157;;:::o;28879:377::-;28985:3;29013:39;29046:5;29013:39;:::i;:::-;29068:89;29150:6;29145:3;29068:89;:::i;:::-;29061:96;;29166:52;29211:6;29206:3;29199:4;29192:5;29188:16;29166:52;:::i;:::-;29243:6;29238:3;29234:16;29227:23;;28989:267;28879:377;;;;:::o;29262:570::-;29467:3;29489:92;29577:3;29568:6;29489:92;:::i;:::-;29482:99;;29591:75;29662:3;29653:6;29591:75;:::i;:::-;29691:2;29686:3;29682:12;29675:19;;29711:95;29802:3;29793:6;29711:95;:::i;:::-;29704:102;;29823:3;29816:10;;29262:570;;;;;;:::o;29838:98::-;29889:6;29923:5;29917:12;29907:22;;29838:98;;;:::o;29942:168::-;30025:11;30059:6;30054:3;30047:19;30099:4;30094:3;30090:14;30075:29;;29942:168;;;;:::o;30116:360::-;30202:3;30230:38;30262:5;30230:38;:::i;:::-;30284:70;30347:6;30342:3;30284:70;:::i;:::-;30277:77;;30363:52;30408:6;30403:3;30396:4;30389:5;30385:16;30363:52;:::i;:::-;30440:29;30462:6;30440:29;:::i;:::-;30435:3;30431:39;30424:46;;30206:270;30116:360;;;;:::o;30482:640::-;30677:4;30715:3;30704:9;30700:19;30692:27;;30729:71;30797:1;30786:9;30782:17;30773:6;30729:71;:::i;:::-;30810:72;30878:2;30867:9;30863:18;30854:6;30810:72;:::i;:::-;30892;30960:2;30949:9;30945:18;30936:6;30892:72;:::i;:::-;31011:9;31005:4;31001:20;30996:2;30985:9;30981:18;30974:48;31039:76;31110:4;31101:6;31039:76;:::i;:::-;31031:84;;30482:640;;;;;;;:::o;31128:141::-;31184:5;31215:6;31209:13;31200:22;;31231:32;31257:5;31231:32;:::i;:::-;31128:141;;;;:::o;31275:349::-;31344:6;31393:2;31381:9;31372:7;31368:23;31364:32;31361:119;;;31399:79;;:::i;:::-;31361:119;31519:1;31544:63;31599:7;31590:6;31579:9;31575:22;31544:63;:::i;:::-;31534:73;;31490:127;31275:349;;;;:::o;31630:180::-;31678:77;31675:1;31668:88;31775:4;31772:1;31765:15;31799:4;31796:1;31789:15;31816:185;31856:1;31873:20;31891:1;31873:20;:::i;:::-;31868:25;;31907:20;31925:1;31907:20;:::i;:::-;31902:25;;31946:1;31936:35;;31951:18;;:::i;:::-;31936:35;31993:1;31990;31986:9;31981:14;;31816:185;;;;:::o;32007:176::-;32039:1;32056:20;32074:1;32056:20;:::i;:::-;32051:25;;32090:20;32108:1;32090:20;:::i;:::-;32085:25;;32129:1;32119:35;;32134:18;;:::i;:::-;32119:35;32175:1;32172;32168:9;32163:14;;32007:176;;;;:::o;32189:191::-;32229:4;32249:20;32267:1;32249:20;:::i;:::-;32244:25;;32283:20;32301:1;32283:20;:::i;:::-;32278:25;;32322:1;32319;32316:8;32313:34;;;32327:18;;:::i;:::-;32313:34;32372:1;32369;32365:9;32357:17;;32189:191;;;;:::o

Swarm Source

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