ETH Price: $2,976.33 (-5.18%)
Gas: 8 Gwei

Token

Legend Maps (LMNFT)
 

Overview

Max Total Supply

5,757 LMNFT

Holders

1,479

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Shiba Shabu: Deployer
Balance
3 LMNFT
0x54e35a069ff7916d594c4b7fd404bd7688f589da
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Legend Maps is a roguelike dungeon crawler using NFTs on the ethereum blockchain: an opportunity for adventurers to seek fame, power & fortune by staking their claim to maps of infinite dungeons. Each of the 5757 limited edition Founder Maps is a gateway to a unique & unexplored dungeon. Each procedurally-generated map is the keystone to a claim, establishing the dungeon's name, biome, backstory, and the type of dwellers and loot to be found within. Founder Map holders get presale access to future drops. Learn more at [legendmaps.io](https://legendmaps.io).

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LegendMaps

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 18: LegendMaps.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

/*
################################################################       
___       _______   _______    _______  _____  ___   ________   
|"  |     /"     "| /" _   "|  /"     "|(\"   \|"  \ |"      "\  
||  |    (: ______)(: ( \___) (: ______)|.\\   \    |(.  ___  :) 
|:  |     \/    |   \/ \       \/    |  |: \.   \\  ||: \   ) || 
 \  |___  // ___)_  //  \ ___  // ___)_ |.  \    \. |(| (___\ || 
( \_|:  \(:      "|(:   _(  _|(:      "||    \    \ ||:       :) 
 \_______)\_______) \_______)  \_______) \___|\____\)(________/                                                           
 ___      ___       __         _______    ________               
|"  \    /"  |     /""\       |   __ "\  /"       )              
 \   \  //   |    /    \      (. |__) :)(:   \___/               
 /\\  \/.    |   /' /\  \     |:  ____/  \___  \                 
|: \.        |  //  __'  \    (|  /       __/  \\                
|.  \    /:  | /   /  \\  \  /|__/ \     /" \   :)               
|___|\__/|___|(___/    \___)(_______)   (_______/         
       
################################################################    
*/
import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./MerkleProof.sol";

