ETH Price: $3,108.72 (+4.10%)
Gas: 7 Gwei

Token

WALTZ (WALTZ)
 

Overview

Max Total Supply

10,000 WALTZ

Holders

3,682

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lordbog.eth
Balance
1 WALTZ
0x6232d7a6085d0ab8f885292078eeb723064a376b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

WALTZ is a collection of 10,000 unique artworks, each consisting of petals dancing in the wind.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SunflowerArt

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 15 : SunflowerArt.sol
// Sunflower Art V1
// V2: 0xb761cef3ac09d249a3f1e79d1facea809b31457e

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";


contract SunflowerArt is Initializable, ERC721EnumerableUpgradeable, OwnableUpgradeable, PausableUpgradeable {

  uint256 public sunflowerPercent;
  string public tokenBaseURI;
  bool public isArtCodeSealed;
  string public artCode;
  string public artCodeDependencies; //e.g. [email protected] w/ hash;
  string public artDescription;

  uint256 currentTokenID;
  uint256 public maxTokens;
  uint256 public tokenPrice;

  address payable public artistAddress;
  address payable constant platformAddress = payable(0xf0bE1F2FB8abfa9aBF7d218a226ef4F046f09a40);

  // Block hashes are determined at mint time.
  // The seed corresponding to a token can only be accesed one block after, and is equal to keccak256(blockhash + tokenID)
  mapping(uint256 => bytes32) internal blockhashForToken;

  // Want "initialize" so can use proxy
  function initialize(string memory _name, string memory _symbol, uint256 _maxTokens, uint256 _tokenPrice, address _artistAddress) public initializer {
    __ERC721_init(_name, _symbol);
    __ERC721Enumerable_init_unchained();
    __Ownable_init();
    __Pausable_init();
    isArtCodeSealed = false;
    sunflowerPercent = 10;
    tokenBaseURI = "";

    maxTokens = _maxTokens;
    tokenPrice = _tokenPrice;
    currentTokenID = 0;

    artistAddress = payable(_artistAddress);

    pauseMinting();
  }

  // If set blockhashForToken to blockNumber-1, minters will have 10-20s to decide whether they want a work and mint it. This is not as good as a reveal (which would require minter to call the contract again within 256 blocks), but is a good starting point.
  function seedForToken(uint256 tokenID) public view returns (uint256) {
    require(_exists(tokenID), "Token does not exist.");
    bytes32 intermediate = bytes32(tokenID) ^ blockhashForToken[tokenID];
    bytes32 hashed = keccak256(abi.encodePacked(intermediate));
    uint256 seed = uint256(hashed);
    return seed;
  }

  // Minting function
  function _mintBase() internal {
    require(currentTokenID < maxTokens, "Max number of tokens minted.");
    require(isArtCodeSealed == true, "Art code has not been sealed.");
    require(msg.value == tokenPrice, "Transaction value incorrect.");
    _safeMint(msg.sender, currentTokenID);
    blockhashForToken[currentTokenID] = blockhash(block.number - 1);

    uint256 sunflowerFee = (sunflowerPercent * 100 * msg.value) / (100*100);
    uint256 artistAmount = msg.value - sunflowerFee;

    currentTokenID = currentTokenID + 1;

    platformAddress.transfer(sunflowerFee);
    artistAddress.transfer(artistAmount);
  }
  // Mint for owner, ignoring pause status
  function mintTokenOwner() public payable onlyOwner {
    _mintBase();
  }
  // Only mintable when not paused
  function mintToken() public payable whenNotPaused {
    _mintBase();
  }


  function pauseMinting() public onlyOwner {
    _pause();
  }
  function resumeMinting() public onlyOwner {
    _unpause();
  }
  function adjustPrice(uint256 _tokenPrice) public onlyOwner {
    require(msg.sender == platformAddress, "Platform only");
    tokenPrice = _tokenPrice;
  }

  function setArtCode(string memory _artCode, string memory _artCodeDependencies, string memory _artDescription) public onlyOwner {
    require(isArtCodeSealed == false, "Art code is sealed.");
    artCode = _artCode;
    artCodeDependencies = _artCodeDependencies;
    artDescription = _artDescription;
  }
  function sealArtCode() public onlyOwner {
    require(isArtCodeSealed == false, "Art code is already sealed.");
    require(bytes(artCode).length != 0, "No art code set.");
    require(bytes(artCodeDependencies).length != 0, "No art code deps. set.");
    require(bytes(artDescription).length != 0, "No art code description set.");
    isArtCodeSealed = true;
  }

  // Changing the token URI
  function _baseURI() internal view override returns (string memory) {
    return tokenBaseURI;
  }
  function setBaseURI(string memory _tokenBaseURI) public onlyOwner {
    tokenBaseURI = _tokenBaseURI;
  }
}

File 2 of 15 : ERC721EnumerableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.sol";
import "../../../proxy/utils/Initializable.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 ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
    function __ERC721Enumerable_init() internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __ERC721Enumerable_init_unchained();
    }

    function __ERC721Enumerable_init_unchained() internal initializer {
    }
    // 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(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
        return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Upgradeable.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 < ERC721EnumerableUpgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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();
    }
    uint256[46] private __gap;
}

File 3 of 15 : OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _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);
    }
    uint256[49] private __gap;
}

File 4 of 15 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

File 5 of 15 : PausableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pausable_init() internal initializer {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal initializer {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
    uint256[49] private __gap;
}

File 6 of 15 : ERC721Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721Upgradeable.sol";
import "./IERC721ReceiverUpgradeable.sol";
import "./extensions/IERC721MetadataUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
    using AddressUpgradeable for address;
    using StringsUpgradeable 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.
     */
    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __ERC721_init_unchained(name_, symbol_);
    }

    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
        return
            interfaceId == type(IERC721Upgradeable).interfaceId ||
            interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721ReceiverUpgradeable.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 {}
    uint256[44] private __gap;
}

