ETH Price: $3,256.91 (+2.25%)
Gas: 1 Gwei

Token

Club Name (SHORTCODE)
 

Overview

Max Total Supply

411 SHORTCODE

Holders

183

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jbondwagon.eth
Balance
4 SHORTCODE
0x9dfd400201b905dc343cf0eaae5f68f4da342b60
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Contract

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: Contract.sol
pragma solidity ^0.6.6;
pragma experimental ABIEncoderV2;

import "./ERC721.sol";
import "./Ownable.sol";

contract Contract is ERC721, Ownable {
    using SafeMath for uint256;

    string public PROVENANCE = "";
    string public LICENSE_TEXT = "";

    uint256 public constant price = 0.04 * 10**18;
    uint256 public constant presalePrice = 0.05 * 10**18;
    uint256 public constant MAX = 8888;

    uint256 public constant maxPurchase = 20;

    bool public saleIsActive = true;
    bool public presaleIsActive = true;
    bool licenseLocked = false;

    address payable user1 = 0x23992951637DE01651efeF536A0e13b4B04cc16B;
    address payable user2 = 0xffCF9020799B4f03A63E11260e8C2e75CEB5c505;
    uint256 user1Fraction = 765;
    uint256 user2Fraction = 35;

    mapping(uint256 => string) public names;

    uint256 public reserve = 222;

    event nameChange(address _by, uint256 _tokenId, string _name);
    event licenseIsLocked(string _licenseText);

    constructor() public ERC721("Club Name", "SHORTCODE") {}

    function withdraw() public onlyOwner {
        uint256 u1total = (address(this).balance * user1Fraction) / 1000;
        uint256 u2total = (address(this).balance * user2Fraction) / 1000;
        user1.transfer(u1total);
        user2.transfer(u2total);
        msg.sender.transfer(address(this).balance);
    }

    function reserveTokens(address _to, uint256 _reserveAmount)
        public
        onlyOwner
    {
        uint256 supply = totalSupply();
        require(
            _reserveAmount > 0 && _reserveAmount <= reserve,
            "Not enough reserve left for the team"
        );
        for (uint256 i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        reserve = reserve.sub(_reserveAmount);
    }

    function setProvenanceHash(string memory _provenanceHash) public onlyOwner {
        PROVENANCE = _provenanceHash;
    }

    function setBaseURI(string memory _baseURI) public onlyOwner {
        _setBaseURI(_baseURI);
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipPresaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function tokenLicense(uint256 _id) public view returns (string memory) {
        require(_id < totalSupply(), "Choose a NFT within range!");
        return LICENSE_TEXT;
    }

    function lockLicense() public onlyOwner {
        licenseLocked = true;
        emit licenseIsLocked(LICENSE_TEXT);
    }

    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked!");
        LICENSE_TEXT = _license;
    }

    function mint(uint256 _numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint NFT...");
        require(
            _numberOfTokens > 0 && _numberOfTokens <= maxPurchase,
            "Can only mint 20 tokens at a time!"
        );
        require(
            totalSupply().add(_numberOfTokens) <= MAX,
            "Not enough tokens available for minting..."
        );
        require(
            msg.value >= price.mul(_numberOfTokens),
            "Ether value sent is not enough..."
        );
        if (presaleIsActive) {
            require(
                msg.value >= presalePrice.mul(_numberOfTokens),
                "Ether value sent is not enough..."
            );
        } else {
            require(
                msg.value >= price.mul(_numberOfTokens),
                "Ether value sent is not enough..."
            );
        }

        for (uint256 i = 0; i < _numberOfTokens; i++) {
            uint256 mintIndex = totalSupply();
            if (totalSupply() < MAX) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }

    function changeName(uint256 _tokenId, string memory _name) public {
        require(
            ownerOf(_tokenId) == msg.sender,
            "Hey, your wallet doesn't own this NFT!"
        );
        require(sha256(bytes(_name)) != sha256(bytes(names[_tokenId])));
        names[_tokenId] = _name;

        emit nameChange(msg.sender, _tokenId, _name);
    }

    function viewName(uint256 _tokenId) public view returns (string memory) {
        require(_tokenId < totalSupply(), "Choose a NFT within range.");
        return names[_tokenId];
    }

    function namesOfOwners(address _owner)
        external
        view
        returns (string[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new string[](0);
        } else {
            string[] memory result = new string[](tokenCount);
            for (uint256 index = 0; index < tokenCount; index++) {
                result[index] = names[tokenOfOwnerByIndex(_owner, index)];
            }
            return result;
        }
    }
}

File 1 of 4: Context.sol
// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity >=0.6.0 <0.8.0;

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

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

File 3 of 4: ERC721.sol
// File: @openzeppelin/contracts/introspection/IERC165.sol

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity >=0.6.2 <0.8.0;

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity >=0.6.2 <0.8.0;

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity >=0.6.0 <0.8.0;

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

// File: @openzeppelin/contracts/introspection/ERC165.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity >=0.6.2 <0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/utils/EnumerableSet.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        require(
            set._values.length > index,
            "EnumerableSet: index out of bounds"
        );
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }
}