contract LegendMaps is ERC721, ERC721Enumerable, Ownable {
  using Strings for uint256;
  string private _baseURIextended;
  string public _baseExtension = "";
  bool public saleActive = false;
  bool public whitelistActive = false;
  uint8 public activeWhiteListTier = 0;
  bytes32 public legendaryRoot;
  bytes32 public epicRoot;
  bytes32 public rareRoot;
  bytes32 public uncommonRoot;

  mapping(uint256 => bool) public sold;
  mapping(uint256 => uint256) public price;
  mapping(uint256 => string) private _tokenURIs;
  uint256 public constant MAX_SUPPLY = 5757;
  uint256 public constant MAX_PUBLIC_MINT = 5;
  uint256 public constant PRICE_PER_TOKEN = 0.042 ether;
  uint public constant LEGENDARY_MINTS = 5;
  uint public constant EPIC_MINTS = 4;
  uint public constant RARE_MINTS = 3;
  uint public constant UNCOMMON_MINTS = 2;

  event Purchase(address owner, uint256 price, uint256 id, string uri);

  constructor() ERC721("Legend Maps", "LMNFT") {
  }

  function setWhiteListActive(bool _whitelististActive) external onlyOwner {
    whitelistActive = _whitelististActive;
  }

  function setRoot (uint8 group, bytes32 merkleroot) external onlyOwner {
    if(group == 0){
      legendaryRoot = merkleroot;
    } else if(group == 1){
      epicRoot = merkleroot;
    } else if(group == 2){
      rareRoot = merkleroot;
    } else if(group == 3){
      uncommonRoot = merkleroot;
    }
  }

  function getMintsRemaining(address addr, uint8 group) external view returns(uint){
    uint senderBalance = balanceOf(addr);
    return mintsRemaining(senderBalance, group);
  }

  function setSaleState(bool newState) public onlyOwner {
    if(newState == false){
      whitelistActive = false;
    }
    saleActive = newState;
  }

  function setActiveWhiteList(uint8 newGroup) public onlyOwner{
    activeWhiteListTier = newGroup;
  }

  // function getWhitelistGroup(address addr) external view returns(uint8){
  //   return _whitelistTiers[addr];
  // }

  function _leaf(address account, uint256 addressId)
  internal pure returns (bytes32)
  {
      return keccak256(abi.encodePacked(addressId, account));
  }

  function _verify(bytes32 leaf, bytes32[] memory proof, uint8 whitelistGroup)
  internal view returns (bool)
  {
      if(whitelistGroup == 0){
        return MerkleProof.verify(proof, legendaryRoot, leaf);
      }
      if(whitelistGroup == 1){
        return MerkleProof.verify(proof, epicRoot, leaf);
      }
      if(whitelistGroup == 2){
        return MerkleProof.verify(proof, rareRoot, leaf);
      }
      if(whitelistGroup == 3){
        return MerkleProof.verify(proof, uncommonRoot, leaf);
      }
      return false;
  }

  function mintsRemaining(uint senderBalance, uint8 whitelistGroup) internal pure returns (uint){
    if(whitelistGroup == 0){
      return LEGENDARY_MINTS - senderBalance;
    }
    if(whitelistGroup == 1){
      return EPIC_MINTS - senderBalance;
    }
    if(whitelistGroup == 2){
      return RARE_MINTS - senderBalance;
    }
    if(whitelistGroup == 3){
      return UNCOMMON_MINTS - senderBalance;
    }
    return 0;
  }

  function mintWhiteList(uint8 numTokens, uint256 addressId, uint8 whitelistGroup, bytes32[] calldata proof) external payable {
    uint256 ts = totalSupply();
    uint senderBalance = balanceOf(msg.sender);
    uint remainingMints = mintsRemaining(senderBalance, whitelistGroup);
    require(whitelistActive, "White list is not currently active");
    require(whitelistGroup <= activeWhiteListTier, "Whitelist group not active yet");
    require(_verify(_leaf(msg.sender, addressId), proof, whitelistGroup), "Invalid merkle proof");
    require(ts + numTokens <= MAX_SUPPLY, "Not enough supply remaining");
    require(PRICE_PER_TOKEN * numTokens <= msg.value, "Insufficient ether sent");
    require(numTokens <= remainingMints, "Cannot mint more than allotment");
    require(remainingMints > 0, "No mints remaining");
    for(uint256 i = 0; i < numTokens; i++){
      _safeMint(msg.sender, ts + i);
    }
  }

  function openMint(uint numTokens) public payable {
    uint256 ts = totalSupply();
    require(saleActive, "Sale must be active to mint tokens");
    require(numTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
    require(ts + numTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
    require(PRICE_PER_TOKEN * numTokens <= msg.value, "Ether value sent is not correct");

    for (uint256 i = 0; i < numTokens; i++) {
        _safeMint(msg.sender, ts + i);
    }
  }

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

  function maxSupply() public pure returns (uint256){
    return MAX_SUPPLY;
  }

  function mintPrice() public pure returns(uint256){
    return PRICE_PER_TOKEN;
  }

  function setBaseURI(string memory baseURI_) external onlyOwner {
      _baseURIextended = baseURI_;
  }

  function setBaseExtension(string memory baseExtension) external onlyOwner {
    _baseExtension = baseExtension;
  }

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

  function getTokenURI(uint256 tokenId) public view returns (string memory) {
    return tokenURI(tokenId);
  }

  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
      return super.supportsInterface(interfaceId);
  }

  function contractURI() public pure returns (string memory) {
    return "https://legendmaps.io/legendmaps-metadata.json";
  }

  function setTokenURI(uint256 tokenId, string memory _tokenURI) public onlyOwner {
    _setTokenURI(tokenId, _tokenURI);
  }

  function reserve(uint256 count) public onlyOwner {
    uint supply = totalSupply();
    for(uint i = 0; i < count; i++){
      _safeMint(msg.sender, supply + i);
    }
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
      require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

      string memory _tokenURI = _tokenURIs[tokenId];
      string memory base = _baseURI();

      if (bytes(base).length == 0) {
          return _tokenURI;
      }
      if (bytes(_tokenURI).length > 0) {
          return string(abi.encodePacked(base, _tokenURI));
      }

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

  function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
      require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
      _tokenURIs[tokenId] = _tokenURI;
  }

  function _burn(uint256 tokenId) internal virtual override {
      super._burn(tokenId);

      if (bytes(_tokenURIs[tokenId]).length != 0) {
          delete _tokenURIs[tokenId];
      }
  }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 5 of 18: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 6 of 18: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 18: ERC721Holder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721Receiver.sol";

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

File 8 of 18: ERC721URIStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 9 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 10 of 18: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 12 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 15 of 18: MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

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

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

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

File 16 of 18: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 17 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Purchase","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":"EPIC_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RARE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNCOMMON_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeWhiteListTier","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"epicRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint8","name":"group","type":"uint8"}],"name":"getMintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"legendaryRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"},{"internalType":"uint256","name":"addressId","type":"uint256"},{"internalType":"uint8","name":"whitelistGroup","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"openMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"newGroup","type":"uint8"}],"name":"setActiveWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"group","type":"uint8"},{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelististActive","type":"bool"}],"name":"setWhiteListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uncommonRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b92919062000220565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff021916908360ff1602179055503480156200008b57600080fd5b506040518060400160405280600b81526020017f4c6567656e64204d6170730000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4d4e465400000000000000000000000000000000000000000000000000000081525081600090805190602001906200011092919062000220565b5080600190805190602001906200012992919062000220565b5050506200014c620001406200015260201b60201c565b6200015a60201b60201c565b62000335565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022e90620002ff565b90600052602060002090601f0160209004810192826200025257600085556200029e565b82601f106200026d57805160ff19168380011785556200029e565b828001600101855582156200029e579182015b828111156200029d57825182559160200191906001019062000280565b5b509050620002ad9190620002b1565b5090565b5b80821115620002cc576000816000905550600101620002b2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200031857607f821691505b602082108114156200032f576200032e620002d0565b5b50919050565b61571f80620003456000396000f3fe6080604052600436106102ff5760003560e01c806368428a1b11610190578063b033e1c5116100dc578063c87b56dd11610095578063e8a3d4851161006f578063e8a3d48514610b7c578063e985e9c514610ba7578063eceb7d5214610be4578063f2fde38b14610c0d576102ff565b8063c87b56dd14610aeb578063d5abeb0114610b28578063da3ef23f14610b53576102ff565b8063b033e1c5146109fe578063b182841a14610a29578063b5506cc514610a45578063b88d4fde14610a70578063c2a0d4b314610a99578063c4e3709514610ac2576102ff565b806395d89b4111610149578063a04345f611610123578063a04345f614610956578063a22cb46514610981578063abeea126146109aa578063ad67c77f146109d5576102ff565b806395d89b41146108c35780639c03facb146108ee5780639fbe1de41461092b576102ff565b806368428a1b146107c557806370a08231146107f0578063715018a61461082d578063819b25ba14610844578063833b94991461086d5780638da5cb5b14610898576102ff565b806332cb6b0c1161024f57806346a666a61161020857806361c4dac0116101e257806361c4dac0146107075780636352211e1461073257806365f130971461076f5780636817c76c1461079a576102ff565b806346a666a6146106765780634f6ccce7146106a157806355f804b3146106de576102ff565b806332cb6b0c1461057557806335aa69aa146105a05780633bb3a24d146105dd5780633ccfd60b1461061a57806342842e0e146106315780634287084f1461065a576102ff565b8063162094c4116102bc57806324fcd9461161029657806324fcd946146104a55780632672c902146104d057806326a49e37146104fb5780632f745c5914610538576102ff565b8063162094c41461042857806318160ddd1461045157806323b872dd1461047c576102ff565b806301ffc9a71461030457806302ce58131461034157806305d0e7ed1461036c57806306fdde0314610397578063081812fc146103c2578063095ea7b3146103ff575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906138d5565b610c36565b604051610338919061391d565b60405180910390f35b34801561034d57600080fd5b50610356610c48565b604051610363919061391d565b60405180910390f35b34801561037857600080fd5b50610381610c5b565b60405161038e9190613951565b60405180910390f35b3480156103a357600080fd5b506103ac610c61565b6040516103b99190613a05565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613a5d565b610cf3565b6040516103f69190613acb565b60405180910390f35b34801561040b57600080fd5b5061042660048036038101906104219190613b12565b610d78565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613c87565b610e90565b005b34801561045d57600080fd5b50610466610f1a565b6040516104739190613cf2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613d0d565b610f27565b005b3480156104b157600080fd5b506104ba610f87565b6040516104c79190613cf2565b60405180910390f35b3480156104dc57600080fd5b506104e5610f8c565b6040516104f29190613a05565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613a5d565b61101a565b60405161052f9190613cf2565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613b12565b611032565b60405161056c9190613cf2565b60405180910390f35b34801561058157600080fd5b5061058a6110d7565b6040516105979190613cf2565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613d99565b6110dd565b6040516105d49190613cf2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613a5d565b6110fe565b6040516106119190613a05565b60405180910390f35b34801561062657600080fd5b5061062f611110565b005b34801561063d57600080fd5b5061065860048036038101906106539190613d0d565b6111db565b005b610674600480360381019061066f9190613a5d565b6111fb565b005b34801561068257600080fd5b5061068b611377565b6040516106989190613951565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613a5d565b61137d565b6040516106d59190613cf2565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613dd9565b6113ee565b005b34801561071357600080fd5b5061071c611484565b6040516107299190613cf2565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190613a5d565b611489565b6040516107669190613acb565b60405180910390f35b34801561077b57600080fd5b5061078461153b565b6040516107919190613cf2565b60405180910390f35b3480156107a657600080fd5b506107af611540565b6040516107bc9190613cf2565b60405180910390f35b3480156107d157600080fd5b506107da61154f565b6040516107e7919061391d565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613e22565b611562565b6040516108249190613cf2565b60405180910390f35b34801561083957600080fd5b5061084261161a565b005b34801561085057600080fd5b5061086b60048036038101906108669190613a5d565b6116a2565b005b34801561087957600080fd5b50610882611762565b60405161088f9190613cf2565b60405180910390f35b3480156108a457600080fd5b506108ad61176d565b6040516108ba9190613acb565b60405180910390f35b3480156108cf57600080fd5b506108d8611797565b6040516108e59190613a05565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613a5d565b611829565b604051610922919061391d565b60405180910390f35b34801561093757600080fd5b50610940611849565b60405161094d9190613cf2565b60405180910390f35b34801561096257600080fd5b5061096b61184e565b6040516109789190613951565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613e7b565b611854565b005b3480156109b657600080fd5b506109bf6119d5565b6040516109cc9190613951565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f79190613ebb565b6119db565b005b348015610a0a57600080fd5b50610a13611a75565b604051610a209190613cf2565b60405180910390f35b610a436004803603810190610a3e9190613f48565b611a7a565b005b348015610a5157600080fd5b50610a5a611d51565b604051610a679190613fdf565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a92919061409b565b611d64565b005b348015610aa557600080fd5b50610ac06004803603810190610abb919061414a565b611dc6565b005b348015610ace57600080fd5b50610ae96004803603810190610ae4919061418a565b611ea5565b005b348015610af757600080fd5b50610b126004803603810190610b0d9190613a5d565b611f67565b604051610b1f9190613a05565b60405180910390f35b348015610b3457600080fd5b50610b3d612109565b604051610b4a9190613cf2565b60405180910390f35b348015610b5f57600080fd5b50610b7a6004803603810190610b759190613dd9565b612113565b005b348015610b8857600080fd5b50610b916121a9565b604051610b9e9190613a05565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc991906141b7565b6121c9565b604051610bdb919061391d565b60405180910390f35b348015610bf057600080fd5b50610c0b6004803603810190610c06919061418a565b61225d565b005b348015610c1957600080fd5b50610c346004803603810190610c2f9190613e22565b6122f6565b005b6000610c41826123ee565b9050919050565b600d60019054906101000a900460ff1681565b600f5481565b606060008054610c7090614226565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90614226565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050905090565b6000610cfe82612468565b610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906142ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8382611489565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb9061435c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e136124d4565b73ffffffffffffffffffffffffffffffffffffffff161480610e425750610e4181610e3c6124d4565b6121c9565b5b610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906143ee565b60405180910390fd5b610e8b83836124dc565b505050565b610e986124d4565b73ffffffffffffffffffffffffffffffffffffffff16610eb661176d565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061445a565b60405180910390fd5b610f168282612595565b5050565b6000600880549050905090565b610f38610f326124d4565b82612609565b610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906144ec565b60405180910390fd5b610f828383836126e7565b505050565b600381565b600c8054610f9990614226565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc590614226565b80156110125780601f10610fe757610100808354040283529160200191611012565b820191906000526020600020905b815481529060010190602001808311610ff557829003601f168201915b505050505081565b60136020528060005260406000206000915090505481565b600061103d83611562565b821061107e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110759061457e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61167d81565b6000806110e984611562565b90506110f58184612943565b91505092915050565b606061110982611f67565b9050919050565b6111186124d4565b73ffffffffffffffffffffffffffffffffffffffff1661113661176d565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061445a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111d7573d6000803e3d6000fd5b5050565b6111f683838360405180602001604052806000815250611d64565b505050565b6000611205610f1a565b9050600d60009054906101000a900460ff16611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614610565b60405180910390fd5b600582111561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061467c565b60405180910390fd5b61167d82826112a991906146cb565b11156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e19061476d565b60405180910390fd5b3482669536c7089100006112fe919061478d565b111561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690614833565b60405180910390fd5b60005b828110156113725761135f33828461135a91906146cb565b6129cf565b808061136a90614853565b915050611342565b505050565b600e5481565b6000611387610f1a565b82106113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061490e565b60405180910390fd5b600882815481106113dc576113db61492e565b5b90600052602060002001549050919050565b6113f66124d4565b73ffffffffffffffffffffffffffffffffffffffff1661141461176d565b73ffffffffffffffffffffffffffffffffffffffff161461146a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114619061445a565b60405180910390fd5b80600b90805190602001906114809291906137c6565b5050565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611532576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611529906149cf565b60405180910390fd5b80915050919050565b600581565b6000669536c708910000905090565b600d60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614a61565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116226124d4565b73ffffffffffffffffffffffffffffffffffffffff1661164061176d565b73ffffffffffffffffffffffffffffffffffffffff1614611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d9061445a565b60405180910390fd5b6116a060006129ed565b565b6116aa6124d4565b73ffffffffffffffffffffffffffffffffffffffff166116c861176d565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117159061445a565b60405180910390fd5b6000611728610f1a565b905060005b8281101561175d5761174a33828461174591906146cb565b6129cf565b808061175590614853565b91505061172d565b505050565b669536c70891000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117a690614226565b80601f01602080910402602001604051908101604052809291908181526020018280546117d290614226565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b600281565b60115481565b61185c6124d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614acd565b60405180910390fd5b80600560006118d76124d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119846124d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c9919061391d565b60405180910390a35050565b60105481565b6119e36124d4565b73ffffffffffffffffffffffffffffffffffffffff16611a0161176d565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e9061445a565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b600481565b6000611a84610f1a565b90506000611a9133611562565b90506000611a9f8287612943565b9050600d60019054906101000a900460ff16611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b5f565b60405180910390fd5b600d60029054906101000a900460ff1660ff168660ff161115611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90614bcb565b60405180910390fd5b611b9d611b553389612ab3565b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505088612ae6565b611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614c37565b60405180910390fd5b61167d8860ff1684611bee91906146cb565b1115611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614ca3565b60405180910390fd5b348860ff16669536c708910000611c46919061478d565b1115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614d0f565b60405180910390fd5b808860ff161115611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc490614d7b565b60405180910390fd5b60008111611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790614de7565b60405180910390fd5b60005b8860ff16811015611d4657611d33338286611d2e91906146cb565b6129cf565b8080611d3e90614853565b915050611d13565b505050505050505050565b600d60029054906101000a900460ff1681565b611d75611d6f6124d4565b83612609565b611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906144ec565b60405180910390fd5b611dc084848484612b73565b50505050565b611dce6124d4565b73ffffffffffffffffffffffffffffffffffffffff16611dec61176d565b73ffffffffffffffffffffffffffffffffffffffff1614611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e399061445a565b60405180910390fd5b60008260ff161415611e5a5780600e81905550611ea1565b60018260ff161415611e725780600f81905550611ea0565b60028260ff161415611e8a5780601081905550611e9f565b60038260ff161415611e9e57806011819055505b5b5b5b5050565b611ead6124d4565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61176d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f189061445a565b60405180910390fd5b600015158115151415611f4a576000600d60016101000a81548160ff0219169083151502179055505b80600d60006101000a81548160ff02191690831515021790555050565b6060611f7282612468565b611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614e79565b60405180910390fd5b6000601460008481526020019081526020016000208054611fd190614226565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffd90614226565b801561204a5780601f1061201f5761010080835404028352916020019161204a565b820191906000526020600020905b81548152906001019060200180831161202d57829003601f168201915b50505050509050600061205b612bcf565b9050600081511415612071578192505050612104565b6000825111156120a657808260405160200161208e929190614ed5565b60405160208183030381529060405292505050612104565b60006120b0612bcf565b905060008151116120d057604051806020016040528060008152506120fe565b806120da86612c61565b600c6040516020016120ee93929190614f8d565b6040516020818303038152906040525b93505050505b919050565b600061167d905090565b61211b6124d4565b73ffffffffffffffffffffffffffffffffffffffff1661213961176d565b73ffffffffffffffffffffffffffffffffffffffff161461218f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121869061445a565b60405180910390fd5b80600c90805190602001906121a59291906137c6565b5050565b60606040518060600160405280602e81526020016156bc602e9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122656124d4565b73ffffffffffffffffffffffffffffffffffffffff1661228361176d565b73ffffffffffffffffffffffffffffffffffffffff16146122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061445a565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6122fe6124d4565b73ffffffffffffffffffffffffffffffffffffffff1661231c61176d565b73ffffffffffffffffffffffffffffffffffffffff1614612372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123699061445a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990615030565b60405180910390fd5b6123eb816129ed565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612461575061246082612dc2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661254f83611489565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61259e82612468565b6125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d4906150c2565b60405180910390fd5b806014600084815260200190815260200160002090805190602001906126049291906137c6565b505050565b600061261482612468565b612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a90615154565b60405180910390fd5b600061265e83611489565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126cd57508373ffffffffffffffffffffffffffffffffffffffff166126b584610cf3565b73ffffffffffffffffffffffffffffffffffffffff16145b806126de57506126dd81856121c9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661270782611489565b73ffffffffffffffffffffffffffffffffffffffff161461275d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612754906151e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490615278565b60405180910390fd5b6127d8838383612ea4565b6127e36000826124dc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128339190615298565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a91906146cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808260ff1614156129645782600561295d9190615298565b90506129c9565b60018260ff1614156129845782600461297d9190615298565b90506129c9565b60028260ff1614156129a45782600361299d9190615298565b90506129c9565b60038260ff1614156129c4578260026129bd9190615298565b90506129c9565b600090505b92915050565b6129e9828260405180602001604052806000815250612eb4565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183604051602001612ac8929190615335565b60405160208183030381529060405280519060200120905092915050565b6000808260ff161415612b0757612b0083600e5486612f0f565b9050612b6c565b60018260ff161415612b2757612b2083600f5486612f0f565b9050612b6c565b60028260ff161415612b4757612b408360105486612f0f565b9050612b6c565b60038260ff161415612b6757612b608360115486612f0f565b9050612b6c565b600090505b9392505050565b612b7e8484846126e7565b612b8a84848484612fc5565b612bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc0906153d3565b60405180910390fd5b50505050565b6060600b8054612bde90614226565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0a90614226565b8015612c575780601f10612c2c57610100808354040283529160200191612c57565b820191906000526020600020905b815481529060010190602001808311612c3a57829003601f168201915b5050505050905090565b60606000821415612ca9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dbd565b600082905060005b60008214612cdb578080612cc490614853565b915050600a82612cd49190615422565b9150612cb1565b60008167ffffffffffffffff811115612cf757612cf6613b5c565b5b6040519080825280601f01601f191660200182016040528015612d295781602001600182028036833780820191505090505b5090505b60008514612db657600182612d429190615298565b9150600a85612d519190615453565b6030612d5d91906146cb565b60f81b818381518110612d7357612d7261492e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612daf9190615422565b9450612d2d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e9d5750612e9c8261315c565b5b9050919050565b612eaf8383836131c6565b505050565b612ebe83836132da565b612ecb6000848484612fc5565b612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f01906153d3565b60405180910390fd5b505050565b60008082905060005b8551811015612fb7576000868281518110612f3657612f3561492e565b5b60200260200101519050808311612f77578281604051602001612f5a9291906154a5565b604051602081830303815290604052805190602001209250612fa3565b8083604051602001612f8a9291906154a5565b6040516020818303038152906040528051906020012092505b508080612faf90614853565b915050612f18565b508381149150509392505050565b6000612fe68473ffffffffffffffffffffffffffffffffffffffff166134a8565b1561314f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261300f6124d4565b8786866040518563ffffffff1660e01b81526004016130319493929190615526565b602060405180830381600087803b15801561304b57600080fd5b505af192505050801561307c57506040513d601f19601f820116820180604052508101906130799190615587565b60015b6130ff573d80600081146130ac576040519150601f19603f3d011682016040523d82523d6000602084013e6130b1565b606091505b506000815114156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee906153d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613154565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131d18383836134bb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132145761320f816134c0565b613253565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613252576132518382613509565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132965761329181613676565b6132d5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132d4576132d38282613747565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334190615600565b60405180910390fd5b61335381612468565b15613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a9061566c565b60405180910390fd5b61339f60008383612ea4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ef91906146cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161351684611562565b6135209190615298565b9050600060076000848152602001908152602001600020549050818114613605576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061368a9190615298565b90506000600960008481526020019081526020016000205490506000600883815481106136ba576136b961492e565b5b9060005260206000200154905080600883815481106136dc576136db61492e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061372b5761372a61568c565b5b6001900381819060005260206000200160009055905550505050565b600061375283611562565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546137d290614226565b90600052602060002090601f0160209004810192826137f4576000855561383b565b82601f1061380d57805160ff191683800117855561383b565b8280016001018555821561383b579182015b8281111561383a57825182559160200191906001019061381f565b5b509050613848919061384c565b5090565b5b8082111561386557600081600090555060010161384d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b28161387d565b81146138bd57600080fd5b50565b6000813590506138cf816138a9565b92915050565b6000602082840312156138eb576138ea613873565b5b60006138f9848285016138c0565b91505092915050565b60008115159050919050565b61391781613902565b82525050565b6000602082019050613932600083018461390e565b92915050565b6000819050919050565b61394b81613938565b82525050565b60006020820190506139666000830184613942565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139a657808201518184015260208101905061398b565b838111156139b5576000848401525b50505050565b6000601f19601f8301169050919050565b60006139d78261396c565b6139e18185613977565b93506139f1818560208601613988565b6139fa816139bb565b840191505092915050565b60006020820190508181036000830152613a1f81846139cc565b905092915050565b6000819050919050565b613a3a81613a27565b8114613a4557600080fd5b50565b600081359050613a5781613a31565b92915050565b600060208284031215613a7357613a72613873565b5b6000613a8184828501613a48565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab582613a8a565b9050919050565b613ac581613aaa565b82525050565b6000602082019050613ae06000830184613abc565b92915050565b613aef81613aaa565b8114613afa57600080fd5b50565b600081359050613b0c81613ae6565b92915050565b60008060408385031215613b2957613b28613873565b5b6000613b3785828601613afd565b9250506020613b4885828601613a48565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b94826139bb565b810181811067ffffffffffffffff82111715613bb357613bb2613b5c565b5b80604052505050565b6000613bc6613869565b9050613bd28282613b8b565b919050565b600067ffffffffffffffff821115613bf257613bf1613b5c565b5b613bfb826139bb565b9050602081019050919050565b82818337600083830152505050565b6000613c2a613c2584613bd7565b613bbc565b905082815260208101848484011115613c4657613c45613b57565b5b613c51848285613c08565b509392505050565b600082601f830112613c6e57613c6d613b52565b5b8135613c7e848260208601613c17565b91505092915050565b60008060408385031215613c9e57613c9d613873565b5b6000613cac85828601613a48565b925050602083013567ffffffffffffffff811115613ccd57613ccc613878565b5b613cd985828601613c59565b9150509250929050565b613cec81613a27565b82525050565b6000602082019050613d076000830184613ce3565b92915050565b600080600060608486031215613d2657613d25613873565b5b6000613d3486828701613afd565b9350506020613d4586828701613afd565b9250506040613d5686828701613a48565b9150509250925092565b600060ff82169050919050565b613d7681613d60565b8114613d8157600080fd5b50565b600081359050613d9381613d6d565b92915050565b60008060408385031215613db057613daf613873565b5b6000613dbe85828601613afd565b9250506020613dcf85828601613d84565b9150509250929050565b600060208284031215613def57613dee613873565b5b600082013567ffffffffffffffff811115613e0d57613e0c613878565b5b613e1984828501613c59565b91505092915050565b600060208284031215613e3857613e37613873565b5b6000613e4684828501613afd565b91505092915050565b613e5881613902565b8114613e6357600080fd5b50565b600081359050613e7581613e4f565b92915050565b60008060408385031215613e9257613e91613873565b5b6000613ea085828601613afd565b9250506020613eb185828601613e66565b9150509250929050565b600060208284031215613ed157613ed0613873565b5b6000613edf84828501613d84565b91505092915050565b600080fd5b600080fd5b60008083601f840112613f0857613f07613b52565b5b8235905067ffffffffffffffff811115613f2557613f24613ee8565b5b602083019150836020820283011115613f4157613f40613eed565b5b9250929050565b600080600080600060808688031215613f6457613f63613873565b5b6000613f7288828901613d84565b9550506020613f8388828901613a48565b9450506040613f9488828901613d84565b935050606086013567ffffffffffffffff811115613fb557613fb4613878565b5b613fc188828901613ef2565b92509250509295509295909350565b613fd981613d60565b82525050565b6000602082019050613ff46000830184613fd0565b92915050565b600067ffffffffffffffff82111561401557614014613b5c565b5b61401e826139bb565b9050602081019050919050565b600061403e61403984613ffa565b613bbc565b90508281526020810184848401111561405a57614059613b57565b5b614065848285613c08565b509392505050565b600082601f83011261408257614081613b52565b5b813561409284826020860161402b565b91505092915050565b600080600080608085870312156140b5576140b4613873565b5b60006140c387828801613afd565b94505060206140d487828801613afd565b93505060406140e587828801613a48565b925050606085013567ffffffffffffffff81111561410657614105613878565b5b6141128782880161406d565b91505092959194509250565b61412781613938565b811461413257600080fd5b50565b6000813590506141448161411e565b92915050565b6000806040838503121561416157614160613873565b5b600061416f85828601613d84565b925050602061418085828601614135565b9150509250929050565b6000602082840312156141a05761419f613873565b5b60006141ae84828501613e66565b91505092915050565b600080604083850312156141ce576141cd613873565b5b60006141dc85828601613afd565b92505060206141ed85828601613afd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423e57607f821691505b60208210811415614252576142516141f7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142b4602c83613977565b91506142bf82614258565b604082019050919050565b600060208201905081810360008301526142e3816142a7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614346602183613977565b9150614351826142ea565b604082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006143d8603883613977565b91506143e38261437c565b604082019050919050565b60006020820190508181036000830152614407816143cb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614444602083613977565b915061444f8261440e565b602082019050919050565b6000602082019050818103600083015261447381614437565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144d6603183613977565b91506144e18261447a565b604082019050919050565b60006020820190508181036000830152614505816144c9565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614568602b83613977565b91506145738261450c565b604082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b60006145fa602283613977565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614666601b83613977565b915061467182614630565b602082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d682613a27565b91506146e183613a27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147165761471561469c565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614757602083613977565b915061476282614721565b602082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b600061479882613a27565b91506147a383613a27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147dc576147db61469c565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061481d601f83613977565b9150614828826147e7565b602082019050919050565b6000602082019050818103600083015261484c81614810565b9050919050565b600061485e82613a27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148915761489061469c565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148f8602c83613977565b91506149038261489c565b604082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149b9602983613977565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a4b602a83613977565b9150614a56826149ef565b604082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ab7601983613977565b9150614ac282614a81565b602082019050919050565b60006020820190508181036000830152614ae681614aaa565b9050919050565b7f5768697465206c697374206973206e6f742063757272656e746c79206163746960008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b49602283613977565b9150614b5482614aed565b604082019050919050565b60006020820190508181036000830152614b7881614b3c565b9050919050565b7f57686974656c6973742067726f7570206e6f7420616374697665207965740000600082015250565b6000614bb5601e83613977565b9150614bc082614b7f565b602082019050919050565b60006020820190508181036000830152614be481614ba8565b9050919050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614c21601483613977565b9150614c2c82614beb565b602082019050919050565b60006020820190508181036000830152614c5081614c14565b9050919050565b7f4e6f7420656e6f75676820737570706c792072656d61696e696e670000000000600082015250565b6000614c8d601b83613977565b9150614c9882614c57565b602082019050919050565b60006020820190508181036000830152614cbc81614c80565b9050919050565b7f496e73756666696369656e742065746865722073656e74000000000000000000600082015250565b6000614cf9601783613977565b9150614d0482614cc3565b602082019050919050565b60006020820190508181036000830152614d2881614cec565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e20616c6c6f746d656e7400600082015250565b6000614d65601f83613977565b9150614d7082614d2f565b602082019050919050565b60006020820190508181036000830152614d9481614d58565b9050919050565b7f4e6f206d696e74732072656d61696e696e670000000000000000000000000000600082015250565b6000614dd1601283613977565b9150614ddc82614d9b565b602082019050919050565b60006020820190508181036000830152614e0081614dc4565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000614e63603183613977565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b600081905092915050565b6000614eaf8261396c565b614eb98185614e99565b9350614ec9818560208601613988565b80840191505092915050565b6000614ee18285614ea4565b9150614eed8284614ea4565b91508190509392505050565b60008190508160005260206000209050919050565b60008154614f1b81614226565b614f258186614e99565b94506001821660008114614f405760018114614f5157614f84565b60ff19831686528186019350614f84565b614f5a85614ef9565b60005b83811015614f7c57815481890152600182019150602081019050614f5d565b838801955050505b50505092915050565b6000614f998286614ea4565b9150614fa58285614ea4565b9150614fb18284614f0e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061501a602683613977565b915061502582614fbe565b604082019050919050565b600060208201905081810360008301526150498161500d565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006150ac602e83613977565b91506150b782615050565b604082019050919050565b600060208201905081810360008301526150db8161509f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061513e602c83613977565b9150615149826150e2565b604082019050919050565b6000602082019050818103600083015261516d81615131565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006151d0602983613977565b91506151db82615174565b604082019050919050565b600060208201905081810360008301526151ff816151c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615262602483613977565b915061526d82615206565b604082019050919050565b6000602082019050818103600083015261529181615255565b9050919050565b60006152a382613a27565b91506152ae83613a27565b9250828210156152c1576152c061469c565b5b828203905092915050565b6000819050919050565b6152e76152e282613a27565b6152cc565b82525050565b60008160601b9050919050565b6000615305826152ed565b9050919050565b6000615317826152fa565b9050919050565b61532f61532a82613aaa565b61530c565b82525050565b600061534182856152d6565b602082019150615351828461531e565b6014820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006153bd603283613977565b91506153c882615361565b604082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061542d82613a27565b915061543883613a27565b925082615448576154476153f3565b5b828204905092915050565b600061545e82613a27565b915061546983613a27565b925082615479576154786153f3565b5b828206905092915050565b6000819050919050565b61549f61549a82613938565b615484565b82525050565b60006154b1828561548e565b6020820191506154c1828461548e565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006154f8826154d1565b61550281856154dc565b9350615512818560208601613988565b61551b816139bb565b840191505092915050565b600060808201905061553b6000830187613abc565b6155486020830186613abc565b6155556040830185613ce3565b818103606083015261556781846154ed565b905095945050505050565b600081519050615581816138a9565b92915050565b60006020828403121561559d5761559c613873565b5b60006155ab84828501615572565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006155ea602083613977565b91506155f5826155b4565b602082019050919050565b60006020820190508181036000830152615619816155dd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615656601c83613977565b915061566182615620565b602082019050919050565b6000602082019050818103600083015261568581615649565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f6c6567656e646d6170732e696f2f6c6567656e646d6170732d6d657461646174612e6a736f6ea264697066735822122090722edca440a4df05169e0261ff3c1839aeb0fab2951f710d2ea519a9bd8b9664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806368428a1b11610190578063b033e1c5116100dc578063c87b56dd11610095578063e8a3d4851161006f578063e8a3d48514610b7c578063e985e9c514610ba7578063eceb7d5214610be4578063f2fde38b14610c0d576102ff565b8063c87b56dd14610aeb578063d5abeb0114610b28578063da3ef23f14610b53576102ff565b8063b033e1c5146109fe578063b182841a14610a29578063b5506cc514610a45578063b88d4fde14610a70578063c2a0d4b314610a99578063c4e3709514610ac2576102ff565b806395d89b4111610149578063a04345f611610123578063a04345f614610956578063a22cb46514610981578063abeea126146109aa578063ad67c77f146109d5576102ff565b806395d89b41146108c35780639c03facb146108ee5780639fbe1de41461092b576102ff565b806368428a1b146107c557806370a08231146107f0578063715018a61461082d578063819b25ba14610844578063833b94991461086d5780638da5cb5b14610898576102ff565b806332cb6b0c1161024f57806346a666a61161020857806361c4dac0116101e257806361c4dac0146107075780636352211e1461073257806365f130971461076f5780636817c76c1461079a576102ff565b806346a666a6146106765780634f6ccce7146106a157806355f804b3146106de576102ff565b806332cb6b0c1461057557806335aa69aa146105a05780633bb3a24d146105dd5780633ccfd60b1461061a57806342842e0e146106315780634287084f1461065a576102ff565b8063162094c4116102bc57806324fcd9461161029657806324fcd946146104a55780632672c902146104d057806326a49e37146104fb5780632f745c5914610538576102ff565b8063162094c41461042857806318160ddd1461045157806323b872dd1461047c576102ff565b806301ffc9a71461030457806302ce58131461034157806305d0e7ed1461036c57806306fdde0314610397578063081812fc146103c2578063095ea7b3146103ff575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906138d5565b610c36565b604051610338919061391d565b60405180910390f35b34801561034d57600080fd5b50610356610c48565b604051610363919061391d565b60405180910390f35b34801561037857600080fd5b50610381610c5b565b60405161038e9190613951565b60405180910390f35b3480156103a357600080fd5b506103ac610c61565b6040516103b99190613a05565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613a5d565b610cf3565b6040516103f69190613acb565b60405180910390f35b34801561040b57600080fd5b5061042660048036038101906104219190613b12565b610d78565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613c87565b610e90565b005b34801561045d57600080fd5b50610466610f1a565b6040516104739190613cf2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613d0d565b610f27565b005b3480156104b157600080fd5b506104ba610f87565b6040516104c79190613cf2565b60405180910390f35b3480156104dc57600080fd5b506104e5610f8c565b6040516104f29190613a05565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613a5d565b61101a565b60405161052f9190613cf2565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613b12565b611032565b60405161056c9190613cf2565b60405180910390f35b34801561058157600080fd5b5061058a6110d7565b6040516105979190613cf2565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613d99565b6110dd565b6040516105d49190613cf2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613a5d565b6110fe565b6040516106119190613a05565b60405180910390f35b34801561062657600080fd5b5061062f611110565b005b34801561063d57600080fd5b5061065860048036038101906106539190613d0d565b6111db565b005b610674600480360381019061066f9190613a5d565b6111fb565b005b34801561068257600080fd5b5061068b611377565b6040516106989190613951565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613a5d565b61137d565b6040516106d59190613cf2565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613dd9565b6113ee565b005b34801561071357600080fd5b5061071c611484565b6040516107299190613cf2565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190613a5d565b611489565b6040516107669190613acb565b60405180910390f35b34801561077b57600080fd5b5061078461153b565b6040516107919190613cf2565b60405180910390f35b3480156107a657600080fd5b506107af611540565b6040516107bc9190613cf2565b60405180910390f35b3480156107d157600080fd5b506107da61154f565b6040516107e7919061391d565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613e22565b611562565b6040516108249190613cf2565b60405180910390f35b34801561083957600080fd5b5061084261161a565b005b34801561085057600080fd5b5061086b60048036038101906108669190613a5d565b6116a2565b005b34801561087957600080fd5b50610882611762565b60405161088f9190613cf2565b60405180910390f35b3480156108a457600080fd5b506108ad61176d565b6040516108ba9190613acb565b60405180910390f35b3480156108cf57600080fd5b506108d8611797565b6040516108e59190613a05565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613a5d565b611829565b604051610922919061391d565b60405180910390f35b34801561093757600080fd5b50610940611849565b60405161094d9190613cf2565b60405180910390f35b34801561096257600080fd5b5061096b61184e565b6040516109789190613951565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613e7b565b611854565b005b3480156109b657600080fd5b506109bf6119d5565b6040516109cc9190613951565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f79190613ebb565b6119db565b005b348015610a0a57600080fd5b50610a13611a75565b604051610a209190613cf2565b60405180910390f35b610a436004803603810190610a3e9190613f48565b611a7a565b005b348015610a5157600080fd5b50610a5a611d51565b604051610a679190613fdf565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a92919061409b565b611d64565b005b348015610aa557600080fd5b50610ac06004803603810190610abb919061414a565b611dc6565b005b348015610ace57600080fd5b50610ae96004803603810190610ae4919061418a565b611ea5565b005b348015610af757600080fd5b50610b126004803603810190610b0d9190613a5d565b611f67565b604051610b1f9190613a05565b60405180910390f35b348015610b3457600080fd5b50610b3d612109565b604051610b4a9190613cf2565b60405180910390f35b348015610b5f57600080fd5b50610b7a6004803603810190610b759190613dd9565b612113565b005b348015610b8857600080fd5b50610b916121a9565b604051610b9e9190613a05565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc991906141b7565b6121c9565b604051610bdb919061391d565b60405180910390f35b348015610bf057600080fd5b50610c0b6004803603810190610c06919061418a565b61225d565b005b348015610c1957600080fd5b50610c346004803603810190610c2f9190613e22565b6122f6565b005b6000610c41826123ee565b9050919050565b600d60019054906101000a900460ff1681565b600f5481565b606060008054610c7090614226565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90614226565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050905090565b6000610cfe82612468565b610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906142ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8382611489565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb9061435c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e136124d4565b73ffffffffffffffffffffffffffffffffffffffff161480610e425750610e4181610e3c6124d4565b6121c9565b5b610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906143ee565b60405180910390fd5b610e8b83836124dc565b505050565b610e986124d4565b73ffffffffffffffffffffffffffffffffffffffff16610eb661176d565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061445a565b60405180910390fd5b610f168282612595565b5050565b6000600880549050905090565b610f38610f326124d4565b82612609565b610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906144ec565b60405180910390fd5b610f828383836126e7565b505050565b600381565b600c8054610f9990614226565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc590614226565b80156110125780601f10610fe757610100808354040283529160200191611012565b820191906000526020600020905b815481529060010190602001808311610ff557829003601f168201915b505050505081565b60136020528060005260406000206000915090505481565b600061103d83611562565b821061107e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110759061457e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61167d81565b6000806110e984611562565b90506110f58184612943565b91505092915050565b606061110982611f67565b9050919050565b6111186124d4565b73ffffffffffffffffffffffffffffffffffffffff1661113661176d565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061445a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111d7573d6000803e3d6000fd5b5050565b6111f683838360405180602001604052806000815250611d64565b505050565b6000611205610f1a565b9050600d60009054906101000a900460ff16611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614610565b60405180910390fd5b600582111561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061467c565b60405180910390fd5b61167d82826112a991906146cb565b11156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e19061476d565b60405180910390fd5b3482669536c7089100006112fe919061478d565b111561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690614833565b60405180910390fd5b60005b828110156113725761135f33828461135a91906146cb565b6129cf565b808061136a90614853565b915050611342565b505050565b600e5481565b6000611387610f1a565b82106113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061490e565b60405180910390fd5b600882815481106113dc576113db61492e565b5b90600052602060002001549050919050565b6113f66124d4565b73ffffffffffffffffffffffffffffffffffffffff1661141461176d565b73ffffffffffffffffffffffffffffffffffffffff161461146a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114619061445a565b60405180910390fd5b80600b90805190602001906114809291906137c6565b5050565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611532576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611529906149cf565b60405180910390fd5b80915050919050565b600581565b6000669536c708910000905090565b600d60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614a61565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116226124d4565b73ffffffffffffffffffffffffffffffffffffffff1661164061176d565b73ffffffffffffffffffffffffffffffffffffffff1614611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d9061445a565b60405180910390fd5b6116a060006129ed565b565b6116aa6124d4565b73ffffffffffffffffffffffffffffffffffffffff166116c861176d565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117159061445a565b60405180910390fd5b6000611728610f1a565b905060005b8281101561175d5761174a33828461174591906146cb565b6129cf565b808061175590614853565b91505061172d565b505050565b669536c70891000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117a690614226565b80601f01602080910402602001604051908101604052809291908181526020018280546117d290614226565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b600281565b60115481565b61185c6124d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614acd565b60405180910390fd5b80600560006118d76124d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119846124d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c9919061391d565b60405180910390a35050565b60105481565b6119e36124d4565b73ffffffffffffffffffffffffffffffffffffffff16611a0161176d565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e9061445a565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b600481565b6000611a84610f1a565b90506000611a9133611562565b90506000611a9f8287612943565b9050600d60019054906101000a900460ff16611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b5f565b60405180910390fd5b600d60029054906101000a900460ff1660ff168660ff161115611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90614bcb565b60405180910390fd5b611b9d611b553389612ab3565b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505088612ae6565b611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614c37565b60405180910390fd5b61167d8860ff1684611bee91906146cb565b1115611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614ca3565b60405180910390fd5b348860ff16669536c708910000611c46919061478d565b1115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614d0f565b60405180910390fd5b808860ff161115611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc490614d7b565b60405180910390fd5b60008111611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790614de7565b60405180910390fd5b60005b8860ff16811015611d4657611d33338286611d2e91906146cb565b6129cf565b8080611d3e90614853565b915050611d13565b505050505050505050565b600d60029054906101000a900460ff1681565b611d75611d6f6124d4565b83612609565b611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906144ec565b60405180910390fd5b611dc084848484612b73565b50505050565b611dce6124d4565b73ffffffffffffffffffffffffffffffffffffffff16611dec61176d565b73ffffffffffffffffffffffffffffffffffffffff1614611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e399061445a565b60405180910390fd5b60008260ff161415611e5a5780600e81905550611ea1565b60018260ff161415611e725780600f81905550611ea0565b60028260ff161415611e8a5780601081905550611e9f565b60038260ff161415611e9e57806011819055505b5b5b5b5050565b611ead6124d4565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61176d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f189061445a565b60405180910390fd5b600015158115151415611f4a576000600d60016101000a81548160ff0219169083151502179055505b80600d60006101000a81548160ff02191690831515021790555050565b6060611f7282612468565b611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614e79565b60405180910390fd5b6000601460008481526020019081526020016000208054611fd190614226565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffd90614226565b801561204a5780601f1061201f5761010080835404028352916020019161204a565b820191906000526020600020905b81548152906001019060200180831161202d57829003601f168201915b50505050509050600061205b612bcf565b9050600081511415612071578192505050612104565b6000825111156120a657808260405160200161208e929190614ed5565b60405160208183030381529060405292505050612104565b60006120b0612bcf565b905060008151116120d057604051806020016040528060008152506120fe565b806120da86612c61565b600c6040516020016120ee93929190614f8d565b6040516020818303038152906040525b93505050505b919050565b600061167d905090565b61211b6124d4565b73ffffffffffffffffffffffffffffffffffffffff1661213961176d565b73ffffffffffffffffffffffffffffffffffffffff161461218f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121869061445a565b60405180910390fd5b80600c90805190602001906121a59291906137c6565b5050565b60606040518060600160405280602e81526020016156bc602e9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122656124d4565b73ffffffffffffffffffffffffffffffffffffffff1661228361176d565b73ffffffffffffffffffffffffffffffffffffffff16146122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061445a565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6122fe6124d4565b73ffffffffffffffffffffffffffffffffffffffff1661231c61176d565b73ffffffffffffffffffffffffffffffffffffffff1614612372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123699061445a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990615030565b60405180910390fd5b6123eb816129ed565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612461575061246082612dc2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661254f83611489565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61259e82612468565b6125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d4906150c2565b60405180910390fd5b806014600084815260200190815260200160002090805190602001906126049291906137c6565b505050565b600061261482612468565b612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a90615154565b60405180910390fd5b600061265e83611489565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126cd57508373ffffffffffffffffffffffffffffffffffffffff166126b584610cf3565b73ffffffffffffffffffffffffffffffffffffffff16145b806126de57506126dd81856121c9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661270782611489565b73ffffffffffffffffffffffffffffffffffffffff161461275d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612754906151e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490615278565b60405180910390fd5b6127d8838383612ea4565b6127e36000826124dc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128339190615298565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a91906146cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808260ff1614156129645782600561295d9190615298565b90506129c9565b60018260ff1614156129845782600461297d9190615298565b90506129c9565b60028260ff1614156129a45782600361299d9190615298565b90506129c9565b60038260ff1614156129c4578260026129bd9190615298565b90506129c9565b600090505b92915050565b6129e9828260405180602001604052806000815250612eb4565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183604051602001612ac8929190615335565b60405160208183030381529060405280519060200120905092915050565b6000808260ff161415612b0757612b0083600e5486612f0f565b9050612b6c565b60018260ff161415612b2757612b2083600f5486612f0f565b9050612b6c565b60028260ff161415612b4757612b408360105486612f0f565b9050612b6c565b60038260ff161415612b6757612b608360115486612f0f565b9050612b6c565b600090505b9392505050565b612b7e8484846126e7565b612b8a84848484612fc5565b612bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc0906153d3565b60405180910390fd5b50505050565b6060600b8054612bde90614226565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0a90614226565b8015612c575780601f10612c2c57610100808354040283529160200191612c57565b820191906000526020600020905b815481529060010190602001808311612c3a57829003601f168201915b5050505050905090565b60606000821415612ca9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dbd565b600082905060005b60008214612cdb578080612cc490614853565b915050600a82612cd49190615422565b9150612cb1565b60008167ffffffffffffffff811115612cf757612cf6613b5c565b5b6040519080825280601f01601f191660200182016040528015612d295781602001600182028036833780820191505090505b5090505b60008514612db657600182612d429190615298565b9150600a85612d519190615453565b6030612d5d91906146cb565b60f81b818381518110612d7357612d7261492e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612daf9190615422565b9450612d2d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e9d5750612e9c8261315c565b5b9050919050565b612eaf8383836131c6565b505050565b612ebe83836132da565b612ecb6000848484612fc5565b612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f01906153d3565b60405180910390fd5b505050565b60008082905060005b8551811015612fb7576000868281518110612f3657612f3561492e565b5b60200260200101519050808311612f77578281604051602001612f5a9291906154a5565b604051602081830303815290604052805190602001209250612fa3565b8083604051602001612f8a9291906154a5565b6040516020818303038152906040528051906020012092505b508080612faf90614853565b915050612f18565b508381149150509392505050565b6000612fe68473ffffffffffffffffffffffffffffffffffffffff166134a8565b1561314f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261300f6124d4565b8786866040518563ffffffff1660e01b81526004016130319493929190615526565b602060405180830381600087803b15801561304b57600080fd5b505af192505050801561307c57506040513d601f19601f820116820180604052508101906130799190615587565b60015b6130ff573d80600081146130ac576040519150601f19603f3d011682016040523d82523d6000602084013e6130b1565b606091505b506000815114156130f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ee906153d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613154565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131d18383836134bb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132145761320f816134c0565b613253565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613252576132518382613509565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132965761329181613676565b6132d5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132d4576132d38282613747565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334190615600565b60405180910390fd5b61335381612468565b15613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a9061566c565b60405180910390fd5b61339f60008383612ea4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ef91906146cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161351684611562565b6135209190615298565b9050600060076000848152602001908152602001600020549050818114613605576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061368a9190615298565b90506000600960008481526020019081526020016000205490506000600883815481106136ba576136b961492e565b5b9060005260206000200154905080600883815481106136dc576136db61492e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061372b5761372a61568c565b5b6001900381819060005260206000200160009055905550505050565b600061375283611562565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546137d290614226565b90600052602060002090601f0160209004810192826137f4576000855561383b565b82601f1061380d57805160ff191683800117855561383b565b8280016001018555821561383b579182015b8281111561383a57825182559160200191906001019061381f565b5b509050613848919061384c565b5090565b5b8082111561386557600081600090555060010161384d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b28161387d565b81146138bd57600080fd5b50565b6000813590506138cf816138a9565b92915050565b6000602082840312156138eb576138ea613873565b5b60006138f9848285016138c0565b91505092915050565b60008115159050919050565b61391781613902565b82525050565b6000602082019050613932600083018461390e565b92915050565b6000819050919050565b61394b81613938565b82525050565b60006020820190506139666000830184613942565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139a657808201518184015260208101905061398b565b838111156139b5576000848401525b50505050565b6000601f19601f8301169050919050565b60006139d78261396c565b6139e18185613977565b93506139f1818560208601613988565b6139fa816139bb565b840191505092915050565b60006020820190508181036000830152613a1f81846139cc565b905092915050565b6000819050919050565b613a3a81613a27565b8114613a4557600080fd5b50565b600081359050613a5781613a31565b92915050565b600060208284031215613a7357613a72613873565b5b6000613a8184828501613a48565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab582613a8a565b9050919050565b613ac581613aaa565b82525050565b6000602082019050613ae06000830184613abc565b92915050565b613aef81613aaa565b8114613afa57600080fd5b50565b600081359050613b0c81613ae6565b92915050565b60008060408385031215613b2957613b28613873565b5b6000613b3785828601613afd565b9250506020613b4885828601613a48565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b94826139bb565b810181811067ffffffffffffffff82111715613bb357613bb2613b5c565b5b80604052505050565b6000613bc6613869565b9050613bd28282613b8b565b919050565b600067ffffffffffffffff821115613bf257613bf1613b5c565b5b613bfb826139bb565b9050602081019050919050565b82818337600083830152505050565b6000613c2a613c2584613bd7565b613bbc565b905082815260208101848484011115613c4657613c45613b57565b5b613c51848285613c08565b509392505050565b600082601f830112613c6e57613c6d613b52565b5b8135613c7e848260208601613c17565b91505092915050565b60008060408385031215613c9e57613c9d613873565b5b6000613cac85828601613a48565b925050602083013567ffffffffffffffff811115613ccd57613ccc613878565b5b613cd985828601613c59565b9150509250929050565b613cec81613a27565b82525050565b6000602082019050613d076000830184613ce3565b92915050565b600080600060608486031215613d2657613d25613873565b5b6000613d3486828701613afd565b9350506020613d4586828701613afd565b9250506040613d5686828701613a48565b9150509250925092565b600060ff82169050919050565b613d7681613d60565b8114613d8157600080fd5b50565b600081359050613d9381613d6d565b92915050565b60008060408385031215613db057613daf613873565b5b6000613dbe85828601613afd565b9250506020613dcf85828601613d84565b9150509250929050565b600060208284031215613def57613dee613873565b5b600082013567ffffffffffffffff811115613e0d57613e0c613878565b5b613e1984828501613c59565b91505092915050565b600060208284031215613e3857613e37613873565b5b6000613e4684828501613afd565b91505092915050565b613e5881613902565b8114613e6357600080fd5b50565b600081359050613e7581613e4f565b92915050565b60008060408385031215613e9257613e91613873565b5b6000613ea085828601613afd565b9250506020613eb185828601613e66565b9150509250929050565b600060208284031215613ed157613ed0613873565b5b6000613edf84828501613d84565b91505092915050565b600080fd5b600080fd5b60008083601f840112613f0857613f07613b52565b5b8235905067ffffffffffffffff811115613f2557613f24613ee8565b5b602083019150836020820283011115613f4157613f40613eed565b5b9250929050565b600080600080600060808688031215613f6457613f63613873565b5b6000613f7288828901613d84565b9550506020613f8388828901613a48565b9450506040613f9488828901613d84565b935050606086013567ffffffffffffffff811115613fb557613fb4613878565b5b613fc188828901613ef2565b92509250509295509295909350565b613fd981613d60565b82525050565b6000602082019050613ff46000830184613fd0565b92915050565b600067ffffffffffffffff82111561401557614014613b5c565b5b61401e826139bb565b9050602081019050919050565b600061403e61403984613ffa565b613bbc565b90508281526020810184848401111561405a57614059613b57565b5b614065848285613c08565b509392505050565b600082601f83011261408257614081613b52565b5b813561409284826020860161402b565b91505092915050565b600080600080608085870312156140b5576140b4613873565b5b60006140c387828801613afd565b94505060206140d487828801613afd565b93505060406140e587828801613a48565b925050606085013567ffffffffffffffff81111561410657614105613878565b5b6141128782880161406d565b91505092959194509250565b61412781613938565b811461413257600080fd5b50565b6000813590506141448161411e565b92915050565b6000806040838503121561416157614160613873565b5b600061416f85828601613d84565b925050602061418085828601614135565b9150509250929050565b6000602082840312156141a05761419f613873565b5b60006141ae84828501613e66565b91505092915050565b600080604083850312156141ce576141cd613873565b5b60006141dc85828601613afd565b92505060206141ed85828601613afd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061423e57607f821691505b60208210811415614252576142516141f7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142b4602c83613977565b91506142bf82614258565b604082019050919050565b600060208201905081810360008301526142e3816142a7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614346602183613977565b9150614351826142ea565b604082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006143d8603883613977565b91506143e38261437c565b604082019050919050565b60006020820190508181036000830152614407816143cb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614444602083613977565b915061444f8261440e565b602082019050919050565b6000602082019050818103600083015261447381614437565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144d6603183613977565b91506144e18261447a565b604082019050919050565b60006020820190508181036000830152614505816144c9565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614568602b83613977565b91506145738261450c565b604082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b60006145fa602283613977565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614666601b83613977565b915061467182614630565b602082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d682613a27565b91506146e183613a27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147165761471561469c565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614757602083613977565b915061476282614721565b602082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b600061479882613a27565b91506147a383613a27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147dc576147db61469c565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061481d601f83613977565b9150614828826147e7565b602082019050919050565b6000602082019050818103600083015261484c81614810565b9050919050565b600061485e82613a27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148915761489061469c565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148f8602c83613977565b91506149038261489c565b604082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149b9602983613977565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a4b602a83613977565b9150614a56826149ef565b604082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ab7601983613977565b9150614ac282614a81565b602082019050919050565b60006020820190508181036000830152614ae681614aaa565b9050919050565b7f5768697465206c697374206973206e6f742063757272656e746c79206163746960008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b49602283613977565b9150614b5482614aed565b604082019050919050565b60006020820190508181036000830152614b7881614b3c565b9050919050565b7f57686974656c6973742067726f7570206e6f7420616374697665207965740000600082015250565b6000614bb5601e83613977565b9150614bc082614b7f565b602082019050919050565b60006020820190508181036000830152614be481614ba8565b9050919050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614c21601483613977565b9150614c2c82614beb565b602082019050919050565b60006020820190508181036000830152614c5081614c14565b9050919050565b7f4e6f7420656e6f75676820737570706c792072656d61696e696e670000000000600082015250565b6000614c8d601b83613977565b9150614c9882614c57565b602082019050919050565b60006020820190508181036000830152614cbc81614c80565b9050919050565b7f496e73756666696369656e742065746865722073656e74000000000000000000600082015250565b6000614cf9601783613977565b9150614d0482614cc3565b602082019050919050565b60006020820190508181036000830152614d2881614cec565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e20616c6c6f746d656e7400600082015250565b6000614d65601f83613977565b9150614d7082614d2f565b602082019050919050565b60006020820190508181036000830152614d9481614d58565b9050919050565b7f4e6f206d696e74732072656d61696e696e670000000000000000000000000000600082015250565b6000614dd1601283613977565b9150614ddc82614d9b565b602082019050919050565b60006020820190508181036000830152614e0081614dc4565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000614e63603183613977565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b600081905092915050565b6000614eaf8261396c565b614eb98185614e99565b9350614ec9818560208601613988565b80840191505092915050565b6000614ee18285614ea4565b9150614eed8284614ea4565b91508190509392505050565b60008190508160005260206000209050919050565b60008154614f1b81614226565b614f258186614e99565b94506001821660008114614f405760018114614f5157614f84565b60ff19831686528186019350614f84565b614f5a85614ef9565b60005b83811015614f7c57815481890152600182019150602081019050614f5d565b838801955050505b50505092915050565b6000614f998286614ea4565b9150614fa58285614ea4565b9150614fb18284614f0e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061501a602683613977565b915061502582614fbe565b604082019050919050565b600060208201905081810360008301526150498161500d565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006150ac602e83613977565b91506150b782615050565b604082019050919050565b600060208201905081810360008301526150db8161509f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061513e602c83613977565b9150615149826150e2565b604082019050919050565b6000602082019050818103600083015261516d81615131565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006151d0602983613977565b91506151db82615174565b604082019050919050565b600060208201905081810360008301526151ff816151c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615262602483613977565b915061526d82615206565b604082019050919050565b6000602082019050818103600083015261529181615255565b9050919050565b60006152a382613a27565b91506152ae83613a27565b9250828210156152c1576152c061469c565b5b828203905092915050565b6000819050919050565b6152e76152e282613a27565b6152cc565b82525050565b60008160601b9050919050565b6000615305826152ed565b9050919050565b6000615317826152fa565b9050919050565b61532f61532a82613aaa565b61530c565b82525050565b600061534182856152d6565b602082019150615351828461531e565b6014820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006153bd603283613977565b91506153c882615361565b604082019050919050565b600060208201905081810360008301526153ec816153b0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061542d82613a27565b915061543883613a27565b925082615448576154476153f3565b5b828204905092915050565b600061545e82613a27565b915061546983613a27565b925082615479576154786153f3565b5b828206905092915050565b6000819050919050565b61549f61549a82613938565b615484565b82525050565b60006154b1828561548e565b6020820191506154c1828461548e565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006154f8826154d1565b61550281856154dc565b9350615512818560208601613988565b61551b816139bb565b840191505092915050565b600060808201905061553b6000830187613abc565b6155486020830186613abc565b6155556040830185613ce3565b818103606083015261556781846154ed565b905095945050505050565b600081519050615581816138a9565b92915050565b60006020828403121561559d5761559c613873565b5b60006155ab84828501615572565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006155ea602083613977565b91506155f5826155b4565b602082019050919050565b60006020820190508181036000830152615619816155dd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615656601c83613977565b915061566182615620565b602082019050919050565b6000602082019050818103600083015261568581615649565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f6c6567656e646d6170732e696f2f6c6567656e646d6170732d6d657461646174612e6a736f6ea264697066735822122090722edca440a4df05169e0261ff3c1839aeb0fab2951f710d2ea519a9bd8b9664736f6c63430008090033

Deployed Bytecode Sourcemap

1322:7265:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1523:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1637:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7222:125:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1577:113:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2100:35:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1450:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1768:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1245:256:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1863:41:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2770:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6610:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5945:130;;;;;;;;;;;;;:::i;:::-;;5285:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5445:494:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1604:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1767:233:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6257:105:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2015:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:239:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1909:43:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6167:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1488:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:16;;;;;;;;;;;;;:::i;:::-;;7353:176:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1957:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1727:36:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2140:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1665:23:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3117:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2060:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4515:924;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1563:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2447:317:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2956:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7535:630;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6081:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6368:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7089:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2318:123:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1899:192:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6908:175:13;7019:4;7041:36;7065:11;7041:23;:36::i;:::-;7034:43;;6908:175;;;:::o;1523:35::-;;;;;;;;;;;;;:::o;1637:23::-;;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;7222:125:13:-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7309:32:13::1;7322:7;7331:9;7309:12;:32::i;:::-;7222:125:::0;;:::o;1577:113:5:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;2100:35:13:-;2134:1;2100:35;:::o;1450:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1768:40::-;;;;;;;;;;;;;;;;;:::o;1245:256:5:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;1863:41:13:-;1900:4;1863:41;:::o;2770:180::-;2846:4;2858:18;2879:15;2889:4;2879:9;:15::i;:::-;2858:36;;2908;2923:13;2938:5;2908:14;:36::i;:::-;2901:43;;;2770:180;;;;:::o;6610:111::-;6669:13;6698:17;6707:7;6698:8;:17::i;:::-;6691:24;;6610:111;;;:::o;5945:130::-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5989:12:13::1;6004:21;5989:36;;6040:10;6032:28;;:37;6061:7;6032:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5982:93;5945:130::o:0;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;5445:494:13:-;5501:10;5514:13;:11;:13::i;:::-;5501:26;;5542:10;;;;;;;;;;;5534:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1951:1;5606:9;:28;;5598:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1900:4;5686:9;5681:2;:14;;;;:::i;:::-;:28;;5673:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5792:9;5779;1999:11;5761:27;;;;:::i;:::-;:40;;5753:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;5851:9;5846:88;5870:9;5866:1;:13;5846:88;;;5897:29;5907:10;5924:1;5919:2;:6;;;;:::i;:::-;5897:9;:29::i;:::-;5881:3;;;;;:::i;:::-;;;;5846:88;;;;5494:445;5445:494;:::o;1604:28::-;;;;:::o;1767:233:5:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;:::i;:::-;;;;;;;;;;1968:24;;1767:233;;;:::o;6257:105:13:-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6348:8:13::1;6329:16;:27;;;;;;;;;;;;:::i;:::-;;6257:105:::0;:::o;2015:40::-;2054:1;2015:40;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;1909:43:13:-;1951:1;1909:43;:::o;6167:84::-;6208:7;1999:11;6223:22;;6167:84;:::o;1488:30::-;;;;;;;;;;;;;:::o;1850:208:3:-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:16:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;7353:176:13:-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7409:11:13::1;7423:13;:11;:13::i;:::-;7409:27;;7447:6;7443:81;7463:5;7459:1;:9;7443:81;;;7483:33;7493:10;7514:1;7505:6;:10;;;;:::i;:::-;7483:9;:33::i;:::-;7470:3;;;;;:::i;:::-;;;;7443:81;;;;7402:127;7353:176:::0;:::o;1957:53::-;1999:11;1957:53;:::o;999:87:16:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;1727:36:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;2140:39::-;2178:1;2140:39;:::o;1693:27::-;;;;:::o;4278:295:3:-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;1665:23:13:-;;;;:::o;3117:103::-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3206:8:13::1;3184:19;;:30;;;;;;;;;;;;;;;;;;3117:103:::0;:::o;2060:35::-;2094:1;2060:35;:::o;4515:924::-;4646:10;4659:13;:11;:13::i;:::-;4646:26;;4679:18;4700:21;4710:10;4700:9;:21::i;:::-;4679:42;;4728:19;4750:45;4765:13;4780:14;4750;:45::i;:::-;4728:67;;4810:15;;;;;;;;;;;4802:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4897:19;;;;;;;;;;;4879:37;;:14;:37;;;;4871:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;4966:60;4974:28;4980:10;4992:9;4974:5;:28::i;:::-;5004:5;;4966:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5011:14;4966:7;:60::i;:::-;4958:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1900:4;5071:9;5066:14;;:2;:14;;;;:::i;:::-;:28;;5058:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5172:9;5159;5141:27;;1999:11;5141:27;;;;:::i;:::-;:40;;5133:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5237:14;5224:9;:27;;;;5216:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5319:1;5302:14;:18;5294:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;5354:9;5350:84;5373:9;5369:13;;:1;:13;5350:84;;;5397:29;5407:10;5424:1;5419:2;:6;;;;:::i;:::-;5397:9;:29::i;:::-;5384:3;;;;;:::i;:::-;;;;5350:84;;;;4639:800;;;4515:924;;;;;:::o;1563:36::-;;;;;;;;;;;;;:::o;5541:328:3:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;2447:317:13:-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2536:1:13::1;2527:5;:10;;;2524:235;;;2563:10;2547:13;:26;;;;2524:235;;;2599:1;2590:5;:10;;;2587:172;;;2621:10;2610:8;:21;;;;2587:172;;;2657:1;2648:5;:10;;;2645:114;;;2679:10;2668:8;:21;;;;2645:114;;;2715:1;2706:5;:10;;;2703:56;;;2741:10;2726:12;:25;;;;2703:56;2645:114;2587:172;2524:235;2447:317:::0;;:::o;2956:155::-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3032:5:13::1;3020:17;;:8;:17;;;3017:61;;;3065:5;3047:15;;:23;;;;;;;;;;;;;;;;;;3017:61;3097:8;3084:10;;:21;;;;;;;;;;;;;;;;;;2956:155:::0;:::o;7535:630::-;7608:13;7640:16;7648:7;7640;:16::i;:::-;7632:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;7721:23;7747:10;:19;7758:7;7747:19;;;;;;;;;;;7721:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7775:18;7796:10;:8;:10::i;:::-;7775:31;;7843:1;7827:4;7821:18;:23;7817:68;;;7866:9;7859:16;;;;;;7817:68;7923:1;7903:9;7897:23;:27;7893:104;;;7970:4;7976:9;7953:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7939:48;;;;;;7893:104;8007:21;8031:10;:8;:10::i;:::-;8007:34;;8081:1;8063:7;8057:21;:25;:102;;;;;;;;;;;;;;;;;8109:7;8118:18;:7;:16;:18::i;:::-;8138:14;8092:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8057:102;8050:109;;;;;7535:630;;;;:::o;6081:80::-;6123:7;1900:4;6138:17;;6081:80;:::o;6368:117::-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6466:13:13::1;6449:14;:30;;;;;;;;;;;;:::i;:::-;;6368:117:::0;:::o;7089:127::-;7133:13;7155:55;;;;;;;;;;;;;;;;;;;7089:127;:::o;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;2318:123:13:-;1230:12:16;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2416:19:13::1;2398:15;;:37;;;;;;;;;;;;;;;;;;2318:123:::0;:::o;1899:192:16:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;937:224:5:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;7379:127:3:-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;602:98:1:-;655:7;682:10;675:17;;602:98;:::o;11361:174:3:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;8171:211:13:-;8269:16;8277:7;8269;:16::i;:::-;8261:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;8367:9;8345:10;:19;8356:7;8345:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;8171:211;;:::o;7673:348:3:-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;4069:440:13:-;4158:4;4191:1;4173:14;:19;;;4170:78;;;4227:13;2054:1;4209:31;;;;:::i;:::-;4202:38;;;;4170:78;4275:1;4257:14;:19;;;4254:73;;;4306:13;2094:1;4293:26;;;;:::i;:::-;4286:33;;;;4254:73;4354:1;4336:14;:19;;;4333:73;;;4385:13;2134:1;4372:26;;;;:::i;:::-;4365:33;;;;4333:73;4433:1;4415:14;:19;;;4412:77;;;4468:13;2178:1;4451:30;;;;:::i;:::-;4444:37;;;;4412:77;4502:1;4495:8;;4069:440;;;;;:::o;8363:110:3:-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;2099:173:16:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;3351:158:13:-;3428:7;3483:9;3494:7;3466:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3456:47;;;;;;3449:54;;3351:158;;;;:::o;3515:548::-;3618:4;3657:1;3639:14;:19;;;3636:97;;;3677:46;3696:5;3703:13;;3718:4;3677:18;:46::i;:::-;3670:53;;;;3636:97;3762:1;3744:14;:19;;;3741:92;;;3782:41;3801:5;3808:8;;3818:4;3782:18;:41::i;:::-;3775:48;;;;3741:92;3862:1;3844:14;:19;;;3841:92;;;3882:41;3901:5;3908:8;;3918:4;3882:18;:41::i;:::-;3875:48;;;;3841:92;3962:1;3944:14;:19;;;3941:96;;;3982:45;4001:5;4008:12;;4022:4;3982:18;:45::i;:::-;3975:52;;;;3941:96;4052:5;4045:12;;3515:548;;;;;;:::o;6751:315:3:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;6491:113:13:-;6551:13;6582:16;6575:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6491:113;:::o;288:723:17:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;1481:305:3:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;6727:175:13:-;6851:45;6878:4;6884:2;6888:7;6851:26;:45::i;:::-;6727:175;;;:::o;8700:321:3:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;797:830:14:-;922:4;939:20;962:4;939:27;;984:9;979:525;1003:5;:12;999:1;:16;979:525;;;1037:20;1060:5;1066:1;1060:8;;;;;;;;:::i;:::-;;;;;;;;1037:31;;1105:12;1089;:28;1085:408;;1259:12;1273;1242:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1232:55;;;;;;1217:70;;1085:408;;;1449:12;1463;1432:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1422:55;;;;;;1407:70;;1085:408;1022:482;1017:3;;;;;:::i;:::-;;;;979:525;;;;1615:4;1599:12;:20;1592:27;;;797:830;;;;;:::o;12100:799:3:-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:620;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12571:1;12554:6;:13;:18;12550:272;;;12597:60;;;;;;;;;;:::i;:::-;;;;;;;;12550:272;12772:6;12766:13;12757:6;12753:2;12749:15;12742:38;12308:529;12445:41;;;12435:51;;;:6;:51;;;;12428:58;;;;;12272:620;12876:4;12869:11;;12100:799;;;;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:5:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;13471:126:3:-;;;;:::o;3925:164:5:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5228:294;5194:328;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4797:907;;4716:988;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;:::i;:::-;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6070:1008;;;5999:1079;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3577:147;3503:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:77::-;3380:7;3409:5;3398:16;;3343:77;;;:::o;3426:122::-;3499:24;3517:5;3499:24;:::i;:::-;3492:5;3489:35;3479:63;;3538:1;3535;3528:12;3479:63;3426:122;:::o;3554:139::-;3600:5;3638:6;3625:20;3616:29;;3654:33;3681:5;3654:33;:::i;:::-;3554:139;;;;:::o;3699:329::-;3758:6;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;3699:329;;;;:::o;4034:126::-;4071:7;4111:42;4104:5;4100:54;4089:65;;4034:126;;;:::o;4166:96::-;4203:7;4232:24;4250:5;4232:24;:::i;:::-;4221:35;;4166:96;;;:::o;4268:118::-;4355:24;4373:5;4355:24;:::i;:::-;4350:3;4343:37;4268:118;;:::o;4392:222::-;4485:4;4523:2;4512:9;4508:18;4500:26;;4536:71;4604:1;4593:9;4589:17;4580:6;4536:71;:::i;:::-;4392:222;;;;:::o;4620:122::-;4693:24;4711:5;4693:24;:::i;:::-;4686:5;4683:35;4673:63;;4732:1;4729;4722:12;4673:63;4620:122;:::o;4748:139::-;4794:5;4832:6;4819:20;4810:29;;4848:33;4875:5;4848:33;:::i;:::-;4748:139;;;;:::o;4893:474::-;4961:6;4969;5018:2;5006:9;4997:7;4993:23;4989:32;4986:119;;;5024:79;;:::i;:::-;4986:119;5144:1;5169:53;5214:7;5205:6;5194:9;5190:22;5169:53;:::i;:::-;5159:63;;5115:117;5271:2;5297:53;5342:7;5333:6;5322:9;5318:22;5297:53;:::i;:::-;5287:63;;5242:118;4893:474;;;;;:::o;5373:117::-;5482:1;5479;5472:12;5496:117;5605:1;5602;5595:12;5619:180;5667:77;5664:1;5657:88;5764:4;5761:1;5754:15;5788:4;5785:1;5778:15;5805:281;5888:27;5910:4;5888:27;:::i;:::-;5880:6;5876:40;6018:6;6006:10;6003:22;5982:18;5970:10;5967:34;5964:62;5961:88;;;6029:18;;:::i;:::-;5961:88;6069:10;6065:2;6058:22;5848:238;5805:281;;:::o;6092:129::-;6126:6;6153:20;;:::i;:::-;6143:30;;6182:33;6210:4;6202:6;6182:33;:::i;:::-;6092:129;;;:::o;6227:308::-;6289:4;6379:18;6371:6;6368:30;6365:56;;;6401:18;;:::i;:::-;6365:56;6439:29;6461:6;6439:29;:::i;:::-;6431:37;;6523:4;6517;6513:15;6505:23;;6227:308;;;:::o;6541:154::-;6625:6;6620:3;6615;6602:30;6687:1;6678:6;6673:3;6669:16;6662:27;6541:154;;;:::o;6701:412::-;6779:5;6804:66;6820:49;6862:6;6820:49;:::i;:::-;6804:66;:::i;:::-;6795:75;;6893:6;6886:5;6879:21;6931:4;6924:5;6920:16;6969:3;6960:6;6955:3;6951:16;6948:25;6945:112;;;6976:79;;:::i;:::-;6945:112;7066:41;7100:6;7095:3;7090;7066:41;:::i;:::-;6785:328;6701:412;;;;;:::o;7133:340::-;7189:5;7238:3;7231:4;7223:6;7219:17;7215:27;7205:122;;7246:79;;:::i;:::-;7205:122;7363:6;7350:20;7388:79;7463:3;7455:6;7448:4;7440:6;7436:17;7388:79;:::i;:::-;7379:88;;7195:278;7133:340;;;;:::o;7479:654::-;7557:6;7565;7614:2;7602:9;7593:7;7589:23;7585:32;7582:119;;;7620:79;;:::i;:::-;7582:119;7740:1;7765:53;7810:7;7801:6;7790:9;7786:22;7765:53;:::i;:::-;7755:63;;7711:117;7895:2;7884:9;7880:18;7867:32;7926:18;7918:6;7915:30;7912:117;;;7948:79;;:::i;:::-;7912:117;8053:63;8108:7;8099:6;8088:9;8084:22;8053:63;:::i;:::-;8043:73;;7838:288;7479:654;;;;;:::o;8139:118::-;8226:24;8244:5;8226:24;:::i;:::-;8221:3;8214:37;8139:118;;:::o;8263:222::-;8356:4;8394:2;8383:9;8379:18;8371:26;;8407:71;8475:1;8464:9;8460:17;8451:6;8407:71;:::i;:::-;8263:222;;;;:::o;8491:619::-;8568:6;8576;8584;8633:2;8621:9;8612:7;8608:23;8604:32;8601:119;;;8639:79;;:::i;:::-;8601:119;8759:1;8784:53;8829:7;8820:6;8809:9;8805:22;8784:53;:::i;:::-;8774:63;;8730:117;8886:2;8912:53;8957:7;8948:6;8937:9;8933:22;8912:53;:::i;:::-;8902:63;;8857:118;9014:2;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8985:118;8491:619;;;;;:::o;9116:86::-;9151:7;9191:4;9184:5;9180:16;9169:27;;9116:86;;;:::o;9208:118::-;9279:22;9295:5;9279:22;:::i;:::-;9272:5;9269:33;9259:61;;9316:1;9313;9306:12;9259:61;9208:118;:::o;9332:135::-;9376:5;9414:6;9401:20;9392:29;;9430:31;9455:5;9430:31;:::i;:::-;9332:135;;;;:::o;9473:470::-;9539:6;9547;9596:2;9584:9;9575:7;9571:23;9567:32;9564:119;;;9602:79;;:::i;:::-;9564:119;9722:1;9747:53;9792:7;9783:6;9772:9;9768:22;9747:53;:::i;:::-;9737:63;;9693:117;9849:2;9875:51;9918:7;9909:6;9898:9;9894:22;9875:51;:::i;:::-;9865:61;;9820:116;9473:470;;;;;:::o;9949:509::-;10018:6;10067:2;10055:9;10046:7;10042:23;10038:32;10035:119;;;10073:79;;:::i;:::-;10035:119;10221:1;10210:9;10206:17;10193:31;10251:18;10243:6;10240:30;10237:117;;;10273:79;;:::i;:::-;10237:117;10378:63;10433:7;10424:6;10413:9;10409:22;10378:63;:::i;:::-;10368:73;;10164:287;9949:509;;;;:::o;10464:329::-;10523:6;10572:2;10560:9;10551:7;10547:23;10543:32;10540:119;;;10578:79;;:::i;:::-;10540:119;10698:1;10723:53;10768:7;10759:6;10748:9;10744:22;10723:53;:::i;:::-;10713:63;;10669:117;10464:329;;;;:::o;10799:116::-;10869:21;10884:5;10869:21;:::i;:::-;10862:5;10859:32;10849:60;;10905:1;10902;10895:12;10849:60;10799:116;:::o;10921:133::-;10964:5;11002:6;10989:20;10980:29;;11018:30;11042:5;11018:30;:::i;:::-;10921:133;;;;:::o;11060:468::-;11125:6;11133;11182:2;11170:9;11161:7;11157:23;11153:32;11150:119;;;11188:79;;:::i;:::-;11150:119;11308:1;11333:53;11378:7;11369:6;11358:9;11354:22;11333:53;:::i;:::-;11323:63;;11279:117;11435:2;11461:50;11503:7;11494:6;11483:9;11479:22;11461:50;:::i;:::-;11451:60;;11406:115;11060:468;;;;;:::o;11534:325::-;11591:6;11640:2;11628:9;11619:7;11615:23;11611:32;11608:119;;;11646:79;;:::i;:::-;11608:119;11766:1;11791:51;11834:7;11825:6;11814:9;11810:22;11791:51;:::i;:::-;11781:61;;11737:115;11534:325;;;;:::o;11865:117::-;11974:1;11971;11964:12;11988:117;12097:1;12094;12087:12;12128:568;12201:8;12211:6;12261:3;12254:4;12246:6;12242:17;12238:27;12228:122;;12269:79;;:::i;:::-;12228:122;12382:6;12369:20;12359:30;;12412:18;12404:6;12401:30;12398:117;;;12434:79;;:::i;:::-;12398:117;12548:4;12540:6;12536:17;12524:29;;12602:3;12594:4;12586:6;12582:17;12572:8;12568:32;12565:41;12562:128;;;12609:79;;:::i;:::-;12562:128;12128:568;;;;;:::o;12702:987::-;12811:6;12819;12827;12835;12843;12892:3;12880:9;12871:7;12867:23;12863:33;12860:120;;;12899:79;;:::i;:::-;12860:120;13019:1;13044:51;13087:7;13078:6;13067:9;13063:22;13044:51;:::i;:::-;13034:61;;12990:115;13144:2;13170:53;13215:7;13206:6;13195:9;13191:22;13170:53;:::i;:::-;13160:63;;13115:118;13272:2;13298:51;13341:7;13332:6;13321:9;13317:22;13298:51;:::i;:::-;13288:61;;13243:116;13426:2;13415:9;13411:18;13398:32;13457:18;13449:6;13446:30;13443:117;;;13479:79;;:::i;:::-;13443:117;13592:80;13664:7;13655:6;13644:9;13640:22;13592:80;:::i;:::-;13574:98;;;;13369:313;12702:987;;;;;;;;:::o;13695:112::-;13778:22;13794:5;13778:22;:::i;:::-;13773:3;13766:35;13695:112;;:::o;13813:214::-;13902:4;13940:2;13929:9;13925:18;13917:26;;13953:67;14017:1;14006:9;14002:17;13993:6;13953:67;:::i;:::-;13813:214;;;;:::o;14033:307::-;14094:4;14184:18;14176:6;14173:30;14170:56;;;14206:18;;:::i;:::-;14170:56;14244:29;14266:6;14244:29;:::i;:::-;14236:37;;14328:4;14322;14318:15;14310:23;;14033:307;;;:::o;14346:410::-;14423:5;14448:65;14464:48;14505:6;14464:48;:::i;:::-;14448:65;:::i;:::-;14439:74;;14536:6;14529:5;14522:21;14574:4;14567:5;14563:16;14612:3;14603:6;14598:3;14594:16;14591:25;14588:112;;;14619:79;;:::i;:::-;14588:112;14709:41;14743:6;14738:3;14733;14709:41;:::i;:::-;14429:327;14346:410;;;;;:::o;14775:338::-;14830:5;14879:3;14872:4;14864:6;14860:17;14856:27;14846:122;;14887:79;;:::i;:::-;14846:122;15004:6;14991:20;15029:78;15103:3;15095:6;15088:4;15080:6;15076:17;15029:78;:::i;:::-;15020:87;;14836:277;14775:338;;;;:::o;15119:943::-;15214:6;15222;15230;15238;15287:3;15275:9;15266:7;15262:23;15258:33;15255:120;;;15294:79;;:::i;:::-;15255:120;15414:1;15439:53;15484:7;15475:6;15464:9;15460:22;15439:53;:::i;:::-;15429:63;;15385:117;15541:2;15567:53;15612:7;15603:6;15592:9;15588:22;15567:53;:::i;:::-;15557:63;;15512:118;15669:2;15695:53;15740:7;15731:6;15720:9;15716:22;15695:53;:::i;:::-;15685:63;;15640:118;15825:2;15814:9;15810:18;15797:32;15856:18;15848:6;15845:30;15842:117;;;15878:79;;:::i;:::-;15842:117;15983:62;16037:7;16028:6;16017:9;16013:22;15983:62;:::i;:::-;15973:72;;15768:287;15119:943;;;;;;;:::o;16068:122::-;16141:24;16159:5;16141:24;:::i;:::-;16134:5;16131:35;16121:63;;16180:1;16177;16170:12;16121:63;16068:122;:::o;16196:139::-;16242:5;16280:6;16267:20;16258:29;;16296:33;16323:5;16296:33;:::i;:::-;16196:139;;;;:::o;16341:470::-;16407:6;16415;16464:2;16452:9;16443:7;16439:23;16435:32;16432:119;;;16470:79;;:::i;:::-;16432:119;16590:1;16615:51;16658:7;16649:6;16638:9;16634:22;16615:51;:::i;:::-;16605:61;;16561:115;16715:2;16741:53;16786:7;16777:6;16766:9;16762:22;16741:53;:::i;:::-;16731:63;;16686:118;16341:470;;;;;:::o;16817:323::-;16873:6;16922:2;16910:9;16901:7;16897:23;16893:32;16890:119;;;16928:79;;:::i;:::-;16890:119;17048:1;17073:50;17115:7;17106:6;17095:9;17091:22;17073:50;:::i;:::-;17063:60;;17019:114;16817:323;;;;:::o;17146:474::-;17214:6;17222;17271:2;17259:9;17250:7;17246:23;17242:32;17239:119;;;17277:79;;:::i;:::-;17239:119;17397:1;17422:53;17467:7;17458:6;17447:9;17443:22;17422:53;:::i;:::-;17412:63;;17368:117;17524:2;17550:53;17595:7;17586:6;17575:9;17571:22;17550:53;:::i;:::-;17540:63;;17495:118;17146:474;;;;;:::o;17626:180::-;17674:77;17671:1;17664:88;17771:4;17768:1;17761:15;17795:4;17792:1;17785:15;17812:320;17856:6;17893:1;17887:4;17883:12;17873:22;;17940:1;17934:4;17930:12;17961:18;17951:81;;18017:4;18009:6;18005:17;17995:27;;17951:81;18079:2;18071:6;18068:14;18048:18;18045:38;18042:84;;;18098:18;;:::i;:::-;18042:84;17863:269;17812:320;;;:::o;18138:231::-;18278:34;18274:1;18266:6;18262:14;18255:58;18347:14;18342:2;18334:6;18330:15;18323:39;18138:231;:::o;18375:366::-;18517:3;18538:67;18602:2;18597:3;18538:67;:::i;:::-;18531:74;;18614:93;18703:3;18614:93;:::i;:::-;18732:2;18727:3;18723:12;18716:19;;18375:366;;;:::o;18747:419::-;18913:4;18951:2;18940:9;18936:18;18928:26;;19000:9;18994:4;18990:20;18986:1;18975:9;18971:17;18964:47;19028:131;19154:4;19028:131;:::i;:::-;19020:139;;18747:419;;;:::o;19172:220::-;19312:34;19308:1;19300:6;19296:14;19289:58;19381:3;19376:2;19368:6;19364:15;19357:28;19172:220;:::o;19398:366::-;19540:3;19561:67;19625:2;19620:3;19561:67;:::i;:::-;19554:74;;19637:93;19726:3;19637:93;:::i;:::-;19755:2;19750:3;19746:12;19739:19;;19398:366;;;:::o;19770:419::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:131;20177:4;20051:131;:::i;:::-;20043:139;;19770:419;;;:::o;20195:243::-;20335:34;20331:1;20323:6;20319:14;20312:58;20404:26;20399:2;20391:6;20387:15;20380:51;20195:243;:::o;20444:366::-;20586:3;20607:67;20671:2;20666:3;20607:67;:::i;:::-;20600:74;;20683:93;20772:3;20683:93;:::i;:::-;20801:2;20796:3;20792:12;20785:19;;20444:366;;;:::o;20816:419::-;20982:4;21020:2;21009:9;21005:18;20997:26;;21069:9;21063:4;21059:20;21055:1;21044:9;21040:17;21033:47;21097:131;21223:4;21097:131;:::i;:::-;21089:139;;20816:419;;;:::o;21241:182::-;21381:34;21377:1;21369:6;21365:14;21358:58;21241:182;:::o;21429:366::-;21571:3;21592:67;21656:2;21651:3;21592:67;:::i;:::-;21585:74;;21668:93;21757:3;21668:93;:::i;:::-;21786:2;21781:3;21777:12;21770:19;;21429:366;;;:::o;21801:419::-;21967:4;22005:2;21994:9;21990:18;21982:26;;22054:9;22048:4;22044:20;22040:1;22029:9;22025:17;22018:47;22082:131;22208:4;22082:131;:::i;:::-;22074:139;;21801:419;;;:::o;22226:236::-;22366:34;22362:1;22354:6;22350:14;22343:58;22435:19;22430:2;22422:6;22418:15;22411:44;22226:236;:::o;22468:366::-;22610:3;22631:67;22695:2;22690:3;22631:67;:::i;:::-;22624:74;;22707:93;22796:3;22707:93;:::i;:::-;22825:2;22820:3;22816:12;22809:19;;22468:366;;;:::o;22840:419::-;23006:4;23044:2;23033:9;23029:18;23021:26;;23093:9;23087:4;23083:20;23079:1;23068:9;23064:17;23057:47;23121:131;23247:4;23121:131;:::i;:::-;23113:139;;22840:419;;;:::o;23265:230::-;23405:34;23401:1;23393:6;23389:14;23382:58;23474:13;23469:2;23461:6;23457:15;23450:38;23265:230;:::o;23501:366::-;23643:3;23664:67;23728:2;23723:3;23664:67;:::i;:::-;23657:74;;23740:93;23829:3;23740:93;:::i;:::-;23858:2;23853:3;23849:12;23842:19;;23501:366;;;:::o;23873:419::-;24039:4;24077:2;24066:9;24062:18;24054:26;;24126:9;24120:4;24116:20;24112:1;24101:9;24097:17;24090:47;24154:131;24280:4;24154:131;:::i;:::-;24146:139;;23873:419;;;:::o;24298:221::-;24438:34;24434:1;24426:6;24422:14;24415:58;24507:4;24502:2;24494:6;24490:15;24483:29;24298:221;:::o;24525:366::-;24667:3;24688:67;24752:2;24747:3;24688:67;:::i;:::-;24681:74;;24764:93;24853:3;24764:93;:::i;:::-;24882:2;24877:3;24873:12;24866:19;;24525:366;;;:::o;24897:419::-;25063:4;25101:2;25090:9;25086:18;25078:26;;25150:9;25144:4;25140:20;25136:1;25125:9;25121:17;25114:47;25178:131;25304:4;25178:131;:::i;:::-;25170:139;;24897:419;;;:::o;25322:177::-;25462:29;25458:1;25450:6;25446:14;25439:53;25322:177;:::o;25505:366::-;25647:3;25668:67;25732:2;25727:3;25668:67;:::i;:::-;25661:74;;25744:93;25833:3;25744:93;:::i;:::-;25862:2;25857:3;25853:12;25846:19;;25505:366;;;:::o;25877:419::-;26043:4;26081:2;26070:9;26066:18;26058:26;;26130:9;26124:4;26120:20;26116:1;26105:9;26101:17;26094:47;26158:131;26284:4;26158:131;:::i;:::-;26150:139;;25877:419;;;:::o;26302:180::-;26350:77;26347:1;26340:88;26447:4;26444:1;26437:15;26471:4;26468:1;26461:15;26488:305;26528:3;26547:20;26565:1;26547:20;:::i;:::-;26542:25;;26581:20;26599:1;26581:20;:::i;:::-;26576:25;;26735:1;26667:66;26663:74;26660:1;26657:81;26654:107;;;26741:18;;:::i;:::-;26654:107;26785:1;26782;26778:9;26771:16;;26488:305;;;;:::o;26799:182::-;26939:34;26935:1;26927:6;26923:14;26916:58;26799:182;:::o;26987:366::-;27129:3;27150:67;27214:2;27209:3;27150:67;:::i;:::-;27143:74;;27226:93;27315:3;27226:93;:::i;:::-;27344:2;27339:3;27335:12;27328:19;;26987:366;;;:::o;27359:419::-;27525:4;27563:2;27552:9;27548:18;27540:26;;27612:9;27606:4;27602:20;27598:1;27587:9;27583:17;27576:47;27640:131;27766:4;27640:131;:::i;:::-;27632:139;;27359:419;;;:::o;27784:348::-;27824:7;27847:20;27865:1;27847:20;:::i;:::-;27842:25;;27881:20;27899:1;27881:20;:::i;:::-;27876:25;;28069:1;28001:66;27997:74;27994:1;27991:81;27986:1;27979:9;27972:17;27968:105;27965:131;;;28076:18;;:::i;:::-;27965:131;28124:1;28121;28117:9;28106:20;;27784:348;;;;:::o;28138:181::-;28278:33;28274:1;28266:6;28262:14;28255:57;28138:181;:::o;28325:366::-;28467:3;28488:67;28552:2;28547:3;28488:67;:::i;:::-;28481:74;;28564:93;28653:3;28564:93;:::i;:::-;28682:2;28677:3;28673:12;28666:19;;28325:366;;;:::o;28697:419::-;28863:4;28901:2;28890:9;28886:18;28878:26;;28950:9;28944:4;28940:20;28936:1;28925:9;28921:17;28914:47;28978:131;29104:4;28978:131;:::i;:::-;28970:139;;28697:419;;;:::o;29122:233::-;29161:3;29184:24;29202:5;29184:24;:::i;:::-;29175:33;;29230:66;29223:5;29220:77;29217:103;;;29300:18;;:::i;:::-;29217:103;29347:1;29340:5;29336:13;29329:20;;29122:233;;;:::o;29361:231::-;29501:34;29497:1;29489:6;29485:14;29478:58;29570:14;29565:2;29557:6;29553:15;29546:39;29361:231;:::o;29598:366::-;29740:3;29761:67;29825:2;29820:3;29761:67;:::i;:::-;29754:74;;29837:93;29926:3;29837:93;:::i;:::-;29955:2;29950:3;29946:12;29939:19;;29598:366;;;:::o;29970:419::-;30136:4;30174:2;30163:9;30159:18;30151:26;;30223:9;30217:4;30213:20;30209:1;30198:9;30194:17;30187:47;30251:131;30377:4;30251:131;:::i;:::-;30243:139;;29970:419;;;:::o;30395:180::-;30443:77;30440:1;30433:88;30540:4;30537:1;30530:15;30564:4;30561:1;30554:15;30581:228;30721:34;30717:1;30709:6;30705:14;30698:58;30790:11;30785:2;30777:6;30773:15;30766:36;30581:228;:::o;30815:366::-;30957:3;30978:67;31042:2;31037:3;30978:67;:::i;:::-;30971:74;;31054:93;31143:3;31054:93;:::i;:::-;31172:2;31167:3;31163:12;31156:19;;30815:366;;;:::o;31187:419::-;31353:4;31391:2;31380:9;31376:18;31368:26;;31440:9;31434:4;31430:20;31426:1;31415:9;31411:17;31404:47;31468:131;31594:4;31468:131;:::i;:::-;31460:139;;31187:419;;;:::o;31612:229::-;31752:34;31748:1;31740:6;31736:14;31729:58;31821:12;31816:2;31808:6;31804:15;31797:37;31612:229;:::o;31847:366::-;31989:3;32010:67;32074:2;32069:3;32010:67;:::i;:::-;32003:74;;32086:93;32175:3;32086:93;:::i;:::-;32204:2;32199:3;32195:12;32188:19;;31847:366;;;:::o;32219:419::-;32385:4;32423:2;32412:9;32408:18;32400:26;;32472:9;32466:4;32462:20;32458:1;32447:9;32443:17;32436:47;32500:131;32626:4;32500:131;:::i;:::-;32492:139;;32219:419;;;:::o;32644:175::-;32784:27;32780:1;32772:6;32768:14;32761:51;32644:175;:::o;32825:366::-;32967:3;32988:67;33052:2;33047:3;32988:67;:::i;:::-;32981:74;;33064:93;33153:3;33064:93;:::i;:::-;33182:2;33177:3;33173:12;33166:19;;32825:366;;;:::o;33197:419::-;33363:4;33401:2;33390:9;33386:18;33378:26;;33450:9;33444:4;33440:20;33436:1;33425:9;33421:17;33414:47;33478:131;33604:4;33478:131;:::i;:::-;33470:139;;33197:419;;;:::o;33622:221::-;33762:34;33758:1;33750:6;33746:14;33739:58;33831:4;33826:2;33818:6;33814:15;33807:29;33622:221;:::o;33849:366::-;33991:3;34012:67;34076:2;34071:3;34012:67;:::i;:::-;34005:74;;34088:93;34177:3;34088:93;:::i;:::-;34206:2;34201:3;34197:12;34190:19;;33849:366;;;:::o;34221:419::-;34387:4;34425:2;34414:9;34410:18;34402:26;;34474:9;34468:4;34464:20;34460:1;34449:9;34445:17;34438:47;34502:131;34628:4;34502:131;:::i;:::-;34494:139;;34221:419;;;:::o;34646:180::-;34786:32;34782:1;34774:6;34770:14;34763:56;34646:180;:::o;34832:366::-;34974:3;34995:67;35059:2;35054:3;34995:67;:::i;:::-;34988:74;;35071:93;35160:3;35071:93;:::i;:::-;35189:2;35184:3;35180:12;35173:19;;34832:366;;;:::o;35204:419::-;35370:4;35408:2;35397:9;35393:18;35385:26;;35457:9;35451:4;35447:20;35443:1;35432:9;35428:17;35421:47;35485:131;35611:4;35485:131;:::i;:::-;35477:139;;35204:419;;;:::o;35629:170::-;35769:22;35765:1;35757:6;35753:14;35746:46;35629:170;:::o;35805:366::-;35947:3;35968:67;36032:2;36027:3;35968:67;:::i;:::-;35961:74;;36044:93;36133:3;36044:93;:::i;:::-;36162:2;36157:3;36153:12;36146:19;;35805:366;;;:::o;36177:419::-;36343:4;36381:2;36370:9;36366:18;36358:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36458:131;36584:4;36458:131;:::i;:::-;36450:139;;36177:419;;;:::o;36602:177::-;36742:29;36738:1;36730:6;36726:14;36719:53;36602:177;:::o;36785:366::-;36927:3;36948:67;37012:2;37007:3;36948:67;:::i;:::-;36941:74;;37024:93;37113:3;37024:93;:::i;:::-;37142:2;37137:3;37133:12;37126:19;;36785:366;;;:::o;37157:419::-;37323:4;37361:2;37350:9;37346:18;37338:26;;37410:9;37404:4;37400:20;37396:1;37385:9;37381:17;37374:47;37438:131;37564:4;37438:131;:::i;:::-;37430:139;;37157:419;;;:::o;37582:173::-;37722:25;37718:1;37710:6;37706:14;37699:49;37582:173;:::o;37761:366::-;37903:3;37924:67;37988:2;37983:3;37924:67;:::i;:::-;37917:74;;38000:93;38089:3;38000:93;:::i;:::-;38118:2;38113:3;38109:12;38102:19;;37761:366;;;:::o;38133:419::-;38299:4;38337:2;38326:9;38322:18;38314:26;;38386:9;38380:4;38376:20;38372:1;38361:9;38357:17;38350:47;38414:131;38540:4;38414:131;:::i;:::-;38406:139;;38133:419;;;:::o;38558:181::-;38698:33;38694:1;38686:6;38682:14;38675:57;38558:181;:::o;38745:366::-;38887:3;38908:67;38972:2;38967:3;38908:67;:::i;:::-;38901:74;;38984:93;39073:3;38984:93;:::i;:::-;39102:2;39097:3;39093:12;39086:19;;38745:366;;;:::o;39117:419::-;39283:4;39321:2;39310:9;39306:18;39298:26;;39370:9;39364:4;39360:20;39356:1;39345:9;39341:17;39334:47;39398:131;39524:4;39398:131;:::i;:::-;39390:139;;39117:419;;;:::o;39542:168::-;39682:20;39678:1;39670:6;39666:14;39659:44;39542:168;:::o;39716:366::-;39858:3;39879:67;39943:2;39938:3;39879:67;:::i;:::-;39872:74;;39955:93;40044:3;39955:93;:::i;:::-;40073:2;40068:3;40064:12;40057:19;;39716:366;;;:::o;40088:419::-;40254:4;40292:2;40281:9;40277:18;40269:26;;40341:9;40335:4;40331:20;40327:1;40316:9;40312:17;40305:47;40369:131;40495:4;40369:131;:::i;:::-;40361:139;;40088:419;;;:::o;40513:236::-;40653:34;40649:1;40641:6;40637:14;40630:58;40722:19;40717:2;40709:6;40705:15;40698:44;40513:236;:::o;40755:366::-;40897:3;40918:67;40982:2;40977:3;40918:67;:::i;:::-;40911:74;;40994:93;41083:3;40994:93;:::i;:::-;41112:2;41107:3;41103:12;41096:19;;40755:366;;;:::o;41127:419::-;41293:4;41331:2;41320:9;41316:18;41308:26;;41380:9;41374:4;41370:20;41366:1;41355:9;41351:17;41344:47;41408:131;41534:4;41408:131;:::i;:::-;41400:139;;41127:419;;;:::o;41552:148::-;41654:11;41691:3;41676:18;;41552:148;;;;:::o;41706:377::-;41812:3;41840:39;41873:5;41840:39;:::i;:::-;41895:89;41977:6;41972:3;41895:89;:::i;:::-;41888:96;;41993:52;42038:6;42033:3;42026:4;42019:5;42015:16;41993:52;:::i;:::-;42070:6;42065:3;42061:16;42054:23;;41816:267;41706:377;;;;:::o;42089:435::-;42269:3;42291:95;42382:3;42373:6;42291:95;:::i;:::-;42284:102;;42403:95;42494:3;42485:6;42403:95;:::i;:::-;42396:102;;42515:3;42508:10;;42089:435;;;;;:::o;42530:141::-;42579:4;42602:3;42594:11;;42625:3;42622:1;42615:14;42659:4;42656:1;42646:18;42638:26;;42530:141;;;:::o;42701:845::-;42804:3;42841:5;42835:12;42870:36;42896:9;42870:36;:::i;:::-;42922:89;43004:6;42999:3;42922:89;:::i;:::-;42915:96;;43042:1;43031:9;43027:17;43058:1;43053:137;;;;43204:1;43199:341;;;;43020:520;;43053:137;43137:4;43133:9;43122;43118:25;43113:3;43106:38;43173:6;43168:3;43164:16;43157:23;;43053:137;;43199:341;43266:38;43298:5;43266:38;:::i;:::-;43326:1;43340:154;43354:6;43351:1;43348:13;43340:154;;;43428:7;43422:14;43418:1;43413:3;43409:11;43402:35;43478:1;43469:7;43465:15;43454:26;;43376:4;43373:1;43369:12;43364:17;;43340:154;;;43523:6;43518:3;43514:16;43507:23;;43206:334;;43020:520;;42808:738;;42701:845;;;;:::o;43552:589::-;43777:3;43799:95;43890:3;43881:6;43799:95;:::i;:::-;43792:102;;43911:95;44002:3;43993:6;43911:95;:::i;:::-;43904:102;;44023:92;44111:3;44102:6;44023:92;:::i;:::-;44016:99;;44132:3;44125:10;;43552:589;;;;;;:::o;44147:225::-;44287:34;44283:1;44275:6;44271:14;44264:58;44356:8;44351:2;44343:6;44339:15;44332:33;44147:225;:::o;44378:366::-;44520:3;44541:67;44605:2;44600:3;44541:67;:::i;:::-;44534:74;;44617:93;44706:3;44617:93;:::i;:::-;44735:2;44730:3;44726:12;44719:19;;44378:366;;;:::o;44750:419::-;44916:4;44954:2;44943:9;44939:18;44931:26;;45003:9;44997:4;44993:20;44989:1;44978:9;44974:17;44967:47;45031:131;45157:4;45031:131;:::i;:::-;45023:139;;44750:419;;;:::o;45175:233::-;45315:34;45311:1;45303:6;45299:14;45292:58;45384:16;45379:2;45371:6;45367:15;45360:41;45175:233;:::o;45414:366::-;45556:3;45577:67;45641:2;45636:3;45577:67;:::i;:::-;45570:74;;45653:93;45742:3;45653:93;:::i;:::-;45771:2;45766:3;45762:12;45755:19;;45414:366;;;:::o;45786:419::-;45952:4;45990:2;45979:9;45975:18;45967:26;;46039:9;46033:4;46029:20;46025:1;46014:9;46010:17;46003:47;46067:131;46193:4;46067:131;:::i;:::-;46059:139;;45786:419;;;:::o;46211:231::-;46351:34;46347:1;46339:6;46335:14;46328:58;46420:14;46415:2;46407:6;46403:15;46396:39;46211:231;:::o;46448:366::-;46590:3;46611:67;46675:2;46670:3;46611:67;:::i;:::-;46604:74;;46687:93;46776:3;46687:93;:::i;:::-;46805:2;46800:3;46796:12;46789:19;;46448:366;;;:::o;46820:419::-;46986:4;47024:2;47013:9;47009:18;47001:26;;47073:9;47067:4;47063:20;47059:1;47048:9;47044:17;47037:47;47101:131;47227:4;47101:131;:::i;:::-;47093:139;;46820:419;;;:::o;47245:228::-;47385:34;47381:1;47373:6;47369:14;47362:58;47454:11;47449:2;47441:6;47437:15;47430:36;47245:228;:::o;47479:366::-;47621:3;47642:67;47706:2;47701:3;47642:67;:::i;:::-;47635:74;;47718:93;47807:3;47718:93;:::i;:::-;47836:2;47831:3;47827:12;47820:19;;47479:366;;;:::o;47851:419::-;48017:4;48055:2;48044:9;48040:18;48032:26;;48104:9;48098:4;48094:20;48090:1;48079:9;48075:17;48068:47;48132:131;48258:4;48132:131;:::i;:::-;48124:139;;47851:419;;;:::o;48276:223::-;48416:34;48412:1;48404:6;48400:14;48393:58;48485:6;48480:2;48472:6;48468:15;48461:31;48276:223;:::o;48505:366::-;48647:3;48668:67;48732:2;48727:3;48668:67;:::i;:::-;48661:74;;48744:93;48833:3;48744:93;:::i;:::-;48862:2;48857:3;48853:12;48846:19;;48505:366;;;:::o;48877:419::-;49043:4;49081:2;49070:9;49066:18;49058:26;;49130:9;49124:4;49120:20;49116:1;49105:9;49101:17;49094:47;49158:131;49284:4;49158:131;:::i;:::-;49150:139;;48877:419;;;:::o;49302:191::-;49342:4;49362:20;49380:1;49362:20;:::i;:::-;49357:25;;49396:20;49414:1;49396:20;:::i;:::-;49391:25;;49435:1;49432;49429:8;49426:34;;;49440:18;;:::i;:::-;49426:34;49485:1;49482;49478:9;49470:17;;49302:191;;;;:::o;49499:79::-;49538:7;49567:5;49556:16;;49499:79;;;:::o;49584:157::-;49689:45;49709:24;49727:5;49709:24;:::i;:::-;49689:45;:::i;:::-;49684:3;49677:58;49584:157;;:::o;49747:94::-;49780:8;49828:5;49824:2;49820:14;49799:35;;49747:94;;;:::o;49847:::-;49886:7;49915:20;49929:5;49915:20;:::i;:::-;49904:31;;49847:94;;;:::o;49947:100::-;49986:7;50015:26;50035:5;50015:26;:::i;:::-;50004:37;;49947:100;;;:::o;50053:157::-;50158:45;50178:24;50196:5;50178:24;:::i;:::-;50158:45;:::i;:::-;50153:3;50146:58;50053:157;;:::o;50216:397::-;50356:3;50371:75;50442:3;50433:6;50371:75;:::i;:::-;50471:2;50466:3;50462:12;50455:19;;50484:75;50555:3;50546:6;50484:75;:::i;:::-;50584:2;50579:3;50575:12;50568:19;;50604:3;50597:10;;50216:397;;;;;:::o;50619:237::-;50759:34;50755:1;50747:6;50743:14;50736:58;50828:20;50823:2;50815:6;50811:15;50804:45;50619:237;:::o;50862:366::-;51004:3;51025:67;51089:2;51084:3;51025:67;:::i;:::-;51018:74;;51101:93;51190:3;51101:93;:::i;:::-;51219:2;51214:3;51210:12;51203:19;;50862:366;;;:::o;51234:419::-;51400:4;51438:2;51427:9;51423:18;51415:26;;51487:9;51481:4;51477:20;51473:1;51462:9;51458:17;51451:47;51515:131;51641:4;51515:131;:::i;:::-;51507:139;;51234:419;;;:::o;51659:180::-;51707:77;51704:1;51697:88;51804:4;51801:1;51794:15;51828:4;51825:1;51818:15;51845:185;51885:1;51902:20;51920:1;51902:20;:::i;:::-;51897:25;;51936:20;51954:1;51936:20;:::i;:::-;51931:25;;51975:1;51965:35;;51980:18;;:::i;:::-;51965:35;52022:1;52019;52015:9;52010:14;;51845:185;;;;:::o;52036:176::-;52068:1;52085:20;52103:1;52085:20;:::i;:::-;52080:25;;52119:20;52137:1;52119:20;:::i;:::-;52114:25;;52158:1;52148:35;;52163:18;;:::i;:::-;52148:35;52204:1;52201;52197:9;52192:14;;52036:176;;;;:::o;52218:79::-;52257:7;52286:5;52275:16;;52218:79;;;:::o;52303:157::-;52408:45;52428:24;52446:5;52428:24;:::i;:::-;52408:45;:::i;:::-;52403:3;52396:58;52303:157;;:::o;52466:397::-;52606:3;52621:75;52692:3;52683:6;52621:75;:::i;:::-;52721:2;52716:3;52712:12;52705:19;;52734:75;52805:3;52796:6;52734:75;:::i;:::-;52834:2;52829:3;52825:12;52818:19;;52854:3;52847:10;;52466:397;;;;;:::o;52869:98::-;52920:6;52954:5;52948:12;52938:22;;52869:98;;;:::o;52973:168::-;53056:11;53090:6;53085:3;53078:19;53130:4;53125:3;53121:14;53106:29;;52973:168;;;;:::o;53147:360::-;53233:3;53261:38;53293:5;53261:38;:::i;:::-;53315:70;53378:6;53373:3;53315:70;:::i;:::-;53308:77;;53394:52;53439:6;53434:3;53427:4;53420:5;53416:16;53394:52;:::i;:::-;53471:29;53493:6;53471:29;:::i;:::-;53466:3;53462:39;53455:46;;53237:270;53147:360;;;;:::o;53513:640::-;53708:4;53746:3;53735:9;53731:19;53723:27;;53760:71;53828:1;53817:9;53813:17;53804:6;53760:71;:::i;:::-;53841:72;53909:2;53898:9;53894:18;53885:6;53841:72;:::i;:::-;53923;53991:2;53980:9;53976:18;53967:6;53923:72;:::i;:::-;54042:9;54036:4;54032:20;54027:2;54016:9;54012:18;54005:48;54070:76;54141:4;54132:6;54070:76;:::i;:::-;54062:84;;53513:640;;;;;;;:::o;54159:141::-;54215:5;54246:6;54240:13;54231:22;;54262:32;54288:5;54262:32;:::i;:::-;54159:141;;;;:::o;54306:349::-;54375:6;54424:2;54412:9;54403:7;54399:23;54395:32;54392:119;;;54430:79;;:::i;:::-;54392:119;54550:1;54575:63;54630:7;54621:6;54610:9;54606:22;54575:63;:::i;:::-;54565:73;;54521:127;54306:349;;;;:::o;54661:182::-;54801:34;54797:1;54789:6;54785:14;54778:58;54661:182;:::o;54849:366::-;54991:3;55012:67;55076:2;55071:3;55012:67;:::i;:::-;55005:74;;55088:93;55177:3;55088:93;:::i;:::-;55206:2;55201:3;55197:12;55190:19;;54849:366;;;:::o;55221:419::-;55387:4;55425:2;55414:9;55410:18;55402:26;;55474:9;55468:4;55464:20;55460:1;55449:9;55445:17;55438:47;55502:131;55628:4;55502:131;:::i;:::-;55494:139;;55221:419;;;:::o;55646:178::-;55786:30;55782:1;55774:6;55770:14;55763:54;55646:178;:::o;55830:366::-;55972:3;55993:67;56057:2;56052:3;55993:67;:::i;:::-;55986:74;;56069:93;56158:3;56069:93;:::i;:::-;56187:2;56182:3;56178:12;56171:19;;55830:366;;;:::o;56202:419::-;56368:4;56406:2;56395:9;56391:18;56383:26;;56455:9;56449:4;56445:20;56441:1;56430:9;56426:17;56419:47;56483:131;56609:4;56483:131;:::i;:::-;56475:139;;56202:419;;;:::o;56627:180::-;56675:77;56672:1;56665:88;56772:4;56769:1;56762:15;56796:4;56793:1;56786:15

Swarm Source

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