File 7 of 15 : IERC721EnumerableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721Upgradeable.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721EnumerableUpgradeable is IERC721Upgradeable {
    /**
     * @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 8 of 15 : IERC721Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165Upgradeable.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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 9 of 15 : IERC721ReceiverUpgradeable.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 IERC721ReceiverUpgradeable {
    /**
     * @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 10 of 15 : IERC721MetadataUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721Upgradeable.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
    /**
     * @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 11 of 15 : AddressUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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 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 12 of 15 : ContextUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

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

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

File 13 of 15 : StringsUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library StringsUpgradeable {
    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);
    }
}

File 14 of 15 : ERC165Upgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable {
    function __ERC165_init() internal initializer {
        __ERC165_init_unchained();
    }

    function __ERC165_init_unchained() internal initializer {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }
    uint256[50] private __gap;
}

File 15 of 15 : IERC165Upgradeable.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 IERC165Upgradeable {
    /**
     * @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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"adjustPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artCodeDependencies","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"address","name":"_artistAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"isArtCodeSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintTokenOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeMinting","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":"sealArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"seedForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_artCode","type":"string"},{"internalType":"string","name":"_artCodeDependencies","type":"string"},{"internalType":"string","name":"_artDescription","type":"string"}],"name":"setArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sunflowerPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061589580620000216000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063da8fbf2a1161006f578063da8fbf2a146107eb578063e4473e1f14610802578063e83157421461082d578063e985e9c514610858578063f2fde38b1461089557610230565b8063b88d4fde14610704578063c87b56dd1461072d578063cb53a7d61461076a578063d3f6002114610795578063d7eb3f3a146107c057610230565b80638da5cb5b116100f25780638da5cb5b146106315780638fab34e71461065c57806395d89b411461068557806396052ded146106b0578063a22cb465146106db57610230565b806370a082311461054c578063715018a61461058957806372bf079e146105a0578063742cfb87146105c95780637ff9b5961461060657610230565b806330e46619116101bc57806355f804b31161018057806355f804b31461049a57806359ae340e146104c35780635c975abb146104da5780636352211e1461050557806369a3c7b11461054257610230565b806330e46619146103c957806333eea181146103e057806342842e0e146104095780634e99b800146104325780634f6ccce71461045d57610230565b806318160ddd1161020357806318160ddd146103035780632004ffd91461032e57806323b872dd1461033857806328b5e965146103615780632f745c591461038c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614047565b6108be565b6040516102699190614835565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190614850565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190614218565b6109ca565b6040516102d191906147b3565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061400b565b610a4f565b005b34801561030f57600080fd5b50610318610b67565b6040516103259190614c52565b60405180910390f35b610336610b74565b005b34801561034457600080fd5b5061035f600480360381019061035a9190613f05565b610bc6565b005b34801561036d57600080fd5b50610376610c26565b6040516103839190614850565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae919061400b565b610cb5565b6040516103c09190614c52565b60405180910390f35b3480156103d557600080fd5b506103de610d5a565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614171565b610f44565b005b34801561041557600080fd5b50610430600480360381019061042b9190613f05565b6110f3565b005b34801561043e57600080fd5b50610447611113565b6040516104549190614850565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190614218565b6111a2565b6040516104919190614c52565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190614099565b611239565b005b3480156104cf57600080fd5b506104d86112d0565b005b3480156104e657600080fd5b506104ef611356565b6040516104fc9190614835565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190614218565b61136d565b60405161053991906147b3565b60405180910390f35b61054a61141f565b005b34801561055857600080fd5b50610573600480360381019061056e9190613ea0565b6114a5565b6040516105809190614c52565b60405180910390f35b34801561059557600080fd5b5061059e61155d565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614218565b6115e5565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190614218565b6116ee565b6040516105fd9190614c52565b60405180910390f35b34801561061257600080fd5b5061061b611794565b6040516106289190614c52565b60405180910390f35b34801561063d57600080fd5b5061064661179b565b60405161065391906147b3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906140da565b6117c5565b005b34801561069157600080fd5b5061069a6118e5565b6040516106a79190614850565b60405180910390f35b3480156106bc57600080fd5b506106c5611977565b6040516106d29190614835565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613fcf565b61198b565b005b34801561071057600080fd5b5061072b60048036038101906107269190613f54565b611b0c565b005b34801561073957600080fd5b50610754600480360381019061074f9190614218565b611b6e565b6040516107619190614850565b60405180910390f35b34801561077657600080fd5b5061077f611c15565b60405161078c9190614850565b60405180910390f35b3480156107a157600080fd5b506107aa611ca4565b6040516107b79190614850565b60405180910390f35b3480156107cc57600080fd5b506107d5611d33565b6040516107e291906147ce565b60405180910390f35b3480156107f757600080fd5b50610800611d5a565b005b34801561080e57600080fd5b50610817611de0565b6040516108249190614c52565b60405180910390f35b34801561083957600080fd5b50610842611de7565b60405161084f9190614c52565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a9190613ec9565b611dee565b60405161088c9190614835565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190613ea0565b611e82565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610931575061093082611f7a565b5b9050919050565b60606065805461094790614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461097390614f1e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d58261205c565b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90614ab2565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5a8261136d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290614b92565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aea6120c8565b73ffffffffffffffffffffffffffffffffffffffff161480610b195750610b1881610b136120c8565b611dee565b5b610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f906149d2565b60405180910390fd5b610b6283836120d0565b505050565b6000609980549050905090565b610b7c611356565b15610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb3906149b2565b60405180910390fd5b610bc4612189565b565b610bd7610bd16120c8565b826123bf565b610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614bd2565b60405180910390fd5b610c2183838361249d565b505050565b6101328054610c3490614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6090614f1e565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b505050505081565b6000610cc0836114a5565b8210610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906148b2565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d626120c8565b73ffffffffffffffffffffffffffffffffffffffff16610d8061179b565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614ad2565b60405180910390fd5b6000151561012f60009054906101000a900460ff16151514610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614972565b60405180910390fd5b60006101308054610e3d90614f1e565b90501415610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614b72565b60405180910390fd5b60006101318054610e9090614f1e565b90501415610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614bb2565b60405180910390fd5b60006101328054610ee390614f1e565b90501415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614af2565b60405180910390fd5b600161012f60006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff1680610f6a575060008054906101000a900460ff16155b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015610ff9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61100386866126f9565b61100b6127ee565b6110136128c7565b61101b6129b0565b600061012f60006101000a81548160ff021916908315150217905550600a61012d819055506040518060200160405280600081525061012e9080519060200190611066929190613cc4565b50836101348190555082610135819055506000610133819055508161013660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ca611d5a565b80156110eb5760008060016101000a81548160ff0219169083151502179055505b505050505050565b61110e83838360405180602001604052806000815250611b0c565b505050565b61012e805461112190614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90614f1e565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b505050505081565b60006111ac610b67565b82106111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614bf2565b60405180910390fd5b60998281548110611227577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112416120c8565b73ffffffffffffffffffffffffffffffffffffffff1661125f61179b565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90614ad2565b60405180910390fd5b8061012e90805190602001906112cc929190613cc4565b5050565b6112d86120c8565b73ffffffffffffffffffffffffffffffffffffffff166112f661179b565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390614ad2565b60405180910390fd5b611354612a99565b565b600060fb60009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90614a12565b60405180910390fd5b80915050919050565b6114276120c8565b73ffffffffffffffffffffffffffffffffffffffff1661144561179b565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614ad2565b60405180910390fd5b6114a3612189565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906149f2565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115656120c8565b73ffffffffffffffffffffffffffffffffffffffff1661158361179b565b73ffffffffffffffffffffffffffffffffffffffff16146115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090614ad2565b60405180910390fd5b6115e36000612b3b565b565b6115ed6120c8565b73ffffffffffffffffffffffffffffffffffffffff1661160b61179b565b73ffffffffffffffffffffffffffffffffffffffff1614611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890614ad2565b60405180910390fd5b73f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90614c32565b60405180910390fd5b806101358190555050565b60006116f98261205c565b611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90614a92565b60405180910390fd5b60006101376000848152602001908152602001600020548360001b1890506000816040516020016117699190614774565b60405160208183030381529060405280519060200120905060008160001c9050809350505050919050565b6101355481565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117cd6120c8565b73ffffffffffffffffffffffffffffffffffffffff166117eb61179b565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890614ad2565b60405180910390fd5b6000151561012f60009054906101000a900460ff16151514611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90614a52565b60405180910390fd5b8261013090805190602001906118af929190613cc4565b508161013190805190602001906118c7929190613cc4565b508061013290805190602001906118df929190613cc4565b50505050565b6060606680546118f490614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461192090614f1e565b801561196d5780601f106119425761010080835404028352916020019161196d565b820191906000526020600020905b81548152906001019060200180831161195057829003601f168201915b5050505050905090565b61012f60009054906101000a900460ff1681565b6119936120c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614952565b60405180910390fd5b80606a6000611a0e6120c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611abb6120c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b009190614835565b60405180910390a35050565b611b1d611b176120c8565b836123bf565b611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390614bd2565b60405180910390fd5b611b6884848484612c01565b50505050565b6060611b798261205c565b611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614b52565b60405180910390fd5b6000611bc2612c5d565b90506000815111611be25760405180602001604052806000815250611c0d565b80611bec84612cf0565b604051602001611bfd92919061478f565b6040516020818303038152906040525b915050919050565b6101308054611c2390614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f90614f1e565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b505050505081565b6101318054611cb290614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cde90614f1e565b8015611d2b5780601f10611d0057610100808354040283529160200191611d2b565b820191906000526020600020905b815481529060010190602001808311611d0e57829003601f168201915b505050505081565b61013660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d626120c8565b73ffffffffffffffffffffffffffffffffffffffff16611d8061179b565b73ffffffffffffffffffffffffffffffffffffffff1614611dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcd90614ad2565b60405180910390fd5b611dde612e9d565b565b61012d5481565b6101345481565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e8a6120c8565b73ffffffffffffffffffffffffffffffffffffffff16611ea861179b565b73ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590614ad2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f65906148f2565b60405180910390fd5b611f7781612b3b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061204557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612055575061205482612f40565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121438361136d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6101345461013354106121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c890614c12565b60405180910390fd5b6001151561012f60009054906101000a900460ff16151514612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90614892565b60405180910390fd5b61013554341461226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614b32565b60405180910390fd5b61227a3361013354612faa565b6001436122879190614e18565b40610137600061013354815260200190815260200160002081905550600061271034606461012d546122b99190614dbe565b6122c39190614dbe565b6122cd9190614d8d565b9050600081346122dd9190614e18565b90506001610133546122ef9190614d37565b6101338190555073f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612350573d6000803e3d6000fd5b5061013660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156123ba573d6000803e3d6000fd5b505050565b60006123ca8261205c565b612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614992565b60405180910390fd5b60006124148361136d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061248357508373ffffffffffffffffffffffffffffffffffffffff1661246b846109ca565b73ffffffffffffffffffffffffffffffffffffffff16145b8061249457506124938185611dee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124bd8261136d565b73ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90614932565b60405180910390fd5b61258e838383612fc8565b6125996000826120d0565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e99190614e18565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126409190614d37565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600060019054906101000a900460ff168061271f575060008054906101000a900460ff16155b61275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614a32565b60405180910390fd5b60008060019054906101000a900460ff1615905080156127ae576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6127b66130dc565b6127be6131b5565b6127c8838361328e565b80156127e95760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612814575060008054906101000a900460ff16155b612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614a32565b60405180910390fd5b60008060019054906101000a900460ff1615905080156128a3576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156128c45760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806128ed575060008054906101000a900460ff16155b61292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561297c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6129846130dc565b61298c613397565b80156129ad5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806129d6575060008054906101000a900460ff16155b612a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0c90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015612a65576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612a6d6130dc565b612a75613480565b8015612a965760008060016101000a81548160ff0219169083151502179055505b50565b612aa1611356565b612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad790614872565b60405180910390fd5b600060fb60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b246120c8565b604051612b3191906147b3565b60405180910390a1565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c0c84848461249d565b612c1884848484613574565b612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e906148d2565b60405180910390fd5b50505050565b606061012e8054612c6d90614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9990614f1e565b8015612ce65780601f10612cbb57610100808354040283529160200191612ce6565b820191906000526020600020905b815481529060010190602001808311612cc957829003601f168201915b5050505050905090565b60606000821415612d38576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e98565b600082905060005b60008214612d6a578080612d5390614f81565b915050600a82612d639190614d8d565b9150612d40565b60008167ffffffffffffffff811115612dac577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dde5781602001600182028036833780820191505090505b5090505b60008514612e9157600182612df79190614e18565b9150600a85612e069190614fd4565b6030612e129190614d37565b60f81b818381518110612e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e8a9190614d8d565b9450612de2565b8093505050505b919050565b612ea5611356565b15612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc906149b2565b60405180910390fd5b600160fb60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f296120c8565b604051612f3691906147b3565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fc482826040518060200160405280600081525061370b565b5050565b612fd3838383613766565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613016576130118161376b565b613055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130545761305383826137b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130985761309381613921565b6130d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130d6576130d58282613a64565b5b5b505050565b600060019054906101000a900460ff1680613102575060008054906101000a900460ff16155b613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613191576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156131b25760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806131db575060008054906101000a900460ff16155b61321a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321190614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561326a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561328b5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806132b4575060008054906101000a900460ff16155b6132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613343576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613359929190613cc4565b508160669080519060200190613370929190613cc4565b5080156133925760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806133bd575060008054906101000a900460ff16155b6133fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f390614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561344c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61345c6134576120c8565b612b3b565b801561347d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134a6575060008054906101000a900460ff16155b6134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613535576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060fb60006101000a81548160ff02191690831515021790555080156135715760008060016101000a81548160ff0219169083151502179055505b50565b60006135958473ffffffffffffffffffffffffffffffffffffffff16613ae3565b156136fe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135be6120c8565b8786866040518563ffffffff1660e01b81526004016135e094939291906147e9565b602060405180830381600087803b1580156135fa57600080fd5b505af192505050801561362b57506040513d601f19601f820116820180604052508101906136289190614070565b60015b6136ae573d806000811461365b576040519150601f19603f3d011682016040523d82523d6000602084013e613660565b606091505b506000815114156136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369d906148d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613703565b600190505b949350505050565b6137158383613af6565b6137226000848484613574565b613761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613758906148d2565b60405180910390fd5b505050565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137c1846114a5565b6137cb9190614e18565b90506000609860008481526020019081526020016000205490508181146138b0576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016099805490506139359190614e18565b90506000609a600084815260200190815260200160002054905060006099838154811061398b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080609983815481106139d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a6000858152602001908152602001600020600090556099805480613a48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613a6f836114a5565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5d90614a72565b60405180910390fd5b613b6f8161205c565b15613baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba690614912565b60405180910390fd5b613bbb60008383612fc8565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c0b9190614d37565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613cd090614f1e565b90600052602060002090601f016020900481019282613cf25760008555613d39565b82601f10613d0b57805160ff1916838001178555613d39565b82800160010185558215613d39579182015b82811115613d38578251825591602001919060010190613d1d565b5b509050613d469190613d4a565b5090565b5b80821115613d63576000816000905550600101613d4b565b5090565b6000613d7a613d7584614c92565b614c6d565b905082815260208101848484011115613d9257600080fd5b613d9d848285614edc565b509392505050565b6000613db8613db384614cc3565b614c6d565b905082815260208101848484011115613dd057600080fd5b613ddb848285614edc565b509392505050565b600081359050613df281615803565b92915050565b600081359050613e078161581a565b92915050565b600081359050613e1c81615831565b92915050565b600081519050613e3181615831565b92915050565b600082601f830112613e4857600080fd5b8135613e58848260208601613d67565b91505092915050565b600082601f830112613e7257600080fd5b8135613e82848260208601613da5565b91505092915050565b600081359050613e9a81615848565b92915050565b600060208284031215613eb257600080fd5b6000613ec084828501613de3565b91505092915050565b60008060408385031215613edc57600080fd5b6000613eea85828601613de3565b9250506020613efb85828601613de3565b9150509250929050565b600080600060608486031215613f1a57600080fd5b6000613f2886828701613de3565b9350506020613f3986828701613de3565b9250506040613f4a86828701613e8b565b9150509250925092565b60008060008060808587031215613f6a57600080fd5b6000613f7887828801613de3565b9450506020613f8987828801613de3565b9350506040613f9a87828801613e8b565b925050606085013567ffffffffffffffff811115613fb757600080fd5b613fc387828801613e37565b91505092959194509250565b60008060408385031215613fe257600080fd5b6000613ff085828601613de3565b925050602061400185828601613df8565b9150509250929050565b6000806040838503121561401e57600080fd5b600061402c85828601613de3565b925050602061403d85828601613e8b565b9150509250929050565b60006020828403121561405957600080fd5b600061406784828501613e0d565b91505092915050565b60006020828403121561408257600080fd5b600061409084828501613e22565b91505092915050565b6000602082840312156140ab57600080fd5b600082013567ffffffffffffffff8111156140c557600080fd5b6140d184828501613e61565b91505092915050565b6000806000606084860312156140ef57600080fd5b600084013567ffffffffffffffff81111561410957600080fd5b61411586828701613e61565b935050602084013567ffffffffffffffff81111561413257600080fd5b61413e86828701613e61565b925050604084013567ffffffffffffffff81111561415b57600080fd5b61416786828701613e61565b9150509250925092565b600080600080600060a0868803121561418957600080fd5b600086013567ffffffffffffffff8111156141a357600080fd5b6141af88828901613e61565b955050602086013567ffffffffffffffff8111156141cc57600080fd5b6141d888828901613e61565b94505060406141e988828901613e8b565b93505060606141fa88828901613e8b565b925050608061420b88828901613de3565b9150509295509295909350565b60006020828403121561422a57600080fd5b600061423884828501613e8b565b91505092915050565b61424a81614e5e565b82525050565b61425981614e4c565b82525050565b61426881614e70565b82525050565b61427f61427a82614e7c565b614fca565b82525050565b600061429082614cf4565b61429a8185614d0a565b93506142aa818560208601614eeb565b6142b3816150c1565b840191505092915050565b60006142c982614cff565b6142d38185614d1b565b93506142e3818560208601614eeb565b6142ec816150c1565b840191505092915050565b600061430282614cff565b61430c8185614d2c565b935061431c818560208601614eeb565b80840191505092915050565b6000614335601483614d1b565b9150614340826150d2565b602082019050919050565b6000614358601d83614d1b565b9150614363826150fb565b602082019050919050565b600061437b602b83614d1b565b915061438682615124565b604082019050919050565b600061439e603283614d1b565b91506143a982615173565b604082019050919050565b60006143c1602683614d1b565b91506143cc826151c2565b604082019050919050565b60006143e4601c83614d1b565b91506143ef82615211565b602082019050919050565b6000614407602483614d1b565b91506144128261523a565b604082019050919050565b600061442a601983614d1b565b915061443582615289565b602082019050919050565b600061444d601b83614d1b565b9150614458826152b2565b602082019050919050565b6000614470602c83614d1b565b915061447b826152db565b604082019050919050565b6000614493601083614d1b565b915061449e8261532a565b602082019050919050565b60006144b6603883614d1b565b91506144c182615353565b604082019050919050565b60006144d9602a83614d1b565b91506144e4826153a2565b604082019050919050565b60006144fc602983614d1b565b9150614507826153f1565b604082019050919050565b600061451f602e83614d1b565b915061452a82615440565b604082019050919050565b6000614542601383614d1b565b915061454d8261548f565b602082019050919050565b6000614565602083614d1b565b9150614570826154b8565b602082019050919050565b6000614588601583614d1b565b9150614593826154e1565b602082019050919050565b60006145ab602c83614d1b565b91506145b68261550a565b604082019050919050565b60006145ce602083614d1b565b91506145d982615559565b602082019050919050565b60006145f1601c83614d1b565b91506145fc82615582565b602082019050919050565b6000614614602983614d1b565b915061461f826155ab565b604082019050919050565b6000614637601c83614d1b565b9150614642826155fa565b602082019050919050565b600061465a602f83614d1b565b915061466582615623565b604082019050919050565b600061467d601083614d1b565b915061468882615672565b602082019050919050565b60006146a0602183614d1b565b91506146ab8261569b565b604082019050919050565b60006146c3601683614d1b565b91506146ce826156ea565b602082019050919050565b60006146e6603183614d1b565b91506146f182615713565b604082019050919050565b6000614709602c83614d1b565b915061471482615762565b604082019050919050565b600061472c601c83614d1b565b9150614737826157b1565b602082019050919050565b600061474f600d83614d1b565b915061475a826157da565b602082019050919050565b61476e81614ed2565b82525050565b6000614780828461426e565b60208201915081905092915050565b600061479b82856142f7565b91506147a782846142f7565b91508190509392505050565b60006020820190506147c86000830184614250565b92915050565b60006020820190506147e36000830184614241565b92915050565b60006080820190506147fe6000830187614250565b61480b6020830186614250565b6148186040830185614765565b818103606083015261482a8184614285565b905095945050505050565b600060208201905061484a600083018461425f565b92915050565b6000602082019050818103600083015261486a81846142be565b905092915050565b6000602082019050818103600083015261488b81614328565b9050919050565b600060208201905081810360008301526148ab8161434b565b9050919050565b600060208201905081810360008301526148cb8161436e565b9050919050565b600060208201905081810360008301526148eb81614391565b9050919050565b6000602082019050818103600083015261490b816143b4565b9050919050565b6000602082019050818103600083015261492b816143d7565b9050919050565b6000602082019050818103600083015261494b816143fa565b9050919050565b6000602082019050818103600083015261496b8161441d565b9050919050565b6000602082019050818103600083015261498b81614440565b9050919050565b600060208201905081810360008301526149ab81614463565b9050919050565b600060208201905081810360008301526149cb81614486565b9050919050565b600060208201905081810360008301526149eb816144a9565b9050919050565b60006020820190508181036000830152614a0b816144cc565b9050919050565b60006020820190508181036000830152614a2b816144ef565b9050919050565b60006020820190508181036000830152614a4b81614512565b9050919050565b60006020820190508181036000830152614a6b81614535565b9050919050565b60006020820190508181036000830152614a8b81614558565b9050919050565b60006020820190508181036000830152614aab8161457b565b9050919050565b60006020820190508181036000830152614acb8161459e565b9050919050565b60006020820190508181036000830152614aeb816145c1565b9050919050565b60006020820190508181036000830152614b0b816145e4565b9050919050565b60006020820190508181036000830152614b2b81614607565b9050919050565b60006020820190508181036000830152614b4b8161462a565b9050919050565b60006020820190508181036000830152614b6b8161464d565b9050919050565b60006020820190508181036000830152614b8b81614670565b9050919050565b60006020820190508181036000830152614bab81614693565b9050919050565b60006020820190508181036000830152614bcb816146b6565b9050919050565b60006020820190508181036000830152614beb816146d9565b9050919050565b60006020820190508181036000830152614c0b816146fc565b9050919050565b60006020820190508181036000830152614c2b8161471f565b9050919050565b60006020820190508181036000830152614c4b81614742565b9050919050565b6000602082019050614c676000830184614765565b92915050565b6000614c77614c88565b9050614c838282614f50565b919050565b6000604051905090565b600067ffffffffffffffff821115614cad57614cac615092565b5b614cb6826150c1565b9050602081019050919050565b600067ffffffffffffffff821115614cde57614cdd615092565b5b614ce7826150c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d4282614ed2565b9150614d4d83614ed2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8257614d81615005565b5b828201905092915050565b6000614d9882614ed2565b9150614da383614ed2565b925082614db357614db2615034565b5b828204905092915050565b6000614dc982614ed2565b9150614dd483614ed2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0d57614e0c615005565b5b828202905092915050565b6000614e2382614ed2565b9150614e2e83614ed2565b925082821015614e4157614e40615005565b5b828203905092915050565b6000614e5782614eb2565b9050919050565b6000614e6982614eb2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f09578082015181840152602081019050614eee565b83811115614f18576000848401525b50505050565b60006002820490506001821680614f3657607f821691505b60208210811415614f4a57614f49615063565b5b50919050565b614f59826150c1565b810181811067ffffffffffffffff82111715614f7857614f77615092565b5b80604052505050565b6000614f8c82614ed2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fbf57614fbe615005565b5b600182019050919050565b6000819050919050565b6000614fdf82614ed2565b9150614fea83614ed2565b925082614ffa57614ff9615034565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f41727420636f646520686173206e6f74206265656e207365616c65642e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41727420636f646520697320616c7265616479207365616c65642e0000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f41727420636f6465206973207365616c65642e00000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f2061727420636f6465206465736372697074696f6e207365742e00000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e2076616c756520696e636f72726563742e00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2061727420636f6465207365742e00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2061727420636f646520646570732e207365742e00000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d6178206e756d626572206f6620746f6b656e73206d696e7465642e00000000600082015250565b7f506c6174666f726d206f6e6c7900000000000000000000000000000000000000600082015250565b61580c81614e4c565b811461581757600080fd5b50565b61582381614e70565b811461582e57600080fd5b50565b61583a81614e86565b811461584557600080fd5b50565b61585181614ed2565b811461585c57600080fd5b5056fea264697066735822122024e1cf08b0f28f208227884549cfe58527cfbdd9157bead971905dac6397614564736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063da8fbf2a1161006f578063da8fbf2a146107eb578063e4473e1f14610802578063e83157421461082d578063e985e9c514610858578063f2fde38b1461089557610230565b8063b88d4fde14610704578063c87b56dd1461072d578063cb53a7d61461076a578063d3f6002114610795578063d7eb3f3a146107c057610230565b80638da5cb5b116100f25780638da5cb5b146106315780638fab34e71461065c57806395d89b411461068557806396052ded146106b0578063a22cb465146106db57610230565b806370a082311461054c578063715018a61461058957806372bf079e146105a0578063742cfb87146105c95780637ff9b5961461060657610230565b806330e46619116101bc57806355f804b31161018057806355f804b31461049a57806359ae340e146104c35780635c975abb146104da5780636352211e1461050557806369a3c7b11461054257610230565b806330e46619146103c957806333eea181146103e057806342842e0e146104095780634e99b800146104325780634f6ccce71461045d57610230565b806318160ddd1161020357806318160ddd146103035780632004ffd91461032e57806323b872dd1461033857806328b5e965146103615780632f745c591461038c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190614047565b6108be565b6040516102699190614835565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190614850565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190614218565b6109ca565b6040516102d191906147b3565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061400b565b610a4f565b005b34801561030f57600080fd5b50610318610b67565b6040516103259190614c52565b60405180910390f35b610336610b74565b005b34801561034457600080fd5b5061035f600480360381019061035a9190613f05565b610bc6565b005b34801561036d57600080fd5b50610376610c26565b6040516103839190614850565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae919061400b565b610cb5565b6040516103c09190614c52565b60405180910390f35b3480156103d557600080fd5b506103de610d5a565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614171565b610f44565b005b34801561041557600080fd5b50610430600480360381019061042b9190613f05565b6110f3565b005b34801561043e57600080fd5b50610447611113565b6040516104549190614850565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190614218565b6111a2565b6040516104919190614c52565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190614099565b611239565b005b3480156104cf57600080fd5b506104d86112d0565b005b3480156104e657600080fd5b506104ef611356565b6040516104fc9190614835565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190614218565b61136d565b60405161053991906147b3565b60405180910390f35b61054a61141f565b005b34801561055857600080fd5b50610573600480360381019061056e9190613ea0565b6114a5565b6040516105809190614c52565b60405180910390f35b34801561059557600080fd5b5061059e61155d565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614218565b6115e5565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190614218565b6116ee565b6040516105fd9190614c52565b60405180910390f35b34801561061257600080fd5b5061061b611794565b6040516106289190614c52565b60405180910390f35b34801561063d57600080fd5b5061064661179b565b60405161065391906147b3565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906140da565b6117c5565b005b34801561069157600080fd5b5061069a6118e5565b6040516106a79190614850565b60405180910390f35b3480156106bc57600080fd5b506106c5611977565b6040516106d29190614835565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613fcf565b61198b565b005b34801561071057600080fd5b5061072b60048036038101906107269190613f54565b611b0c565b005b34801561073957600080fd5b50610754600480360381019061074f9190614218565b611b6e565b6040516107619190614850565b60405180910390f35b34801561077657600080fd5b5061077f611c15565b60405161078c9190614850565b60405180910390f35b3480156107a157600080fd5b506107aa611ca4565b6040516107b79190614850565b60405180910390f35b3480156107cc57600080fd5b506107d5611d33565b6040516107e291906147ce565b60405180910390f35b3480156107f757600080fd5b50610800611d5a565b005b34801561080e57600080fd5b50610817611de0565b6040516108249190614c52565b60405180910390f35b34801561083957600080fd5b50610842611de7565b60405161084f9190614c52565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a9190613ec9565b611dee565b60405161088c9190614835565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190613ea0565b611e82565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610931575061093082611f7a565b5b9050919050565b60606065805461094790614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461097390614f1e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d58261205c565b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90614ab2565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5a8261136d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac290614b92565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aea6120c8565b73ffffffffffffffffffffffffffffffffffffffff161480610b195750610b1881610b136120c8565b611dee565b5b610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f906149d2565b60405180910390fd5b610b6283836120d0565b505050565b6000609980549050905090565b610b7c611356565b15610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb3906149b2565b60405180910390fd5b610bc4612189565b565b610bd7610bd16120c8565b826123bf565b610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614bd2565b60405180910390fd5b610c2183838361249d565b505050565b6101328054610c3490614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6090614f1e565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b505050505081565b6000610cc0836114a5565b8210610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906148b2565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d626120c8565b73ffffffffffffffffffffffffffffffffffffffff16610d8061179b565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614ad2565b60405180910390fd5b6000151561012f60009054906101000a900460ff16151514610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614972565b60405180910390fd5b60006101308054610e3d90614f1e565b90501415610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614b72565b60405180910390fd5b60006101318054610e9090614f1e565b90501415610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614bb2565b60405180910390fd5b60006101328054610ee390614f1e565b90501415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614af2565b60405180910390fd5b600161012f60006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff1680610f6a575060008054906101000a900460ff16155b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015610ff9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61100386866126f9565b61100b6127ee565b6110136128c7565b61101b6129b0565b600061012f60006101000a81548160ff021916908315150217905550600a61012d819055506040518060200160405280600081525061012e9080519060200190611066929190613cc4565b50836101348190555082610135819055506000610133819055508161013660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ca611d5a565b80156110eb5760008060016101000a81548160ff0219169083151502179055505b505050505050565b61110e83838360405180602001604052806000815250611b0c565b505050565b61012e805461112190614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90614f1e565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b505050505081565b60006111ac610b67565b82106111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614bf2565b60405180910390fd5b60998281548110611227577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112416120c8565b73ffffffffffffffffffffffffffffffffffffffff1661125f61179b565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90614ad2565b60405180910390fd5b8061012e90805190602001906112cc929190613cc4565b5050565b6112d86120c8565b73ffffffffffffffffffffffffffffffffffffffff166112f661179b565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390614ad2565b60405180910390fd5b611354612a99565b565b600060fb60009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90614a12565b60405180910390fd5b80915050919050565b6114276120c8565b73ffffffffffffffffffffffffffffffffffffffff1661144561179b565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614ad2565b60405180910390fd5b6114a3612189565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906149f2565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115656120c8565b73ffffffffffffffffffffffffffffffffffffffff1661158361179b565b73ffffffffffffffffffffffffffffffffffffffff16146115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090614ad2565b60405180910390fd5b6115e36000612b3b565b565b6115ed6120c8565b73ffffffffffffffffffffffffffffffffffffffff1661160b61179b565b73ffffffffffffffffffffffffffffffffffffffff1614611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890614ad2565b60405180910390fd5b73f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90614c32565b60405180910390fd5b806101358190555050565b60006116f98261205c565b611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90614a92565b60405180910390fd5b60006101376000848152602001908152602001600020548360001b1890506000816040516020016117699190614774565b60405160208183030381529060405280519060200120905060008160001c9050809350505050919050565b6101355481565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117cd6120c8565b73ffffffffffffffffffffffffffffffffffffffff166117eb61179b565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890614ad2565b60405180910390fd5b6000151561012f60009054906101000a900460ff16151514611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90614a52565b60405180910390fd5b8261013090805190602001906118af929190613cc4565b508161013190805190602001906118c7929190613cc4565b508061013290805190602001906118df929190613cc4565b50505050565b6060606680546118f490614f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461192090614f1e565b801561196d5780601f106119425761010080835404028352916020019161196d565b820191906000526020600020905b81548152906001019060200180831161195057829003601f168201915b5050505050905090565b61012f60009054906101000a900460ff1681565b6119936120c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614952565b60405180910390fd5b80606a6000611a0e6120c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611abb6120c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b009190614835565b60405180910390a35050565b611b1d611b176120c8565b836123bf565b611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390614bd2565b60405180910390fd5b611b6884848484612c01565b50505050565b6060611b798261205c565b611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614b52565b60405180910390fd5b6000611bc2612c5d565b90506000815111611be25760405180602001604052806000815250611c0d565b80611bec84612cf0565b604051602001611bfd92919061478f565b6040516020818303038152906040525b915050919050565b6101308054611c2390614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f90614f1e565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b505050505081565b6101318054611cb290614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cde90614f1e565b8015611d2b5780601f10611d0057610100808354040283529160200191611d2b565b820191906000526020600020905b815481529060010190602001808311611d0e57829003601f168201915b505050505081565b61013660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d626120c8565b73ffffffffffffffffffffffffffffffffffffffff16611d8061179b565b73ffffffffffffffffffffffffffffffffffffffff1614611dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcd90614ad2565b60405180910390fd5b611dde612e9d565b565b61012d5481565b6101345481565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e8a6120c8565b73ffffffffffffffffffffffffffffffffffffffff16611ea861179b565b73ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590614ad2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f65906148f2565b60405180910390fd5b611f7781612b3b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061204557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612055575061205482612f40565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121438361136d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6101345461013354106121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c890614c12565b60405180910390fd5b6001151561012f60009054906101000a900460ff16151514612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90614892565b60405180910390fd5b61013554341461226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614b32565b60405180910390fd5b61227a3361013354612faa565b6001436122879190614e18565b40610137600061013354815260200190815260200160002081905550600061271034606461012d546122b99190614dbe565b6122c39190614dbe565b6122cd9190614d8d565b9050600081346122dd9190614e18565b90506001610133546122ef9190614d37565b6101338190555073f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612350573d6000803e3d6000fd5b5061013660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156123ba573d6000803e3d6000fd5b505050565b60006123ca8261205c565b612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614992565b60405180910390fd5b60006124148361136d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061248357508373ffffffffffffffffffffffffffffffffffffffff1661246b846109ca565b73ffffffffffffffffffffffffffffffffffffffff16145b8061249457506124938185611dee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124bd8261136d565b73ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90614932565b60405180910390fd5b61258e838383612fc8565b6125996000826120d0565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e99190614e18565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126409190614d37565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600060019054906101000a900460ff168061271f575060008054906101000a900460ff16155b61275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614a32565b60405180910390fd5b60008060019054906101000a900460ff1615905080156127ae576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6127b66130dc565b6127be6131b5565b6127c8838361328e565b80156127e95760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612814575060008054906101000a900460ff16155b612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614a32565b60405180910390fd5b60008060019054906101000a900460ff1615905080156128a3576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156128c45760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806128ed575060008054906101000a900460ff16155b61292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561297c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6129846130dc565b61298c613397565b80156129ad5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806129d6575060008054906101000a900460ff16155b612a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0c90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015612a65576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612a6d6130dc565b612a75613480565b8015612a965760008060016101000a81548160ff0219169083151502179055505b50565b612aa1611356565b612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad790614872565b60405180910390fd5b600060fb60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b246120c8565b604051612b3191906147b3565b60405180910390a1565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c0c84848461249d565b612c1884848484613574565b612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e906148d2565b60405180910390fd5b50505050565b606061012e8054612c6d90614f1e565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9990614f1e565b8015612ce65780601f10612cbb57610100808354040283529160200191612ce6565b820191906000526020600020905b815481529060010190602001808311612cc957829003601f168201915b5050505050905090565b60606000821415612d38576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e98565b600082905060005b60008214612d6a578080612d5390614f81565b915050600a82612d639190614d8d565b9150612d40565b60008167ffffffffffffffff811115612dac577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dde5781602001600182028036833780820191505090505b5090505b60008514612e9157600182612df79190614e18565b9150600a85612e069190614fd4565b6030612e129190614d37565b60f81b818381518110612e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e8a9190614d8d565b9450612de2565b8093505050505b919050565b612ea5611356565b15612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc906149b2565b60405180910390fd5b600160fb60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f296120c8565b604051612f3691906147b3565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fc482826040518060200160405280600081525061370b565b5050565b612fd3838383613766565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613016576130118161376b565b613055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130545761305383826137b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130985761309381613921565b6130d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130d6576130d58282613a64565b5b5b505050565b600060019054906101000a900460ff1680613102575060008054906101000a900460ff16155b613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613191576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156131b25760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806131db575060008054906101000a900460ff16155b61321a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321190614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561326a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561328b5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806132b4575060008054906101000a900460ff16155b6132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613343576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613359929190613cc4565b508160669080519060200190613370929190613cc4565b5080156133925760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806133bd575060008054906101000a900460ff16155b6133fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f390614a32565b60405180910390fd5b60008060019054906101000a900460ff16159050801561344c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61345c6134576120c8565b612b3b565b801561347d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134a6575060008054906101000a900460ff16155b6134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc90614a32565b60405180910390fd5b60008060019054906101000a900460ff161590508015613535576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060fb60006101000a81548160ff02191690831515021790555080156135715760008060016101000a81548160ff0219169083151502179055505b50565b60006135958473ffffffffffffffffffffffffffffffffffffffff16613ae3565b156136fe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135be6120c8565b8786866040518563ffffffff1660e01b81526004016135e094939291906147e9565b602060405180830381600087803b1580156135fa57600080fd5b505af192505050801561362b57506040513d601f19601f820116820180604052508101906136289190614070565b60015b6136ae573d806000811461365b576040519150601f19603f3d011682016040523d82523d6000602084013e613660565b606091505b506000815114156136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369d906148d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613703565b600190505b949350505050565b6137158383613af6565b6137226000848484613574565b613761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613758906148d2565b60405180910390fd5b505050565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137c1846114a5565b6137cb9190614e18565b90506000609860008481526020019081526020016000205490508181146138b0576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016099805490506139359190614e18565b90506000609a600084815260200190815260200160002054905060006099838154811061398b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080609983815481106139d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a6000858152602001908152602001600020600090556099805480613a48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613a6f836114a5565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5d90614a72565b60405180910390fd5b613b6f8161205c565b15613baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ba690614912565b60405180910390fd5b613bbb60008383612fc8565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c0b9190614d37565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613cd090614f1e565b90600052602060002090601f016020900481019282613cf25760008555613d39565b82601f10613d0b57805160ff1916838001178555613d39565b82800160010185558215613d39579182015b82811115613d38578251825591602001919060010190613d1d565b5b509050613d469190613d4a565b5090565b5b80821115613d63576000816000905550600101613d4b565b5090565b6000613d7a613d7584614c92565b614c6d565b905082815260208101848484011115613d9257600080fd5b613d9d848285614edc565b509392505050565b6000613db8613db384614cc3565b614c6d565b905082815260208101848484011115613dd057600080fd5b613ddb848285614edc565b509392505050565b600081359050613df281615803565b92915050565b600081359050613e078161581a565b92915050565b600081359050613e1c81615831565b92915050565b600081519050613e3181615831565b92915050565b600082601f830112613e4857600080fd5b8135613e58848260208601613d67565b91505092915050565b600082601f830112613e7257600080fd5b8135613e82848260208601613da5565b91505092915050565b600081359050613e9a81615848565b92915050565b600060208284031215613eb257600080fd5b6000613ec084828501613de3565b91505092915050565b60008060408385031215613edc57600080fd5b6000613eea85828601613de3565b9250506020613efb85828601613de3565b9150509250929050565b600080600060608486031215613f1a57600080fd5b6000613f2886828701613de3565b9350506020613f3986828701613de3565b9250506040613f4a86828701613e8b565b9150509250925092565b60008060008060808587031215613f6a57600080fd5b6000613f7887828801613de3565b9450506020613f8987828801613de3565b9350506040613f9a87828801613e8b565b925050606085013567ffffffffffffffff811115613fb757600080fd5b613fc387828801613e37565b91505092959194509250565b60008060408385031215613fe257600080fd5b6000613ff085828601613de3565b925050602061400185828601613df8565b9150509250929050565b6000806040838503121561401e57600080fd5b600061402c85828601613de3565b925050602061403d85828601613e8b565b9150509250929050565b60006020828403121561405957600080fd5b600061406784828501613e0d565b91505092915050565b60006020828403121561408257600080fd5b600061409084828501613e22565b91505092915050565b6000602082840312156140ab57600080fd5b600082013567ffffffffffffffff8111156140c557600080fd5b6140d184828501613e61565b91505092915050565b6000806000606084860312156140ef57600080fd5b600084013567ffffffffffffffff81111561410957600080fd5b61411586828701613e61565b935050602084013567ffffffffffffffff81111561413257600080fd5b61413e86828701613e61565b925050604084013567ffffffffffffffff81111561415b57600080fd5b61416786828701613e61565b9150509250925092565b600080600080600060a0868803121561418957600080fd5b600086013567ffffffffffffffff8111156141a357600080fd5b6141af88828901613e61565b955050602086013567ffffffffffffffff8111156141cc57600080fd5b6141d888828901613e61565b94505060406141e988828901613e8b565b93505060606141fa88828901613e8b565b925050608061420b88828901613de3565b9150509295509295909350565b60006020828403121561422a57600080fd5b600061423884828501613e8b565b91505092915050565b61424a81614e5e565b82525050565b61425981614e4c565b82525050565b61426881614e70565b82525050565b61427f61427a82614e7c565b614fca565b82525050565b600061429082614cf4565b61429a8185614d0a565b93506142aa818560208601614eeb565b6142b3816150c1565b840191505092915050565b60006142c982614cff565b6142d38185614d1b565b93506142e3818560208601614eeb565b6142ec816150c1565b840191505092915050565b600061430282614cff565b61430c8185614d2c565b935061431c818560208601614eeb565b80840191505092915050565b6000614335601483614d1b565b9150614340826150d2565b602082019050919050565b6000614358601d83614d1b565b9150614363826150fb565b602082019050919050565b600061437b602b83614d1b565b915061438682615124565b604082019050919050565b600061439e603283614d1b565b91506143a982615173565b604082019050919050565b60006143c1602683614d1b565b91506143cc826151c2565b604082019050919050565b60006143e4601c83614d1b565b91506143ef82615211565b602082019050919050565b6000614407602483614d1b565b91506144128261523a565b604082019050919050565b600061442a601983614d1b565b915061443582615289565b602082019050919050565b600061444d601b83614d1b565b9150614458826152b2565b602082019050919050565b6000614470602c83614d1b565b915061447b826152db565b604082019050919050565b6000614493601083614d1b565b915061449e8261532a565b602082019050919050565b60006144b6603883614d1b565b91506144c182615353565b604082019050919050565b60006144d9602a83614d1b565b91506144e4826153a2565b604082019050919050565b60006144fc602983614d1b565b9150614507826153f1565b604082019050919050565b600061451f602e83614d1b565b915061452a82615440565b604082019050919050565b6000614542601383614d1b565b915061454d8261548f565b602082019050919050565b6000614565602083614d1b565b9150614570826154b8565b602082019050919050565b6000614588601583614d1b565b9150614593826154e1565b602082019050919050565b60006145ab602c83614d1b565b91506145b68261550a565b604082019050919050565b60006145ce602083614d1b565b91506145d982615559565b602082019050919050565b60006145f1601c83614d1b565b91506145fc82615582565b602082019050919050565b6000614614602983614d1b565b915061461f826155ab565b604082019050919050565b6000614637601c83614d1b565b9150614642826155fa565b602082019050919050565b600061465a602f83614d1b565b915061466582615623565b604082019050919050565b600061467d601083614d1b565b915061468882615672565b602082019050919050565b60006146a0602183614d1b565b91506146ab8261569b565b604082019050919050565b60006146c3601683614d1b565b91506146ce826156ea565b602082019050919050565b60006146e6603183614d1b565b91506146f182615713565b604082019050919050565b6000614709602c83614d1b565b915061471482615762565b604082019050919050565b600061472c601c83614d1b565b9150614737826157b1565b602082019050919050565b600061474f600d83614d1b565b915061475a826157da565b602082019050919050565b61476e81614ed2565b82525050565b6000614780828461426e565b60208201915081905092915050565b600061479b82856142f7565b91506147a782846142f7565b91508190509392505050565b60006020820190506147c86000830184614250565b92915050565b60006020820190506147e36000830184614241565b92915050565b60006080820190506147fe6000830187614250565b61480b6020830186614250565b6148186040830185614765565b818103606083015261482a8184614285565b905095945050505050565b600060208201905061484a600083018461425f565b92915050565b6000602082019050818103600083015261486a81846142be565b905092915050565b6000602082019050818103600083015261488b81614328565b9050919050565b600060208201905081810360008301526148ab8161434b565b9050919050565b600060208201905081810360008301526148cb8161436e565b9050919050565b600060208201905081810360008301526148eb81614391565b9050919050565b6000602082019050818103600083015261490b816143b4565b9050919050565b6000602082019050818103600083015261492b816143d7565b9050919050565b6000602082019050818103600083015261494b816143fa565b9050919050565b6000602082019050818103600083015261496b8161441d565b9050919050565b6000602082019050818103600083015261498b81614440565b9050919050565b600060208201905081810360008301526149ab81614463565b9050919050565b600060208201905081810360008301526149cb81614486565b9050919050565b600060208201905081810360008301526149eb816144a9565b9050919050565b60006020820190508181036000830152614a0b816144cc565b9050919050565b60006020820190508181036000830152614a2b816144ef565b9050919050565b60006020820190508181036000830152614a4b81614512565b9050919050565b60006020820190508181036000830152614a6b81614535565b9050919050565b60006020820190508181036000830152614a8b81614558565b9050919050565b60006020820190508181036000830152614aab8161457b565b9050919050565b60006020820190508181036000830152614acb8161459e565b9050919050565b60006020820190508181036000830152614aeb816145c1565b9050919050565b60006020820190508181036000830152614b0b816145e4565b9050919050565b60006020820190508181036000830152614b2b81614607565b9050919050565b60006020820190508181036000830152614b4b8161462a565b9050919050565b60006020820190508181036000830152614b6b8161464d565b9050919050565b60006020820190508181036000830152614b8b81614670565b9050919050565b60006020820190508181036000830152614bab81614693565b9050919050565b60006020820190508181036000830152614bcb816146b6565b9050919050565b60006020820190508181036000830152614beb816146d9565b9050919050565b60006020820190508181036000830152614c0b816146fc565b9050919050565b60006020820190508181036000830152614c2b8161471f565b9050919050565b60006020820190508181036000830152614c4b81614742565b9050919050565b6000602082019050614c676000830184614765565b92915050565b6000614c77614c88565b9050614c838282614f50565b919050565b6000604051905090565b600067ffffffffffffffff821115614cad57614cac615092565b5b614cb6826150c1565b9050602081019050919050565b600067ffffffffffffffff821115614cde57614cdd615092565b5b614ce7826150c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d4282614ed2565b9150614d4d83614ed2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8257614d81615005565b5b828201905092915050565b6000614d9882614ed2565b9150614da383614ed2565b925082614db357614db2615034565b5b828204905092915050565b6000614dc982614ed2565b9150614dd483614ed2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0d57614e0c615005565b5b828202905092915050565b6000614e2382614ed2565b9150614e2e83614ed2565b925082821015614e4157614e40615005565b5b828203905092915050565b6000614e5782614eb2565b9050919050565b6000614e6982614eb2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f09578082015181840152602081019050614eee565b83811115614f18576000848401525b50505050565b60006002820490506001821680614f3657607f821691505b60208210811415614f4a57614f49615063565b5b50919050565b614f59826150c1565b810181811067ffffffffffffffff82111715614f7857614f77615092565b5b80604052505050565b6000614f8c82614ed2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fbf57614fbe615005565b5b600182019050919050565b6000819050919050565b6000614fdf82614ed2565b9150614fea83614ed2565b925082614ffa57614ff9615034565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f41727420636f646520686173206e6f74206265656e207365616c65642e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41727420636f646520697320616c7265616479207365616c65642e0000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f41727420636f6465206973207365616c65642e00000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f2061727420636f6465206465736372697074696f6e207365742e00000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e2076616c756520696e636f72726563742e00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2061727420636f6465207365742e00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2061727420636f646520646570732e207365742e00000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d6178206e756d626572206f6620746f6b656e73206d696e7465642e00000000600082015250565b7f506c6174666f726d206f6e6c7900000000000000000000000000000000000000600082015250565b61580c81614e4c565b811461581757600080fd5b50565b61582381614e70565b811461582e57600080fd5b50565b61583a81614e86565b811461584557600080fd5b50565b61585181614ed2565b811461585c57600080fd5b5056fea264697066735822122024e1cf08b0f28f208227884549cfe58527cfbdd9157bead971905dac6397614564736f6c63430008040033

Deployed Bytecode Sourcemap

431:3990:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1292:255:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2936:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4458:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1961:111:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3146:72:14;;;:::i;:::-;;5322:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;731:28:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1626:264:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3819:363:14;;;;;;;;;;;;;:::i;:::-;;1256:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5718:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;580:26:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2144:241:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4314:105:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3286:63;;;;;;;;;;;;;:::i;:::-;;1310:84:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2639:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3035:73:14;;;:::i;:::-;;2377:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1871:92:0;;;;;;;;;;;;;:::i;:::-;;3352:155:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2021:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;818:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1239:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3511:305:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3098:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;610:27:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4742:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5963:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3266:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;641:21:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;666:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;848:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3223:60;;;;;;;;;;;;;:::i;:::-;;545:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;790:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5098:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2112:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1292:255:6;1416:4;1454:46;1439:61;;;:11;:61;;;;:101;;;;1504:36;1528:11;1504:23;:36::i;:::-;1439:101;1432:108;;1292:255;;;:::o;2936:98:3:-;2990:13;3022:5;3015:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2936:98;:::o;4458:217::-;4534:7;4561:16;4569:7;4561;:16::i;:::-;4553:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4644:15;:24;4660:7;4644:24;;;;;;;;;;;;;;;;;;;;;4637:31;;4458:217;;;:::o;3985:412::-;4065:13;4081:34;4107:7;4081:25;:34::i;:::-;4065:50;;4139:5;4133:11;;:2;:11;;;;4125:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4230:5;4214:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4239:37;4256:5;4263:12;:10;:12::i;:::-;4239:16;:37::i;:::-;4214:62;4193:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4369:21;4378:2;4382:7;4369:8;:21::i;:::-;3985:412;;;:::o;1961:111:6:-;2022:7;2048:10;:17;;;;2041:24;;1961:111;:::o;3146:72:14:-;1624:8:2;:6;:8::i;:::-;1623:9;1615:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3202:11:14::1;:9;:11::i;:::-;3146:72::o:0;5322:330:3:-;5511:41;5530:12;:10;:12::i;:::-;5544:7;5511:18;:41::i;:::-;5503:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5617:28;5627:4;5633:2;5637:7;5617:9;:28::i;:::-;5322:330;;;:::o;731:28:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1626:264:6:-;1723:7;1758:34;1786:5;1758:27;:34::i;:::-;1750:5;:42;1742:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1857:12;:19;1870:5;1857:19;;;;;;;;;;;;;;;:26;1877:5;1857:26;;;;;;;;;;;;1850:33;;1626:264;;;;:::o;3819:363:14:-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3892:5:14::1;3873:24;;:15;;;;;;;;;;;:24;;;3865:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3968:1;3949:7;3943:21;;;;;:::i;:::-;;;:26;;3935:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4041:1;4010:19;4004:33;;;;;:::i;:::-;;;:38;;3996:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4115:1;4089:14;4083:28;;;;;:::i;:::-;;;:33;;4075:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4173:4;4155:15;;:22;;;;;;;;;;;;;;;;;;3819:363::o:0;1256:503::-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1410:29:14::1;1424:5;1431:7;1410:13;:29::i;:::-;1445:35;:33;:35::i;:::-;1486:16;:14;:16::i;:::-;1508:17;:15;:17::i;:::-;1549:5;1531:15;;:23;;;;;;;;;;;;;;;;;;1579:2;1560:16;:21;;;;1587:17;;;;;;;;;;;::::0;:12:::1;:17;;;;;;;;;;;;:::i;:::-;;1623:10;1611:9;:22;;;;1652:11;1639:10;:24;;;;1686:1;1669:14;:18;;;;1718:14;1694:13;;:39;;;;;;;;;;;;;;;;;;1740:14;:12;:14::i;:::-;1671::1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1256:503:14;;;;;;:::o;5718:179:3:-;5851:39;5868:4;5874:2;5878:7;5851:39;;;;;;;;;;;;:16;:39::i;:::-;5718:179;;;:::o;580:26:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2144:241:6:-;2219:7;2254:41;:39;:41::i;:::-;2246:5;:49;2238:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;2361:10;2372:5;2361:17;;;;;;;;;;;;;;;;;;;;;;;;2354:24;;2144:241;;;:::o;4314:105:14:-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4401:13:14::1;4386:12;:28;;;;;;;;;;;;:::i;:::-;;4314:105:::0;:::o;3286:63::-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3334:10:14::1;:8;:10::i;:::-;3286:63::o:0;1310:84:2:-;1357:4;1380:7;;;;;;;;;;;1373:14;;1310:84;:::o;2639:235:3:-;2711:7;2730:13;2746:7;:16;2754:7;2746:16;;;;;;;;;;;;;;;;;;;;;2730:32;;2797:1;2780:19;;:5;:19;;;;2772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2862:5;2855:12;;;2639:235;;;:::o;3035:73:14:-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3092:11:14::1;:9;:11::i;:::-;3035:73::o:0;2377:205:3:-;2449:7;2493:1;2476:19;;:5;:19;;;;2468:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2559:9;:16;2569:5;2559:16;;;;;;;;;;;;;;;;2552:23;;2377:205;;;:::o;1871:92:0:-;1462:12;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1935:21:::1;1953:1;1935:9;:21::i;:::-;1871:92::o:0;3352:155:14:-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;939:42:14::1;3425:29;;:10;:29;;;3417:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3491:11;3478:10;:24;;;;3352:155:::0;:::o;2021:321::-;2081:7;2104:16;2112:7;2104;:16::i;:::-;2096:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2152:20;2194:17;:26;2212:7;2194:26;;;;;;;;;;;;2183:7;2175:16;;:45;2152:68;;2226:14;2270:12;2253:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2243:41;;;;;;2226:58;;2290:12;2313:6;2305:15;;2290:30;;2333:4;2326:11;;;;;2021:321;;;:::o;818:25::-;;;;:::o;1239:85:0:-;1285:7;1311:6;;;;;;;;;;;1304:13;;1239:85;:::o;3511:305:14:-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3672:5:14::1;3653:24;;:15;;;;;;;;;;;:24;;;3645:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3717:8;3707:7;:18;;;;;;;;;;;;:::i;:::-;;3753:20;3731:19;:42;;;;;;;;;;;;:::i;:::-;;3796:15;3779:14;:32;;;;;;;;;;;;:::i;:::-;;3511:305:::0;;;:::o;3098:102:3:-;3154:13;3186:7;3179:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3098:102;:::o;610:27:14:-;;;;;;;;;;;;;:::o;4742:290:3:-;4856:12;:10;:12::i;:::-;4844:24;;:8;:24;;;;4836:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4954:8;4909:18;:32;4928:12;:10;:12::i;:::-;4909:32;;;;;;;;;;;;;;;:42;4942:8;4909:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5006:8;4977:48;;4992:12;:10;:12::i;:::-;4977:48;;;5016:8;4977:48;;;;;;:::i;:::-;;;;;;;;4742:290;;:::o;5963:320::-;6132:41;6151:12;:10;:12::i;:::-;6165:7;6132:18;:41::i;:::-;6124:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6237:39;6251:4;6257:2;6261:7;6270:5;6237:13;:39::i;:::-;5963:320;;;;:::o;3266:329::-;3339:13;3372:16;3380:7;3372;:16::i;:::-;3364:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3451:21;3475:10;:8;:10::i;:::-;3451:34;;3526:1;3508:7;3502:21;:25;:86;;;;;;;;;;;;;;;;;3554:7;3563:18;:7;:16;:18::i;:::-;3537:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3502:86;3495:93;;;3266:329;;;:::o;641:21:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;666:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;848:36::-;;;;;;;;;;;;;:::o;3223:60::-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3270:8:14::1;:6;:8::i;:::-;3223:60::o:0;545:31::-;;;;:::o;790:24::-;;;;:::o;5098:162:3:-;5195:4;5218:18;:25;5237:5;5218:25;;;;;;;;;;;;;;;:35;5244:8;5218:35;;;;;;;;;;;;;;;;;;;;;;;;;5211:42;;5098:162;;;;:::o;2112:189:0:-;1462:12;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2220:1:::1;2200:22;;:8;:22;;;;2192:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:19;2285:8;2275:9;:19::i;:::-;2112:189:::0;:::o;1974:344:3:-;2098:4;2148:36;2133:51;;;:11;:51;;;;:126;;;;2215:44;2200:59;;;:11;:59;;;;2133:126;:178;;;;2275:36;2299:11;2275:23;:36::i;:::-;2133:178;2114:197;;1974:344;;;:::o;7755:125::-;7820:4;7871:1;7843:30;;:7;:16;7851:7;7843:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7836:37;;7755:125;;;:::o;823:96:10:-;876:7;902:10;895:17;;823:96;:::o;11639:182:3:-;11740:2;11713:15;:24;11729:7;11713:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11806:7;11802:2;11757:57;;11766:34;11792:7;11766:25;:34::i;:::-;11757:57;;;;;;;;;;;;11639:182;;:::o;2368:621:14:-;2429:9;;2412:14;;:26;2404:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2504:4;2485:23;;:15;;;;;;;;;;;:23;;;2477:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2569:10;;2556:9;:23;2548:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2618:37;2628:10;2640:14;;2618:9;:37::i;:::-;2722:1;2707:12;:16;;;;:::i;:::-;2697:27;2661:17;:33;2679:14;;2661:33;;;;;;;;;;;:63;;;;2731:20;2794:7;2780:9;2774:3;2755:16;;:22;;;;:::i;:::-;:34;;;;:::i;:::-;2754:48;;;;:::i;:::-;2731:71;;2808:20;2843:12;2831:9;:24;;;;:::i;:::-;2808:47;;2896:1;2879:14;;:18;;;;:::i;:::-;2862:14;:35;;;;939:42;2904:24;;:38;2929:12;2904:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2948:13;;;;;;;;;;;:22;;:36;2971:12;2948:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2368:621;;:::o;8038:355:3:-;8131:4;8155:16;8163:7;8155;:16::i;:::-;8147:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8230:13;8246:34;8272:7;8246:25;:34::i;:::-;8230:50;;8309:5;8298:16;;:7;:16;;;:51;;;;8342:7;8318:31;;:20;8330:7;8318:11;:20::i;:::-;:31;;;8298:51;:87;;;;8353:32;8370:5;8377:7;8353:16;:32::i;:::-;8298:87;8290:96;;;8038:355;;;;:::o;10957:571::-;11122:4;11084:42;;:34;11110:7;11084:25;:34::i;:::-;:42;;;11076:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;11204:1;11190:16;;:2;:16;;;;11182:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11258:39;11279:4;11285:2;11289:7;11258:20;:39::i;:::-;11359:29;11376:1;11380:7;11359:8;:29::i;:::-;11418:1;11399:9;:15;11409:4;11399:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11446:1;11429:9;:13;11439:2;11429:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11476:2;11457:7;:16;11465:7;11457:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11513:7;11509:2;11494:27;;11503:4;11494:27;;;;;;;;;;;;10957:571;;;:::o;1531:215::-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1629:26:3::1;:24;:26::i;:::-;1665:25;:23;:25::i;:::-;1700:39;1724:5;1731:7;1700:23;:39::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1531:215:3;;;:::o;691:73:6:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;691:73:6;:::o;934:126:0:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;991:26:0::1;:24;:26::i;:::-;1027;:24;:26::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;934:126:0;:::o;991:128:2:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1049:26:2::1;:24;:26::i;:::-;1085:27;:25;:27::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;991:128:2;:::o;2322:117::-;1889:8;:6;:8::i;:::-;1881:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2390:5:::1;2380:7;;:15;;;;;;;;;;;;;;;;;;2410:22;2419:12;:10;:12::i;:::-;2410:22;;;;;;:::i;:::-;;;;;;;;2322:117::o:0;2307:169:0:-;2362:16;2381:6;;;;;;;;;;;2362:25;;2406:8;2397:6;;:17;;;;;;;;;;;;;;;;;;2460:8;2429:40;;2450:8;2429:40;;;;;;;;;;;;2307:169;;:::o;7145:307:3:-;7296:28;7306:4;7312:2;7316:7;7296:9;:28::i;:::-;7342:48;7365:4;7371:2;7375:7;7384:5;7342:22;:48::i;:::-;7334:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;7145:307;;;;:::o;4214:97:14:-;4266:13;4294:12;4287:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4214:97;:::o;286:703:11:-;342:13;568:1;559:5;:10;555:51;;;585:10;;;;;;;;;;;;;;;;;;;;;555:51;615:12;630:5;615:20;;645:14;669:75;684:1;676:4;:9;669:75;;701:8;;;;;:::i;:::-;;;;731:2;723:10;;;;;:::i;:::-;;;669:75;;;753:19;785:6;775:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:39;;802:150;818:1;809:5;:10;802:150;;845:1;835:11;;;;;:::i;:::-;;;911:2;903:5;:10;;;;:::i;:::-;890:2;:24;;;;:::i;:::-;877:39;;860:6;867;860:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;939:2;930:11;;;;;:::i;:::-;;;802:150;;;975:6;961:21;;;;;286:703;;;;:::o;2075:115:2:-;1624:8;:6;:8::i;:::-;1623:9;1615:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2144:4:::1;2134:7;;:14;;;;;;;;;;;;;;;;;;2163:20;2170:12;:10;:12::i;:::-;2163:20;;;;;;:::i;:::-;;;;;;;;2075:115::o:0;1019:166:12:-;1104:4;1142:36;1127:51;;;:11;:51;;;;1120:58;;1019:166;;;:::o;8723:108:3:-;8798:26;8808:2;8812:7;8798:26;;;;;;;;;;;;:9;:26::i;:::-;8723:108;;:::o;2981:572:6:-;3120:45;3147:4;3153:2;3157:7;3120:26;:45::i;:::-;3196:1;3180:18;;:4;:18;;;3176:183;;;3214:40;3246:7;3214:31;:40::i;:::-;3176:183;;;3283:2;3275:10;;:4;:10;;;3271:88;;3301:47;3334:4;3340:7;3301:32;:47::i;:::-;3271:88;3176:183;3386:1;3372:16;;:2;:16;;;3368:179;;;3404:45;3441:7;3404:36;:45::i;:::-;3368:179;;;3476:4;3470:10;;:2;:10;;;3466:81;;3496:40;3524:2;3528:7;3496:27;:40::i;:::-;3466:81;3368:179;2981:572;;;:::o;754:64:10:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;754:64:10;:::o;890:63:12:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;890:63:12;:::o;1752:155:3:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1868:5:3::1;1860;:13;;;;;;;;;;;;:::i;:::-;;1893:7;1883;:17;;;;;;;;;;;;:::i;:::-;;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1752:155:3;;;:::o;1066:97:0:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1133:23:0::1;1143:12;:10;:12::i;:::-;1133:9;:23::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1066:97:0;:::o;1125:90:2:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1203:5:2::1;1193:7;;:15;;;;;;;;;;;;;;;;;;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1125:90:2;:::o;12374:800:3:-;12524:4;12544:15;:2;:13;;;:15::i;:::-;12540:628;;;12606:2;12579:47;;;12627:12;:10;:12::i;:::-;12641:4;12647:7;12656:5;12579:83;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12575:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12857:1;12840:6;:13;:18;12836:266;;;12882:60;;;;;;;;;;:::i;:::-;;;;;;;;12836:266;13054:6;13048:13;13039:6;13035:2;13031:15;13024:38;12575:541;12722:52;;;12712:62;;;:6;:62;;;;12705:69;;;;;12540:628;13153:4;13146:11;;12374:800;;;;;;;:::o;9052:311::-;9177:18;9183:2;9187:7;9177:5;:18::i;:::-;9226:54;9257:1;9261:2;9265:7;9274:5;9226:22;:54::i;:::-;9205:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;9052:311;;;:::o;13730:122::-;;;;:::o;4270:161:6:-;4373:10;:17;;;;4346:15;:24;4362:7;4346:24;;;;;;;;;;;:44;;;;4400:10;4416:7;4400:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4270:161;:::o;5048:981::-;5310:22;5371:1;5335:33;5363:4;5335:27;:33::i;:::-;:37;;;;:::i;:::-;5310:62;;5382:18;5403:17;:26;5421:7;5403:26;;;;;;;;;;;;5382:47;;5547:14;5533:10;:28;5529:323;;5577:19;5599:12;:18;5612:4;5599:18;;;;;;;;;;;;;;;:34;5618:14;5599:34;;;;;;;;;;;;5577:56;;5681:11;5648:12;:18;5661:4;5648:18;;;;;;;;;;;;;;;:30;5667:10;5648:30;;;;;;;;;;;:44;;;;5797:10;5764:17;:30;5782:11;5764:30;;;;;;;;;;;:43;;;;5529:323;;5945:17;:26;5963:7;5945:26;;;;;;;;;;;5938:33;;;5988:12;:18;6001:4;5988:18;;;;;;;;;;;;;;;:34;6007:14;5988:34;;;;;;;;;;;5981:41;;;5048:981;;;;:::o;6317:1061::-;6566:22;6611:1;6591:10;:17;;;;:21;;;;:::i;:::-;6566:46;;6622:18;6643:15;:24;6659:7;6643:24;;;;;;;;;;;;6622:45;;6989:19;7011:10;7022:14;7011:26;;;;;;;;;;;;;;;;;;;;;;;;6989:48;;7073:11;7048:10;7059;7048:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;7183:10;7152:15;:28;7168:11;7152:28;;;;;;;;;;;:41;;;;7321:15;:24;7337:7;7321:24;;;;;;;;;;;7314:31;;;7355:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:1061;;;;:::o;3847:228::-;3931:14;3948:31;3976:2;3948:27;:31::i;:::-;3931:48;;4016:7;3989:12;:16;4002:2;3989:16;;;;;;;;;;;;;;;:24;4006:6;3989:24;;;;;;;;;;;:34;;;;4062:6;4033:17;:26;4051:7;4033:26;;;;;;;;;;;:35;;;;3847:228;;;:::o;729:377:9:-;789:4;992:12;1057:7;1045:20;1037:28;;1098:1;1091:4;:8;1084:15;;;729:377;;;:::o;9685:372:3:-;9778:1;9764:16;;:2;:16;;;;9756:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9836:16;9844:7;9836;:16::i;:::-;9835:17;9827:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9896:45;9925:1;9929:2;9933:7;9896:20;:45::i;:::-;9969:1;9952:9;:13;9962:2;9952:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9999:2;9980:7;:16;9988:7;9980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10042:7;10038:2;10017:33;;10034:1;10017:33;;;;;;;;;;;;9685:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:15:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:891::-;5925:6;5933;5941;5990:2;5978:9;5969:7;5965:23;5961:32;5958:2;;;6006:1;6003;5996:12;5958:2;6077:1;6066:9;6062:17;6049:31;6107:18;6099:6;6096:30;6093:2;;;6139:1;6136;6129:12;6093:2;6167:63;6222:7;6213:6;6202:9;6198:22;6167:63;:::i;:::-;6157:73;;6020:220;6307:2;6296:9;6292:18;6279:32;6338:18;6330:6;6327:30;6324:2;;;6370:1;6367;6360:12;6324:2;6398:63;6453:7;6444:6;6433:9;6429:22;6398:63;:::i;:::-;6388:73;;6250:221;6538:2;6527:9;6523:18;6510:32;6569:18;6561:6;6558:30;6555:2;;;6601:1;6598;6591:12;6555:2;6629:63;6684:7;6675:6;6664:9;6660:22;6629:63;:::i;:::-;6619:73;;6481:221;5948:761;;;;;:::o;6715:1070::-;6830:6;6838;6846;6854;6862;6911:3;6899:9;6890:7;6886:23;6882:33;6879:2;;;6928:1;6925;6918:12;6879:2;6999:1;6988:9;6984:17;6971:31;7029:18;7021:6;7018:30;7015:2;;;7061:1;7058;7051:12;7015:2;7089:63;7144:7;7135:6;7124:9;7120:22;7089:63;:::i;:::-;7079:73;;6942:220;7229:2;7218:9;7214:18;7201:32;7260:18;7252:6;7249:30;7246:2;;;7292:1;7289;7282:12;7246:2;7320:63;7375:7;7366:6;7355:9;7351:22;7320:63;:::i;:::-;7310:73;;7172:221;7432:2;7458:53;7503:7;7494:6;7483:9;7479:22;7458:53;:::i;:::-;7448:63;;7403:118;7560:2;7586:53;7631:7;7622:6;7611:9;7607:22;7586:53;:::i;:::-;7576:63;;7531:118;7688:3;7715:53;7760:7;7751:6;7740:9;7736:22;7715:53;:::i;:::-;7705:63;;7659:119;6869:916;;;;;;;;:::o;7791:262::-;7850:6;7899:2;7887:9;7878:7;7874:23;7870:32;7867:2;;;7915:1;7912;7905:12;7867:2;7958:1;7983:53;8028:7;8019:6;8008:9;8004:22;7983:53;:::i;:::-;7973:63;;7929:117;7857:196;;;;:::o;8059:142::-;8162:32;8188:5;8162:32;:::i;:::-;8157:3;8150:45;8140:61;;:::o;8207:118::-;8294:24;8312:5;8294:24;:::i;:::-;8289:3;8282:37;8272:53;;:::o;8331:109::-;8412:21;8427:5;8412:21;:::i;:::-;8407:3;8400:34;8390:50;;:::o;8446:157::-;8551:45;8571:24;8589:5;8571:24;:::i;:::-;8551:45;:::i;:::-;8546:3;8539:58;8529:74;;:::o;8609:360::-;8695:3;8723:38;8755:5;8723:38;:::i;:::-;8777:70;8840:6;8835:3;8777:70;:::i;:::-;8770:77;;8856:52;8901:6;8896:3;8889:4;8882:5;8878:16;8856:52;:::i;:::-;8933:29;8955:6;8933:29;:::i;:::-;8928:3;8924:39;8917:46;;8699:270;;;;;:::o;8975:364::-;9063:3;9091:39;9124:5;9091:39;:::i;:::-;9146:71;9210:6;9205:3;9146:71;:::i;:::-;9139:78;;9226:52;9271:6;9266:3;9259:4;9252:5;9248:16;9226:52;:::i;:::-;9303:29;9325:6;9303:29;:::i;:::-;9298:3;9294:39;9287:46;;9067:272;;;;;:::o;9345:377::-;9451:3;9479:39;9512:5;9479:39;:::i;:::-;9534:89;9616:6;9611:3;9534:89;:::i;:::-;9527:96;;9632:52;9677:6;9672:3;9665:4;9658:5;9654:16;9632:52;:::i;:::-;9709:6;9704:3;9700:16;9693:23;;9455:267;;;;;:::o;9728:366::-;9870:3;9891:67;9955:2;9950:3;9891:67;:::i;:::-;9884:74;;9967:93;10056:3;9967:93;:::i;:::-;10085:2;10080:3;10076:12;10069:19;;9874:220;;;:::o;10100:366::-;10242:3;10263:67;10327:2;10322:3;10263:67;:::i;:::-;10256:74;;10339:93;10428:3;10339:93;:::i;:::-;10457:2;10452:3;10448:12;10441:19;;10246:220;;;:::o;10472:366::-;10614:3;10635:67;10699:2;10694:3;10635:67;:::i;:::-;10628:74;;10711:93;10800:3;10711:93;:::i;:::-;10829:2;10824:3;10820:12;10813:19;;10618:220;;;:::o;10844:366::-;10986:3;11007:67;11071:2;11066:3;11007:67;:::i;:::-;11000:74;;11083:93;11172:3;11083:93;:::i;:::-;11201:2;11196:3;11192:12;11185:19;;10990:220;;;:::o;11216:366::-;11358:3;11379:67;11443:2;11438:3;11379:67;:::i;:::-;11372:74;;11455:93;11544:3;11455:93;:::i;:::-;11573:2;11568:3;11564:12;11557:19;;11362:220;;;:::o;11588:366::-;11730:3;11751:67;11815:2;11810:3;11751:67;:::i;:::-;11744:74;;11827:93;11916:3;11827:93;:::i;:::-;11945:2;11940:3;11936:12;11929:19;;11734:220;;;:::o;11960:366::-;12102:3;12123:67;12187:2;12182:3;12123:67;:::i;:::-;12116:74;;12199:93;12288:3;12199:93;:::i;:::-;12317:2;12312:3;12308:12;12301:19;;12106:220;;;:::o;12332:366::-;12474:3;12495:67;12559:2;12554:3;12495:67;:::i;:::-;12488:74;;12571:93;12660:3;12571:93;:::i;:::-;12689:2;12684:3;12680:12;12673:19;;12478:220;;;:::o;12704:366::-;12846:3;12867:67;12931:2;12926:3;12867:67;:::i;:::-;12860:74;;12943:93;13032:3;12943:93;:::i;:::-;13061:2;13056:3;13052:12;13045:19;;12850:220;;;:::o;13076:366::-;13218:3;13239:67;13303:2;13298:3;13239:67;:::i;:::-;13232:74;;13315:93;13404:3;13315:93;:::i;:::-;13433:2;13428:3;13424:12;13417:19;;13222:220;;;:::o;13448:366::-;13590:3;13611:67;13675:2;13670:3;13611:67;:::i;:::-;13604:74;;13687:93;13776:3;13687:93;:::i;:::-;13805:2;13800:3;13796:12;13789:19;;13594:220;;;:::o;13820:366::-;13962:3;13983:67;14047:2;14042:3;13983:67;:::i;:::-;13976:74;;14059:93;14148:3;14059:93;:::i;:::-;14177:2;14172:3;14168:12;14161:19;;13966:220;;;:::o;14192:366::-;14334:3;14355:67;14419:2;14414:3;14355:67;:::i;:::-;14348:74;;14431:93;14520:3;14431:93;:::i;:::-;14549:2;14544:3;14540:12;14533:19;;14338:220;;;:::o;14564:366::-;14706:3;14727:67;14791:2;14786:3;14727:67;:::i;:::-;14720:74;;14803:93;14892:3;14803:93;:::i;:::-;14921:2;14916:3;14912:12;14905:19;;14710:220;;;:::o;14936:366::-;15078:3;15099:67;15163:2;15158:3;15099:67;:::i;:::-;15092:74;;15175:93;15264:3;15175:93;:::i;:::-;15293:2;15288:3;15284:12;15277:19;;15082:220;;;:::o;15308:366::-;15450:3;15471:67;15535:2;15530:3;15471:67;:::i;:::-;15464:74;;15547:93;15636:3;15547:93;:::i;:::-;15665:2;15660:3;15656:12;15649:19;;15454:220;;;:::o;15680:366::-;15822:3;15843:67;15907:2;15902:3;15843:67;:::i;:::-;15836:74;;15919:93;16008:3;15919:93;:::i;:::-;16037:2;16032:3;16028:12;16021:19;;15826:220;;;:::o;16052:366::-;16194:3;16215:67;16279:2;16274:3;16215:67;:::i;:::-;16208:74;;16291:93;16380:3;16291:93;:::i;:::-;16409:2;16404:3;16400:12;16393:19;;16198:220;;;:::o;16424:366::-;16566:3;16587:67;16651:2;16646:3;16587:67;:::i;:::-;16580:74;;16663:93;16752:3;16663:93;:::i;:::-;16781:2;16776:3;16772:12;16765:19;;16570:220;;;:::o;16796:366::-;16938:3;16959:67;17023:2;17018:3;16959:67;:::i;:::-;16952:74;;17035:93;17124:3;17035:93;:::i;:::-;17153:2;17148:3;17144:12;17137:19;;16942:220;;;:::o;17168:366::-;17310:3;17331:67;17395:2;17390:3;17331:67;:::i;:::-;17324:74;;17407:93;17496:3;17407:93;:::i;:::-;17525:2;17520:3;17516:12;17509:19;;17314:220;;;:::o;17540:366::-;17682:3;17703:67;17767:2;17762:3;17703:67;:::i;:::-;17696:74;;17779:93;17868:3;17779:93;:::i;:::-;17897:2;17892:3;17888:12;17881:19;;17686:220;;;:::o;17912:366::-;18054:3;18075:67;18139:2;18134:3;18075:67;:::i;:::-;18068:74;;18151:93;18240:3;18151:93;:::i;:::-;18269:2;18264:3;18260:12;18253:19;;18058:220;;;:::o;18284:366::-;18426:3;18447:67;18511:2;18506:3;18447:67;:::i;:::-;18440:74;;18523:93;18612:3;18523:93;:::i;:::-;18641:2;18636:3;18632:12;18625:19;;18430:220;;;:::o;18656:366::-;18798:3;18819:67;18883:2;18878:3;18819:67;:::i;:::-;18812:74;;18895:93;18984:3;18895:93;:::i;:::-;19013:2;19008:3;19004:12;18997:19;;18802:220;;;:::o;19028:366::-;19170:3;19191:67;19255:2;19250:3;19191:67;:::i;:::-;19184:74;;19267:93;19356:3;19267:93;:::i;:::-;19385:2;19380:3;19376:12;19369:19;;19174:220;;;:::o;19400:366::-;19542:3;19563:67;19627:2;19622:3;19563:67;:::i;:::-;19556:74;;19639:93;19728:3;19639:93;:::i;:::-;19757:2;19752:3;19748:12;19741:19;;19546:220;;;:::o;19772:366::-;19914:3;19935:67;19999:2;19994:3;19935:67;:::i;:::-;19928:74;;20011:93;20100:3;20011:93;:::i;:::-;20129:2;20124:3;20120:12;20113:19;;19918:220;;;:::o;20144:366::-;20286:3;20307:67;20371:2;20366:3;20307:67;:::i;:::-;20300:74;;20383:93;20472:3;20383:93;:::i;:::-;20501:2;20496:3;20492:12;20485:19;;20290:220;;;:::o;20516:366::-;20658:3;20679:67;20743:2;20738:3;20679:67;:::i;:::-;20672:74;;20755:93;20844:3;20755:93;:::i;:::-;20873:2;20868:3;20864:12;20857:19;;20662:220;;;:::o;20888:366::-;21030:3;21051:67;21115:2;21110:3;21051:67;:::i;:::-;21044:74;;21127:93;21216:3;21127:93;:::i;:::-;21245:2;21240:3;21236:12;21229:19;;21034:220;;;:::o;21260:118::-;21347:24;21365:5;21347:24;:::i;:::-;21342:3;21335:37;21325:53;;:::o;21384:256::-;21496:3;21511:75;21582:3;21573:6;21511:75;:::i;:::-;21611:2;21606:3;21602:12;21595:19;;21631:3;21624:10;;21500:140;;;;:::o;21646:435::-;21826:3;21848:95;21939:3;21930:6;21848:95;:::i;:::-;21841:102;;21960:95;22051:3;22042:6;21960:95;:::i;:::-;21953:102;;22072:3;22065:10;;21830:251;;;;;:::o;22087:222::-;22180:4;22218:2;22207:9;22203:18;22195:26;;22231:71;22299:1;22288:9;22284:17;22275:6;22231:71;:::i;:::-;22185:124;;;;:::o;22315:254::-;22424:4;22462:2;22451:9;22447:18;22439:26;;22475:87;22559:1;22548:9;22544:17;22535:6;22475:87;:::i;:::-;22429:140;;;;:::o;22575:640::-;22770:4;22808:3;22797:9;22793:19;22785:27;;22822:71;22890:1;22879:9;22875:17;22866:6;22822:71;:::i;:::-;22903:72;22971:2;22960:9;22956:18;22947:6;22903:72;:::i;:::-;22985;23053:2;23042:9;23038:18;23029:6;22985:72;:::i;:::-;23104:9;23098:4;23094:20;23089:2;23078:9;23074:18;23067:48;23132:76;23203:4;23194:6;23132:76;:::i;:::-;23124:84;;22775:440;;;;;;;:::o;23221:210::-;23308:4;23346:2;23335:9;23331:18;23323:26;;23359:65;23421:1;23410:9;23406:17;23397:6;23359:65;:::i;:::-;23313:118;;;;:::o;23437:313::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:78;23738:4;23729:6;23665:78;:::i;:::-;23657:86;;23555:195;;;;:::o;23756:419::-;23922:4;23960:2;23949:9;23945:18;23937:26;;24009:9;24003:4;23999:20;23995:1;23984:9;23980:17;23973:47;24037:131;24163:4;24037:131;:::i;:::-;24029:139;;23927:248;;;:::o;24181:419::-;24347:4;24385:2;24374:9;24370:18;24362:26;;24434:9;24428:4;24424:20;24420:1;24409:9;24405:17;24398:47;24462:131;24588:4;24462:131;:::i;:::-;24454:139;;24352:248;;;:::o;24606:419::-;24772:4;24810:2;24799:9;24795:18;24787:26;;24859:9;24853:4;24849:20;24845:1;24834:9;24830:17;24823:47;24887:131;25013:4;24887:131;:::i;:::-;24879:139;;24777:248;;;:::o;25031:419::-;25197:4;25235:2;25224:9;25220:18;25212:26;;25284:9;25278:4;25274:20;25270:1;25259:9;25255:17;25248:47;25312:131;25438:4;25312:131;:::i;:::-;25304:139;;25202:248;;;:::o;25456:419::-;25622:4;25660:2;25649:9;25645:18;25637:26;;25709:9;25703:4;25699:20;25695:1;25684:9;25680:17;25673:47;25737:131;25863:4;25737:131;:::i;:::-;25729:139;;25627:248;;;:::o;25881:419::-;26047:4;26085:2;26074:9;26070:18;26062:26;;26134:9;26128:4;26124:20;26120:1;26109:9;26105:17;26098:47;26162:131;26288:4;26162:131;:::i;:::-;26154:139;;26052:248;;;:::o;26306:419::-;26472:4;26510:2;26499:9;26495:18;26487:26;;26559:9;26553:4;26549:20;26545:1;26534:9;26530:17;26523:47;26587:131;26713:4;26587:131;:::i;:::-;26579:139;;26477:248;;;:::o;26731:419::-;26897:4;26935:2;26924:9;26920:18;26912:26;;26984:9;26978:4;26974:20;26970:1;26959:9;26955:17;26948:47;27012:131;27138:4;27012:131;:::i;:::-;27004:139;;26902:248;;;:::o;27156:419::-;27322:4;27360:2;27349:9;27345:18;27337:26;;27409:9;27403:4;27399:20;27395:1;27384:9;27380:17;27373:47;27437:131;27563:4;27437:131;:::i;:::-;27429:139;;27327:248;;;:::o;27581:419::-;27747:4;27785:2;27774:9;27770:18;27762:26;;27834:9;27828:4;27824:20;27820:1;27809:9;27805:17;27798:47;27862:131;27988:4;27862:131;:::i;:::-;27854:139;;27752:248;;;:::o;28006:419::-;28172:4;28210:2;28199:9;28195:18;28187:26;;28259:9;28253:4;28249:20;28245:1;28234:9;28230:17;28223:47;28287:131;28413:4;28287:131;:::i;:::-;28279:139;;28177:248;;;:::o;28431:419::-;28597:4;28635:2;28624:9;28620:18;28612:26;;28684:9;28678:4;28674:20;28670:1;28659:9;28655:17;28648:47;28712:131;28838:4;28712:131;:::i;:::-;28704:139;;28602:248;;;:::o;28856:419::-;29022:4;29060:2;29049:9;29045:18;29037:26;;29109:9;29103:4;29099:20;29095:1;29084:9;29080:17;29073:47;29137:131;29263:4;29137:131;:::i;:::-;29129:139;;29027:248;;;:::o;29281:419::-;29447:4;29485:2;29474:9;29470:18;29462:26;;29534:9;29528:4;29524:20;29520:1;29509:9;29505:17;29498:47;29562:131;29688:4;29562:131;:::i;:::-;29554:139;;29452:248;;;:::o;29706:419::-;29872:4;29910:2;29899:9;29895:18;29887:26;;29959:9;29953:4;29949:20;29945:1;29934:9;29930:17;29923:47;29987:131;30113:4;29987:131;:::i;:::-;29979:139;;29877:248;;;:::o;30131:419::-;30297:4;30335:2;30324:9;30320:18;30312:26;;30384:9;30378:4;30374:20;30370:1;30359:9;30355:17;30348:47;30412:131;30538:4;30412:131;:::i;:::-;30404:139;;30302:248;;;:::o;30556:419::-;30722:4;30760:2;30749:9;30745:18;30737:26;;30809:9;30803:4;30799:20;30795:1;30784:9;30780:17;30773:47;30837:131;30963:4;30837:131;:::i;:::-;30829:139;;30727:248;;;:::o;30981:419::-;31147:4;31185:2;31174:9;31170:18;31162:26;;31234:9;31228:4;31224:20;31220:1;31209:9;31205:17;31198:47;31262:131;31388:4;31262:131;:::i;:::-;31254:139;;31152:248;;;:::o;31406:419::-;31572:4;31610:2;31599:9;31595:18;31587:26;;31659:9;31653:4;31649:20;31645:1;31634:9;31630:17;31623:47;31687:131;31813:4;31687:131;:::i;:::-;31679:139;;31577:248;;;:::o;31831:419::-;31997:4;32035:2;32024:9;32020:18;32012:26;;32084:9;32078:4;32074:20;32070:1;32059:9;32055:17;32048:47;32112:131;32238:4;32112:131;:::i;:::-;32104:139;;32002:248;;;:::o;32256:419::-;32422:4;32460:2;32449:9;32445:18;32437:26;;32509:9;32503:4;32499:20;32495:1;32484:9;32480:17;32473:47;32537:131;32663:4;32537:131;:::i;:::-;32529:139;;32427:248;;;:::o;32681:419::-;32847:4;32885:2;32874:9;32870:18;32862:26;;32934:9;32928:4;32924:20;32920:1;32909:9;32905:17;32898:47;32962:131;33088:4;32962:131;:::i;:::-;32954:139;;32852:248;;;:::o;33106:419::-;33272:4;33310:2;33299:9;33295:18;33287:26;;33359:9;33353:4;33349:20;33345:1;33334:9;33330:17;33323:47;33387:131;33513:4;33387:131;:::i;:::-;33379:139;;33277:248;;;:::o;33531:419::-;33697:4;33735:2;33724:9;33720:18;33712:26;;33784:9;33778:4;33774:20;33770:1;33759:9;33755:17;33748:47;33812:131;33938:4;33812:131;:::i;:::-;33804:139;;33702:248;;;:::o;33956:419::-;34122:4;34160:2;34149:9;34145:18;34137:26;;34209:9;34203:4;34199:20;34195:1;34184:9;34180:17;34173:47;34237:131;34363:4;34237:131;:::i;:::-;34229:139;;34127:248;;;:::o;34381:419::-;34547:4;34585:2;34574:9;34570:18;34562:26;;34634:9;34628:4;34624:20;34620:1;34609:9;34605:17;34598:47;34662:131;34788:4;34662:131;:::i;:::-;34654:139;;34552:248;;;:::o;34806:419::-;34972:4;35010:2;34999:9;34995:18;34987:26;;35059:9;35053:4;35049:20;35045:1;35034:9;35030:17;35023:47;35087:131;35213:4;35087:131;:::i;:::-;35079:139;;34977:248;;;:::o;35231:419::-;35397:4;35435:2;35424:9;35420:18;35412:26;;35484:9;35478:4;35474:20;35470:1;35459:9;35455:17;35448:47;35512:131;35638:4;35512:131;:::i;:::-;35504:139;;35402:248;;;:::o;35656:419::-;35822:4;35860:2;35849:9;35845:18;35837:26;;35909:9;35903:4;35899:20;35895:1;35884:9;35880:17;35873:47;35937:131;36063:4;35937:131;:::i;:::-;35929:139;;35827:248;;;:::o;36081:419::-;36247:4;36285:2;36274:9;36270:18;36262:26;;36334:9;36328:4;36324:20;36320:1;36309:9;36305:17;36298:47;36362:131;36488:4;36362:131;:::i;:::-;36354:139;;36252:248;;;:::o;36506:419::-;36672:4;36710:2;36699:9;36695:18;36687:26;;36759:9;36753:4;36749:20;36745:1;36734:9;36730:17;36723:47;36787:131;36913:4;36787:131;:::i;:::-;36779:139;;36677:248;;;:::o;36931:222::-;37024:4;37062:2;37051:9;37047:18;37039:26;;37075:71;37143:1;37132:9;37128:17;37119:6;37075:71;:::i;:::-;37029:124;;;;:::o;37159:129::-;37193:6;37220:20;;:::i;:::-;37210:30;;37249:33;37277:4;37269:6;37249:33;:::i;:::-;37200:88;;;:::o;37294:75::-;37327:6;37360:2;37354:9;37344:19;;37334:35;:::o;37375:307::-;37436:4;37526:18;37518:6;37515:30;37512:2;;;37548:18;;:::i;:::-;37512:2;37586:29;37608:6;37586:29;:::i;:::-;37578:37;;37670:4;37664;37660:15;37652:23;;37441:241;;;:::o;37688:308::-;37750:4;37840:18;37832:6;37829:30;37826:2;;;37862:18;;:::i;:::-;37826:2;37900:29;37922:6;37900:29;:::i;:::-;37892:37;;37984:4;37978;37974:15;37966:23;;37755:241;;;:::o;38002:98::-;38053:6;38087:5;38081:12;38071:22;;38060:40;;;:::o;38106:99::-;38158:6;38192:5;38186:12;38176:22;;38165:40;;;:::o;38211:168::-;38294:11;38328:6;38323:3;38316:19;38368:4;38363:3;38359:14;38344:29;;38306:73;;;;:::o;38385:169::-;38469:11;38503:6;38498:3;38491:19;38543:4;38538:3;38534:14;38519:29;;38481:73;;;;:::o;38560:148::-;38662:11;38699:3;38684:18;;38674:34;;;;:::o;38714:305::-;38754:3;38773:20;38791:1;38773:20;:::i;:::-;38768:25;;38807:20;38825:1;38807:20;:::i;:::-;38802:25;;38961:1;38893:66;38889:74;38886:1;38883:81;38880:2;;;38967:18;;:::i;:::-;38880:2;39011:1;39008;39004:9;38997:16;;38758:261;;;;:::o;39025:185::-;39065:1;39082:20;39100:1;39082:20;:::i;:::-;39077:25;;39116:20;39134:1;39116:20;:::i;:::-;39111:25;;39155:1;39145:2;;39160:18;;:::i;:::-;39145:2;39202:1;39199;39195:9;39190:14;;39067:143;;;;:::o;39216:348::-;39256:7;39279:20;39297:1;39279:20;:::i;:::-;39274:25;;39313:20;39331:1;39313:20;:::i;:::-;39308:25;;39501:1;39433:66;39429:74;39426:1;39423:81;39418:1;39411:9;39404:17;39400:105;39397:2;;;39508:18;;:::i;:::-;39397:2;39556:1;39553;39549:9;39538:20;;39264:300;;;;:::o;39570:191::-;39610:4;39630:20;39648:1;39630:20;:::i;:::-;39625:25;;39664:20;39682:1;39664:20;:::i;:::-;39659:25;;39703:1;39700;39697:8;39694:2;;;39708:18;;:::i;:::-;39694:2;39753:1;39750;39746:9;39738:17;;39615:146;;;;:::o;39767:96::-;39804:7;39833:24;39851:5;39833:24;:::i;:::-;39822:35;;39812:51;;;:::o;39869:104::-;39914:7;39943:24;39961:5;39943:24;:::i;:::-;39932:35;;39922:51;;;:::o;39979:90::-;40013:7;40056:5;40049:13;40042:21;40031:32;;40021:48;;;:::o;40075:77::-;40112:7;40141:5;40130:16;;40120:32;;;:::o;40158:149::-;40194:7;40234:66;40227:5;40223:78;40212:89;;40202:105;;;:::o;40313:126::-;40350:7;40390:42;40383:5;40379:54;40368:65;;40358:81;;;:::o;40445:77::-;40482:7;40511:5;40500:16;;40490:32;;;:::o;40528:154::-;40612:6;40607:3;40602;40589:30;40674:1;40665:6;40660:3;40656:16;40649:27;40579:103;;;:::o;40688:307::-;40756:1;40766:113;40780:6;40777:1;40774:13;40766:113;;;40865:1;40860:3;40856:11;40850:18;40846:1;40841:3;40837:11;40830:39;40802:2;40799:1;40795:10;40790:15;;40766:113;;;40897:6;40894:1;40891:13;40888:2;;;40977:1;40968:6;40963:3;40959:16;40952:27;40888:2;40737:258;;;;:::o;41001:320::-;41045:6;41082:1;41076:4;41072:12;41062:22;;41129:1;41123:4;41119:12;41150:18;41140:2;;41206:4;41198:6;41194:17;41184:27;;41140:2;41268;41260:6;41257:14;41237:18;41234:38;41231:2;;;41287:18;;:::i;:::-;41231:2;41052:269;;;;:::o;41327:281::-;41410:27;41432:4;41410:27;:::i;:::-;41402:6;41398:40;41540:6;41528:10;41525:22;41504:18;41492:10;41489:34;41486:62;41483:2;;;41551:18;;:::i;:::-;41483:2;41591:10;41587:2;41580:22;41370:238;;;:::o;41614:233::-;41653:3;41676:24;41694:5;41676:24;:::i;:::-;41667:33;;41722:66;41715:5;41712:77;41709:2;;;41792:18;;:::i;:::-;41709:2;41839:1;41832:5;41828:13;41821:20;;41657:190;;;:::o;41853:79::-;41892:7;41921:5;41910:16;;41900:32;;;:::o;41938:176::-;41970:1;41987:20;42005:1;41987:20;:::i;:::-;41982:25;;42021:20;42039:1;42021:20;:::i;:::-;42016:25;;42060:1;42050:2;;42065:18;;:::i;:::-;42050:2;42106:1;42103;42099:9;42094:14;;41972:142;;;;:::o;42120:180::-;42168:77;42165:1;42158:88;42265:4;42262:1;42255:15;42289:4;42286:1;42279:15;42306:180;42354:77;42351:1;42344:88;42451:4;42448:1;42441:15;42475:4;42472:1;42465:15;42492:180;42540:77;42537:1;42530:88;42637:4;42634:1;42627:15;42661:4;42658:1;42651:15;42678:180;42726:77;42723:1;42716:88;42823:4;42820:1;42813:15;42847:4;42844:1;42837:15;42864:102;42905:6;42956:2;42952:7;42947:2;42940:5;42936:14;42932:28;42922:38;;42912:54;;;:::o;42972:170::-;43112:22;43108:1;43100:6;43096:14;43089:46;43078:64;:::o;43148:179::-;43288:31;43284:1;43276:6;43272:14;43265:55;43254:73;:::o;43333:230::-;43473:34;43469:1;43461:6;43457:14;43450:58;43542:13;43537:2;43529:6;43525:15;43518:38;43439:124;:::o;43569:237::-;43709:34;43705:1;43697:6;43693:14;43686:58;43778:20;43773:2;43765:6;43761:15;43754:45;43675:131;:::o;43812:225::-;43952:34;43948:1;43940:6;43936:14;43929:58;44021:8;44016:2;44008:6;44004:15;43997:33;43918:119;:::o;44043:178::-;44183:30;44179:1;44171:6;44167:14;44160:54;44149:72;:::o;44227:223::-;44367:34;44363:1;44355:6;44351:14;44344:58;44436:6;44431:2;44423:6;44419:15;44412:31;44333:117;:::o;44456:175::-;44596:27;44592:1;44584:6;44580:14;44573:51;44562:69;:::o;44637:177::-;44777:29;44773:1;44765:6;44761:14;44754:53;44743:71;:::o;44820:231::-;44960:34;44956:1;44948:6;44944:14;44937:58;45029:14;45024:2;45016:6;45012:15;45005:39;44926:125;:::o;45057:166::-;45197:18;45193:1;45185:6;45181:14;45174:42;45163:60;:::o;45229:243::-;45369:34;45365:1;45357:6;45353:14;45346:58;45438:26;45433:2;45425:6;45421:15;45414:51;45335:137;:::o;45478:229::-;45618:34;45614:1;45606:6;45602:14;45595:58;45687:12;45682:2;45674:6;45670:15;45663:37;45584:123;:::o;45713:228::-;45853:34;45849:1;45841:6;45837:14;45830:58;45922:11;45917:2;45909:6;45905:15;45898:36;45819:122;:::o;45947:233::-;46087:34;46083:1;46075:6;46071:14;46064:58;46156:16;46151:2;46143:6;46139:15;46132:41;46053:127;:::o;46186:169::-;46326:21;46322:1;46314:6;46310:14;46303:45;46292:63;:::o;46361:182::-;46501:34;46497:1;46489:6;46485:14;46478:58;46467:76;:::o;46549:171::-;46689:23;46685:1;46677:6;46673:14;46666:47;46655:65;:::o;46726:231::-;46866:34;46862:1;46854:6;46850:14;46843:58;46935:14;46930:2;46922:6;46918:15;46911:39;46832:125;:::o;46963:182::-;47103:34;47099:1;47091:6;47087:14;47080:58;47069:76;:::o;47151:178::-;47291:30;47287:1;47279:6;47275:14;47268:54;47257:72;:::o;47335:228::-;47475:34;47471:1;47463:6;47459:14;47452:58;47544:11;47539:2;47531:6;47527:15;47520:36;47441:122;:::o;47569:178::-;47709:30;47705:1;47697:6;47693:14;47686:54;47675:72;:::o;47753:234::-;47893:34;47889:1;47881:6;47877:14;47870:58;47962:17;47957:2;47949:6;47945:15;47938:42;47859:128;:::o;47993:166::-;48133:18;48129:1;48121:6;48117:14;48110:42;48099:60;:::o;48165:220::-;48305:34;48301:1;48293:6;48289:14;48282:58;48374:3;48369:2;48361:6;48357:15;48350:28;48271:114;:::o;48391:172::-;48531:24;48527:1;48519:6;48515:14;48508:48;48497:66;:::o;48569:236::-;48709:34;48705:1;48697:6;48693:14;48686:58;48778:19;48773:2;48765:6;48761:15;48754:44;48675:130;:::o;48811:231::-;48951:34;48947:1;48939:6;48935:14;48928:58;49020:14;49015:2;49007:6;49003:15;48996:39;48917:125;:::o;49048:178::-;49188:30;49184:1;49176:6;49172:14;49165:54;49154:72;:::o;49232:163::-;49372:15;49368:1;49360:6;49356:14;49349:39;49338:57;:::o;49401:122::-;49474:24;49492:5;49474:24;:::i;:::-;49467:5;49464:35;49454:2;;49513:1;49510;49503:12;49454:2;49444:79;:::o;49529:116::-;49599:21;49614:5;49599:21;:::i;:::-;49592:5;49589:32;49579:2;;49635:1;49632;49625:12;49579:2;49569:76;:::o;49651:120::-;49723:23;49740:5;49723:23;:::i;:::-;49716:5;49713:34;49703:2;;49761:1;49758;49751:12;49703:2;49693:78;:::o;49777:122::-;49850:24;49868:5;49850:24;:::i;:::-;49843:5;49840:35;49830:2;;49889:1;49886;49879:12;49830:2;49820:79;:::o

Swarm Source

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