// File: @openzeppelin/contracts/utils/EnumerableMap.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;
        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(
        Map storage map,
        bytes32 key,
        bytes32 value
    ) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) {
            // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({_key: key, _value: value}));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) {
            // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key)
        private
        view
        returns (bool)
    {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

    /**
     * @dev Returns the key-value pair stored at position `index` in the map. O(1).
     *
     * Note that there are no guarantees on the ordering of entries inside the
     * array, and it may change when more entries are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Map storage map, uint256 index)
        private
        view
        returns (bytes32, bytes32)
    {
        require(
            map._entries.length > index,
            "EnumerableMap: index out of bounds"
        );

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key)
        private
        view
        returns (bool, bytes32)
    {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(
        Map storage map,
        bytes32 key,
        string memory errorMessage
    ) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToAddressMap storage map,
        uint256 key,
        address value
    ) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key)
        internal
        returns (bool)
    {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (bool)
    {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map)
        internal
        view
        returns (uint256)
    {
        return _length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToAddressMap storage map, uint256 index)
        internal
        view
        returns (uint256, address)
    {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (bool, address)
    {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToAddressMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (address) {
        return
            address(
                uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))
            );
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */

contract ERC721 is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping(address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        return
            _tokenOwners.get(
                tokenId,
                "ERC721: owner query for nonexistent token"
            );
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

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

    /**
     * @dev Returns the base URI set via {_setBaseURI}. This will be
     * automatically added as a prefix in {tokenURI} to each token's URI, or
     * to the token ID if no specific URI is set for that token ID.
     */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(
            abi.encodeWithSelector(
                IERC721Receiver(to).onERC721Received.selector,
                _msgSender(),
                from,
                tokenId,
                _data
            ),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

File 4 of 4: Ownable.sol
// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseIsLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"nameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"names","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"namesOfOwners","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":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveTokens","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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000404565b5060405180602001604052806000815250600c90805190602001906200005392919062000404565b506001600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055507323992951637de01651efef536a0e13b4b04cc16b600d60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ffcf9020799b4f03a63e11260e8c2e75ceb5c505600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102fd600f55602360105560de6012553480156200016c57600080fd5b506040518060400160405280600981526020017f436c7562204e616d6500000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f53484f5254434f44450000000000000000000000000000000000000000000000815250620001f16301ffc9a760e01b6200032460201b60201c565b81600690805190602001906200020992919062000404565b5080600790805190602001906200022292919062000404565b506200023b6380ac58cd60e01b6200032460201b60201c565b62000253635b5e139f60e01b6200032460201b60201c565b6200026b63780e9d6360e01b6200032460201b60201c565b505060006200027f620003fc60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200051f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038790620004ec565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200044757805160ff191683800117855562000478565b8280016001018555821562000478579182015b82811115620004775782518255916020019190600101906200045a565b5b5090506200048791906200048b565b5090565b5b80821115620004a65760008160009055506001016200048c565b5090565b6000620004b9601c836200050e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200050781620004aa565b9050919050565b600082825260208201905092915050565b61562c806200052f6000396000f3fe6080604052600436106102665760003560e01c806378cf19e911610144578063bf4702fc116100b6578063d49d51811161007a578063d49d518114610920578063d9b137b21461094b578063e985e9c514610988578063eb8d2444146109c5578063f2fde38b146109f0578063f81227d414610a1957610266565b8063bf4702fc1461083b578063c39cbef114610852578063c87b56dd1461087b578063cd3293de146108b8578063d33cceb1146108e357610266565b80639c3e72bd116101085780639c3e72bd1461074e578063a035b1fe14610779578063a0712d68146107a4578063a22cb465146107c0578063b09904b5146107e9578063b88d4fde1461081257610266565b806378cf19e9146106675780638462151c146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b1461072357610266565b806334918dfd116101dd57806355f804b3116101a157806355f804b3146105575780636352211e146105805780636373a6b1146105bd5780636c0360eb146105e857806370a0823114610613578063715018a61461065057610266565b806334918dfd146104865780633ccfd60b1461049d57806342842e0e146104b45780634622ab03146104dd5780634f6ccce71461051a57610266565b8063109695231161022f578063109695231461036457806318160ddd1461038d5780631b868d00146103b857806323b872dd146103f55780632f745c591461041e57806330f72cd41461045b57610266565b80620e7fa81461026b57806301ffc9a71461029657806306fdde03146102d3578063081812fc146102fe578063095ea7b31461033b575b600080fd5b34801561027757600080fd5b50610280610a30565b60405161028d9190615274565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613d89565b610a3b565b6040516102ca9190614e35565b60405180910390f35b3480156102df57600080fd5b506102e8610aa2565b6040516102f59190614e50565b60405180910390f35b34801561030a57600080fd5b5061032560048036038101906103209190613e1c565b610b44565b6040516103329190614d4c565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613d24565b610bc9565b005b34801561037057600080fd5b5061038b60048036038101906103869190613ddb565b610ce1565b005b34801561039957600080fd5b506103a2610d77565b6040516103af9190615274565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613e1c565b610d88565b6040516103ec9190614e50565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613c1e565b610e86565b005b34801561042a57600080fd5b5061044560048036038101906104409190613d24565b610ee6565b6040516104529190615274565b60405180910390f35b34801561046757600080fd5b50610470610f41565b60405161047d9190614e35565b60405180910390f35b34801561049257600080fd5b5061049b610f54565b005b3480156104a957600080fd5b506104b2610ffc565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613c1e565b6111bd565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e1c565b6111dd565b6040516105119190614e50565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613e1c565b61128d565b60405161054e9190615274565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613ddb565b6112b0565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613e1c565b611338565b6040516105b49190614d4c565b60405180910390f35b3480156105c957600080fd5b506105d261136f565b6040516105df9190614e50565b60405180910390f35b3480156105f457600080fd5b506105fd61140d565b60405161060a9190614e50565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613bb9565b6114af565b6040516106479190615274565b60405180910390f35b34801561065c57600080fd5b5061066561156e565b005b34801561067357600080fd5b5061068e60048036038101906106899190613d24565b6116ab565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613bb9565b6117c9565b6040516106c49190614e13565b60405180910390f35b3480156106d957600080fd5b506106e26118c2565b6040516106ef9190614d4c565b60405180910390f35b34801561070457600080fd5b5061070d6118ec565b60405161071a9190614e50565b60405180910390f35b34801561072f57600080fd5b5061073861198e565b6040516107459190615274565b60405180910390f35b34801561075a57600080fd5b50610763611993565b6040516107709190614e50565b60405180910390f35b34801561078557600080fd5b5061078e611a31565b60405161079b9190615274565b60405180910390f35b6107be60048036038101906107b99190613e1c565b611a3c565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613ce8565b611cad565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ddb565b611e2e565b005b34801561081e57600080fd5b5061083960048036038101906108349190613c6d565b611f1a565b005b34801561084757600080fd5b50610850611f7c565b005b34801561085e57600080fd5b5061087960048036038101906108749190613e45565b61204d565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613e1c565b6121e7565b6040516108af9190614e50565b60405180910390f35b3480156108c457600080fd5b506108cd61236a565b6040516108da9190615274565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613bb9565b612370565b6040516109179190614df1565b60405180910390f35b34801561092c57600080fd5b5061093561251d565b6040516109429190615274565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613e1c565b612523565b60405161097f9190614e50565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613be2565b612610565b6040516109bc9190614e35565b60405180910390f35b3480156109d157600080fd5b506109da6126a4565b6040516109e79190614e35565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190613bb9565b6126b7565b005b348015610a2557600080fd5b50610a2e612863565b005b66b1a2bc2ec5000081565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b4f8261290b565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590615114565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd482611338565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c906151b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c64612928565b73ffffffffffffffffffffffffffffffffffffffff161480610c935750610c9281610c8d612928565b612610565b5b610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990615034565b60405180910390fd5b610cdc8383612930565b505050565b610ce9612928565b73ffffffffffffffffffffffffffffffffffffffff16610d076118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490615134565b60405180910390fd5b80600b9080519060200190610d739291906139f6565b5050565b6000610d8360026129e9565b905090565b6060610d92610d77565b8210610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90615174565b60405180910390fd5b601160008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b50505050509050919050565b610e97610e91612928565b826129fe565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906151d4565b60405180910390fd5b610ee1838383612adc565b505050565b6000610f3982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf390919063ffffffff16565b905092915050565b600d60019054906101000a900460ff1681565b610f5c612928565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b611004612928565b73ffffffffffffffffffffffffffffffffffffffff166110226118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90615134565b60405180910390fd5b60006103e8600f5447028161108957fe5b04905060006103e860105447028161109d57fe5b049050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611108573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611171573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111b8573d6000803e3d6000fd5b505050565b6111d883838360405180602001604052806000815250611f1a565b505050565b60116020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b505050505081565b6000806112a4836002612d0d90919063ffffffff16565b50905080915050919050565b6112b8612928565b73ffffffffffffffffffffffffffffffffffffffff166112d66118c2565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390615134565b60405180910390fd5b61133581612d39565b50565b6000611368826040518060600160405280602981526020016155ce602991396002612d539092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790615054565b60405180910390fd5b611567600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d72565b9050919050565b611576612928565b73ffffffffffffffffffffffffffffffffffffffff166115946118c2565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116b3612928565b73ffffffffffffffffffffffffffffffffffffffff166116d16118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615134565b60405180910390fd5b6000611731610d77565b905060008211801561174557506012548211155b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90614eb4565b60405180910390fd5b60005b828110156117a85761179b84828401612d87565b8080600101915050611787565b506117be82601254612da590919063ffffffff16565b601281905550505050565b606060006117d6836114af565b9050600081141561183157600067ffffffffffffffff811180156117f957600080fd5b506040519080825280602002602001820160405280156118285781602001602082028036833780820191505090505b509150506118bd565b60608167ffffffffffffffff8111801561184a57600080fd5b506040519080825280602002602001820160405280156118795781602001602082028036833780820191505090505b50905060005b828110156118b6576118918582610ee6565b82828151811061189d57fe5b602002602001018181525050808060010191505061187f565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b601481565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b668e1bc9bf04000081565b600d60009054906101000a900460ff16611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290615234565b60405180910390fd5b600081118015611a9c575060148111155b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614fd4565b60405180910390fd5b6122b8611af882611aea610d77565b612df590919063ffffffff16565b1115611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090615074565b60405180910390fd5b611b5381668e1bc9bf040000612e4a90919063ffffffff16565b341015611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90615214565b60405180910390fd5b600d60019054906101000a900460ff1615611c0b57611bc48166b1a2bc2ec50000612e4a90919063ffffffff16565b341015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90615214565b60405180910390fd5b611c68565b611c2581668e1bc9bf040000612e4a90919063ffffffff16565b341015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90615214565b60405180910390fd5b5b60005b81811015611ca9576000611c7d610d77565b90506122b8611c8a610d77565b1015611c9b57611c9a3382612d87565b5b508080600101915050611c6b565b5050565b611cb5612928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614f94565b60405180910390fd5b8060056000611d30612928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd612928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e229190614e35565b60405180910390a35050565b611e36612928565b73ffffffffffffffffffffffffffffffffffffffff16611e546118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190615134565b60405180910390fd5b60001515600d60029054906101000a900460ff16151514611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790615254565b60405180910390fd5b80600c9080519060200190611f169291906139f6565b5050565b611f2b611f25612928565b836129fe565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61906151d4565b60405180910390fd5b611f7684848484612eba565b50505050565b611f84612928565b73ffffffffffffffffffffffffffffffffffffffff16611fa26118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90615134565b60405180910390fd5b6001600d60026101000a81548160ff0219169083151502179055507ff27a6fa5c2c9783f2c131f659c2119106077b81db9f21c76357aa819ad314f7e600c6040516120439190614e72565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff1661206d83611338565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614f54565b60405180910390fd5b6002601160008481526020019081526020016000206040516120e59190614d11565b602060405180830381855afa158015612102573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121259190613d60565b6002826040516121359190614cfa565b602060405180830381855afa158015612152573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121759190613d60565b141561218057600080fd5b806011600084815260200190815260200160002090805190602001906121a79291906139f6565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a3383836040516121db93929190614db3565b60405180910390a15050565b60606121f28261290b565b612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222890615194565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905060606122eb61140d565b9050600081511415612301578192505050612365565b60008251111561233657808260405160200161231e929190614d28565b60405160208183030381529060405292505050612365565b8061234085612f16565b604051602001612351929190614d28565b604051602081830303815290604052925050505b919050565b60125481565b6060600061237d836114af565b905060008114156123dd57600067ffffffffffffffff811180156123a057600080fd5b506040519080825280602002602001820160405280156123d457816020015b60608152602001906001900390816123bf5790505b50915050612518565b60608167ffffffffffffffff811180156123f657600080fd5b5060405190808252806020026020018201604052801561242a57816020015b60608152602001906001900390816124155790505b50905060005b8281101561251157601160006124468784610ee6565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124e85780601f106124bd576101008083540402835291602001916124e8565b820191906000526020600020905b8154815290600101906020018083116124cb57829003601f168201915b50505050508282815181106124f957fe5b60200260200101819052508080600101915050612430565b5080925050505b919050565b6122b881565b606061252d610d77565b821061256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906150b4565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126045780601f106125d957610100808354040283529160200191612604565b820191906000526020600020905b8154815290600101906020018083116125e757829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6126bf612928565b73ffffffffffffffffffffffffffffffffffffffff166126dd6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61286b612928565b73ffffffffffffffffffffffffffffffffffffffff166128896118c2565b73ffffffffffffffffffffffffffffffffffffffff16146128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600061292182600261305d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a383611338565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f782600001613077565b9050919050565b6000612a098261290b565b612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f90615014565b60405180910390fd5b6000612a5383611338565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac257508373ffffffffffffffffffffffffffffffffffffffff16612aaa84610b44565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad35750612ad28185612610565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611338565b73ffffffffffffffffffffffffffffffffffffffff1614612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615154565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614f74565b60405180910390fd5b612bcd838383613088565b612bd8600082612930565b612c2981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061308d90919063ffffffff16565b50612c7b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b50612c92818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d0283600001836130f6565b60001c905092915050565b600080600080612d208660000186613163565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612d4f9291906139f6565b5050565b6000612d66846000018460001b846131e6565b60001c90509392505050565b6000612d8082600001613277565b9050919050565b612da1828260405180602001604052806000815250613288565b5050565b600082821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190614fb4565b60405180910390fd5b818303905092915050565b600080828401905083811015612e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3790614f34565b60405180910390fd5b8091505092915050565b600080831415612e5d5760009050612eb4565b6000828402905082848281612e6e57fe5b0414612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906150f4565b60405180910390fd5b809150505b92915050565b612ec5848484612adc565b612ed1848484846132e3565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614ed4565b60405180910390fd5b50505050565b60606000821415612f5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f88578080600101915050600a8281612f8057fe5b049150612f66565b60608167ffffffffffffffff81118015612fa157600080fd5b506040519080825280601f01601f191660200182016040528015612fd45781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461305057600a8481612ff557fe5b0660300160f81b8282806001900393508151811061300f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161304857fe5b049350612fe3565b819450505050505b919050565b600061306f836000018360001b613447565b905092915050565b600081600001805490509050919050565b505050565b600061309f836000018360001b61346a565b905092915050565b60006130b9836000018360001b613552565b905092915050565b60006130ed846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6135c2565b90509392505050565b600081836000018054905011613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614e94565b60405180910390fd5b82600001828154811061315057fe5b9060005260206000200154905092915050565b600080828460000180549050116131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a690615094565b60405180910390fd5b60008460000184815481106131c057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f9190614e50565b60405180910390fd5b5084600001600182038154811061325b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613292838361369e565b61329f60008484846132e3565b6132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d590614ed4565b60405180910390fd5b505050565b60006133048473ffffffffffffffffffffffffffffffffffffffff1661382c565b613311576001905061343f565b60606133d863150b7a0260e01b613326612928565b88878760405160240161333c9493929190614d67565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161559c603291398773ffffffffffffffffffffffffffffffffffffffff1661383f9092919063ffffffff16565b90506000818060200190518101906133f09190613db2565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461354657600060018203905060006001866000018054905003905060008660000182815481106134b557fe5b90600052602060002001549050808760000184815481106134d257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061350a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061354c565b60009150505b92915050565b600061355e8383613857565b6135b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506135bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561366957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613697565b8285600001600183038154811061367c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906150d4565b60405180910390fd5b6137178161290b565b15613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e90614f14565b60405180910390fd5b61376360008383613088565b6137b481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b506137cb818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061384e848460008561387a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614ff4565b60405180910390fd5b6138c88561382c565b613907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fe906151f4565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516139319190614cfa565b60006040518083038185875af1925050503d806000811461396e576040519150601f19603f3d011682016040523d82523d6000602084013e613973565b606091505b509150915061398382828661398f565b92505050949350505050565b6060831561399f578290506139ef565b6000835111156139b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e69190614e50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a3757805160ff1916838001178555613a65565b82800160010185558215613a65579182015b82811115613a64578251825591602001919060010190613a49565b5b509050613a729190613a76565b5090565b5b80821115613a8f576000816000905550600101613a77565b5090565b600081359050613aa281615528565b92915050565b600081359050613ab78161553f565b92915050565b600081519050613acc81615556565b92915050565b600081359050613ae18161556d565b92915050565b600081519050613af68161556d565b92915050565b600082601f830112613b0d57600080fd5b8135613b20613b1b826152bc565b61528f565b91508082526020830160208301858383011115613b3c57600080fd5b613b478382846154d5565b50505092915050565b600082601f830112613b6157600080fd5b8135613b74613b6f826152e8565b61528f565b91508082526020830160208301858383011115613b9057600080fd5b613b9b8382846154d5565b50505092915050565b600081359050613bb381615584565b92915050565b600060208284031215613bcb57600080fd5b6000613bd984828501613a93565b91505092915050565b60008060408385031215613bf557600080fd5b6000613c0385828601613a93565b9250506020613c1485828601613a93565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c4186828701613a93565b9350506020613c5286828701613a93565b9250506040613c6386828701613ba4565b9150509250925092565b60008060008060808587031215613c8357600080fd5b6000613c9187828801613a93565b9450506020613ca287828801613a93565b9350506040613cb387828801613ba4565b925050606085013567ffffffffffffffff811115613cd057600080fd5b613cdc87828801613afc565b91505092959194509250565b60008060408385031215613cfb57600080fd5b6000613d0985828601613a93565b9250506020613d1a85828601613aa8565b9150509250929050565b60008060408385031215613d3757600080fd5b6000613d4585828601613a93565b9250506020613d5685828601613ba4565b9150509250929050565b600060208284031215613d7257600080fd5b6000613d8084828501613abd565b91505092915050565b600060208284031215613d9b57600080fd5b6000613da984828501613ad2565b91505092915050565b600060208284031215613dc457600080fd5b6000613dd284828501613ae7565b91505092915050565b600060208284031215613ded57600080fd5b600082013567ffffffffffffffff811115613e0757600080fd5b613e1384828501613b50565b91505092915050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613ba4565b91505092915050565b60008060408385031215613e5857600080fd5b6000613e6685828601613ba4565b925050602083013567ffffffffffffffff811115613e8357600080fd5b613e8f85828601613b50565b9150509250929050565b6000613ea583836140cc565b905092915050565b6000613eb98383614cdc565b60208301905092915050565b613ece8161549f565b82525050565b613edd81615421565b82525050565b613eec8161540f565b82525050565b6000613efd8261535e565b613f0781856153a4565b935083602082028501613f1985615314565b8060005b85811015613f555784840389528151613f368582613e99565b9450613f418361538a565b925060208a01995050600181019050613f1d565b50829750879550505050505092915050565b6000613f7282615369565b613f7c81856153b5565b9350613f8783615324565b8060005b83811015613fb8578151613f9f8882613ead565b9750613faa83615397565b925050600181019050613f8b565b5085935050505092915050565b613fce81615433565b82525050565b6000613fdf82615374565b613fe981856153c6565b9350613ff98185602086016154e4565b61400281615517565b840191505092915050565b600061401882615374565b61402281856153d7565b93506140328185602086016154e4565b80840191505092915050565b60008154600181166000811461405b5760018114614080576140c4565b607f600283041661406c81876153d7565b955060ff19831686528086019350506140c4565b6002820461408e81876153d7565b955061409985615334565b60005b828110156140bb5781548189015260018201915060208101905061409c565b82880195505050505b505092915050565b60006140d78261537f565b6140e181856153e2565b93506140f18185602086016154e4565b6140fa81615517565b840191505092915050565b60006141108261537f565b61411a81856153f3565b935061412a8185602086016154e4565b61413381615517565b840191505092915050565b60006141498261537f565b6141538185615404565b93506141638185602086016154e4565b80840191505092915050565b60008154600181166000811461418c57600181146141b2576141f6565b607f600283041661419d81876153f3565b955060ff1983168652602086019350506141f6565b600282046141c081876153f3565b95506141cb85615349565b60005b828110156141ed578154818901526001820191506020810190506141ce565b80880195505050505b505092915050565b600061420b6022836153f3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142716024836153f3565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008301527f7465616d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142d76032836153f3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061433d6026836153f3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3601c836153f3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143e3601b836153f3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006144236026836153f3565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204e46542100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144896024836153f3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ef6019836153f3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452f601e836153f3565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456f6022836153f3565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d56026836153f3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061463b602c836153f3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146a16038836153f3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614707602a836153f3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061476d602a836153f3565b91507f4e6f7420656e6f75676820746f6b656e7320617661696c61626c6520666f722060008301527f6d696e74696e672e2e2e000000000000000000000000000000000000000000006020830152604082019050919050565b60006147d36022836153f3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614839601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e6765210000000000006000830152602082019050919050565b60006148796020836153f3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148b96021836153f3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061491f602c836153f3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149856020836153f3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149c56029836153f3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a2b601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e67652e0000000000006000830152602082019050919050565b6000614a6b602f836153f3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614ad16021836153f3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b376031836153f3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b9d601d836153f3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bdd6021836153f3565b91507f45746865722076616c75652073656e74206973206e6f7420656e6f7567682e2e60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436022836153f3565b91507f53616c65206d7573742062652061637469766520746f206d696e74204e46542e60008301527f2e2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca96017836153f3565b91507f4c6963656e736520616c7265616479206c6f636b6564210000000000000000006000830152602082019050919050565b614ce581615495565b82525050565b614cf481615495565b82525050565b6000614d06828461400d565b915081905092915050565b6000614d1d828461403e565b915081905092915050565b6000614d34828561413e565b9150614d40828461413e565b91508190509392505050565b6000602082019050614d616000830184613ee3565b92915050565b6000608082019050614d7c6000830187613ed4565b614d896020830186613ee3565b614d966040830185614ceb565b8181036060830152614da88184613fd4565b905095945050505050565b6000606082019050614dc86000830186613ec5565b614dd56020830185614ceb565b8181036040830152614de78184614105565b9050949350505050565b60006020820190508181036000830152614e0b8184613ef2565b905092915050565b60006020820190508181036000830152614e2d8184613f67565b905092915050565b6000602082019050614e4a6000830184613fc5565b92915050565b60006020820190508181036000830152614e6a8184614105565b905092915050565b60006020820190508181036000830152614e8c818461416f565b905092915050565b60006020820190508181036000830152614ead816141fe565b9050919050565b60006020820190508181036000830152614ecd81614264565b9050919050565b60006020820190508181036000830152614eed816142ca565b9050919050565b60006020820190508181036000830152614f0d81614330565b9050919050565b60006020820190508181036000830152614f2d81614396565b9050919050565b60006020820190508181036000830152614f4d816143d6565b9050919050565b60006020820190508181036000830152614f6d81614416565b9050919050565b60006020820190508181036000830152614f8d8161447c565b9050919050565b60006020820190508181036000830152614fad816144e2565b9050919050565b60006020820190508181036000830152614fcd81614522565b9050919050565b60006020820190508181036000830152614fed81614562565b9050919050565b6000602082019050818103600083015261500d816145c8565b9050919050565b6000602082019050818103600083015261502d8161462e565b9050919050565b6000602082019050818103600083015261504d81614694565b9050919050565b6000602082019050818103600083015261506d816146fa565b9050919050565b6000602082019050818103600083015261508d81614760565b9050919050565b600060208201905081810360008301526150ad816147c6565b9050919050565b600060208201905081810360008301526150cd8161482c565b9050919050565b600060208201905081810360008301526150ed8161486c565b9050919050565b6000602082019050818103600083015261510d816148ac565b9050919050565b6000602082019050818103600083015261512d81614912565b9050919050565b6000602082019050818103600083015261514d81614978565b9050919050565b6000602082019050818103600083015261516d816149b8565b9050919050565b6000602082019050818103600083015261518d81614a1e565b9050919050565b600060208201905081810360008301526151ad81614a5e565b9050919050565b600060208201905081810360008301526151cd81614ac4565b9050919050565b600060208201905081810360008301526151ed81614b2a565b9050919050565b6000602082019050818103600083015261520d81614b90565b9050919050565b6000602082019050818103600083015261522d81614bd0565b9050919050565b6000602082019050818103600083015261524d81614c36565b9050919050565b6000602082019050818103600083015261526d81614c9c565b9050919050565b60006020820190506152896000830184614ceb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152b257600080fd5b8060405250919050565b600067ffffffffffffffff8211156152d357600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152ff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061541a82615475565b9050919050565b600061542c82615475565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154aa826154b1565b9050919050565b60006154bc826154c3565b9050919050565b60006154ce82615475565b9050919050565b82818337600083830152505050565b60005b838110156155025780820151818401526020810190506154e7565b83811115615511576000848401525b50505050565b6000601f19601f8301169050919050565b6155318161540f565b811461553c57600080fd5b50565b61554881615433565b811461555357600080fd5b50565b61555f8161543f565b811461556a57600080fd5b50565b61557681615449565b811461558157600080fd5b50565b61558d81615495565b811461559857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212204efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106102665760003560e01c806378cf19e911610144578063bf4702fc116100b6578063d49d51811161007a578063d49d518114610920578063d9b137b21461094b578063e985e9c514610988578063eb8d2444146109c5578063f2fde38b146109f0578063f81227d414610a1957610266565b8063bf4702fc1461083b578063c39cbef114610852578063c87b56dd1461087b578063cd3293de146108b8578063d33cceb1146108e357610266565b80639c3e72bd116101085780639c3e72bd1461074e578063a035b1fe14610779578063a0712d68146107a4578063a22cb465146107c0578063b09904b5146107e9578063b88d4fde1461081257610266565b806378cf19e9146106675780638462151c146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b1461072357610266565b806334918dfd116101dd57806355f804b3116101a157806355f804b3146105575780636352211e146105805780636373a6b1146105bd5780636c0360eb146105e857806370a0823114610613578063715018a61461065057610266565b806334918dfd146104865780633ccfd60b1461049d57806342842e0e146104b45780634622ab03146104dd5780634f6ccce71461051a57610266565b8063109695231161022f578063109695231461036457806318160ddd1461038d5780631b868d00146103b857806323b872dd146103f55780632f745c591461041e57806330f72cd41461045b57610266565b80620e7fa81461026b57806301ffc9a71461029657806306fdde03146102d3578063081812fc146102fe578063095ea7b31461033b575b600080fd5b34801561027757600080fd5b50610280610a30565b60405161028d9190615274565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613d89565b610a3b565b6040516102ca9190614e35565b60405180910390f35b3480156102df57600080fd5b506102e8610aa2565b6040516102f59190614e50565b60405180910390f35b34801561030a57600080fd5b5061032560048036038101906103209190613e1c565b610b44565b6040516103329190614d4c565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613d24565b610bc9565b005b34801561037057600080fd5b5061038b60048036038101906103869190613ddb565b610ce1565b005b34801561039957600080fd5b506103a2610d77565b6040516103af9190615274565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613e1c565b610d88565b6040516103ec9190614e50565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613c1e565b610e86565b005b34801561042a57600080fd5b5061044560048036038101906104409190613d24565b610ee6565b6040516104529190615274565b60405180910390f35b34801561046757600080fd5b50610470610f41565b60405161047d9190614e35565b60405180910390f35b34801561049257600080fd5b5061049b610f54565b005b3480156104a957600080fd5b506104b2610ffc565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613c1e565b6111bd565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e1c565b6111dd565b6040516105119190614e50565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613e1c565b61128d565b60405161054e9190615274565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613ddb565b6112b0565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613e1c565b611338565b6040516105b49190614d4c565b60405180910390f35b3480156105c957600080fd5b506105d261136f565b6040516105df9190614e50565b60405180910390f35b3480156105f457600080fd5b506105fd61140d565b60405161060a9190614e50565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613bb9565b6114af565b6040516106479190615274565b60405180910390f35b34801561065c57600080fd5b5061066561156e565b005b34801561067357600080fd5b5061068e60048036038101906106899190613d24565b6116ab565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613bb9565b6117c9565b6040516106c49190614e13565b60405180910390f35b3480156106d957600080fd5b506106e26118c2565b6040516106ef9190614d4c565b60405180910390f35b34801561070457600080fd5b5061070d6118ec565b60405161071a9190614e50565b60405180910390f35b34801561072f57600080fd5b5061073861198e565b6040516107459190615274565b60405180910390f35b34801561075a57600080fd5b50610763611993565b6040516107709190614e50565b60405180910390f35b34801561078557600080fd5b5061078e611a31565b60405161079b9190615274565b60405180910390f35b6107be60048036038101906107b99190613e1c565b611a3c565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613ce8565b611cad565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ddb565b611e2e565b005b34801561081e57600080fd5b5061083960048036038101906108349190613c6d565b611f1a565b005b34801561084757600080fd5b50610850611f7c565b005b34801561085e57600080fd5b5061087960048036038101906108749190613e45565b61204d565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613e1c565b6121e7565b6040516108af9190614e50565b60405180910390f35b3480156108c457600080fd5b506108cd61236a565b6040516108da9190615274565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613bb9565b612370565b6040516109179190614df1565b60405180910390f35b34801561092c57600080fd5b5061093561251d565b6040516109429190615274565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613e1c565b612523565b60405161097f9190614e50565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613be2565b612610565b6040516109bc9190614e35565b60405180910390f35b3480156109d157600080fd5b506109da6126a4565b6040516109e79190614e35565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190613bb9565b6126b7565b005b348015610a2557600080fd5b50610a2e612863565b005b66b1a2bc2ec5000081565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b4f8261290b565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590615114565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd482611338565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c906151b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c64612928565b73ffffffffffffffffffffffffffffffffffffffff161480610c935750610c9281610c8d612928565b612610565b5b610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990615034565b60405180910390fd5b610cdc8383612930565b505050565b610ce9612928565b73ffffffffffffffffffffffffffffffffffffffff16610d076118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490615134565b60405180910390fd5b80600b9080519060200190610d739291906139f6565b5050565b6000610d8360026129e9565b905090565b6060610d92610d77565b8210610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90615174565b60405180910390fd5b601160008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b50505050509050919050565b610e97610e91612928565b826129fe565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906151d4565b60405180910390fd5b610ee1838383612adc565b505050565b6000610f3982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf390919063ffffffff16565b905092915050565b600d60019054906101000a900460ff1681565b610f5c612928565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b611004612928565b73ffffffffffffffffffffffffffffffffffffffff166110226118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90615134565b60405180910390fd5b60006103e8600f5447028161108957fe5b04905060006103e860105447028161109d57fe5b049050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611108573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611171573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111b8573d6000803e3d6000fd5b505050565b6111d883838360405180602001604052806000815250611f1a565b505050565b60116020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b505050505081565b6000806112a4836002612d0d90919063ffffffff16565b50905080915050919050565b6112b8612928565b73ffffffffffffffffffffffffffffffffffffffff166112d66118c2565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390615134565b60405180910390fd5b61133581612d39565b50565b6000611368826040518060600160405280602981526020016155ce602991396002612d539092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790615054565b60405180910390fd5b611567600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d72565b9050919050565b611576612928565b73ffffffffffffffffffffffffffffffffffffffff166115946118c2565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116b3612928565b73ffffffffffffffffffffffffffffffffffffffff166116d16118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615134565b60405180910390fd5b6000611731610d77565b905060008211801561174557506012548211155b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90614eb4565b60405180910390fd5b60005b828110156117a85761179b84828401612d87565b8080600101915050611787565b506117be82601254612da590919063ffffffff16565b601281905550505050565b606060006117d6836114af565b9050600081141561183157600067ffffffffffffffff811180156117f957600080fd5b506040519080825280602002602001820160405280156118285781602001602082028036833780820191505090505b509150506118bd565b60608167ffffffffffffffff8111801561184a57600080fd5b506040519080825280602002602001820160405280156118795781602001602082028036833780820191505090505b50905060005b828110156118b6576118918582610ee6565b82828151811061189d57fe5b602002602001018181525050808060010191505061187f565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b601481565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b668e1bc9bf04000081565b600d60009054906101000a900460ff16611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290615234565b60405180910390fd5b600081118015611a9c575060148111155b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614fd4565b60405180910390fd5b6122b8611af882611aea610d77565b612df590919063ffffffff16565b1115611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090615074565b60405180910390fd5b611b5381668e1bc9bf040000612e4a90919063ffffffff16565b341015611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90615214565b60405180910390fd5b600d60019054906101000a900460ff1615611c0b57611bc48166b1a2bc2ec50000612e4a90919063ffffffff16565b341015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90615214565b60405180910390fd5b611c68565b611c2581668e1bc9bf040000612e4a90919063ffffffff16565b341015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90615214565b60405180910390fd5b5b60005b81811015611ca9576000611c7d610d77565b90506122b8611c8a610d77565b1015611c9b57611c9a3382612d87565b5b508080600101915050611c6b565b5050565b611cb5612928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614f94565b60405180910390fd5b8060056000611d30612928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd612928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e229190614e35565b60405180910390a35050565b611e36612928565b73ffffffffffffffffffffffffffffffffffffffff16611e546118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190615134565b60405180910390fd5b60001515600d60029054906101000a900460ff16151514611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790615254565b60405180910390fd5b80600c9080519060200190611f169291906139f6565b5050565b611f2b611f25612928565b836129fe565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61906151d4565b60405180910390fd5b611f7684848484612eba565b50505050565b611f84612928565b73ffffffffffffffffffffffffffffffffffffffff16611fa26118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90615134565b60405180910390fd5b6001600d60026101000a81548160ff0219169083151502179055507ff27a6fa5c2c9783f2c131f659c2119106077b81db9f21c76357aa819ad314f7e600c6040516120439190614e72565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff1661206d83611338565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614f54565b60405180910390fd5b6002601160008481526020019081526020016000206040516120e59190614d11565b602060405180830381855afa158015612102573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121259190613d60565b6002826040516121359190614cfa565b602060405180830381855afa158015612152573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121759190613d60565b141561218057600080fd5b806011600084815260200190815260200160002090805190602001906121a79291906139f6565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a3383836040516121db93929190614db3565b60405180910390a15050565b60606121f28261290b565b612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222890615194565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905060606122eb61140d565b9050600081511415612301578192505050612365565b60008251111561233657808260405160200161231e929190614d28565b60405160208183030381529060405292505050612365565b8061234085612f16565b604051602001612351929190614d28565b604051602081830303815290604052925050505b919050565b60125481565b6060600061237d836114af565b905060008114156123dd57600067ffffffffffffffff811180156123a057600080fd5b506040519080825280602002602001820160405280156123d457816020015b60608152602001906001900390816123bf5790505b50915050612518565b60608167ffffffffffffffff811180156123f657600080fd5b5060405190808252806020026020018201604052801561242a57816020015b60608152602001906001900390816124155790505b50905060005b8281101561251157601160006124468784610ee6565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124e85780601f106124bd576101008083540402835291602001916124e8565b820191906000526020600020905b8154815290600101906020018083116124cb57829003601f168201915b50505050508282815181106124f957fe5b60200260200101819052508080600101915050612430565b5080925050505b919050565b6122b881565b606061252d610d77565b821061256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906150b4565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126045780601f106125d957610100808354040283529160200191612604565b820191906000526020600020905b8154815290600101906020018083116125e757829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6126bf612928565b73ffffffffffffffffffffffffffffffffffffffff166126dd6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61286b612928565b73ffffffffffffffffffffffffffffffffffffffff166128896118c2565b73ffffffffffffffffffffffffffffffffffffffff16146128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600061292182600261305d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a383611338565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f782600001613077565b9050919050565b6000612a098261290b565b612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f90615014565b60405180910390fd5b6000612a5383611338565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac257508373ffffffffffffffffffffffffffffffffffffffff16612aaa84610b44565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad35750612ad28185612610565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611338565b73ffffffffffffffffffffffffffffffffffffffff1614612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615154565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614f74565b60405180910390fd5b612bcd838383613088565b612bd8600082612930565b612c2981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061308d90919063ffffffff16565b50612c7b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b50612c92818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d0283600001836130f6565b60001c905092915050565b600080600080612d208660000186613163565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612d4f9291906139f6565b5050565b6000612d66846000018460001b846131e6565b60001c90509392505050565b6000612d8082600001613277565b9050919050565b612da1828260405180602001604052806000815250613288565b5050565b600082821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190614fb4565b60405180910390fd5b818303905092915050565b600080828401905083811015612e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3790614f34565b60405180910390fd5b8091505092915050565b600080831415612e5d5760009050612eb4565b6000828402905082848281612e6e57fe5b0414612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906150f4565b60405180910390fd5b809150505b92915050565b612ec5848484612adc565b612ed1848484846132e3565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614ed4565b60405180910390fd5b50505050565b60606000821415612f5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f88578080600101915050600a8281612f8057fe5b049150612f66565b60608167ffffffffffffffff81118015612fa157600080fd5b506040519080825280601f01601f191660200182016040528015612fd45781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461305057600a8481612ff557fe5b0660300160f81b8282806001900393508151811061300f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161304857fe5b049350612fe3565b819450505050505b919050565b600061306f836000018360001b613447565b905092915050565b600081600001805490509050919050565b505050565b600061309f836000018360001b61346a565b905092915050565b60006130b9836000018360001b613552565b905092915050565b60006130ed846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6135c2565b90509392505050565b600081836000018054905011613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614e94565b60405180910390fd5b82600001828154811061315057fe5b9060005260206000200154905092915050565b600080828460000180549050116131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a690615094565b60405180910390fd5b60008460000184815481106131c057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f9190614e50565b60405180910390fd5b5084600001600182038154811061325b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613292838361369e565b61329f60008484846132e3565b6132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d590614ed4565b60405180910390fd5b505050565b60006133048473ffffffffffffffffffffffffffffffffffffffff1661382c565b613311576001905061343f565b60606133d863150b7a0260e01b613326612928565b88878760405160240161333c9493929190614d67565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161559c603291398773ffffffffffffffffffffffffffffffffffffffff1661383f9092919063ffffffff16565b90506000818060200190518101906133f09190613db2565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461354657600060018203905060006001866000018054905003905060008660000182815481106134b557fe5b90600052602060002001549050808760000184815481106134d257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061350a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061354c565b60009150505b92915050565b600061355e8383613857565b6135b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506135bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561366957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613697565b8285600001600183038154811061367c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906150d4565b60405180910390fd5b6137178161290b565b15613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e90614f14565b60405180910390fd5b61376360008383613088565b6137b481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b506137cb818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061384e848460008561387a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614ff4565b60405180910390fd5b6138c88561382c565b613907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fe906151f4565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516139319190614cfa565b60006040518083038185875af1925050503d806000811461396e576040519150601f19603f3d011682016040523d82523d6000602084013e613973565b606091505b509150915061398382828661398f565b92505050949350505050565b6060831561399f578290506139ef565b6000835111156139b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e69190614e50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a3757805160ff1916838001178555613a65565b82800160010185558215613a65579182015b82811115613a64578251825591602001919060010190613a49565b5b509050613a729190613a76565b5090565b5b80821115613a8f576000816000905550600101613a77565b5090565b600081359050613aa281615528565b92915050565b600081359050613ab78161553f565b92915050565b600081519050613acc81615556565b92915050565b600081359050613ae18161556d565b92915050565b600081519050613af68161556d565b92915050565b600082601f830112613b0d57600080fd5b8135613b20613b1b826152bc565b61528f565b91508082526020830160208301858383011115613b3c57600080fd5b613b478382846154d5565b50505092915050565b600082601f830112613b6157600080fd5b8135613b74613b6f826152e8565b61528f565b91508082526020830160208301858383011115613b9057600080fd5b613b9b8382846154d5565b50505092915050565b600081359050613bb381615584565b92915050565b600060208284031215613bcb57600080fd5b6000613bd984828501613a93565b91505092915050565b60008060408385031215613bf557600080fd5b6000613c0385828601613a93565b9250506020613c1485828601613a93565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c4186828701613a93565b9350506020613c5286828701613a93565b9250506040613c6386828701613ba4565b9150509250925092565b60008060008060808587031215613c8357600080fd5b6000613c9187828801613a93565b9450506020613ca287828801613a93565b9350506040613cb387828801613ba4565b925050606085013567ffffffffffffffff811115613cd057600080fd5b613cdc87828801613afc565b91505092959194509250565b60008060408385031215613cfb57600080fd5b6000613d0985828601613a93565b9250506020613d1a85828601613aa8565b9150509250929050565b60008060408385031215613d3757600080fd5b6000613d4585828601613a93565b9250506020613d5685828601613ba4565b9150509250929050565b600060208284031215613d7257600080fd5b6000613d8084828501613abd565b91505092915050565b600060208284031215613d9b57600080fd5b6000613da984828501613ad2565b91505092915050565b600060208284031215613dc457600080fd5b6000613dd284828501613ae7565b91505092915050565b600060208284031215613ded57600080fd5b600082013567ffffffffffffffff811115613e0757600080fd5b613e1384828501613b50565b91505092915050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613ba4565b91505092915050565b60008060408385031215613e5857600080fd5b6000613e6685828601613ba4565b925050602083013567ffffffffffffffff811115613e8357600080fd5b613e8f85828601613b50565b9150509250929050565b6000613ea583836140cc565b905092915050565b6000613eb98383614cdc565b60208301905092915050565b613ece8161549f565b82525050565b613edd81615421565b82525050565b613eec8161540f565b82525050565b6000613efd8261535e565b613f0781856153a4565b935083602082028501613f1985615314565b8060005b85811015613f555784840389528151613f368582613e99565b9450613f418361538a565b925060208a01995050600181019050613f1d565b50829750879550505050505092915050565b6000613f7282615369565b613f7c81856153b5565b9350613f8783615324565b8060005b83811015613fb8578151613f9f8882613ead565b9750613faa83615397565b925050600181019050613f8b565b5085935050505092915050565b613fce81615433565b82525050565b6000613fdf82615374565b613fe981856153c6565b9350613ff98185602086016154e4565b61400281615517565b840191505092915050565b600061401882615374565b61402281856153d7565b93506140328185602086016154e4565b80840191505092915050565b60008154600181166000811461405b5760018114614080576140c4565b607f600283041661406c81876153d7565b955060ff19831686528086019350506140c4565b6002820461408e81876153d7565b955061409985615334565b60005b828110156140bb5781548189015260018201915060208101905061409c565b82880195505050505b505092915050565b60006140d78261537f565b6140e181856153e2565b93506140f18185602086016154e4565b6140fa81615517565b840191505092915050565b60006141108261537f565b61411a81856153f3565b935061412a8185602086016154e4565b61413381615517565b840191505092915050565b60006141498261537f565b6141538185615404565b93506141638185602086016154e4565b80840191505092915050565b60008154600181166000811461418c57600181146141b2576141f6565b607f600283041661419d81876153f3565b955060ff1983168652602086019350506141f6565b600282046141c081876153f3565b95506141cb85615349565b60005b828110156141ed578154818901526001820191506020810190506141ce565b80880195505050505b505092915050565b600061420b6022836153f3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142716024836153f3565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008301527f7465616d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142d76032836153f3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061433d6026836153f3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3601c836153f3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143e3601b836153f3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006144236026836153f3565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204e46542100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144896024836153f3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ef6019836153f3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452f601e836153f3565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456f6022836153f3565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d56026836153f3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061463b602c836153f3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146a16038836153f3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614707602a836153f3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061476d602a836153f3565b91507f4e6f7420656e6f75676820746f6b656e7320617661696c61626c6520666f722060008301527f6d696e74696e672e2e2e000000000000000000000000000000000000000000006020830152604082019050919050565b60006147d36022836153f3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614839601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e6765210000000000006000830152602082019050919050565b60006148796020836153f3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148b96021836153f3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061491f602c836153f3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149856020836153f3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149c56029836153f3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a2b601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e67652e0000000000006000830152602082019050919050565b6000614a6b602f836153f3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614ad16021836153f3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b376031836153f3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b9d601d836153f3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bdd6021836153f3565b91507f45746865722076616c75652073656e74206973206e6f7420656e6f7567682e2e60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436022836153f3565b91507f53616c65206d7573742062652061637469766520746f206d696e74204e46542e60008301527f2e2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca96017836153f3565b91507f4c6963656e736520616c7265616479206c6f636b6564210000000000000000006000830152602082019050919050565b614ce581615495565b82525050565b614cf481615495565b82525050565b6000614d06828461400d565b915081905092915050565b6000614d1d828461403e565b915081905092915050565b6000614d34828561413e565b9150614d40828461413e565b91508190509392505050565b6000602082019050614d616000830184613ee3565b92915050565b6000608082019050614d7c6000830187613ed4565b614d896020830186613ee3565b614d966040830185614ceb565b8181036060830152614da88184613fd4565b905095945050505050565b6000606082019050614dc86000830186613ec5565b614dd56020830185614ceb565b8181036040830152614de78184614105565b9050949350505050565b60006020820190508181036000830152614e0b8184613ef2565b905092915050565b60006020820190508181036000830152614e2d8184613f67565b905092915050565b6000602082019050614e4a6000830184613fc5565b92915050565b60006020820190508181036000830152614e6a8184614105565b905092915050565b60006020820190508181036000830152614e8c818461416f565b905092915050565b60006020820190508181036000830152614ead816141fe565b9050919050565b60006020820190508181036000830152614ecd81614264565b9050919050565b60006020820190508181036000830152614eed816142ca565b9050919050565b60006020820190508181036000830152614f0d81614330565b9050919050565b60006020820190508181036000830152614f2d81614396565b9050919050565b60006020820190508181036000830152614f4d816143d6565b9050919050565b60006020820190508181036000830152614f6d81614416565b9050919050565b60006020820190508181036000830152614f8d8161447c565b9050919050565b60006020820190508181036000830152614fad816144e2565b9050919050565b60006020820190508181036000830152614fcd81614522565b9050919050565b60006020820190508181036000830152614fed81614562565b9050919050565b6000602082019050818103600083015261500d816145c8565b9050919050565b6000602082019050818103600083015261502d8161462e565b9050919050565b6000602082019050818103600083015261504d81614694565b9050919050565b6000602082019050818103600083015261506d816146fa565b9050919050565b6000602082019050818103600083015261508d81614760565b9050919050565b600060208201905081810360008301526150ad816147c6565b9050919050565b600060208201905081810360008301526150cd8161482c565b9050919050565b600060208201905081810360008301526150ed8161486c565b9050919050565b6000602082019050818103600083015261510d816148ac565b9050919050565b6000602082019050818103600083015261512d81614912565b9050919050565b6000602082019050818103600083015261514d81614978565b9050919050565b6000602082019050818103600083015261516d816149b8565b9050919050565b6000602082019050818103600083015261518d81614a1e565b9050919050565b600060208201905081810360008301526151ad81614a5e565b9050919050565b600060208201905081810360008301526151cd81614ac4565b9050919050565b600060208201905081810360008301526151ed81614b2a565b9050919050565b6000602082019050818103600083015261520d81614b90565b9050919050565b6000602082019050818103600083015261522d81614bd0565b9050919050565b6000602082019050818103600083015261524d81614c36565b9050919050565b6000602082019050818103600083015261526d81614c9c565b9050919050565b60006020820190506152896000830184614ceb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152b257600080fd5b8060405250919050565b600067ffffffffffffffff8211156152d357600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152ff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061541a82615475565b9050919050565b600061542c82615475565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154aa826154b1565b9050919050565b60006154bc826154c3565b9050919050565b60006154ce82615475565b9050919050565b82818337600083830152505050565b60005b838110156155025780820151818401526020810190506154e7565b83811115615511576000848401525b50505050565b6000601f19601f8301169050919050565b6155318161540f565b811461553c57600080fd5b50565b61554881615433565b811461555357600080fd5b50565b61555f8161543f565b811461556a57600080fd5b50565b61557681615449565b811461558157600080fd5b50565b61558d81615495565b811461559857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212204efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d64736f6c634300060c0033

Deployed Bytecode Sourcemap

113:5462:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;320:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9529:200:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53016:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56024:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55523:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1849:122:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54951:211:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4860:187:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57083:376:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54663:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;509:34:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2088:89;;;;;;;;;;;;;:::i;:::-;;1068:316;;;;;;;;;;;;;:::i;:::-;;57530:185:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;800:39:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55239:222:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1979:101:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52660:289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;192:29:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54482:97:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52290:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1809:148:3;;;;;;;;;;;;;:::i;:::-;;1392:449:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1158:87:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53185:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;422:40:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;228:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;268:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3328:1147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56404:327:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3145:175:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57786:365:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3013:124:1;;;;;;;;;;;;;:::i;:::-;;4483:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53360:879:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;848:28:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5055:517;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;379:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2827:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56802:214:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;471:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2112:281:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2185:92:1;;;;;;;;;;;;;:::i;:::-;;320:52;359:13;320:52;:::o;9529:200:2:-;9659:4;9688:20;:33;9709:11;9688:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9681:40;;9529:200;;;:::o;53016:100::-;53070:13;53103:5;53096:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53016:100;:::o;56024:308::-;56145:7;56192:16;56200:7;56192;:16::i;:::-;56170:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;56300:15;:24;56316:7;56300:24;;;;;;;;;;;;;;;;;;;;;56293:31;;56024:308;;;:::o;55523:435::-;55604:13;55620:23;55635:7;55620:14;:23::i;:::-;55604:39;;55668:5;55662:11;;:2;:11;;;;55654:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55762:5;55746:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;55788:44;55812:5;55819:12;:10;:12::i;:::-;55788:23;:44::i;:::-;55746:86;55724:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;55929:21;55938:2;55942:7;55929:8;:21::i;:::-;55523:435;;;:::o;1849:122:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1948:15:1::1;1935:10;:28;;;;;;;;;;;;:::i;:::-;;1849:122:::0;:::o;54951:211:2:-;55012:7;55133:21;:12;:19;:21::i;:::-;55126:28;;54951:211;:::o;4860:187:1:-;4917:13;4962;:11;:13::i;:::-;4951:8;:24;4943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5024:5;:15;5030:8;5024:15;;;;;;;;;;;5017:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4860:187;;;:::o;57083:376:2:-;57292:41;57311:12;:10;:12::i;:::-;57325:7;57292:18;:41::i;:::-;57270:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;57423:28;57433:4;57439:2;57443:7;57423:9;:28::i;:::-;57083:376;;;:::o;54663:212::-;54805:7;54837:30;54861:5;54837:13;:20;54851:5;54837:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;54830:37;;54663:212;;;;:::o;509:34:1:-;;;;;;;;;;;;;:::o;2088:89::-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2157:12:1::1;;;;;;;;;;;2156:13;2141:12;;:28;;;;;;;;;;;;;;;;;;2088:89::o:0;1068:316::-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1116:15:1::1;1176:4;1159:13;;1135:21;:37;1134:46;;;;;;1116:64;;1191:15;1251:4;1234:13;;1210:21;:37;1209:46;;;;;;1191:64;;1266:5;;;;;;;;;;;:14;;:23;1281:7;1266:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1300:5;;;;;;;;;;;:14;;:23;1315:7;1300:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1334:10;:19;;:42;1354:21;1334:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1449:1:3;;1068:316:1:o:0;57530:185:2:-;57668:39;57685:4;57691:2;57695:7;57668:39;;;;;;;;;;;;:16;:39::i;:::-;57530:185;;;:::o;800:39:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55239:222:2:-;55359:7;55385:15;55406:22;55422:5;55406:12;:15;;:22;;;;:::i;:::-;55384:44;;;55446:7;55439:14;;;55239:222;;;:::o;1979:101:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2051:21:1::1;2063:8;2051:11;:21::i;:::-;1979:101:::0;:::o;52660:289:2:-;52777:7;52822:119;52857:7;52822:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;52802:139;;52660:289;;;:::o;192:29:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54482:97:2:-;54530:13;54563:8;54556:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54482:97;:::o;52290:308::-;52407:7;52471:1;52454:19;;:5;:19;;;;52432:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52561:29;:13;:20;52575:5;52561:20;;;;;;;;;;;;;;;:27;:29::i;:::-;52554:36;;52290:308;;;:::o;1809:148:3:-;1389:12;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1916:1:::1;1879:40;;1900:6;;;;;;;;;;;1879:40;;;;;;;;;;;;1947:1;1930:6;;:19;;;;;;;;;;;;;;;;;;1809:148::o:0;1392:449:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1503:14:1::1;1520:13;:11;:13::i;:::-;1503:30;;1583:1;1566:14;:18;:47;;;;;1606:7;;1588:14;:25;;1566:47;1544:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;1693:9;1688:98;1712:14;1708:1;:18;1688:98;;;1748:26;1758:3;1772:1;1763:6;:10;1748:9;:26::i;:::-;1728:3;;;;;;;1688:98;;;;1806:27;1818:14;1806:7;;:11;;:27;;;;:::i;:::-;1796:7;:37;;;;1449:1:3;1392:449:1::0;;:::o;2285:534::-;2374:16;2408:18;2429:17;2439:6;2429:9;:17::i;:::-;2408:38;;2475:1;2461:10;:15;2457:355;;;2514:1;2500:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:23;;;;;2457:355;2549:23;2589:10;2575:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2549:51;;2615:13;2643:130;2667:10;2659:5;:18;2643:130;;;2723:34;2743:6;2751:5;2723:19;:34::i;:::-;2707:6;2714:5;2707:13;;;;;;;;;;;;;:50;;;;;2679:7;;;;;;;2643:130;;;2794:6;2787:13;;;;;2285:534;;;;:::o;1158:87:3:-;1204:7;1231:6;;;;;;;;;;;1224:13;;1158:87;:::o;53185:104:2:-;53241:13;53274:7;53267:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53185:104;:::o;422:40:1:-;460:2;422:40;:::o;228:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;268:45::-;300:13;268:45;:::o;3328:1147::-;3401:12;;;;;;;;;;;3393:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3503:1;3485:15;:19;:53;;;;;460:2;3508:15;:30;;3485:53;3463:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;409:4;3633:34;3651:15;3633:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:41;;3611:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;3790:26;3800:15;300:13;3790:9;;:26;;;;:::i;:::-;3777:9;:39;;3755:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;3892:15;;;;;;;;;;;3888:356;;;3963:33;3980:15;359:13;3963:16;;:33;;;;:::i;:::-;3950:9;:46;;3924:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:356;;;4137:26;4147:15;300:13;4137:9;;:26;;;;:::i;:::-;4124:9;:39;;4098:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:356;4261:9;4256:212;4280:15;4276:1;:19;4256:212;;;4317:17;4337:13;:11;:13::i;:::-;4317:33;;409:4;4369:13;:11;:13::i;:::-;:19;4365:92;;;4409:32;4419:10;4431:9;4409;:32::i;:::-;4365:92;4256:212;4297:3;;;;;;;4256:212;;;;3328:1147;:::o;56404:327:2:-;56551:12;:10;:12::i;:::-;56539:24;;:8;:24;;;;56531:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56651:8;56606:18;:32;56625:12;:10;:12::i;:::-;56606:32;;;;;;;;;;;;;;;:42;56639:8;56606:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;56704:8;56675:48;;56690:12;:10;:12::i;:::-;56675:48;;;56714:8;56675:48;;;;;;:::i;:::-;;;;;;;;56404:327;;:::o;3145:175:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:5:1::1;3228:22;;:13;;;;;;;;;;;:22;;;3220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3304:8;3289:12;:23;;;;;;;;;;;;:::i;:::-;;3145:175:::0;:::o;57786:365:2:-;57975:41;57994:12;:10;:12::i;:::-;58008:7;57975:18;:41::i;:::-;57953:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;58104:39;58118:4;58124:2;58128:7;58137:5;58104:13;:39::i;:::-;57786:365;;;;:::o;3013:124:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3080:4:1::1;3064:13;;:20;;;;;;;;;;;;;;;;;;3100:29;3116:12;3100:29;;;;;;:::i;:::-;;;;;;;;3013:124::o:0;4483:369::-;4603:10;4582:31;;:17;4590:8;4582:7;:17::i;:::-;:31;;;4560:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;4722:30;4735:5;:15;4741:8;4735:15;;;;;;;;;;;4722:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4698:20;4711:5;4698:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4690:63;;;;;;4782:5;4764;:15;4770:8;4764:15;;;;;;;;;;;:23;;;;;;;;;;;;:::i;:::-;;4805:39;4816:10;4828:8;4838:5;4805:39;;;;;;;;:::i;:::-;;;;;;;;4483:369;;:::o;53360:879:2:-;53478:13;53531:16;53539:7;53531;:16::i;:::-;53509:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53635:23;53661:10;:19;53672:7;53661:19;;;;;;;;;;;53635:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53691:18;53712:9;:7;:9::i;:::-;53691:30;;53819:1;53803:4;53797:18;:23;53793:72;;;53844:9;53837:16;;;;;;53793:72;53995:1;53975:9;53969:23;:27;53965:108;;;54044:4;54050:9;54027:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54013:48;;;;;;53965:108;54205:4;54211:18;:7;:16;:18::i;:::-;54188:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54174:57;;;;53360:879;;;;:::o;848:28:1:-;;;;:::o;5055:517::-;5144:15;5177:18;5198:17;5208:6;5198:9;:17::i;:::-;5177:38;;5244:1;5230:10;:15;5226:339;;;5282:1;5269:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5262:22;;;;;5226:339;5317:22;5355:10;5342:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5317:49;;5386:13;5381:145;5413:10;5405:5;:18;5381:145;;;5469:5;:41;5475:34;5495:6;5503:5;5475:19;:34::i;:::-;5469:41;;;;;;;;;;;5453:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;5460:5;5453:13;;;;;;;;;;;;;:57;;;;5425:7;;;;;;;5381:145;;;;5547:6;5540:13;;;;5055:517;;;;:::o;379:34::-;409:4;379:34;:::o;2827:178::-;2883:13;2923;:11;:13::i;:::-;2917:3;:19;2909:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:12;2978:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2827:178;;;:::o;56802:214:2:-;56944:4;56973:18;:25;56992:5;56973:25;;;;;;;;;;;;;;;:35;56999:8;56973:35;;;;;;;;;;;;;;;;;;;;;;;;;56966:42;;56802:214;;;;:::o;471:31:1:-;;;;;;;;;;;;;:::o;2112:281:3:-;1389:12;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2235:1:::1;2215:22;;:8;:22;;;;2193:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2348:8;2319:38;;2340:6;;;;;;;;;;;2319:38;;;;;;;;;;;;2377:8;2368:6;;:17;;;;;;;;;;;;;;;;;;2112:281:::0;:::o;2185:92:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:12:1::1;;;;;;;;;;;2256:13;2241:12;;:28;;;;;;;;;;;;;;;;;;2185:92::o:0;59698:127:2:-;59763:4;59787:30;59809:7;59787:12;:21;;:30;;;;:::i;:::-;59780:37;;59698:127;;;:::o;632:106:0:-;685:15;720:10;713:17;;632:106;:::o;66112:192:2:-;66214:2;66187:15;:24;66203:7;66187:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66270:7;66266:2;66232:46;;66241:23;66256:7;66241:14;:23::i;:::-;66232:46;;;;;;;;;;;;66112:192;;:::o;45346:155::-;45442:7;45474:19;45482:3;:10;;45474:7;:19::i;:::-;45467:26;;45346:155;;;:::o;59992:459::-;60121:4;60165:16;60173:7;60165;:16::i;:::-;60143:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;60264:13;60280:23;60295:7;60280:14;:23::i;:::-;60264:39;;60333:5;60322:16;;:7;:16;;;:64;;;;60379:7;60355:31;;:20;60367:7;60355:11;:20::i;:::-;:31;;;60322:64;:120;;;;60403:39;60427:5;60434:7;60403:23;:39::i;:::-;60322:120;60314:129;;;59992:459;;;;:::o;63303:670::-;63476:4;63449:31;;:23;63464:7;63449:14;:23::i;:::-;:31;;;63427:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;63600:1;63586:16;;:2;:16;;;;63578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63656:39;63677:4;63683:2;63687:7;63656:20;:39::i;:::-;63760:29;63777:1;63781:7;63760:8;:29::i;:::-;63802:35;63829:7;63802:13;:19;63816:4;63802:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;63848:30;63870:7;63848:13;:17;63862:2;63848:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;63891:29;63908:7;63917:2;63891:12;:16;;:29;;;;;:::i;:::-;;63957:7;63953:2;63938:27;;63947:4;63938:27;;;;;;;;;;;;63303:670;;;:::o;36788:169::-;36886:7;36926:22;36930:3;:10;;36942:5;36926:3;:22::i;:::-;36918:31;;36911:38;;36788:169;;;;:::o;45849:268::-;45956:7;45965;45991:11;46004:13;46021:22;46025:3;:10;;46037:5;46021:3;:22::i;:::-;45990:53;;;;46070:3;46062:12;;46100:5;46092:14;;46054:55;;;;;;45849:268;;;;;:::o;64634:100::-;64718:8;64707;:19;;;;;;;;;;;;:::i;:::-;;64634:100;:::o;47231:292::-;47372:7;47454:44;47459:3;:10;;47479:3;47471:12;;47485;47454:4;:44::i;:::-;47446:53;;47392:123;;47231:292;;;;;:::o;36320:114::-;36380:7;36407:19;36415:3;:10;;36407:7;:19::i;:::-;36400:26;;36320:114;;;:::o;60794:110::-;60870:26;60880:2;60884:7;60870:26;;;;;;;;;;;;:9;:26::i;:::-;60794:110;;:::o;13759:158::-;13817:7;13850:1;13845;:6;;13837:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;13908:1;13904;:5;13897:12;;13759:158;;;;:::o;13297:179::-;13355:7;13375:9;13391:1;13387;:5;13375:17;;13416:1;13411;:6;;13403:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13467:1;13460:8;;;13297:179;;;;:::o;14176:220::-;14234:7;14263:1;14258;:6;14254:20;;;14273:1;14266:8;;;;14254:20;14285:9;14301:1;14297;:5;14285:17;;14330:1;14325;14321;:5;;;;;;:10;14313:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14387:1;14380:8;;;14176:220;;;;;:::o;59033:352::-;59190:28;59200:4;59206:2;59210:7;59190:9;:28::i;:::-;59251:48;59274:4;59280:2;59284:7;59293:5;59251:22;:48::i;:::-;59229:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;59033:352;;;;:::o;47770:748::-;47826:13;48056:1;48047:5;:10;48043:53;;;48074:10;;;;;;;;;;;;;;;;;;;;;48043:53;48106:12;48121:5;48106:20;;48137:14;48162:78;48177:1;48169:4;:9;48162:78;;48195:8;;;;;;;48226:2;48218:10;;;;;;;;;48162:78;;;48250:19;48282:6;48272:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48250:39;;48300:13;48325:1;48316:6;:10;48300:26;;48344:5;48337:12;;48360:119;48375:1;48367:4;:9;48360:119;;48437:2;48430:4;:9;;;;;;48424:2;:16;48411:31;;48393:6;48400:7;;;;;;;48393:15;;;;;;;;;;;:49;;;;;;;;;;;48465:2;48457:10;;;;;;;;;48360:119;;;48503:6;48489:21;;;;;;47770:748;;;;:::o;45075:183::-;45186:4;45215:35;45225:3;:10;;45245:3;45237:12;;45215:9;:35::i;:::-;45208:42;;45075:183;;;;:::o;41691:110::-;41747:7;41774:3;:12;;:19;;;;41767:26;;41691:110;;;:::o;66917:126::-;;;;:::o;35810:160::-;35898:4;35927:35;35935:3;:10;;35955:5;35947:14;;35927:7;:35::i;:::-;35920:42;;35810:160;;;;:::o;35503:131::-;35570:4;35594:32;35599:3;:10;;35619:5;35611:14;;35594:4;:32::i;:::-;35587:39;;35503:131;;;;:::o;44441:219::-;44564:4;44588:64;44593:3;:10;;44613:3;44605:12;;44643:5;44627:23;;44619:32;;44588:4;:64::i;:::-;44581:71;;44441:219;;;;;:::o;31454:273::-;31548:7;31616:5;31595:3;:11;;:18;;;;:26;31573:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31701:3;:11;;31713:5;31701:18;;;;;;;;;;;;;;;;31694:25;;31454:273;;;;:::o;42166:348::-;42260:7;42269;42338:5;42316:3;:12;;:19;;;;:27;42294:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42418:22;42443:3;:12;;42456:5;42443:19;;;;;;;;;;;;;;;;;;42418:44;;42481:5;:10;;;42493:5;:12;;;42473:33;;;;;42166:348;;;;;:::o;43764:353::-;43892:7;43912:16;43931:3;:12;;:17;43944:3;43931:17;;;;;;;;;;;;43912:36;;43979:1;43967:8;:13;;43982:12;43959:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;44049:3;:12;;44073:1;44062:8;:12;44049:26;;;;;;;;;;;;;;;;;;:33;;;44042:40;;;43764:353;;;;;:::o;30991:109::-;31047:7;31074:3;:11;;:18;;;;31067:25;;30991:109;;;:::o;61131:321::-;61261:18;61267:2;61271:7;61261:5;:18::i;:::-;61312:54;61343:1;61347:2;61351:7;61360:5;61312:22;:54::i;:::-;61290:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;61131:321;;;:::o;65299:694::-;65454:4;65476:15;:2;:13;;;:15::i;:::-;65471:60;;65515:4;65508:11;;;;65471:60;65541:23;65567:313;65638:45;;;65702:12;:10;:12::i;:::-;65733:4;65756:7;65782:5;65597:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65567:313;;;;;;;;;;;;;;;;;:2;:15;;;;:313;;;;;:::i;:::-;65541:339;;65891:13;65918:10;65907:32;;;;;;;;;;;;:::i;:::-;65891:48;;49293:10;65968:16;;65958:26;;;:6;:26;;;;65950:35;;;;65299:694;;;;;;;:::o;41439:157::-;41537:4;41587:1;41566:3;:12;;:17;41579:3;41566:17;;;;;;;;;;;;:22;;41559:29;;41439:157;;;;:::o;29101:1557::-;29167:4;29285:18;29306:3;:12;;:19;29319:5;29306:19;;;;;;;;;;;;29285:40;;29356:1;29342:10;:15;29338:1313;;29717:21;29754:1;29741:10;:14;29717:38;;29770:17;29811:1;29790:3;:11;;:18;;;;:22;29770:42;;30057:17;30077:3;:11;;30089:9;30077:22;;;;;;;;;;;;;;;;30057:42;;30223:9;30194:3;:11;;30206:13;30194:26;;;;;;;;;;;;;;;:38;;;;30342:1;30326:13;:17;30300:3;:12;;:23;30313:9;30300:23;;;;;;;;;;;:43;;;;30452:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30547:3;:12;;:19;30560:5;30547:19;;;;;;;;;;;30540:26;;;30590:4;30583:11;;;;;;;;29338:1313;30634:5;30627:12;;;29101:1557;;;;;:::o;28511:414::-;28574:4;28596:21;28606:3;28611:5;28596:9;:21::i;:::-;28591:327;;28634:3;:11;;28651:5;28634:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28817:3;:11;;:18;;;;28795:3;:12;;:19;28808:5;28795:19;;;;;;;;;;;:40;;;;28857:4;28850:11;;;;28591:327;28901:5;28894:12;;28511:414;;;;;:::o;38881:737::-;38991:4;39107:16;39126:3;:12;;:17;39139:3;39126:17;;;;;;;;;;;;39107:36;;39172:1;39160:8;:13;39156:455;;;39240:3;:12;;39258:36;;;;;;;;39274:3;39258:36;;;;39287:5;39258:36;;;39240:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39453:3;:12;;:19;;;;39433:3;:12;;:17;39446:3;39433:17;;;;;;;;;;;:39;;;;39494:4;39487:11;;;;;39156:455;39567:5;39531:3;:12;;39555:1;39544:8;:12;39531:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;39594:5;39587:12;;;38881:737;;;;;;:::o;61788:404::-;61882:1;61868:16;;:2;:16;;;;61860:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61941:16;61949:7;61941;:16::i;:::-;61940:17;61932:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62003:45;62032:1;62036:2;62040:7;62003:20;:45::i;:::-;62061:30;62083:7;62061:13;:17;62075:2;62061:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62104:29;62121:7;62130:2;62104:12;:16;;:29;;;;;:::i;:::-;;62176:7;62172:2;62151:33;;62168:1;62151:33;;;;;;;;;;;;61788:404;;:::o;18836:444::-;18896:4;19104:12;19228:7;19216:20;19208:28;;19271:1;19264:4;:8;19257:15;;;18836:444;;;:::o;21873:229::-;22010:12;22042:52;22064:6;22072:4;22078:1;22081:12;22042:21;:52::i;:::-;22035:59;;21873:229;;;;;:::o;30744:161::-;30844:4;30896:1;30873:3;:12;;:19;30886:5;30873:19;;;;;;;;;;;;:24;;30866:31;;30744:161;;;;:::o;23089:632::-;23259:12;23331:5;23306:21;:30;;23284:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;23421:18;23432:6;23421:10;:18::i;:::-;23413:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23547:12;23561:23;23588:6;:11;;23607:5;23628:4;23588:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23546:97;;;;23661:52;23679:7;23688:10;23700:12;23661:17;:52::i;:::-;23654:59;;;;23089:632;;;;;;:::o;26012:777::-;26162:12;26191:7;26187:595;;;26222:10;26215:17;;;;26187:595;26356:1;26336:10;:17;:21;26332:439;;;26599:10;26593:17;26660:15;26647:10;26643:2;26639:19;26632:44;26547:148;26742:12;26735:20;;;;;;;;;;;:::i;:::-;;;;;;;;26012:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:124::-;;219:6;206:20;197:29;;231:30;255:5;231:30;:::i;:::-;191:75;;;;:::o;273:134::-;;357:6;351:13;342:22;;369:33;396:5;369:33;:::i;:::-;336:71;;;;:::o;414:128::-;;493:6;480:20;471:29;;505:32;531:5;505:32;:::i;:::-;465:77;;;;:::o;549:132::-;;632:6;626:13;617:22;;644:32;670:5;644:32;:::i;:::-;611:70;;;;:::o;689:440::-;;790:3;783:4;775:6;771:17;767:27;757:2;;808:1;805;798:12;757:2;845:6;832:20;867:64;882:48;923:6;882:48;:::i;:::-;867:64;:::i;:::-;858:73;;951:6;944:5;937:21;987:4;979:6;975:17;1020:4;1013:5;1009:16;1055:3;1046:6;1041:3;1037:16;1034:25;1031:2;;;1072:1;1069;1062:12;1031:2;1082:41;1116:6;1111:3;1106;1082:41;:::i;:::-;750:379;;;;;;;:::o;1138:442::-;;1240:3;1233:4;1225:6;1221:17;1217:27;1207:2;;1258:1;1255;1248:12;1207:2;1295:6;1282:20;1317:65;1332:49;1374:6;1332:49;:::i;:::-;1317:65;:::i;:::-;1308:74;;1402:6;1395:5;1388:21;1438:4;1430:6;1426:17;1471:4;1464:5;1460:16;1506:3;1497:6;1492:3;1488:16;1485:25;1482:2;;;1523:1;1520;1513:12;1482:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1200:380;;;;;;;:::o;1588:130::-;;1668:6;1655:20;1646:29;;1680:33;1707:5;1680:33;:::i;:::-;1640:78;;;;:::o;1725:241::-;;1829:2;1817:9;1808:7;1804:23;1800:32;1797:2;;;1845:1;1842;1835:12;1797:2;1880:1;1897:53;1942:7;1933:6;1922:9;1918:22;1897:53;:::i;:::-;1887:63;;1859:97;1791:175;;;;:::o;1973:366::-;;;2094:2;2082:9;2073:7;2069:23;2065:32;2062:2;;;2110:1;2107;2100:12;2062:2;2145:1;2162:53;2207:7;2198:6;2187:9;2183:22;2162:53;:::i;:::-;2152:63;;2124:97;2252:2;2270:53;2315:7;2306:6;2295:9;2291:22;2270:53;:::i;:::-;2260:63;;2231:98;2056:283;;;;;:::o;2346:491::-;;;;2484:2;2472:9;2463:7;2459:23;2455:32;2452:2;;;2500:1;2497;2490:12;2452:2;2535:1;2552:53;2597:7;2588:6;2577:9;2573:22;2552:53;:::i;:::-;2542:63;;2514:97;2642:2;2660:53;2705:7;2696:6;2685:9;2681:22;2660:53;:::i;:::-;2650:63;;2621:98;2750:2;2768:53;2813:7;2804:6;2793:9;2789:22;2768:53;:::i;:::-;2758:63;;2729:98;2446:391;;;;;:::o;2844:721::-;;;;;3008:3;2996:9;2987:7;2983:23;2979:33;2976:2;;;3025:1;3022;3015:12;2976:2;3060:1;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3039:97;3167:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3146:98;3275:2;3293:53;3338:7;3329:6;3318:9;3314:22;3293:53;:::i;:::-;3283:63;;3254:98;3411:2;3400:9;3396:18;3383:32;3435:18;3427:6;3424:30;3421:2;;;3467:1;3464;3457:12;3421:2;3487:62;3541:7;3532:6;3521:9;3517:22;3487:62;:::i;:::-;3477:72;;3362:193;2970:595;;;;;;;:::o;3572:360::-;;;3690:2;3678:9;3669:7;3665:23;3661:32;3658:2;;;3706:1;3703;3696:12;3658:2;3741:1;3758:53;3803:7;3794:6;3783:9;3779:22;3758:53;:::i;:::-;3748:63;;3720:97;3848:2;3866:50;3908:7;3899:6;3888:9;3884:22;3866:50;:::i;:::-;3856:60;;3827:95;3652:280;;;;;:::o;3939:366::-;;;4060:2;4048:9;4039:7;4035:23;4031:32;4028:2;;;4076:1;4073;4066:12;4028:2;4111:1;4128:53;4173:7;4164:6;4153:9;4149:22;4128:53;:::i;:::-;4118:63;;4090:97;4218:2;4236:53;4281:7;4272:6;4261:9;4257:22;4236:53;:::i;:::-;4226:63;;4197:98;4022:283;;;;;:::o;4312:263::-;;4427:2;4415:9;4406:7;4402:23;4398:32;4395:2;;;4443:1;4440;4433:12;4395:2;4478:1;4495:64;4551:7;4542:6;4531:9;4527:22;4495:64;:::i;:::-;4485:74;;4457:108;4389:186;;;;:::o;4582:239::-;;4685:2;4673:9;4664:7;4660:23;4656:32;4653:2;;;4701:1;4698;4691:12;4653:2;4736:1;4753:52;4797:7;4788:6;4777:9;4773:22;4753:52;:::i;:::-;4743:62;;4715:96;4647:174;;;;:::o;4828:261::-;;4942:2;4930:9;4921:7;4917:23;4913:32;4910:2;;;4958:1;4955;4948:12;4910:2;4993:1;5010:63;5065:7;5056:6;5045:9;5041:22;5010:63;:::i;:::-;5000:73;;4972:107;4904:185;;;;:::o;5096:347::-;;5210:2;5198:9;5189:7;5185:23;5181:32;5178:2;;;5226:1;5223;5216:12;5178:2;5289:1;5278:9;5274:17;5261:31;5312:18;5304:6;5301:30;5298:2;;;5344:1;5341;5334:12;5298:2;5364:63;5419:7;5410:6;5399:9;5395:22;5364:63;:::i;:::-;5354:73;;5240:193;5172:271;;;;:::o;5450:241::-;;5554:2;5542:9;5533:7;5529:23;5525:32;5522:2;;;5570:1;5567;5560:12;5522:2;5605:1;5622:53;5667:7;5658:6;5647:9;5643:22;5622:53;:::i;:::-;5612:63;;5584:97;5516:175;;;;:::o;5698:472::-;;;5829:2;5817:9;5808:7;5804:23;5800:32;5797:2;;;5845:1;5842;5835:12;5797:2;5880:1;5897:53;5942:7;5933:6;5922:9;5918:22;5897:53;:::i;:::-;5887:63;;5859:97;6015:2;6004:9;6000:18;5987:32;6039:18;6031:6;6028:30;6025:2;;;6071:1;6068;6061:12;6025:2;6091:63;6146:7;6137:6;6126:9;6122:22;6091:63;:::i;:::-;6081:73;;5966:194;5791:379;;;;;:::o;6178:193::-;;6299:66;6361:3;6353:6;6299:66;:::i;:::-;6285:80;;6278:93;;;;:::o;6380:173::-;;6467:46;6509:3;6501:6;6467:46;:::i;:::-;6542:4;6537:3;6533:14;6519:28;;6460:93;;;;:::o;6561:142::-;6652:45;6691:5;6652:45;:::i;:::-;6647:3;6640:58;6634:69;;:::o;6710:137::-;6809:32;6835:5;6809:32;:::i;:::-;6804:3;6797:45;6791:56;;:::o;6854:113::-;6937:24;6955:5;6937:24;:::i;:::-;6932:3;6925:37;6919:48;;:::o;7003:928::-;;7168:64;7226:5;7168:64;:::i;:::-;7245:96;7334:6;7329:3;7245:96;:::i;:::-;7238:103;;7364:3;7406:4;7398:6;7394:17;7389:3;7385:27;7433:66;7493:5;7433:66;:::i;:::-;7519:7;7547:1;7532:360;7557:6;7554:1;7551:13;7532:360;;;7619:9;7613:4;7609:20;7604:3;7597:33;7664:6;7658:13;7686:84;7765:4;7750:13;7686:84;:::i;:::-;7678:92;;7787:70;7850:6;7787:70;:::i;:::-;7777:80;;7880:4;7875:3;7871:14;7864:21;;7589:303;7579:1;7576;7572:9;7567:14;;7532:360;;;7536:14;7905:4;7898:11;;7922:3;7915:10;;7147:784;;;;;;;;;:::o;7970:690::-;;8115:54;8163:5;8115:54;:::i;:::-;8182:86;8261:6;8256:3;8182:86;:::i;:::-;8175:93;;8289:56;8339:5;8289:56;:::i;:::-;8365:7;8393:1;8378:260;8403:6;8400:1;8397:13;8378:260;;;8470:6;8464:13;8491:63;8550:3;8535:13;8491:63;:::i;:::-;8484:70;;8571:60;8624:6;8571:60;:::i;:::-;8561:70;;8435:203;8425:1;8422;8418:9;8413:14;;8378:260;;;8382:14;8651:3;8644:10;;8094:566;;;;;;;:::o;8668:104::-;8745:21;8760:5;8745:21;:::i;:::-;8740:3;8733:34;8727:45;;:::o;8779:343::-;;8889:38;8921:5;8889:38;:::i;:::-;8939:70;9002:6;8997:3;8939:70;:::i;:::-;8932:77;;9014:52;9059:6;9054:3;9047:4;9040:5;9036:16;9014:52;:::i;:::-;9087:29;9109:6;9087:29;:::i;:::-;9082:3;9078:39;9071:46;;8869:253;;;;;:::o;9129:356::-;;9257:38;9289:5;9257:38;:::i;:::-;9307:88;9388:6;9383:3;9307:88;:::i;:::-;9300:95;;9400:52;9445:6;9440:3;9433:4;9426:5;9422:16;9400:52;:::i;:::-;9473:6;9468:3;9464:16;9457:23;;9237:248;;;;;:::o;9515:887::-;;9654:5;9648:12;9688:1;9677:9;9673:17;9701:1;9696:267;;;;9974:1;9969:427;;;;9666:730;;9696:267;9774:4;9770:1;9759:9;9755:17;9751:28;9793:88;9874:6;9869:3;9793:88;:::i;:::-;9786:95;;9919:4;9915:9;9904;9900:25;9895:3;9888:38;9949:6;9944:3;9940:16;9933:23;;9703:260;9696:267;;9969:427;10038:1;10027:9;10023:17;10054:88;10135:6;10130:3;10054:88;:::i;:::-;10047:95;;10164:41;10199:5;10164:41;:::i;:::-;10221:1;10229:130;10243:6;10240:1;10237:13;10229:130;;;10308:7;10302:14;10298:1;10293:3;10289:11;10282:35;10349:1;10340:7;10336:15;10325:26;;10265:4;10262:1;10258:12;10253:17;;10229:130;;;10382:6;10377:3;10373:16;10366:23;;9976:420;;;9666:730;;9624:778;;;;;:::o;10410:327::-;;10512:39;10545:5;10512:39;:::i;:::-;10563:61;10617:6;10612:3;10563:61;:::i;:::-;10556:68;;10629:52;10674:6;10669:3;10662:4;10655:5;10651:16;10629:52;:::i;:::-;10702:29;10724:6;10702:29;:::i;:::-;10697:3;10693:39;10686:46;;10492:245;;;;;:::o;10744:347::-;;10856:39;10889:5;10856:39;:::i;:::-;10907:71;10971:6;10966:3;10907:71;:::i;:::-;10900:78;;10983:52;11028:6;11023:3;11016:4;11009:5;11005:16;10983:52;:::i;:::-;11056:29;11078:6;11056:29;:::i;:::-;11051:3;11047:39;11040:46;;10836:255;;;;;:::o;11098:360::-;;11228:39;11261:5;11228:39;:::i;:::-;11279:89;11361:6;11356:3;11279:89;:::i;:::-;11272:96;;11373:52;11418:6;11413:3;11406:4;11399:5;11395:16;11373:52;:::i;:::-;11446:6;11441:3;11437:16;11430:23;;11208:250;;;;;:::o;11490:823::-;;11609:5;11603:12;11643:1;11632:9;11628:17;11656:1;11651:248;;;;11910:1;11905:402;;;;11621:686;;11651:248;11729:4;11725:1;11714:9;11710:17;11706:28;11748:71;11812:6;11807:3;11748:71;:::i;:::-;11741:78;;11857:4;11853:9;11842;11838:25;11833:3;11826:38;11887:4;11882:3;11878:14;11871:21;;11658:241;11651:248;;11905:402;11974:1;11963:9;11959:17;11990:71;12054:6;12049:3;11990:71;:::i;:::-;11983:78;;12083:38;12115:5;12083:38;:::i;:::-;12137:1;12145:130;12159:6;12156:1;12153:13;12145:130;;;12224:7;12218:14;12214:1;12209:3;12205:11;12198:35;12265:1;12256:7;12252:15;12241:26;;12181:4;12178:1;12174:12;12169:17;;12145:130;;;12298:1;12293:3;12289:11;12282:18;;11912:395;;;11621:686;;11579:734;;;;;:::o;12322:371::-;;12482:67;12546:2;12541:3;12482:67;:::i;:::-;12475:74;;12582:34;12578:1;12573:3;12569:11;12562:55;12651:4;12646:2;12641:3;12637:12;12630:26;12684:2;12679:3;12675:12;12668:19;;12468:225;;;:::o;12702:373::-;;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12962:34;12958:1;12953:3;12949:11;12942:55;13031:6;13026:2;13021:3;13017:12;13010:28;13066:2;13061:3;13057:12;13050:19;;12848:227;;;:::o;13084:387::-;;13244:67;13308:2;13303:3;13244:67;:::i;:::-;13237:74;;13344:34;13340:1;13335:3;13331:11;13324:55;13413:20;13408:2;13403:3;13399:12;13392:42;13462:2;13457:3;13453:12;13446:19;;13230:241;;;:::o;13480:375::-;;13640:67;13704:2;13699:3;13640:67;:::i;:::-;13633:74;;13740:34;13736:1;13731:3;13727:11;13720:55;13809:8;13804:2;13799:3;13795:12;13788:30;13846:2;13841:3;13837:12;13830:19;;13626:229;;;:::o;13864:328::-;;14024:67;14088:2;14083:3;14024:67;:::i;:::-;14017:74;;14124:30;14120:1;14115:3;14111:11;14104:51;14183:2;14178:3;14174:12;14167:19;;14010:182;;;:::o;14201:327::-;;14361:67;14425:2;14420:3;14361:67;:::i;:::-;14354:74;;14461:29;14457:1;14452:3;14448:11;14441:50;14519:2;14514:3;14510:12;14503:19;;14347:181;;;:::o;14537:375::-;;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14797:34;14793:1;14788:3;14784:11;14777:55;14866:8;14861:2;14856:3;14852:12;14845:30;14903:2;14898:3;14894:12;14887:19;;14683:229;;;:::o;14921:373::-;;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15181:34;15177:1;15172:3;15168:11;15161:55;15250:6;15245:2;15240:3;15236:12;15229:28;15285:2;15280:3;15276:12;15269:19;;15067:227;;;:::o;15303:325::-;;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15563:27;15559:1;15554:3;15550:11;15543:48;15619:2;15614:3;15610:12;15603:19;;15449:179;;;:::o;15637:330::-;;15797:67;15861:2;15856:3;15797:67;:::i;:::-;15790:74;;15897:32;15893:1;15888:3;15884:11;15877:53;15958:2;15953:3;15949:12;15942:19;;15783:184;;;:::o;15976:371::-;;16136:67;16200:2;16195:3;16136:67;:::i;:::-;16129:74;;16236:34;16232:1;16227:3;16223:11;16216:55;16305:4;16300:2;16295:3;16291:12;16284:26;16338:2;16333:3;16329:12;16322:19;;16122:225;;;:::o;16356:375::-;;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16616:34;16612:1;16607:3;16603:11;16596:55;16685:8;16680:2;16675:3;16671:12;16664:30;16722:2;16717:3;16713:12;16706:19;;16502:229;;;:::o;16740:381::-;;16900:67;16964:2;16959:3;16900:67;:::i;:::-;16893:74;;17000:34;16996:1;16991:3;16987:11;16980:55;17069:14;17064:2;17059:3;17055:12;17048:36;17112:2;17107:3;17103:12;17096:19;;16886:235;;;:::o;17130:393::-;;17290:67;17354:2;17349:3;17290:67;:::i;:::-;17283:74;;17390:34;17386:1;17381:3;17377:11;17370:55;17459:26;17454:2;17449:3;17445:12;17438:48;17514:2;17509:3;17505:12;17498:19;;17276:247;;;:::o;17532:379::-;;17692:67;17756:2;17751:3;17692:67;:::i;:::-;17685:74;;17792:34;17788:1;17783:3;17779:11;17772:55;17861:12;17856:2;17851:3;17847:12;17840:34;17902:2;17897:3;17893:12;17886:19;;17678:233;;;:::o;17920:379::-;;18080:67;18144:2;18139:3;18080:67;:::i;:::-;18073:74;;18180:34;18176:1;18171:3;18167:11;18160:55;18249:12;18244:2;18239:3;18235:12;18228:34;18290:2;18285:3;18281:12;18274:19;;18066:233;;;:::o;18308:371::-;;18468:67;18532:2;18527:3;18468:67;:::i;:::-;18461:74;;18568:34;18564:1;18559:3;18555:11;18548:55;18637:4;18632:2;18627:3;18623:12;18616:26;18670:2;18665:3;18661:12;18654:19;;18454:225;;;:::o;18688:326::-;;18848:67;18912:2;18907:3;18848:67;:::i;:::-;18841:74;;18948:28;18944:1;18939:3;18935:11;18928:49;19005:2;19000:3;18996:12;18989:19;;18834:180;;;:::o;19023:332::-;;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19283:34;19279:1;19274:3;19270:11;19263:55;19346:2;19341:3;19337:12;19330:19;;19169:186;;;:::o;19364:370::-;;19524:67;19588:2;19583:3;19524:67;:::i;:::-;19517:74;;19624:34;19620:1;19615:3;19611:11;19604:55;19693:3;19688:2;19683:3;19679:12;19672:25;19725:2;19720:3;19716:12;19709:19;;19510:224;;;:::o;19743:381::-;;19903:67;19967:2;19962:3;19903:67;:::i;:::-;19896:74;;20003:34;19999:1;19994:3;19990:11;19983:55;20072:14;20067:2;20062:3;20058:12;20051:36;20115:2;20110:3;20106:12;20099:19;;19889:235;;;:::o;20133:332::-;;20293:67;20357:2;20352:3;20293:67;:::i;:::-;20286:74;;20393:34;20389:1;20384:3;20380:11;20373:55;20456:2;20451:3;20447:12;20440:19;;20279:186;;;:::o;20474:378::-;;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20734:34;20730:1;20725:3;20721:11;20714:55;20803:11;20798:2;20793:3;20789:12;20782:33;20843:2;20838:3;20834:12;20827:19;;20620:232;;;:::o;20861:326::-;;21021:67;21085:2;21080:3;21021:67;:::i;:::-;21014:74;;21121:28;21117:1;21112:3;21108:11;21101:49;21178:2;21173:3;21169:12;21162:19;;21007:180;;;:::o;21196:384::-;;21356:67;21420:2;21415:3;21356:67;:::i;:::-;21349:74;;21456:34;21452:1;21447:3;21443:11;21436:55;21525:17;21520:2;21515:3;21511:12;21504:39;21571:2;21566:3;21562:12;21555:19;;21342:238;;;:::o;21589:370::-;;21749:67;21813:2;21808:3;21749:67;:::i;:::-;21742:74;;21849:34;21845:1;21840:3;21836:11;21829:55;21918:3;21913:2;21908:3;21904:12;21897:25;21950:2;21945:3;21941:12;21934:19;;21735:224;;;:::o;21968:386::-;;22128:67;22192:2;22187:3;22128:67;:::i;:::-;22121:74;;22228:34;22224:1;22219:3;22215:11;22208:55;22297:19;22292:2;22287:3;22283:12;22276:41;22345:2;22340:3;22336:12;22329:19;;22114:240;;;:::o;22363:329::-;;22523:67;22587:2;22582:3;22523:67;:::i;:::-;22516:74;;22623:31;22619:1;22614:3;22610:11;22603:52;22683:2;22678:3;22674:12;22667:19;;22509:183;;;:::o;22701:370::-;;22861:67;22925:2;22920:3;22861:67;:::i;:::-;22854:74;;22961:34;22957:1;22952:3;22948:11;22941:55;23030:3;23025:2;23020:3;23016:12;23009:25;23062:2;23057:3;23053:12;23046:19;;22847:224;;;:::o;23080:371::-;;23240:67;23304:2;23299:3;23240:67;:::i;:::-;23233:74;;23340:34;23336:1;23331:3;23327:11;23320:55;23409:4;23404:2;23399:3;23395:12;23388:26;23442:2;23437:3;23433:12;23426:19;;23226:225;;;:::o;23460:323::-;;23620:67;23684:2;23679:3;23620:67;:::i;:::-;23613:74;;23720:25;23716:1;23711:3;23707:11;23700:46;23774:2;23769:3;23765:12;23758:19;;23606:177;;;:::o;23791:103::-;23864:24;23882:5;23864:24;:::i;:::-;23859:3;23852:37;23846:48;;:::o;23901:113::-;23984:24;24002:5;23984:24;:::i;:::-;23979:3;23972:37;23966:48;;:::o;24021:271::-;;24174:93;24263:3;24254:6;24174:93;:::i;:::-;24167:100;;24284:3;24277:10;;24155:137;;;;:::o;24299:273::-;;24453:94;24543:3;24534:6;24453:94;:::i;:::-;24446:101;;24564:3;24557:10;;24434:138;;;;:::o;24579:436::-;;24782:95;24873:3;24864:6;24782:95;:::i;:::-;24775:102;;24895:95;24986:3;24977:6;24895:95;:::i;:::-;24888:102;;25007:3;25000:10;;24763:252;;;;;:::o;25022:222::-;;25149:2;25138:9;25134:18;25126:26;;25163:71;25231:1;25220:9;25216:17;25207:6;25163:71;:::i;:::-;25120:124;;;;:::o;25251:672::-;;25496:3;25485:9;25481:19;25473:27;;25511:87;25595:1;25584:9;25580:17;25571:6;25511:87;:::i;:::-;25609:72;25677:2;25666:9;25662:18;25653:6;25609:72;:::i;:::-;25692;25760:2;25749:9;25745:18;25736:6;25692:72;:::i;:::-;25812:9;25806:4;25802:20;25797:2;25786:9;25782:18;25775:48;25837:76;25908:4;25899:6;25837:76;:::i;:::-;25829:84;;25467:456;;;;;;;:::o;25930:548::-;;26141:2;26130:9;26126:18;26118:26;;26155:79;26231:1;26220:9;26216:17;26207:6;26155:79;:::i;:::-;26245:72;26313:2;26302:9;26298:18;26289:6;26245:72;:::i;:::-;26365:9;26359:4;26355:20;26350:2;26339:9;26335:18;26328:48;26390:78;26463:4;26454:6;26390:78;:::i;:::-;26382:86;;26112:366;;;;;;:::o;26485:410::-;;26682:2;26671:9;26667:18;26659:26;;26732:9;26726:4;26722:20;26718:1;26707:9;26703:17;26696:47;26757:128;26880:4;26871:6;26757:128;:::i;:::-;26749:136;;26653:242;;;;:::o;26902:370::-;;27079:2;27068:9;27064:18;27056:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27154:108;27257:4;27248:6;27154:108;:::i;:::-;27146:116;;27050:222;;;;:::o;27279:210::-;;27400:2;27389:9;27385:18;27377:26;;27414:65;27476:1;27465:9;27461:17;27452:6;27414:65;:::i;:::-;27371:118;;;;:::o;27496:310::-;;27643:2;27632:9;27628:18;27620:26;;27693:9;27687:4;27683:20;27679:1;27668:9;27664:17;27657:47;27718:78;27791:4;27782:6;27718:78;:::i;:::-;27710:86;;27614:192;;;;:::o;27813:304::-;;27957:2;27946:9;27942:18;27934:26;;28007:9;28001:4;27997:20;27993:1;27982:9;27978:17;27971:47;28032:75;28102:4;28093:6;28032:75;:::i;:::-;28024:83;;27928:189;;;;:::o;28124:416::-;;28324:2;28313:9;28309:18;28301:26;;28374:9;28368:4;28364:20;28360:1;28349:9;28345:17;28338:47;28399:131;28525:4;28399:131;:::i;:::-;28391:139;;28295:245;;;:::o;28547:416::-;;28747:2;28736:9;28732:18;28724:26;;28797:9;28791:4;28787:20;28783:1;28772:9;28768:17;28761:47;28822:131;28948:4;28822:131;:::i;:::-;28814:139;;28718:245;;;:::o;28970:416::-;;29170:2;29159:9;29155:18;29147:26;;29220:9;29214:4;29210:20;29206:1;29195:9;29191:17;29184:47;29245:131;29371:4;29245:131;:::i;:::-;29237:139;;29141:245;;;:::o;29393:416::-;;29593:2;29582:9;29578:18;29570:26;;29643:9;29637:4;29633:20;29629:1;29618:9;29614:17;29607:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29564:245;;;:::o;29816:416::-;;30016:2;30005:9;30001:18;29993:26;;30066:9;30060:4;30056:20;30052:1;30041:9;30037:17;30030:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29987:245;;;:::o;30239:416::-;;30439:2;30428:9;30424:18;30416:26;;30489:9;30483:4;30479:20;30475:1;30464:9;30460:17;30453:47;30514:131;30640:4;30514:131;:::i;:::-;30506:139;;30410:245;;;:::o;30662:416::-;;30862:2;30851:9;30847:18;30839:26;;30912:9;30906:4;30902:20;30898:1;30887:9;30883:17;30876:47;30937:131;31063:4;30937:131;:::i;:::-;30929:139;;30833:245;;;:::o;31085:416::-;;31285:2;31274:9;31270:18;31262:26;;31335:9;31329:4;31325:20;31321:1;31310:9;31306:17;31299:47;31360:131;31486:4;31360:131;:::i;:::-;31352:139;;31256:245;;;:::o;31508:416::-;;31708:2;31697:9;31693:18;31685:26;;31758:9;31752:4;31748:20;31744:1;31733:9;31729:17;31722:47;31783:131;31909:4;31783:131;:::i;:::-;31775:139;;31679:245;;;:::o;31931:416::-;;32131:2;32120:9;32116:18;32108:26;;32181:9;32175:4;32171:20;32167:1;32156:9;32152:17;32145:47;32206:131;32332:4;32206:131;:::i;:::-;32198:139;;32102:245;;;:::o;32354:416::-;;32554:2;32543:9;32539:18;32531:26;;32604:9;32598:4;32594:20;32590:1;32579:9;32575:17;32568:47;32629:131;32755:4;32629:131;:::i;:::-;32621:139;;32525:245;;;:::o;32777:416::-;;32977:2;32966:9;32962:18;32954:26;;33027:9;33021:4;33017:20;33013:1;33002:9;32998:17;32991:47;33052:131;33178:4;33052:131;:::i;:::-;33044:139;;32948:245;;;:::o;33200:416::-;;33400:2;33389:9;33385:18;33377:26;;33450:9;33444:4;33440:20;33436:1;33425:9;33421:17;33414:47;33475:131;33601:4;33475:131;:::i;:::-;33467:139;;33371:245;;;:::o;33623:416::-;;33823:2;33812:9;33808:18;33800:26;;33873:9;33867:4;33863:20;33859:1;33848:9;33844:17;33837:47;33898:131;34024:4;33898:131;:::i;:::-;33890:139;;33794:245;;;:::o;34046:416::-;;34246:2;34235:9;34231:18;34223:26;;34296:9;34290:4;34286:20;34282:1;34271:9;34267:17;34260:47;34321:131;34447:4;34321:131;:::i;:::-;34313:139;;34217:245;;;:::o;34469:416::-;;34669:2;34658:9;34654:18;34646:26;;34719:9;34713:4;34709:20;34705:1;34694:9;34690:17;34683:47;34744:131;34870:4;34744:131;:::i;:::-;34736:139;;34640:245;;;:::o;34892:416::-;;35092:2;35081:9;35077:18;35069:26;;35142:9;35136:4;35132:20;35128:1;35117:9;35113:17;35106:47;35167:131;35293:4;35167:131;:::i;:::-;35159:139;;35063:245;;;:::o;35315:416::-;;35515:2;35504:9;35500:18;35492:26;;35565:9;35559:4;35555:20;35551:1;35540:9;35536:17;35529:47;35590:131;35716:4;35590:131;:::i;:::-;35582:139;;35486:245;;;:::o;35738:416::-;;35938:2;35927:9;35923:18;35915:26;;35988:9;35982:4;35978:20;35974:1;35963:9;35959:17;35952:47;36013:131;36139:4;36013:131;:::i;:::-;36005:139;;35909:245;;;:::o;36161:416::-;;36361:2;36350:9;36346:18;36338:26;;36411:9;36405:4;36401:20;36397:1;36386:9;36382:17;36375:47;36436:131;36562:4;36436:131;:::i;:::-;36428:139;;36332:245;;;:::o;36584:416::-;;36784:2;36773:9;36769:18;36761:26;;36834:9;36828:4;36824:20;36820:1;36809:9;36805:17;36798:47;36859:131;36985:4;36859:131;:::i;:::-;36851:139;;36755:245;;;:::o;37007:416::-;;37207:2;37196:9;37192:18;37184:26;;37257:9;37251:4;37247:20;37243:1;37232:9;37228:17;37221:47;37282:131;37408:4;37282:131;:::i;:::-;37274:139;;37178:245;;;:::o;37430:416::-;;37630:2;37619:9;37615:18;37607:26;;37680:9;37674:4;37670:20;37666:1;37655:9;37651:17;37644:47;37705:131;37831:4;37705:131;:::i;:::-;37697:139;;37601:245;;;:::o;37853:416::-;;38053:2;38042:9;38038:18;38030:26;;38103:9;38097:4;38093:20;38089:1;38078:9;38074:17;38067:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;38024:245;;;:::o;38276:416::-;;38476:2;38465:9;38461:18;38453:26;;38526:9;38520:4;38516:20;38512:1;38501:9;38497:17;38490:47;38551:131;38677:4;38551:131;:::i;:::-;38543:139;;38447:245;;;:::o;38699:416::-;;38899:2;38888:9;38884:18;38876:26;;38949:9;38943:4;38939:20;38935:1;38924:9;38920:17;38913:47;38974:131;39100:4;38974:131;:::i;:::-;38966:139;;38870:245;;;:::o;39122:416::-;;39322:2;39311:9;39307:18;39299:26;;39372:9;39366:4;39362:20;39358:1;39347:9;39343:17;39336:47;39397:131;39523:4;39397:131;:::i;:::-;39389:139;;39293:245;;;:::o;39545:416::-;;39745:2;39734:9;39730:18;39722:26;;39795:9;39789:4;39785:20;39781:1;39770:9;39766:17;39759:47;39820:131;39946:4;39820:131;:::i;:::-;39812:139;;39716:245;;;:::o;39968:416::-;;40168:2;40157:9;40153:18;40145:26;;40218:9;40212:4;40208:20;40204:1;40193:9;40189:17;40182:47;40243:131;40369:4;40243:131;:::i;:::-;40235:139;;40139:245;;;:::o;40391:416::-;;40591:2;40580:9;40576:18;40568:26;;40641:9;40635:4;40631:20;40627:1;40616:9;40612:17;40605:47;40666:131;40792:4;40666:131;:::i;:::-;40658:139;;40562:245;;;:::o;40814:416::-;;41014:2;41003:9;40999:18;40991:26;;41064:9;41058:4;41054:20;41050:1;41039:9;41035:17;41028:47;41089:131;41215:4;41089:131;:::i;:::-;41081:139;;40985:245;;;:::o;41237:222::-;;41364:2;41353:9;41349:18;41341:26;;41378:71;41446:1;41435:9;41431:17;41422:6;41378:71;:::i;:::-;41335:124;;;;:::o;41466:256::-;;41528:2;41522:9;41512:19;;41566:4;41558:6;41554:17;41665:6;41653:10;41650:22;41629:18;41617:10;41614:34;41611:62;41608:2;;;41686:1;41683;41676:12;41608:2;41706:10;41702:2;41695:22;41506:216;;;;:::o;41729:321::-;;41872:18;41864:6;41861:30;41858:2;;;41904:1;41901;41894:12;41858:2;41971:4;41967:9;41960:4;41952:6;41948:17;41944:33;41936:41;;42035:4;42029;42025:15;42017:23;;41795:255;;;:::o;42057:322::-;;42201:18;42193:6;42190:30;42187:2;;;42233:1;42230;42223:12;42187:2;42300:4;42296:9;42289:4;42281:6;42277:17;42273:33;42265:41;;42364:4;42358;42354:15;42346:23;;42124:255;;;:::o;42386:161::-;;42482:3;42474:11;;42520:4;42515:3;42511:14;42503:22;;42468:79;;;:::o;42554:151::-;;42640:3;42632:11;;42678:4;42673:3;42669:14;42661:22;;42626:79;;;:::o;42712:161::-;;42783:3;42775:11;;42820:3;42817:1;42810:14;42852:4;42849:1;42839:18;42831:26;;42769:104;;;:::o;42880:158::-;;42948:3;42940:11;;42985:3;42982:1;42975:14;43017:4;43014:1;43004:18;42996:26;;42934:104;;;:::o;43045:147::-;;43164:5;43158:12;43148:22;;43129:63;;;:::o;43199:137::-;;43308:5;43302:12;43292:22;;43273:63;;;:::o;43343:121::-;;43436:5;43430:12;43420:22;;43401:63;;;:::o;43471:122::-;;43565:5;43559:12;43549:22;;43530:63;;;:::o;43600:118::-;;43708:4;43703:3;43699:14;43691:22;;43685:33;;;:::o;43725:108::-;;43823:4;43818:3;43814:14;43806:22;;43800:33;;;:::o;43841:188::-;;43981:6;43976:3;43969:19;44018:4;44013:3;44009:14;43994:29;;43962:67;;;;:::o;44038:178::-;;44168:6;44163:3;44156:19;44205:4;44200:3;44196:14;44181:29;;44149:67;;;;:::o;44225:162::-;;44339:6;44334:3;44327:19;44376:4;44371:3;44367:14;44352:29;;44320:67;;;;:::o;44396:144::-;;44531:3;44516:18;;44509:31;;;;:::o;44549:153::-;;44654:6;44649:3;44642:19;44691:4;44686:3;44682:14;44667:29;;44635:67;;;;:::o;44711:163::-;;44826:6;44821:3;44814:19;44863:4;44858:3;44854:14;44839:29;;44807:67;;;;:::o;44883:145::-;;45019:3;45004:18;;44997:31;;;;:::o;45036:91::-;;45098:24;45116:5;45098:24;:::i;:::-;45087:35;;45081:46;;;:::o;45134:99::-;;45204:24;45222:5;45204:24;:::i;:::-;45193:35;;45187:46;;;:::o;45240:85::-;;45313:5;45306:13;45299:21;45288:32;;45282:43;;;:::o;45332:72::-;;45394:5;45383:16;;45377:27;;;:::o;45411:144::-;;45483:66;45476:5;45472:78;45461:89;;45455:100;;;:::o;45562:121::-;;45635:42;45628:5;45624:54;45613:65;;45607:76;;;:::o;45690:72::-;;45752:5;45741:16;;45735:27;;;:::o;45769:129::-;;45856:37;45887:5;45856:37;:::i;:::-;45843:50;;45837:61;;;:::o;45905:121::-;;45984:37;46015:5;45984:37;:::i;:::-;45971:50;;45965:61;;;:::o;46033:108::-;;46112:24;46130:5;46112:24;:::i;:::-;46099:37;;46093:48;;;:::o;46149:145::-;46230:6;46225:3;46220;46207:30;46286:1;46277:6;46272:3;46268:16;46261:27;46200:94;;;:::o;46303:268::-;46368:1;46375:101;46389:6;46386:1;46383:13;46375:101;;;46465:1;46460:3;46456:11;46450:18;46446:1;46441:3;46437:11;46430:39;46411:2;46408:1;46404:10;46399:15;;46375:101;;;46491:6;46488:1;46485:13;46482:2;;;46556:1;46547:6;46542:3;46538:16;46531:27;46482:2;46352:219;;;;:::o;46579:97::-;;46667:2;46663:7;46658:2;46651:5;46647:14;46643:28;46633:38;;46627:49;;;:::o;46684:117::-;46753:24;46771:5;46753:24;:::i;:::-;46746:5;46743:35;46733:2;;46792:1;46789;46782:12;46733:2;46727:74;:::o;46808:111::-;46874:21;46889:5;46874:21;:::i;:::-;46867:5;46864:32;46854:2;;46910:1;46907;46900:12;46854:2;46848:71;:::o;46926:117::-;46995:24;47013:5;46995:24;:::i;:::-;46988:5;46985:35;46975:2;;47034:1;47031;47024:12;46975:2;46969:74;:::o;47050:115::-;47118:23;47135:5;47118:23;:::i;:::-;47111:5;47108:34;47098:2;;47156:1;47153;47146:12;47098:2;47092:73;:::o;47172:117::-;47241:24;47259:5;47241:24;:::i;:::-;47234:5;47231:35;47221:2;;47280:1;47277;47270:12;47221:2;47215:74;:::o

Swarm Source

ipfs://4efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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