ETH Price: $2,418.22 (+1.72%)

Token

Project Sylvia (SYL)
 

Overview

Max Total Supply

54 SYL

Holders

39

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hartel.eth
Balance
1 SYL
0xf9e1D1e9F22c96752356AdFd377231528c7E851E
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:
ProjectSylvia

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

// Adapted from BoringBananasCo
// Modified and updated to 0.8.0 by @Danny_One_
// Project Sylvia art by @kakigaijin
// <3 VeVefam
// Special thanks to BoringBananasCo & Blockhead Devs for all the resources & assistance along the way!

import "./ERC721_flat.sol";

pragma solidity ^0.8.0;
pragma abicoder v2;

contract ProjectSylvia is ERC721, Ownable, nonReentrant {

    string public SYLVIA_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN SYLVIAS ARE ALL SOLD OUT
    
    uint256 public sylPrice = 20000000000000000; // 0.02 ETH

    uint public constant maxSylviaPurchase = 15;

    uint256 public constant MAX_SYLVIAS = 8888;

    bool public saleIsActive = false;
    
    // mapping(uint => string) public sylviaNames;
    
    // Reserve SYL for team - Giveaways/Prizes etc
	uint public constant MAX_SYLRESERVE = 100;	// total team reserves allowed
    uint public sylReserve = MAX_SYLRESERVE;	// counter for team reserves remaining 
    
    constructor() ERC721("Project Sylvia", "SYL") { }
    
    // withraw to project wallet
    function withdraw(uint256 _amount, address payable _owner) public onlyOwner {
        require(_owner == owner());
        require(_amount < address(this).balance + 1);
        _owner.transfer(_amount);
    }
    
    // withdraw to team
	function teamWithdraw(address payable _team1, address payable _team2) public onlyOwner {
        uint balance1 = address(this).balance / 2;
		uint balance2 = address(this).balance - balance1;
		_team1.transfer(balance1);
		_team2.transfer(balance2);
    }

	
	function setSylviaPrice(uint256 _sylPrice) public onlyOwner {
        sylPrice = _sylPrice;
    }
	
	
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        SYLVIA_PROVENANCE = provenanceHash;
    }

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


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    
    function reserveSylvias(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint reserveMint = MAX_SYLRESERVE - sylReserve; // Mint from beginning of tokenIds
        require(_reserveAmount > 0 && _reserveAmount < sylReserve + 1, "Not enough reserve left to fulfill amount");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, reserveMint + i);
        }
        sylReserve = sylReserve - _reserveAmount;
    }


    function mintSylvia(uint numberOfTokens) public payable reentryLock {
        require(saleIsActive, "Sale must be active to mint Sylvia");
        require(numberOfTokens > 0 && numberOfTokens < maxSylviaPurchase + 1, "Can only mint 10 tokens at a time");
        require(totalSupply() + numberOfTokens < MAX_SYLVIAS - sylReserve + 1, "Purchase would exceed max supply of Sylvia");
        require(msg.value >= sylPrice * numberOfTokens, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + sylReserve; // start minting after reserved tokenIds
            if (totalSupply() < MAX_SYLVIAS) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            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;
        }
    }
	
    
}

File 1 of 2: ERC721_flat.sol
/** FLATTENED FROM OPENZEPPELIN REPO 5 SEPTEMBER 2021
 * includes from 
 * https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol
 * "./IERC721.sol";
 * "./IERC721Receiver.sol";
 * "./extensions/IERC721Metadata.sol";
 * "../../utils/Address.sol";
 * "../../utils/Context.sol";
 * "../../utils/Strings.sol";
 * "../../utils/introspection/ERC165.sol";
 * "../access/Ownable.sol"
 * 
 * @Danny-one
 * with thanks to BoringBananaCo
 *
 */

// SPDX-License-Identifier: MIT




pragma solidity ^0.8.0;

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

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




pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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




pragma solidity ^0.8.0;

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




pragma solidity ^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;
}


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 * taken from BoringBananaCo Implmentation
 */
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 () {
        // 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;
    }
}



pragma solidity ^0.8.0;

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

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

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

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

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


pragma solidity ^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;

            if (lastIndex != toDeleteIndex) {
                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] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // 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) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}


pragma solidity ^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 {
    using EnumerableSet for EnumerableSet.Bytes32Set;

    // 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 Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;
        mapping(bytes32 => bytes32) _values;
    }

    /**
     * @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) {
        map._values[key] = value;
        return map._keys.add(key);
    }

    /**
     * @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) {
        delete map._values[key];
        return map._keys.remove(key);
    }

    /**
     * @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._keys.contains(key);
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._keys.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) {
        bytes32 key = map._keys.at(index);
        return (key, map._values[key]);
    }

    /**
     * @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) {
        bytes32 value = map._values[key];
        if (value == bytes32(0)) {
            return (_contains(map, key), bytes32(0));
        } else {
            return (true, value);
        }
    }

    /**
     * @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) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key");
        return value;
    }

    /**
     * @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) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), errorMessage);
        return value;
    }

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




pragma solidity ^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);
}




pragma solidity ^0.8.0;

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


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



/**
 * @title nonReentrant module to prevent recursive calling of functions
 * @dev See https://medium.com/coinmonks/protect-your-solidity-smart-contracts-from-reentrancy-attacks-9972c3af7c21
 */
abstract contract nonReentrant {
    bool private _reentryKey = false;
    modifier reentryLock {
        require(!_reentryKey, "cannot reenter a locked function");
        _reentryKey = true;
        _;
        _reentryKey = false;
    }
}


/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 * BoringBananaCo ERC-721 borrows from EnumerableMap & EnumerableSet
 * implements additional tokenId tracking not in OPENZEPPELIN stock ERC721
 */
 
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    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_) {
        _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 { }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SYLRESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SYLVIAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYLVIA_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":[],"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":"maxSylviaPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintSylvia","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveSylvias","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":"uint256","name":"_sylPrice","type":"uint256"}],"name":"setSylviaPrice","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":"sylPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sylReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_team1","type":"address"},{"internalType":"address payable","name":"_team2","type":"address"}],"name":"teamWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_amount","type":"uint256"},{"internalType":"address payable","name":"_owner","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60146101000a81548160ff02191690831515021790555060405180602001604052806000815250600c9080519060200190620000469291906200034c565b5066470de4df820000600d556000600e60006101000a81548160ff0219169083151502179055506064600f553480156200007f57600080fd5b506040518060400160405280600e81526020017f50726f6a6563742053796c7669610000000000000000000000000000000000008152506040518060400160405280600381526020017f53594c0000000000000000000000000000000000000000000000000000000000815250620001046301ffc9a760e01b620001a660201b60201c565b81600790805190602001906200011c9291906200034c565b508060089080519060200190620001359291906200034c565b506200014e6380ac58cd60e01b620001a660201b60201c565b62000166635b5e139f60e01b620001a660201b60201c565b6200017e63780e9d6360e01b620001a660201b60201c565b5050620001a0620001946200027e60201b60201c565b6200028660201b60201c565b620004e4565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002099062000423565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035a9062000456565b90600052602060002090601f0160209004810192826200037e5760008555620003ca565b82601f106200039957805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003c9578251825591602001919060010190620003ac565b5b509050620003d99190620003dd565b5090565b5b80821115620003f8576000816000905550600101620003de565b5090565b60006200040b601c8362000445565b91506200041882620004bb565b602082019050919050565b600060208201905081810360008301526200043e81620003fc565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200046f57607f821691505b602082108114156200048657620004856200048c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b61478180620004f46000396000f3fe60806040526004361061020e5760003560e01c806369aefd3d11610118578063b88d4fde116100a0578063e6f7f5fb1161006f578063e6f7f5fb1461078b578063e985e9c5146107b6578063eb8d2444146107f3578063f2ae6a511461081e578063f2fde38b146108495761020e565b8063b88d4fde146106d1578063c87b56dd146106fa578063d1c09d1d14610737578063e151ef43146107605761020e565b80638462151c116100e75780638462151c146105ea5780638da5cb5b1461062757806395d89b411461065257806396367e321461067d578063a22cb465146106a85761020e565b806369aefd3d1461054f5780636c0360eb1461056b57806370a0823114610596578063715018a6146105d35761020e565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461045a5780634f6ccce71461048357806355f804b3146104c0578063588430ce146104e95780636352211e146105125761020e565b806323b872dd146103b2578063278f4204146103db5780632f745c591461040657806334918dfd146104435761020e565b8063081812fc116101e2578063081812fc146102cd578063095ea7b31461030a578063109695231461033357806315fef58f1461035c57806318160ddd146103875761020e565b8062f714ce1461021357806301ffc9a71461023c57806305e933f51461027957806306fdde03146102a2575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613280565b610872565b005b34801561024857600080fd5b50610263600480360381019061025e91906131b0565b610990565b604051610270919061382f565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612fda565b6109f7565b005b3480156102ae57600080fd5b506102b7610b28565b6040516102c4919061384a565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190613253565b610bba565b60405161030191906137a6565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613170565b610c3f565b005b34801561033f57600080fd5b5061035a6004803603810190610355919061320a565b610d57565b005b34801561036857600080fd5b50610371610ded565b60405161037e9190613b4c565b60405180910390f35b34801561039357600080fd5b5061039c610df2565b6040516103a99190613b4c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d4919061305a565b610e03565b005b3480156103e757600080fd5b506103f0610e63565b6040516103fd9190613b4c565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190613170565b610e69565b60405161043a9190613b4c565b60405180910390f35b34801561044f57600080fd5b50610458610ec4565b005b34801561046657600080fd5b50610481600480360381019061047c919061305a565b610f6c565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190613253565b610f8c565b6040516104b79190613b4c565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e2919061320a565b610faf565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613170565b611037565b005b34801561051e57600080fd5b5061053960048036038101906105349190613253565b61116f565b60405161054691906137a6565b60405180910390f35b61056960048036038101906105649190613253565b6111a6565b005b34801561057757600080fd5b506105806113ed565b60405161058d919061384a565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612fad565b61147f565b6040516105ca9190613b4c565b60405180910390f35b3480156105df57600080fd5b506105e861153e565b005b3480156105f657600080fd5b50610611600480360381019061060c9190612fad565b6115c6565b60405161061e919061380d565b60405180910390f35b34801561063357600080fd5b5061063c6116d0565b60405161064991906137a6565b60405180910390f35b34801561065e57600080fd5b506106676116fa565b604051610674919061384a565b60405180910390f35b34801561068957600080fd5b5061069261178c565b60405161069f919061384a565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613130565b61181a565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906130ad565b61199b565b005b34801561070657600080fd5b50610721600480360381019061071c9190613253565b6119fd565b60405161072e919061384a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613253565b611b70565b005b34801561076c57600080fd5b50610775611bf6565b6040516107829190613b4c565b60405180910390f35b34801561079757600080fd5b506107a0611bfc565b6040516107ad9190613b4c565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061301a565b611c02565b6040516107ea919061382f565b60405180910390f35b3480156107ff57600080fd5b50610808611c96565b604051610815919061382f565b60405180910390f35b34801561082a57600080fd5b50610833611ca9565b6040516108409190613b4c565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190612fad565b611cae565b005b61087a611da6565b73ffffffffffffffffffffffffffffffffffffffff166108986116d0565b73ffffffffffffffffffffffffffffffffffffffff16146108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590613a4c565b60405180910390fd5b6108f66116d0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092d57600080fd5b60014761093a9190613c75565b821061094557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561098b573d6000803e3d6000fd5b505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6109ff611da6565b73ffffffffffffffffffffffffffffffffffffffff16610a1d6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613a4c565b60405180910390fd5b6000600247610a829190613ccb565b905060008147610a929190613d56565b90508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610ada573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b21573d6000803e3d6000fd5b5050505050565b606060078054610b3790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613e52565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050905090565b6000610bc582611dae565b610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb90613a2c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4a8261116f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613aac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cda611da6565b73ffffffffffffffffffffffffffffffffffffffff161480610d095750610d0881610d03611da6565b611c02565b5b610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f9061398c565b60405180910390fd5b610d528383611dcb565b505050565b610d5f611da6565b73ffffffffffffffffffffffffffffffffffffffff16610d7d6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90613a4c565b60405180910390fd5b80600c9080519060200190610de9929190612dac565b5050565b600f81565b6000610dfe6002611e84565b905090565b610e14610e0e611da6565b82611e99565b610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90613acc565b60405180910390fd5b610e5e838383611f77565b505050565b600d5481565b6000610ebc82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061218e90919063ffffffff16565b905092915050565b610ecc611da6565b73ffffffffffffffffffffffffffffffffffffffff16610eea6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613a4c565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610f878383836040518060200160405280600081525061199b565b505050565b600080610fa38360026121a890919063ffffffff16565b50905080915050919050565b610fb7611da6565b73ffffffffffffffffffffffffffffffffffffffff16610fd56116d0565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613a4c565b60405180910390fd5b611034816121d4565b50565b61103f611da6565b73ffffffffffffffffffffffffffffffffffffffff1661105d6116d0565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90613a4c565b60405180910390fd5b6000600f5460646110c49190613d56565b90506000821180156110e357506001600f546110e09190613c75565b82105b611122576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611119906139cc565b60405180910390fd5b60005b828110156111555761114284828461113d9190613c75565b6121ee565b808061114d90613eb5565b915050611125565b5081600f546111649190613d56565b600f81905550505050565b600061119f8260405180606001604052806029815260200161472360299139600261220c9092919063ffffffff16565b9050919050565b600b60149054906101000a900460ff16156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613b0c565b60405180910390fd5b6001600b60146101000a81548160ff021916908315150217905550600e60009054906101000a900460ff16611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906139ec565b60405180910390fd5b60008111801561127c57506001600f6112799190613c75565b81105b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613b2c565b60405180910390fd5b6001600f546122b86112cd9190613d56565b6112d79190613c75565b816112e0610df2565b6112ea9190613c75565b1061132a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113219061386c565b60405180910390fd5b80600d546113389190613cfc565b34101561137a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113719061392c565b60405180910390fd5b60005b818110156113ce576000600f54611392610df2565b61139c9190613c75565b90506122b86113a9610df2565b10156113ba576113b933826121ee565b5b5080806113c690613eb5565b91505061137d565b506000600b60146101000a81548160ff02191690831515021790555050565b6060600a80546113fc90613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461142890613e52565b80156114755780601f1061144a57610100808354040283529160200191611475565b820191906000526020600020905b81548152906001019060200180831161145857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906139ac565b60405180910390fd5b611537600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061222b565b9050919050565b611546611da6565b73ffffffffffffffffffffffffffffffffffffffff166115646116d0565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190613a4c565b60405180910390fd5b6115c46000612240565b565b606060006115d38361147f565b9050600081141561163057600067ffffffffffffffff8111156115f9576115f861401a565b5b6040519080825280602002602001820160405280156116275781602001602082028036833780820191505090505b509150506116cb565b60008167ffffffffffffffff81111561164c5761164b61401a565b5b60405190808252806020026020018201604052801561167a5781602001602082028036833780820191505090505b50905060005b828110156116c4576116928582610e69565b8282815181106116a5576116a4613feb565b5b60200260200101818152505080806116bc90613eb5565b915050611680565b8193505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606008805461170990613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461173590613e52565b80156117825780601f1061175757610100808354040283529160200191611782565b820191906000526020600020905b81548152906001019060200180831161176557829003601f168201915b5050505050905090565b600c805461179990613e52565b80601f01602080910402602001604051908101604052809291908181526020018280546117c590613e52565b80156118125780601f106117e757610100808354040283529160200191611812565b820191906000526020600020905b8154815290600101906020018083116117f557829003601f168201915b505050505081565b611822611da6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118879061390c565b60405180910390fd5b806006600061189d611da6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661194a611da6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161198f919061382f565b60405180910390a35050565b6119ac6119a6611da6565b83611e99565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613acc565b60405180910390fd5b6119f784848484612306565b50505050565b6060611a0882611dae565b611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613a8c565b60405180910390fd5b6000600960008481526020019081526020016000208054611a6790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9390613e52565b8015611ae05780601f10611ab557610100808354040283529160200191611ae0565b820191906000526020600020905b815481529060010190602001808311611ac357829003601f168201915b505050505090506000611af16113ed565b9050600081511415611b07578192505050611b6b565b600082511115611b3c578082604051602001611b24929190613782565b60405160208183030381529060405292505050611b6b565b80611b4685612362565b604051602001611b57929190613782565b604051602081830303815290604052925050505b919050565b611b78611da6565b73ffffffffffffffffffffffffffffffffffffffff16611b966116d0565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613a4c565b60405180910390fd5b80600d8190555050565b600f5481565b6122b881565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b606481565b611cb6611da6565b73ffffffffffffffffffffffffffffffffffffffff16611cd46116d0565b73ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613a4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906138ac565b60405180910390fd5b611da381612240565b50565b600033905090565b6000611dc48260026124c390919063ffffffff16565b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3e8361116f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e92826000016124dd565b9050919050565b6000611ea482611dae565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda9061396c565b60405180910390fd5b6000611eee8361116f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5d57508373ffffffffffffffffffffffffffffffffffffffff16611f4584610bba565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6e5750611f6d8185611c02565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f978261116f565b73ffffffffffffffffffffffffffffffffffffffff1614611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613a6c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906138ec565b60405180910390fd5b6120688383836124f2565b612073600082611dcb565b6120c481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124f790919063ffffffff16565b5061211681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061251190919063ffffffff16565b5061212d8183600261252b9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061219d8360000183612560565b60001c905092915050565b6000806000806121bb866000018661258b565b915091508160001c8160001c9350935050509250929050565b80600a90805190602001906121ea929190612dac565b5050565b6122088282604051806020016040528060008152506125cb565b5050565b600061221f846000018460001b84612626565b60001c90509392505050565b6000612239826000016126a7565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612311848484611f77565b61231d848484846126b8565b61235c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123539061388c565b60405180910390fd5b50505050565b606060008214156123aa576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124be565b600082905060005b600082146123dc5780806123c590613eb5565b915050600a826123d59190613ccb565b91506123b2565b60008167ffffffffffffffff8111156123f8576123f761401a565b5b6040519080825280601f01601f19166020018201604052801561242a5781602001600182028036833780820191505090505b5090505b600085146124b7576001826124439190613d56565b9150600a856124529190613efe565b603061245e9190613c75565b60f81b81838151811061247457612473613feb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124b09190613ccb565b945061242e565b8093505050505b919050565b60006124d5836000018360001b61281c565b905092915050565b60006124eb8260000161283c565b9050919050565b505050565b6000612509836000018360001b612851565b905092915050565b6000612523836000018360001b612965565b905092915050565b6000612557846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6129d5565b90509392505050565b600082600001828154811061257857612577613feb565b5b9060005260206000200154905092915050565b60008060006125a68486600001612a1090919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6125d58383612a27565b6125e260008484846126b8565b612621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126189061388c565b60405180910390fd5b505050565b6000808460020160008581526020019081526020016000205490506000801b811415806126595750612658858561281c565b5b839061269b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612692919061384a565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006126d98473ffffffffffffffffffffffffffffffffffffffff16612bb5565b6126e65760019050612814565b60006127ad63150b7a0260e01b6126fb611da6565b88878760405160240161271194939291906137c1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016146f1603291398773ffffffffffffffffffffffffffffffffffffffff16612bc89092919063ffffffff16565b90506000818060200190518101906127c591906131dd565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006128348284600001612be090919063ffffffff16565b905092915050565b600061284a826000016126a7565b9050919050565b600080836001016000848152602001908152602001600020549050600081146129595760006001826128839190613d56565b905060006001866000018054905061289b9190613d56565b905081811461290a5760008660000182815481106128bc576128bb613feb565b5b90600052602060002001549050808760000184815481106128e0576128df613feb565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061291e5761291d613fbc565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061295f565b60009150505b92915050565b60006129718383612bf7565b6129ca5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506129cf565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550612a078385600001612c1a90919063ffffffff16565b90509392505050565b6000612a1f8360000183612560565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e90613a0c565b60405180910390fd5b612aa081611dae565b15612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad7906138cc565b60405180910390fd5b612aec600083836124f2565b612b3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061251190919063ffffffff16565b50612b548183600261252b9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060612bd78484600085612c31565b90509392505050565b6000612bef8360000183612bf7565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612c298360000183612965565b905092915050565b606082471015612c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6d9061394c565b60405180910390fd5b612c7f85612bb5565b612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb590613aec565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ce7919061376b565b60006040518083038185875af1925050503d8060008114612d24576040519150601f19603f3d011682016040523d82523d6000602084013e612d29565b606091505b5091509150612d39828286612d45565b92505050949350505050565b60608315612d5557829050612da5565b600083511115612d685782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c919061384a565b60405180910390fd5b9392505050565b828054612db890613e52565b90600052602060002090601f016020900481019282612dda5760008555612e21565b82601f10612df357805160ff1916838001178555612e21565b82800160010185558215612e21579182015b82811115612e20578251825591602001919060010190612e05565b5b509050612e2e9190612e32565b5090565b5b80821115612e4b576000816000905550600101612e33565b5090565b6000612e62612e5d84613b8c565b613b67565b905082815260208101848484011115612e7e57612e7d61404e565b5b612e89848285613e10565b509392505050565b6000612ea4612e9f84613bbd565b613b67565b905082815260208101848484011115612ec057612ebf61404e565b5b612ecb848285613e10565b509392505050565b600081359050612ee28161467d565b92915050565b600081359050612ef781614694565b92915050565b600081359050612f0c816146ab565b92915050565b600081359050612f21816146c2565b92915050565b600081519050612f36816146c2565b92915050565b600082601f830112612f5157612f50614049565b5b8135612f61848260208601612e4f565b91505092915050565b600082601f830112612f7f57612f7e614049565b5b8135612f8f848260208601612e91565b91505092915050565b600081359050612fa7816146d9565b92915050565b600060208284031215612fc357612fc2614058565b5b6000612fd184828501612ed3565b91505092915050565b60008060408385031215612ff157612ff0614058565b5b6000612fff85828601612ee8565b925050602061301085828601612ee8565b9150509250929050565b6000806040838503121561303157613030614058565b5b600061303f85828601612ed3565b925050602061305085828601612ed3565b9150509250929050565b60008060006060848603121561307357613072614058565b5b600061308186828701612ed3565b935050602061309286828701612ed3565b92505060406130a386828701612f98565b9150509250925092565b600080600080608085870312156130c7576130c6614058565b5b60006130d587828801612ed3565b94505060206130e687828801612ed3565b93505060406130f787828801612f98565b925050606085013567ffffffffffffffff81111561311857613117614053565b5b61312487828801612f3c565b91505092959194509250565b6000806040838503121561314757613146614058565b5b600061315585828601612ed3565b925050602061316685828601612efd565b9150509250929050565b6000806040838503121561318757613186614058565b5b600061319585828601612ed3565b92505060206131a685828601612f98565b9150509250929050565b6000602082840312156131c6576131c5614058565b5b60006131d484828501612f12565b91505092915050565b6000602082840312156131f3576131f2614058565b5b600061320184828501612f27565b91505092915050565b6000602082840312156132205761321f614058565b5b600082013567ffffffffffffffff81111561323e5761323d614053565b5b61324a84828501612f6a565b91505092915050565b60006020828403121561326957613268614058565b5b600061327784828501612f98565b91505092915050565b6000806040838503121561329757613296614058565b5b60006132a585828601612f98565b92505060206132b685828601612ee8565b9150509250929050565b60006132cc838361374d565b60208301905092915050565b6132e181613d8a565b82525050565b60006132f282613bfe565b6132fc8185613c2c565b935061330783613bee565b8060005b8381101561333857815161331f88826132c0565b975061332a83613c1f565b92505060018101905061330b565b5085935050505092915050565b61334e81613dae565b82525050565b600061335f82613c09565b6133698185613c3d565b9350613379818560208601613e1f565b6133828161405d565b840191505092915050565b600061339882613c09565b6133a28185613c4e565b93506133b2818560208601613e1f565b80840191505092915050565b60006133c982613c14565b6133d38185613c59565b93506133e3818560208601613e1f565b6133ec8161405d565b840191505092915050565b600061340282613c14565b61340c8185613c6a565b935061341c818560208601613e1f565b80840191505092915050565b6000613435602a83613c59565b91506134408261406e565b604082019050919050565b6000613458603283613c59565b9150613463826140bd565b604082019050919050565b600061347b602683613c59565b91506134868261410c565b604082019050919050565b600061349e601c83613c59565b91506134a98261415b565b602082019050919050565b60006134c1602483613c59565b91506134cc82614184565b604082019050919050565b60006134e4601983613c59565b91506134ef826141d3565b602082019050919050565b6000613507601f83613c59565b9150613512826141fc565b602082019050919050565b600061352a602683613c59565b915061353582614225565b604082019050919050565b600061354d602c83613c59565b915061355882614274565b604082019050919050565b6000613570603883613c59565b915061357b826142c3565b604082019050919050565b6000613593602a83613c59565b915061359e82614312565b604082019050919050565b60006135b6602983613c59565b91506135c182614361565b604082019050919050565b60006135d9602283613c59565b91506135e4826143b0565b604082019050919050565b60006135fc602083613c59565b9150613607826143ff565b602082019050919050565b600061361f602c83613c59565b915061362a82614428565b604082019050919050565b6000613642602083613c59565b915061364d82614477565b602082019050919050565b6000613665602983613c59565b9150613670826144a0565b604082019050919050565b6000613688602f83613c59565b9150613693826144ef565b604082019050919050565b60006136ab602183613c59565b91506136b68261453e565b604082019050919050565b60006136ce603183613c59565b91506136d98261458d565b604082019050919050565b60006136f1601d83613c59565b91506136fc826145dc565b602082019050919050565b6000613714602083613c59565b915061371f82614605565b602082019050919050565b6000613737602183613c59565b91506137428261462e565b604082019050919050565b61375681613e06565b82525050565b61376581613e06565b82525050565b6000613777828461338d565b915081905092915050565b600061378e82856133f7565b915061379a82846133f7565b91508190509392505050565b60006020820190506137bb60008301846132d8565b92915050565b60006080820190506137d660008301876132d8565b6137e360208301866132d8565b6137f0604083018561375c565b81810360608301526138028184613354565b905095945050505050565b6000602082019050818103600083015261382781846132e7565b905092915050565b60006020820190506138446000830184613345565b92915050565b6000602082019050818103600083015261386481846133be565b905092915050565b6000602082019050818103600083015261388581613428565b9050919050565b600060208201905081810360008301526138a58161344b565b9050919050565b600060208201905081810360008301526138c58161346e565b9050919050565b600060208201905081810360008301526138e581613491565b9050919050565b60006020820190508181036000830152613905816134b4565b9050919050565b60006020820190508181036000830152613925816134d7565b9050919050565b60006020820190508181036000830152613945816134fa565b9050919050565b600060208201905081810360008301526139658161351d565b9050919050565b6000602082019050818103600083015261398581613540565b9050919050565b600060208201905081810360008301526139a581613563565b9050919050565b600060208201905081810360008301526139c581613586565b9050919050565b600060208201905081810360008301526139e5816135a9565b9050919050565b60006020820190508181036000830152613a05816135cc565b9050919050565b60006020820190508181036000830152613a25816135ef565b9050919050565b60006020820190508181036000830152613a4581613612565b9050919050565b60006020820190508181036000830152613a6581613635565b9050919050565b60006020820190508181036000830152613a8581613658565b9050919050565b60006020820190508181036000830152613aa58161367b565b9050919050565b60006020820190508181036000830152613ac58161369e565b9050919050565b60006020820190508181036000830152613ae5816136c1565b9050919050565b60006020820190508181036000830152613b05816136e4565b9050919050565b60006020820190508181036000830152613b2581613707565b9050919050565b60006020820190508181036000830152613b458161372a565b9050919050565b6000602082019050613b61600083018461375c565b92915050565b6000613b71613b82565b9050613b7d8282613e84565b919050565b6000604051905090565b600067ffffffffffffffff821115613ba757613ba661401a565b5b613bb08261405d565b9050602081019050919050565b600067ffffffffffffffff821115613bd857613bd761401a565b5b613be18261405d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c8082613e06565b9150613c8b83613e06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cc057613cbf613f2f565b5b828201905092915050565b6000613cd682613e06565b9150613ce183613e06565b925082613cf157613cf0613f5e565b5b828204905092915050565b6000613d0782613e06565b9150613d1283613e06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4b57613d4a613f2f565b5b828202905092915050565b6000613d6182613e06565b9150613d6c83613e06565b925082821015613d7f57613d7e613f2f565b5b828203905092915050565b6000613d9582613de6565b9050919050565b6000613da782613de6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e3d578082015181840152602081019050613e22565b83811115613e4c576000848401525b50505050565b60006002820490506001821680613e6a57607f821691505b60208210811415613e7e57613e7d613f8d565b5b50919050565b613e8d8261405d565b810181811067ffffffffffffffff82111715613eac57613eab61401a565b5b80604052505050565b6000613ec082613e06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef357613ef2613f2f565b5b600182019050919050565b6000613f0982613e06565b9150613f1483613e06565b925082613f2457613f23613f5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662053796c76696100000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420746f2066756c666960008201527f6c6c20616d6f756e740000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742053796c7660008201527f6961000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f63616e6e6f74207265656e7465722061206c6f636b65642066756e6374696f6e600082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b61468681613d8a565b811461469157600080fd5b50565b61469d81613d9c565b81146146a857600080fd5b50565b6146b481613dae565b81146146bf57600080fd5b50565b6146cb81613dba565b81146146d657600080fd5b50565b6146e281613e06565b81146146ed57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220b2fddb26b265b6aef2ca9feaf95923057a2aa49b5d09433e6970914f09522a6664736f6c63430008070033

Deployed Bytecode

0x60806040526004361061020e5760003560e01c806369aefd3d11610118578063b88d4fde116100a0578063e6f7f5fb1161006f578063e6f7f5fb1461078b578063e985e9c5146107b6578063eb8d2444146107f3578063f2ae6a511461081e578063f2fde38b146108495761020e565b8063b88d4fde146106d1578063c87b56dd146106fa578063d1c09d1d14610737578063e151ef43146107605761020e565b80638462151c116100e75780638462151c146105ea5780638da5cb5b1461062757806395d89b411461065257806396367e321461067d578063a22cb465146106a85761020e565b806369aefd3d1461054f5780636c0360eb1461056b57806370a0823114610596578063715018a6146105d35761020e565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461045a5780634f6ccce71461048357806355f804b3146104c0578063588430ce146104e95780636352211e146105125761020e565b806323b872dd146103b2578063278f4204146103db5780632f745c591461040657806334918dfd146104435761020e565b8063081812fc116101e2578063081812fc146102cd578063095ea7b31461030a578063109695231461033357806315fef58f1461035c57806318160ddd146103875761020e565b8062f714ce1461021357806301ffc9a71461023c57806305e933f51461027957806306fdde03146102a2575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613280565b610872565b005b34801561024857600080fd5b50610263600480360381019061025e91906131b0565b610990565b604051610270919061382f565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612fda565b6109f7565b005b3480156102ae57600080fd5b506102b7610b28565b6040516102c4919061384a565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190613253565b610bba565b60405161030191906137a6565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613170565b610c3f565b005b34801561033f57600080fd5b5061035a6004803603810190610355919061320a565b610d57565b005b34801561036857600080fd5b50610371610ded565b60405161037e9190613b4c565b60405180910390f35b34801561039357600080fd5b5061039c610df2565b6040516103a99190613b4c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d4919061305a565b610e03565b005b3480156103e757600080fd5b506103f0610e63565b6040516103fd9190613b4c565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190613170565b610e69565b60405161043a9190613b4c565b60405180910390f35b34801561044f57600080fd5b50610458610ec4565b005b34801561046657600080fd5b50610481600480360381019061047c919061305a565b610f6c565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190613253565b610f8c565b6040516104b79190613b4c565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e2919061320a565b610faf565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613170565b611037565b005b34801561051e57600080fd5b5061053960048036038101906105349190613253565b61116f565b60405161054691906137a6565b60405180910390f35b61056960048036038101906105649190613253565b6111a6565b005b34801561057757600080fd5b506105806113ed565b60405161058d919061384a565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612fad565b61147f565b6040516105ca9190613b4c565b60405180910390f35b3480156105df57600080fd5b506105e861153e565b005b3480156105f657600080fd5b50610611600480360381019061060c9190612fad565b6115c6565b60405161061e919061380d565b60405180910390f35b34801561063357600080fd5b5061063c6116d0565b60405161064991906137a6565b60405180910390f35b34801561065e57600080fd5b506106676116fa565b604051610674919061384a565b60405180910390f35b34801561068957600080fd5b5061069261178c565b60405161069f919061384a565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613130565b61181a565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906130ad565b61199b565b005b34801561070657600080fd5b50610721600480360381019061071c9190613253565b6119fd565b60405161072e919061384a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613253565b611b70565b005b34801561076c57600080fd5b50610775611bf6565b6040516107829190613b4c565b60405180910390f35b34801561079757600080fd5b506107a0611bfc565b6040516107ad9190613b4c565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061301a565b611c02565b6040516107ea919061382f565b60405180910390f35b3480156107ff57600080fd5b50610808611c96565b604051610815919061382f565b60405180910390f35b34801561082a57600080fd5b50610833611ca9565b6040516108409190613b4c565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190612fad565b611cae565b005b61087a611da6565b73ffffffffffffffffffffffffffffffffffffffff166108986116d0565b73ffffffffffffffffffffffffffffffffffffffff16146108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590613a4c565b60405180910390fd5b6108f66116d0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092d57600080fd5b60014761093a9190613c75565b821061094557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561098b573d6000803e3d6000fd5b505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6109ff611da6565b73ffffffffffffffffffffffffffffffffffffffff16610a1d6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613a4c565b60405180910390fd5b6000600247610a829190613ccb565b905060008147610a929190613d56565b90508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610ada573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b21573d6000803e3d6000fd5b5050505050565b606060078054610b3790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613e52565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050905090565b6000610bc582611dae565b610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb90613a2c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4a8261116f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613aac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cda611da6565b73ffffffffffffffffffffffffffffffffffffffff161480610d095750610d0881610d03611da6565b611c02565b5b610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f9061398c565b60405180910390fd5b610d528383611dcb565b505050565b610d5f611da6565b73ffffffffffffffffffffffffffffffffffffffff16610d7d6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90613a4c565b60405180910390fd5b80600c9080519060200190610de9929190612dac565b5050565b600f81565b6000610dfe6002611e84565b905090565b610e14610e0e611da6565b82611e99565b610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90613acc565b60405180910390fd5b610e5e838383611f77565b505050565b600d5481565b6000610ebc82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061218e90919063ffffffff16565b905092915050565b610ecc611da6565b73ffffffffffffffffffffffffffffffffffffffff16610eea6116d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613a4c565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610f878383836040518060200160405280600081525061199b565b505050565b600080610fa38360026121a890919063ffffffff16565b50905080915050919050565b610fb7611da6565b73ffffffffffffffffffffffffffffffffffffffff16610fd56116d0565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613a4c565b60405180910390fd5b611034816121d4565b50565b61103f611da6565b73ffffffffffffffffffffffffffffffffffffffff1661105d6116d0565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90613a4c565b60405180910390fd5b6000600f5460646110c49190613d56565b90506000821180156110e357506001600f546110e09190613c75565b82105b611122576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611119906139cc565b60405180910390fd5b60005b828110156111555761114284828461113d9190613c75565b6121ee565b808061114d90613eb5565b915050611125565b5081600f546111649190613d56565b600f81905550505050565b600061119f8260405180606001604052806029815260200161472360299139600261220c9092919063ffffffff16565b9050919050565b600b60149054906101000a900460ff16156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613b0c565b60405180910390fd5b6001600b60146101000a81548160ff021916908315150217905550600e60009054906101000a900460ff16611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906139ec565b60405180910390fd5b60008111801561127c57506001600f6112799190613c75565b81105b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613b2c565b60405180910390fd5b6001600f546122b86112cd9190613d56565b6112d79190613c75565b816112e0610df2565b6112ea9190613c75565b1061132a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113219061386c565b60405180910390fd5b80600d546113389190613cfc565b34101561137a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113719061392c565b60405180910390fd5b60005b818110156113ce576000600f54611392610df2565b61139c9190613c75565b90506122b86113a9610df2565b10156113ba576113b933826121ee565b5b5080806113c690613eb5565b91505061137d565b506000600b60146101000a81548160ff02191690831515021790555050565b6060600a80546113fc90613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461142890613e52565b80156114755780601f1061144a57610100808354040283529160200191611475565b820191906000526020600020905b81548152906001019060200180831161145857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906139ac565b60405180910390fd5b611537600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061222b565b9050919050565b611546611da6565b73ffffffffffffffffffffffffffffffffffffffff166115646116d0565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190613a4c565b60405180910390fd5b6115c46000612240565b565b606060006115d38361147f565b9050600081141561163057600067ffffffffffffffff8111156115f9576115f861401a565b5b6040519080825280602002602001820160405280156116275781602001602082028036833780820191505090505b509150506116cb565b60008167ffffffffffffffff81111561164c5761164b61401a565b5b60405190808252806020026020018201604052801561167a5781602001602082028036833780820191505090505b50905060005b828110156116c4576116928582610e69565b8282815181106116a5576116a4613feb565b5b60200260200101818152505080806116bc90613eb5565b915050611680565b8193505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606008805461170990613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461173590613e52565b80156117825780601f1061175757610100808354040283529160200191611782565b820191906000526020600020905b81548152906001019060200180831161176557829003601f168201915b5050505050905090565b600c805461179990613e52565b80601f01602080910402602001604051908101604052809291908181526020018280546117c590613e52565b80156118125780601f106117e757610100808354040283529160200191611812565b820191906000526020600020905b8154815290600101906020018083116117f557829003601f168201915b505050505081565b611822611da6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118879061390c565b60405180910390fd5b806006600061189d611da6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661194a611da6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161198f919061382f565b60405180910390a35050565b6119ac6119a6611da6565b83611e99565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613acc565b60405180910390fd5b6119f784848484612306565b50505050565b6060611a0882611dae565b611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613a8c565b60405180910390fd5b6000600960008481526020019081526020016000208054611a6790613e52565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9390613e52565b8015611ae05780601f10611ab557610100808354040283529160200191611ae0565b820191906000526020600020905b815481529060010190602001808311611ac357829003601f168201915b505050505090506000611af16113ed565b9050600081511415611b07578192505050611b6b565b600082511115611b3c578082604051602001611b24929190613782565b60405160208183030381529060405292505050611b6b565b80611b4685612362565b604051602001611b57929190613782565b604051602081830303815290604052925050505b919050565b611b78611da6565b73ffffffffffffffffffffffffffffffffffffffff16611b966116d0565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613a4c565b60405180910390fd5b80600d8190555050565b600f5481565b6122b881565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b606481565b611cb6611da6565b73ffffffffffffffffffffffffffffffffffffffff16611cd46116d0565b73ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613a4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906138ac565b60405180910390fd5b611da381612240565b50565b600033905090565b6000611dc48260026124c390919063ffffffff16565b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3e8361116f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e92826000016124dd565b9050919050565b6000611ea482611dae565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda9061396c565b60405180910390fd5b6000611eee8361116f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5d57508373ffffffffffffffffffffffffffffffffffffffff16611f4584610bba565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f6e5750611f6d8185611c02565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f978261116f565b73ffffffffffffffffffffffffffffffffffffffff1614611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613a6c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906138ec565b60405180910390fd5b6120688383836124f2565b612073600082611dcb565b6120c481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124f790919063ffffffff16565b5061211681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061251190919063ffffffff16565b5061212d8183600261252b9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061219d8360000183612560565b60001c905092915050565b6000806000806121bb866000018661258b565b915091508160001c8160001c9350935050509250929050565b80600a90805190602001906121ea929190612dac565b5050565b6122088282604051806020016040528060008152506125cb565b5050565b600061221f846000018460001b84612626565b60001c90509392505050565b6000612239826000016126a7565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612311848484611f77565b61231d848484846126b8565b61235c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123539061388c565b60405180910390fd5b50505050565b606060008214156123aa576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124be565b600082905060005b600082146123dc5780806123c590613eb5565b915050600a826123d59190613ccb565b91506123b2565b60008167ffffffffffffffff8111156123f8576123f761401a565b5b6040519080825280601f01601f19166020018201604052801561242a5781602001600182028036833780820191505090505b5090505b600085146124b7576001826124439190613d56565b9150600a856124529190613efe565b603061245e9190613c75565b60f81b81838151811061247457612473613feb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124b09190613ccb565b945061242e565b8093505050505b919050565b60006124d5836000018360001b61281c565b905092915050565b60006124eb8260000161283c565b9050919050565b505050565b6000612509836000018360001b612851565b905092915050565b6000612523836000018360001b612965565b905092915050565b6000612557846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6129d5565b90509392505050565b600082600001828154811061257857612577613feb565b5b9060005260206000200154905092915050565b60008060006125a68486600001612a1090919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6125d58383612a27565b6125e260008484846126b8565b612621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126189061388c565b60405180910390fd5b505050565b6000808460020160008581526020019081526020016000205490506000801b811415806126595750612658858561281c565b5b839061269b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612692919061384a565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006126d98473ffffffffffffffffffffffffffffffffffffffff16612bb5565b6126e65760019050612814565b60006127ad63150b7a0260e01b6126fb611da6565b88878760405160240161271194939291906137c1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016146f1603291398773ffffffffffffffffffffffffffffffffffffffff16612bc89092919063ffffffff16565b90506000818060200190518101906127c591906131dd565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006128348284600001612be090919063ffffffff16565b905092915050565b600061284a826000016126a7565b9050919050565b600080836001016000848152602001908152602001600020549050600081146129595760006001826128839190613d56565b905060006001866000018054905061289b9190613d56565b905081811461290a5760008660000182815481106128bc576128bb613feb565b5b90600052602060002001549050808760000184815481106128e0576128df613feb565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061291e5761291d613fbc565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061295f565b60009150505b92915050565b60006129718383612bf7565b6129ca5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506129cf565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550612a078385600001612c1a90919063ffffffff16565b90509392505050565b6000612a1f8360000183612560565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e90613a0c565b60405180910390fd5b612aa081611dae565b15612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad7906138cc565b60405180910390fd5b612aec600083836124f2565b612b3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061251190919063ffffffff16565b50612b548183600261252b9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060612bd78484600085612c31565b90509392505050565b6000612bef8360000183612bf7565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612c298360000183612965565b905092915050565b606082471015612c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6d9061394c565b60405180910390fd5b612c7f85612bb5565b612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb590613aec565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ce7919061376b565b60006040518083038185875af1925050503d8060008114612d24576040519150601f19603f3d011682016040523d82523d6000602084013e612d29565b606091505b5091509150612d39828286612d45565b92505050949350505050565b60608315612d5557829050612da5565b600083511115612d685782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c919061384a565b60405180910390fd5b9392505050565b828054612db890613e52565b90600052602060002090601f016020900481019282612dda5760008555612e21565b82601f10612df357805160ff1916838001178555612e21565b82800160010185558215612e21579182015b82811115612e20578251825591602001919060010190612e05565b5b509050612e2e9190612e32565b5090565b5b80821115612e4b576000816000905550600101612e33565b5090565b6000612e62612e5d84613b8c565b613b67565b905082815260208101848484011115612e7e57612e7d61404e565b5b612e89848285613e10565b509392505050565b6000612ea4612e9f84613bbd565b613b67565b905082815260208101848484011115612ec057612ebf61404e565b5b612ecb848285613e10565b509392505050565b600081359050612ee28161467d565b92915050565b600081359050612ef781614694565b92915050565b600081359050612f0c816146ab565b92915050565b600081359050612f21816146c2565b92915050565b600081519050612f36816146c2565b92915050565b600082601f830112612f5157612f50614049565b5b8135612f61848260208601612e4f565b91505092915050565b600082601f830112612f7f57612f7e614049565b5b8135612f8f848260208601612e91565b91505092915050565b600081359050612fa7816146d9565b92915050565b600060208284031215612fc357612fc2614058565b5b6000612fd184828501612ed3565b91505092915050565b60008060408385031215612ff157612ff0614058565b5b6000612fff85828601612ee8565b925050602061301085828601612ee8565b9150509250929050565b6000806040838503121561303157613030614058565b5b600061303f85828601612ed3565b925050602061305085828601612ed3565b9150509250929050565b60008060006060848603121561307357613072614058565b5b600061308186828701612ed3565b935050602061309286828701612ed3565b92505060406130a386828701612f98565b9150509250925092565b600080600080608085870312156130c7576130c6614058565b5b60006130d587828801612ed3565b94505060206130e687828801612ed3565b93505060406130f787828801612f98565b925050606085013567ffffffffffffffff81111561311857613117614053565b5b61312487828801612f3c565b91505092959194509250565b6000806040838503121561314757613146614058565b5b600061315585828601612ed3565b925050602061316685828601612efd565b9150509250929050565b6000806040838503121561318757613186614058565b5b600061319585828601612ed3565b92505060206131a685828601612f98565b9150509250929050565b6000602082840312156131c6576131c5614058565b5b60006131d484828501612f12565b91505092915050565b6000602082840312156131f3576131f2614058565b5b600061320184828501612f27565b91505092915050565b6000602082840312156132205761321f614058565b5b600082013567ffffffffffffffff81111561323e5761323d614053565b5b61324a84828501612f6a565b91505092915050565b60006020828403121561326957613268614058565b5b600061327784828501612f98565b91505092915050565b6000806040838503121561329757613296614058565b5b60006132a585828601612f98565b92505060206132b685828601612ee8565b9150509250929050565b60006132cc838361374d565b60208301905092915050565b6132e181613d8a565b82525050565b60006132f282613bfe565b6132fc8185613c2c565b935061330783613bee565b8060005b8381101561333857815161331f88826132c0565b975061332a83613c1f565b92505060018101905061330b565b5085935050505092915050565b61334e81613dae565b82525050565b600061335f82613c09565b6133698185613c3d565b9350613379818560208601613e1f565b6133828161405d565b840191505092915050565b600061339882613c09565b6133a28185613c4e565b93506133b2818560208601613e1f565b80840191505092915050565b60006133c982613c14565b6133d38185613c59565b93506133e3818560208601613e1f565b6133ec8161405d565b840191505092915050565b600061340282613c14565b61340c8185613c6a565b935061341c818560208601613e1f565b80840191505092915050565b6000613435602a83613c59565b91506134408261406e565b604082019050919050565b6000613458603283613c59565b9150613463826140bd565b604082019050919050565b600061347b602683613c59565b91506134868261410c565b604082019050919050565b600061349e601c83613c59565b91506134a98261415b565b602082019050919050565b60006134c1602483613c59565b91506134cc82614184565b604082019050919050565b60006134e4601983613c59565b91506134ef826141d3565b602082019050919050565b6000613507601f83613c59565b9150613512826141fc565b602082019050919050565b600061352a602683613c59565b915061353582614225565b604082019050919050565b600061354d602c83613c59565b915061355882614274565b604082019050919050565b6000613570603883613c59565b915061357b826142c3565b604082019050919050565b6000613593602a83613c59565b915061359e82614312565b604082019050919050565b60006135b6602983613c59565b91506135c182614361565b604082019050919050565b60006135d9602283613c59565b91506135e4826143b0565b604082019050919050565b60006135fc602083613c59565b9150613607826143ff565b602082019050919050565b600061361f602c83613c59565b915061362a82614428565b604082019050919050565b6000613642602083613c59565b915061364d82614477565b602082019050919050565b6000613665602983613c59565b9150613670826144a0565b604082019050919050565b6000613688602f83613c59565b9150613693826144ef565b604082019050919050565b60006136ab602183613c59565b91506136b68261453e565b604082019050919050565b60006136ce603183613c59565b91506136d98261458d565b604082019050919050565b60006136f1601d83613c59565b91506136fc826145dc565b602082019050919050565b6000613714602083613c59565b915061371f82614605565b602082019050919050565b6000613737602183613c59565b91506137428261462e565b604082019050919050565b61375681613e06565b82525050565b61376581613e06565b82525050565b6000613777828461338d565b915081905092915050565b600061378e82856133f7565b915061379a82846133f7565b91508190509392505050565b60006020820190506137bb60008301846132d8565b92915050565b60006080820190506137d660008301876132d8565b6137e360208301866132d8565b6137f0604083018561375c565b81810360608301526138028184613354565b905095945050505050565b6000602082019050818103600083015261382781846132e7565b905092915050565b60006020820190506138446000830184613345565b92915050565b6000602082019050818103600083015261386481846133be565b905092915050565b6000602082019050818103600083015261388581613428565b9050919050565b600060208201905081810360008301526138a58161344b565b9050919050565b600060208201905081810360008301526138c58161346e565b9050919050565b600060208201905081810360008301526138e581613491565b9050919050565b60006020820190508181036000830152613905816134b4565b9050919050565b60006020820190508181036000830152613925816134d7565b9050919050565b60006020820190508181036000830152613945816134fa565b9050919050565b600060208201905081810360008301526139658161351d565b9050919050565b6000602082019050818103600083015261398581613540565b9050919050565b600060208201905081810360008301526139a581613563565b9050919050565b600060208201905081810360008301526139c581613586565b9050919050565b600060208201905081810360008301526139e5816135a9565b9050919050565b60006020820190508181036000830152613a05816135cc565b9050919050565b60006020820190508181036000830152613a25816135ef565b9050919050565b60006020820190508181036000830152613a4581613612565b9050919050565b60006020820190508181036000830152613a6581613635565b9050919050565b60006020820190508181036000830152613a8581613658565b9050919050565b60006020820190508181036000830152613aa58161367b565b9050919050565b60006020820190508181036000830152613ac58161369e565b9050919050565b60006020820190508181036000830152613ae5816136c1565b9050919050565b60006020820190508181036000830152613b05816136e4565b9050919050565b60006020820190508181036000830152613b2581613707565b9050919050565b60006020820190508181036000830152613b458161372a565b9050919050565b6000602082019050613b61600083018461375c565b92915050565b6000613b71613b82565b9050613b7d8282613e84565b919050565b6000604051905090565b600067ffffffffffffffff821115613ba757613ba661401a565b5b613bb08261405d565b9050602081019050919050565b600067ffffffffffffffff821115613bd857613bd761401a565b5b613be18261405d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c8082613e06565b9150613c8b83613e06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cc057613cbf613f2f565b5b828201905092915050565b6000613cd682613e06565b9150613ce183613e06565b925082613cf157613cf0613f5e565b5b828204905092915050565b6000613d0782613e06565b9150613d1283613e06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4b57613d4a613f2f565b5b828202905092915050565b6000613d6182613e06565b9150613d6c83613e06565b925082821015613d7f57613d7e613f2f565b5b828203905092915050565b6000613d9582613de6565b9050919050565b6000613da782613de6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e3d578082015181840152602081019050613e22565b83811115613e4c576000848401525b50505050565b60006002820490506001821680613e6a57607f821691505b60208210811415613e7e57613e7d613f8d565b5b50919050565b613e8d8261405d565b810181811067ffffffffffffffff82111715613eac57613eab61401a565b5b80604052505050565b6000613ec082613e06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef357613ef2613f2f565b5b600182019050919050565b6000613f0982613e06565b9150613f1483613e06565b925082613f2457613f23613f5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662053796c76696100000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420746f2066756c666960008201527f6c6c20616d6f756e740000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742053796c7660008201527f6961000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f63616e6e6f74207265656e7465722061206c6f636b65642066756e6374696f6e600082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b61468681613d8a565b811461469157600080fd5b50565b61469d81613d9c565b81146146a857600080fd5b50565b6146b481613dae565b81146146bf57600080fd5b50565b6146cb81613dba565b81146146d657600080fd5b50565b6146e281613e06565b81146146ed57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220b2fddb26b265b6aef2ca9feaf95923057a2aa49b5d09433e6970914f09522a6664736f6c63430008070033

Deployed Bytecode Sourcemap

356:3540:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1111:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9719:148:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1356:260:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46798:98:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49503:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49047:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1735:127:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;590:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48541:208:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50367:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;526:43:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48310:160:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1979:89:1;;;;;;;;;;;;;:::i;:::-;;50733:149:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48821:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1870:99:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2086:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46561:175:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2561:771:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48136:95:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46286:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2820:92;;;;;;;;;;;;;:::i;:::-;;3344:540:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2188:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46960:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;421:36:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49787:290:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50948:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47128:776;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1624:99:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;924:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;642:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50143:162:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;693:32:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;845:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3061:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1111:211:1;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1216:7:1::1;:5;:7::i;:::-;1206:17;;:6;:17;;;1198:26;;;::::0;::::1;;1277:1;1253:21;:25;;;;:::i;:::-;1243:7;:35;1235:44;;;::::0;::::1;;1290:6;:15;;:24;1306:7;1290:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1111:211:::0;;:::o;9719:148:0:-;9804:4;9827:20;:33;9848:11;9827:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9820:40;;9719:148;;;:::o;1356:260:1:-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1454:13:1::1;1494:1;1470:21;:25;;;;:::i;:::-;1454:41;;1500:13;1540:8;1516:21;:32;;;;:::i;:::-;1500:48;;1553:6;:15;;:25;1569:8;1553:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1583:6;:15;;:25;1599:8;1583:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1443:173;;1356:260:::0;;:::o;46798:98:0:-;46852:13;46884:5;46877:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46798:98;:::o;49503:217::-;49579:7;49606:16;49614:7;49606;:16::i;:::-;49598:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49689:15;:24;49705:7;49689:24;;;;;;;;;;;;;;;;;;;;;49682:31;;49503:217;;;:::o;49047:395::-;49127:13;49143:23;49158:7;49143:14;:23::i;:::-;49127:39;;49190:5;49184:11;;:2;:11;;;;49176:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49268:5;49252:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;49277:44;49301:5;49308:12;:10;:12::i;:::-;49277:23;:44::i;:::-;49252:69;49244:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;49414:21;49423:2;49427:7;49414:8;:21::i;:::-;49117:325;49047:395;;:::o;1735:127:1:-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1840:14:1::1;1820:17;:34;;;;;;;;;;;;:::i;:::-;;1735:127:::0;:::o;590:43::-;631:2;590:43;:::o;48541:208:0:-;48602:7;48721:21;:12;:19;:21::i;:::-;48714:28;;48541:208;:::o;50367:300::-;50526:41;50545:12;:10;:12::i;:::-;50559:7;50526:18;:41::i;:::-;50518:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50632:28;50642:4;50648:2;50652:7;50632:9;:28::i;:::-;50367:300;;;:::o;526:43:1:-;;;;:::o;48310:160:0:-;48407:7;48433:30;48457:5;48433:13;:20;48447:5;48433:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;48426:37;;48310:160;;;;:::o;1979:89:1:-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2048:12:1::1;;;;;;;;;;;2047:13;2032:12;;:28;;;;;;;;;;;;;;;;;;1979:89::o:0;50733:149:0:-;50836:39;50853:4;50859:2;50863:7;50836:39;;;;;;;;;;;;:16;:39::i;:::-;50733:149;;;:::o;48821:169::-;48896:7;48916:15;48937:22;48953:5;48937:12;:15;;:22;;;;:::i;:::-;48915:44;;;48976:7;48969:14;;;48821:169;;;:::o;1870:99:1:-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1941:20:1::1;1953:7;1941:11;:20::i;:::-;1870:99:::0;:::o;2086:465::-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2183:16:1::1;2219:10;;883:3;2202:27;;;;:::i;:::-;2183:46;;2300:1;2283:14;:18;:53;;;;;2335:1;2322:10;;:14;;;;:::i;:::-;2305;:31;2283:53;2275:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2398:6;2393:100;2414:14;2410:1;:18;2393:100;;;2450:31;2460:3;2479:1;2465:11;:15;;;;:::i;:::-;2450:9;:31::i;:::-;2430:3;;;;;:::i;:::-;;;;2393:100;;;;2529:14;2516:10;;:27;;;;:::i;:::-;2503:10;:40;;;;2164:387;2086:465:::0;;:::o;46561:175:0:-;46633:7;46659:70;46676:7;46659:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;46652:77;;46561:175;;;:::o;2561:771:1:-;42492:11:0;;;;;;;;;;;42491:12;42483:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42564:4;42550:11;;:18;;;;;;;;;;;;;;;;;;2648:12:1::1;;;;;;;;;;;2640:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2735:1;2718:14;:18;:60;;;;;2777:1;631:2;2757:21;;;;:::i;:::-;2740:14;:38;2718:60;2710:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;2895:1;2882:10;;680:4;2868:24;;;;:::i;:::-;:28;;;;:::i;:::-;2851:14;2835:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:61;2827:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;2986:14;2975:8;;:25;;;;:::i;:::-;2962:9;:38;;2954:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;3061:6;3057:266;3077:14;3073:1;:18;3057:266;;;3113:14;3146:10;;3130:13;:11;:13::i;:::-;:26;;;;:::i;:::-;3113:43;;680:4;3216:13;:11;:13::i;:::-;:27;3212:100;;;3264:32;3274:10;3286:9;3264;:32::i;:::-;3212:100;3098:225;3093:3;;;;;:::i;:::-;;;;3057:266;;;;42603:5:0::0;42589:11;;:19;;;;;;;;;;;;;;;;;;2561:771:1;:::o;48136:95:0:-;48184:13;48216:8;48209:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48136:95;:::o;46286:218::-;46358:7;46402:1;46385:19;;:5;:19;;;;46377:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46468:29;:13;:20;46482:5;46468:20;;;;;;;;;;;;;;;:27;:29::i;:::-;46461:36;;46286:218;;;:::o;2820:92::-;2411:12;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2884:21:::1;2902:1;2884:9;:21::i;:::-;2820:92::o:0;3344:540:1:-;3405:16;3435:18;3456:17;3466:6;3456:9;:17::i;:::-;3435:38;;3502:1;3488:10;:15;3484:393;;;3579:1;3565:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3558:23;;;;;3484:393;3614:23;3654:10;3640:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3614:51;;3680:13;3708:130;3732:10;3724:5;:18;3708:130;;;3788:34;3808:6;3816:5;3788:19;:34::i;:::-;3772:6;3779:5;3772:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;3744:7;;;;;:::i;:::-;;;;3708:130;;;3859:6;3852:13;;;;;3344:540;;;;:::o;2188:85:0:-;2234:7;2260:6;;;;;;;;;;;2253:13;;2188:85;:::o;46960:102::-;47016:13;47048:7;47041:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46960:102;:::o;421:36:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49787:290:0:-;49901:12;:10;:12::i;:::-;49889:24;;:8;:24;;;;49881:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49999:8;49954:18;:32;49973:12;:10;:12::i;:::-;49954:32;;;;;;;;;;;;;;;:42;49987:8;49954:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;50051:8;50022:48;;50037:12;:10;:12::i;:::-;50022:48;;;50061:8;50022:48;;;;;;:::i;:::-;;;;;;;;49787:290;;:::o;50948:282::-;51079:41;51098:12;:10;:12::i;:::-;51112:7;51079:18;:41::i;:::-;51071:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51184:39;51198:4;51204:2;51208:7;51217:5;51184:13;:39::i;:::-;50948:282;;;;:::o;47128:776::-;47201:13;47234:16;47242:7;47234;:16::i;:::-;47226:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47313:23;47339:10;:19;47350:7;47339:19;;;;;;;;;;;47313:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47368:18;47389:9;:7;:9::i;:::-;47368:30;;47493:1;47477:4;47471:18;:23;47467:70;;;47517:9;47510:16;;;;;;47467:70;47665:1;47645:9;47639:23;:27;47635:106;;;47713:4;47719:9;47696:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47682:48;;;;;;47635:106;47871:4;47877:18;:7;:16;:18::i;:::-;47854:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47840:57;;;;47128:776;;;;:::o;1624:99:1:-;2411:12:0;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1706:9:1::1;1695:8;:20;;;;1624:99:::0;:::o;924:39::-;;;;:::o;642:42::-;680:4;642:42;:::o;50143:162:0:-;50240:4;50263:18;:25;50282:5;50263:25;;;;;;;;;;;;;;;:35;50289:8;50263:35;;;;;;;;;;;;;;;;;;;;;;;;;50256:42;;50143:162;;;;:::o;693:32:1:-;;;;;;;;;;;;;:::o;845:41::-;883:3;845:41;:::o;3061:189:0:-;2411:12;:10;:12::i;:::-;2400:23;;:7;:5;:7::i;:::-;:23;;;2392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3169:1:::1;3149:22;;:8;:22;;;;3141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3224:19;3234:8;3224:9;:19::i;:::-;3061:189:::0;:::o;1072:96::-;1125:7;1151:10;1144:17;;1072:96;:::o;52664:125::-;52729:4;52752:30;52774:7;52752:12;:21;;:30;;;;:::i;:::-;52745:37;;52664:125;;;:::o;58506:189::-;58607:2;58580:15;:24;58596:7;58580:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58662:7;58658:2;58624:46;;58633:23;58648:7;58633:14;:23::i;:::-;58624:46;;;;;;;;;;;;58506:189;;:::o;30050:121::-;30119:7;30145:19;30153:3;:10;;30145:7;:19::i;:::-;30138:26;;30050:121;;;:::o;52947:351::-;53040:4;53064:16;53072:7;53064;:16::i;:::-;53056:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53139:13;53155:23;53170:7;53155:14;:23::i;:::-;53139:39;;53207:5;53196:16;;:7;:16;;;:51;;;;53240:7;53216:31;;:20;53228:7;53216:11;:20::i;:::-;:31;;;53196:51;:94;;;;53251:39;53275:5;53282:7;53251:23;:39::i;:::-;53196:94;53188:103;;;52947:351;;;;:::o;55988:584::-;56112:4;56085:31;;:23;56100:7;56085:14;:23::i;:::-;:31;;;56077:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56212:1;56198:16;;:2;:16;;;;56190:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56266:39;56287:4;56293:2;56297:7;56266:20;:39::i;:::-;56367:29;56384:1;56388:7;56367:8;:29::i;:::-;56407:35;56434:7;56407:13;:19;56421:4;56407:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;56452:30;56474:7;56452:13;:17;56466:2;56452:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56493:29;56510:7;56519:2;56493:12;:16;;:29;;;;;:::i;:::-;;56557:7;56553:2;56538:27;;56547:4;56538:27;;;;;;;;;;;;55988:584;;;:::o;23562:135::-;23633:7;23667:22;23671:3;:10;;23683:5;23667:3;:22::i;:::-;23659:31;;23652:38;;23562:135;;;;:::o;30508:233::-;30588:7;30597;30617:11;30630:13;30647:22;30651:3;:10;;30663:5;30647:3;:22::i;:::-;30616:53;;;;30695:3;30687:12;;30725:5;30717:14;;30679:55;;;;;;30508:233;;;;;:::o;57154:98::-;57237:8;57226;:19;;;;;;;;;;;;:::i;:::-;;57154:98;:::o;53629:108::-;53704:26;53714:2;53718:7;53704:26;;;;;;;;;;;;:9;:26::i;:::-;53629:108;;:::o;31761:241::-;31898:7;31948:44;31953:3;:10;;31973:3;31965:12;;31979;31948:4;:44::i;:::-;31940:53;;31917:78;;31761:241;;;;;:::o;23108:112::-;23168:7;23194:19;23202:3;:10;;23194:7;:19::i;:::-;23187:26;;23108:112;;;:::o;3256:169::-;3311:16;3330:6;;;;;;;;;;;3311:25;;3355:8;3346:6;;:17;;;;;;;;;;;;;;;;;;3409:8;3378:40;;3399:8;3378:40;;;;;;;;;;;;3301:124;3256:169;:::o;52092:269::-;52205:28;52215:4;52221:2;52225:7;52205:9;:28::i;:::-;52251:48;52274:4;52280:2;52284:7;52293:5;52251:22;:48::i;:::-;52243:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52092:269;;;;:::o;10707:703::-;10763:13;10989:1;10980:5;:10;10976:51;;;11006:10;;;;;;;;;;;;;;;;;;;;;10976:51;11036:12;11051:5;11036:20;;11066:14;11090:75;11105:1;11097:4;:9;11090:75;;11122:8;;;;;:::i;:::-;;;;11152:2;11144:10;;;;;:::i;:::-;;;11090:75;;;11174:19;11206:6;11196:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11174:39;;11223:150;11239:1;11230:5;:10;11223:150;;11266:1;11256:11;;;;;:::i;:::-;;;11332:2;11324:5;:10;;;;:::i;:::-;11311:2;:24;;;;:::i;:::-;11298:39;;11281:6;11288;11281:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11360:2;11351:11;;;;;:::i;:::-;;;11223:150;;;11396:6;11382:21;;;;;10707:703;;;;:::o;29818:149::-;29902:4;29925:35;29935:3;:10;;29955:3;29947:12;;29925:9;:35::i;:::-;29918:42;;29818:149;;;;:::o;26922:107::-;26978:7;27004:18;:3;:9;;:16;:18::i;:::-;26997:25;;26922:107;;;:::o;59291:93::-;;;;:::o;22667:135::-;22737:4;22760:35;22768:3;:10;;22788:5;22780:14;;22760:7;:35::i;:::-;22753:42;;22667:135;;;;:::o;22370:129::-;22437:4;22460:32;22465:3;:10;;22485:5;22477:14;;22460:4;:32::i;:::-;22453:39;;22370:129;;;;:::o;29227:213::-;29346:4;29369:64;29374:3;:10;;29394:3;29386:12;;29424:5;29408:23;;29400:32;;29369:4;:64::i;:::-;29362:71;;29227:213;;;;;:::o;16708:118::-;16775:7;16801:3;:11;;16813:5;16801:18;;;;;;;;:::i;:::-;;;;;;;;;;16794:25;;16708:118;;;;:::o;27382:175::-;27449:7;27458;27477:11;27491:19;27504:5;27491:3;:9;;:12;;:19;;;;:::i;:::-;27477:33;;27528:3;27533;:11;;:16;27545:3;27533:16;;;;;;;;;;;;27520:30;;;;;27382:175;;;;;:::o;53958:247::-;54053:18;54059:2;54063:7;54053:5;:18::i;:::-;54089:54;54120:1;54124:2;54128:7;54137:5;54089:22;:54::i;:::-;54081:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;53958:247;;;:::o;28648:270::-;28772:7;28791:13;28807:3;:11;;:16;28819:3;28807:16;;;;;;;;;;;;28791:32;;28850:1;28841:10;;:5;:10;;:33;;;;28855:19;28865:3;28870;28855:9;:19::i;:::-;28841:33;28876:12;28833:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28906:5;28899:12;;;28648:270;;;;;:::o;16259:107::-;16315:7;16341:3;:11;;:18;;;;16334:25;;16259:107;;;:::o;57805:589::-;57925:4;57950:15;:2;:13;;;:15::i;:::-;57945:58;;57988:4;57981:11;;;;57945:58;58012:23;58038:246;58090:45;;;58149:12;:10;:12::i;:::-;58175:4;58193:7;58214:5;58054:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58038:246;;;;;;;;;;;;;;;;;:2;:15;;;;:246;;;;;:::i;:::-;58012:272;;58294:13;58321:10;58310:32;;;;;;;;;;;;:::i;:::-;58294:48;;43366:10;58370:16;;58360:26;;;:6;:26;;;;58352:35;;;;57805:589;;;;;;;:::o;26708:124::-;26779:4;26802:23;26821:3;26802;:9;;:18;;:23;;;;:::i;:::-;26795:30;;26708:124;;;;:::o;18435:115::-;18498:7;18524:19;18532:3;:10;;18524:7;:19::i;:::-;18517:26;;18435:115;;;:::o;14582:1388::-;14648:4;14764:18;14785:3;:12;;:19;14798:5;14785:19;;;;;;;;;;;;14764:40;;14833:1;14819:10;:15;14815:1149;;15188:21;15225:1;15212:10;:14;;;;:::i;:::-;15188:38;;15240:17;15281:1;15260:3;:11;;:18;;;;:22;;;;:::i;:::-;15240:42;;15314:13;15301:9;:26;15297:398;;15347:17;15367:3;:11;;15379:9;15367:22;;;;;;;;:::i;:::-;;;;;;;;;;15347:42;;15518:9;15489:3;:11;;15501:13;15489:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;15627:10;15601:3;:12;;:23;15614:9;15601:23;;;;;;;;;;;:36;;;;15329:366;15297:398;15773:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15865:3;:12;;:19;15878:5;15865:19;;;;;;;;;;;15858:26;;;15906:4;15899:11;;;;;;;14815:1149;15948:5;15941:12;;;14582:1388;;;;;:::o;14010:404::-;14073:4;14094:21;14104:3;14109:5;14094:9;:21::i;:::-;14089:319;;14131:3;:11;;14148:5;14131:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14311:3;:11;;:18;;;;14289:3;:12;;:19;14302:5;14289:19;;;;;;;;;;;:40;;;;14350:4;14343:11;;;;14089:319;14392:5;14385:12;;14010:404;;;;;:::o;26125:188::-;26231:4;26266:5;26247:3;:11;;:16;26259:3;26247:16;;;;;;;;;;;:24;;;;26288:18;26302:3;26288;:9;;:13;;:18;;;;:::i;:::-;26281:25;;26125:188;;;;;:::o;18892:129::-;18966:7;18992:22;18996:3;:10;;19008:5;18992:3;:22::i;:::-;18985:29;;18892:129;;;;:::o;54527:393::-;54620:1;54606:16;;:2;:16;;;;54598:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54678:16;54686:7;54678;:16::i;:::-;54677:17;54669:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54738:45;54767:1;54771:2;54775:7;54738:20;:45::i;:::-;54794:30;54816:7;54794:13;:17;54808:2;54794:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;54835:29;54852:7;54861:2;54835:12;:16;;:29;;;;;:::i;:::-;;54905:7;54901:2;54880:33;;54897:1;54880:33;;;;;;;;;;;;54527:393;;:::o;32692:377::-;32752:4;32955:12;33020:7;33008:20;33000:28;;33061:1;33054:4;:8;33047:15;;;32692:377;;;:::o;35435:223::-;35568:12;35599:52;35621:6;35629:4;35635:1;35638:12;35599:21;:52::i;:::-;35592:59;;35435:223;;;;;:::o;18216:138::-;18296:4;18319:28;18329:3;:10;;18341:5;18319:9;:28::i;:::-;18312:35;;18216:138;;;;:::o;16051:127::-;16124:4;16170:1;16147:3;:12;;:19;16160:5;16147:19;;;;;;;;;;;;:24;;16140:31;;16051:127;;;;:::o;17715:123::-;17785:4;17808:23;17813:3;:10;;17825:5;17808:4;:23::i;:::-;17801:30;;17715:123;;;;:::o;36522:499::-;36687:12;36744:5;36719:21;:30;;36711:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36810:18;36821:6;36810:10;:18::i;:::-;36802:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36874:12;36888:23;36915:6;:11;;36934:5;36941:4;36915:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36873:73;;;;36963:51;36980:7;36989:10;37001:12;36963:16;:51::i;:::-;36956:58;;;;36522:499;;;;;;:::o;39135:692::-;39281:12;39309:7;39305:516;;;39339:10;39332:17;;;;39305:516;39470:1;39450:10;:17;:21;39446:365;;;39644:10;39638:17;39704:15;39691:10;39687:2;39683:19;39676:44;39446:365;39783:12;39776:20;;;;;;;;;;;:::i;:::-;;;;;;;;39135:692;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:2:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1331:5;1369:6;1356:20;1347:29;;1385:32;1411:5;1385:32;:::i;:::-;1286:137;;;;:::o;1429:141::-;1485:5;1516:6;1510:13;1501:22;;1532:32;1558:5;1532:32;:::i;:::-;1429:141;;;;:::o;1589:338::-;1644:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:122;;1701:79;;:::i;:::-;1660:122;1818:6;1805:20;1843:78;1917:3;1909:6;1902:4;1894:6;1890:17;1843:78;:::i;:::-;1834:87;;1650:277;1589:338;;;;:::o;1947:340::-;2003:5;2052:3;2045:4;2037:6;2033:17;2029:27;2019:122;;2060:79;;:::i;:::-;2019:122;2177:6;2164:20;2202:79;2277:3;2269:6;2262:4;2254:6;2250:17;2202:79;:::i;:::-;2193:88;;2009:278;1947:340;;;;:::o;2293:139::-;2339:5;2377:6;2364:20;2355:29;;2393:33;2420:5;2393:33;:::i;:::-;2293:139;;;;:::o;2438:329::-;2497:6;2546:2;2534:9;2525:7;2521:23;2517:32;2514:119;;;2552:79;;:::i;:::-;2514:119;2672:1;2697:53;2742:7;2733:6;2722:9;2718:22;2697:53;:::i;:::-;2687:63;;2643:117;2438:329;;;;:::o;2773:506::-;2857:6;2865;2914:2;2902:9;2893:7;2889:23;2885:32;2882:119;;;2920:79;;:::i;:::-;2882:119;3040:1;3065:61;3118:7;3109:6;3098:9;3094:22;3065:61;:::i;:::-;3055:71;;3011:125;3175:2;3201:61;3254:7;3245:6;3234:9;3230:22;3201:61;:::i;:::-;3191:71;;3146:126;2773:506;;;;;:::o;3285:474::-;3353:6;3361;3410:2;3398:9;3389:7;3385:23;3381:32;3378:119;;;3416:79;;:::i;:::-;3378:119;3536:1;3561:53;3606:7;3597:6;3586:9;3582:22;3561:53;:::i;:::-;3551:63;;3507:117;3663:2;3689:53;3734:7;3725:6;3714:9;3710:22;3689:53;:::i;:::-;3679:63;;3634:118;3285:474;;;;;:::o;3765:619::-;3842:6;3850;3858;3907:2;3895:9;3886:7;3882:23;3878:32;3875:119;;;3913:79;;:::i;:::-;3875:119;4033:1;4058:53;4103:7;4094:6;4083:9;4079:22;4058:53;:::i;:::-;4048:63;;4004:117;4160:2;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4131:118;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;3765:619;;;;;:::o;4390:943::-;4485:6;4493;4501;4509;4558:3;4546:9;4537:7;4533:23;4529:33;4526:120;;;4565:79;;:::i;:::-;4526:120;4685:1;4710:53;4755:7;4746:6;4735:9;4731:22;4710:53;:::i;:::-;4700:63;;4656:117;4812:2;4838:53;4883:7;4874:6;4863:9;4859:22;4838:53;:::i;:::-;4828:63;;4783:118;4940:2;4966:53;5011:7;5002:6;4991:9;4987:22;4966:53;:::i;:::-;4956:63;;4911:118;5096:2;5085:9;5081:18;5068:32;5127:18;5119:6;5116:30;5113:117;;;5149:79;;:::i;:::-;5113:117;5254:62;5308:7;5299:6;5288:9;5284:22;5254:62;:::i;:::-;5244:72;;5039:287;4390:943;;;;;;;:::o;5339:468::-;5404:6;5412;5461:2;5449:9;5440:7;5436:23;5432:32;5429:119;;;5467:79;;:::i;:::-;5429:119;5587:1;5612:53;5657:7;5648:6;5637:9;5633:22;5612:53;:::i;:::-;5602:63;;5558:117;5714:2;5740:50;5782:7;5773:6;5762:9;5758:22;5740:50;:::i;:::-;5730:60;;5685:115;5339:468;;;;;:::o;5813:474::-;5881:6;5889;5938:2;5926:9;5917:7;5913:23;5909:32;5906:119;;;5944:79;;:::i;:::-;5906:119;6064:1;6089:53;6134:7;6125:6;6114:9;6110:22;6089:53;:::i;:::-;6079:63;;6035:117;6191:2;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6162:118;5813:474;;;;;:::o;6293:327::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:52;6595:7;6586:6;6575:9;6571:22;6551:52;:::i;:::-;6541:62;;6497:116;6293:327;;;;:::o;6626:349::-;6695:6;6744:2;6732:9;6723:7;6719:23;6715:32;6712:119;;;6750:79;;:::i;:::-;6712:119;6870:1;6895:63;6950:7;6941:6;6930:9;6926:22;6895:63;:::i;:::-;6885:73;;6841:127;6626:349;;;;:::o;6981:509::-;7050:6;7099:2;7087:9;7078:7;7074:23;7070:32;7067:119;;;7105:79;;:::i;:::-;7067:119;7253:1;7242:9;7238:17;7225:31;7283:18;7275:6;7272:30;7269:117;;;7305:79;;:::i;:::-;7269:117;7410:63;7465:7;7456:6;7445:9;7441:22;7410:63;:::i;:::-;7400:73;;7196:287;6981:509;;;;:::o;7496:329::-;7555:6;7604:2;7592:9;7583:7;7579:23;7575:32;7572:119;;;7610:79;;:::i;:::-;7572:119;7730:1;7755:53;7800:7;7791:6;7780:9;7776:22;7755:53;:::i;:::-;7745:63;;7701:117;7496:329;;;;:::o;7831:490::-;7907:6;7915;7964:2;7952:9;7943:7;7939:23;7935:32;7932:119;;;7970:79;;:::i;:::-;7932:119;8090:1;8115:53;8160:7;8151:6;8140:9;8136:22;8115:53;:::i;:::-;8105:63;;8061:117;8217:2;8243:61;8296:7;8287:6;8276:9;8272:22;8243:61;:::i;:::-;8233:71;;8188:126;7831:490;;;;;:::o;8327:179::-;8396:10;8417:46;8459:3;8451:6;8417:46;:::i;:::-;8495:4;8490:3;8486:14;8472:28;;8327:179;;;;:::o;8512:118::-;8599:24;8617:5;8599:24;:::i;:::-;8594:3;8587:37;8512:118;;:::o;8666:732::-;8785:3;8814:54;8862:5;8814:54;:::i;:::-;8884:86;8963:6;8958:3;8884:86;:::i;:::-;8877:93;;8994:56;9044:5;8994:56;:::i;:::-;9073:7;9104:1;9089:284;9114:6;9111:1;9108:13;9089:284;;;9190:6;9184:13;9217:63;9276:3;9261:13;9217:63;:::i;:::-;9210:70;;9303:60;9356:6;9303:60;:::i;:::-;9293:70;;9149:224;9136:1;9133;9129:9;9124:14;;9089:284;;;9093:14;9389:3;9382:10;;8790:608;;;8666:732;;;;:::o;9404:109::-;9485:21;9500:5;9485:21;:::i;:::-;9480:3;9473:34;9404:109;;:::o;9519:360::-;9605:3;9633:38;9665:5;9633:38;:::i;:::-;9687:70;9750:6;9745:3;9687:70;:::i;:::-;9680:77;;9766:52;9811:6;9806:3;9799:4;9792:5;9788:16;9766:52;:::i;:::-;9843:29;9865:6;9843:29;:::i;:::-;9838:3;9834:39;9827:46;;9609:270;9519:360;;;;:::o;9885:373::-;9989:3;10017:38;10049:5;10017:38;:::i;:::-;10071:88;10152:6;10147:3;10071:88;:::i;:::-;10064:95;;10168:52;10213:6;10208:3;10201:4;10194:5;10190:16;10168:52;:::i;:::-;10245:6;10240:3;10236:16;10229:23;;9993:265;9885:373;;;;:::o;10264:364::-;10352:3;10380:39;10413:5;10380:39;:::i;:::-;10435:71;10499:6;10494:3;10435:71;:::i;:::-;10428:78;;10515:52;10560:6;10555:3;10548:4;10541:5;10537:16;10515:52;:::i;:::-;10592:29;10614:6;10592:29;:::i;:::-;10587:3;10583:39;10576:46;;10356:272;10264:364;;;;:::o;10634:377::-;10740:3;10768:39;10801:5;10768:39;:::i;:::-;10823:89;10905:6;10900:3;10823:89;:::i;:::-;10816:96;;10921:52;10966:6;10961:3;10954:4;10947:5;10943:16;10921:52;:::i;:::-;10998:6;10993:3;10989:16;10982:23;;10744:267;10634:377;;;;:::o;11017:366::-;11159:3;11180:67;11244:2;11239:3;11180:67;:::i;:::-;11173:74;;11256:93;11345:3;11256:93;:::i;:::-;11374:2;11369:3;11365:12;11358:19;;11017:366;;;:::o;11389:::-;11531:3;11552:67;11616:2;11611:3;11552:67;:::i;:::-;11545:74;;11628:93;11717:3;11628:93;:::i;:::-;11746:2;11741:3;11737:12;11730:19;;11389:366;;;:::o;11761:::-;11903:3;11924:67;11988:2;11983:3;11924:67;:::i;:::-;11917:74;;12000:93;12089:3;12000:93;:::i;:::-;12118:2;12113:3;12109:12;12102:19;;11761:366;;;:::o;12133:::-;12275:3;12296:67;12360:2;12355:3;12296:67;:::i;:::-;12289:74;;12372:93;12461:3;12372:93;:::i;:::-;12490:2;12485:3;12481:12;12474:19;;12133:366;;;:::o;12505:::-;12647:3;12668:67;12732:2;12727:3;12668:67;:::i;:::-;12661:74;;12744:93;12833:3;12744:93;:::i;:::-;12862:2;12857:3;12853:12;12846:19;;12505:366;;;:::o;12877:::-;13019:3;13040:67;13104:2;13099:3;13040:67;:::i;:::-;13033:74;;13116:93;13205:3;13116:93;:::i;:::-;13234:2;13229:3;13225:12;13218:19;;12877:366;;;:::o;13249:::-;13391:3;13412:67;13476:2;13471:3;13412:67;:::i;:::-;13405:74;;13488:93;13577:3;13488:93;:::i;:::-;13606:2;13601:3;13597:12;13590:19;;13249:366;;;:::o;13621:::-;13763:3;13784:67;13848:2;13843:3;13784:67;:::i;:::-;13777:74;;13860:93;13949:3;13860:93;:::i;:::-;13978:2;13973:3;13969:12;13962:19;;13621:366;;;:::o;13993:::-;14135:3;14156:67;14220:2;14215:3;14156:67;:::i;:::-;14149:74;;14232:93;14321:3;14232:93;:::i;:::-;14350:2;14345:3;14341:12;14334:19;;13993:366;;;:::o;14365:::-;14507:3;14528:67;14592:2;14587:3;14528:67;:::i;:::-;14521:74;;14604:93;14693:3;14604:93;:::i;:::-;14722:2;14717:3;14713:12;14706:19;;14365:366;;;:::o;14737:::-;14879:3;14900:67;14964:2;14959:3;14900:67;:::i;:::-;14893:74;;14976:93;15065:3;14976:93;:::i;:::-;15094:2;15089:3;15085:12;15078:19;;14737:366;;;:::o;15109:::-;15251:3;15272:67;15336:2;15331:3;15272:67;:::i;:::-;15265:74;;15348:93;15437:3;15348:93;:::i;:::-;15466:2;15461:3;15457:12;15450:19;;15109:366;;;:::o;15481:::-;15623:3;15644:67;15708:2;15703:3;15644:67;:::i;:::-;15637:74;;15720:93;15809:3;15720:93;:::i;:::-;15838:2;15833:3;15829:12;15822:19;;15481:366;;;:::o;15853:::-;15995:3;16016:67;16080:2;16075:3;16016:67;:::i;:::-;16009:74;;16092:93;16181:3;16092:93;:::i;:::-;16210:2;16205:3;16201:12;16194:19;;15853:366;;;:::o;16225:::-;16367:3;16388:67;16452:2;16447:3;16388:67;:::i;:::-;16381:74;;16464:93;16553:3;16464:93;:::i;:::-;16582:2;16577:3;16573:12;16566:19;;16225:366;;;:::o;16597:::-;16739:3;16760:67;16824:2;16819:3;16760:67;:::i;:::-;16753:74;;16836:93;16925:3;16836:93;:::i;:::-;16954:2;16949:3;16945:12;16938:19;;16597:366;;;:::o;16969:::-;17111:3;17132:67;17196:2;17191:3;17132:67;:::i;:::-;17125:74;;17208:93;17297:3;17208:93;:::i;:::-;17326:2;17321:3;17317:12;17310:19;;16969:366;;;:::o;17341:::-;17483:3;17504:67;17568:2;17563:3;17504:67;:::i;:::-;17497:74;;17580:93;17669:3;17580:93;:::i;:::-;17698:2;17693:3;17689:12;17682:19;;17341:366;;;:::o;17713:::-;17855:3;17876:67;17940:2;17935:3;17876:67;:::i;:::-;17869:74;;17952:93;18041:3;17952:93;:::i;:::-;18070:2;18065:3;18061:12;18054:19;;17713:366;;;:::o;18085:::-;18227:3;18248:67;18312:2;18307:3;18248:67;:::i;:::-;18241:74;;18324:93;18413:3;18324:93;:::i;:::-;18442:2;18437:3;18433:12;18426:19;;18085:366;;;:::o;18457:::-;18599:3;18620:67;18684:2;18679:3;18620:67;:::i;:::-;18613:74;;18696:93;18785:3;18696:93;:::i;:::-;18814:2;18809:3;18805:12;18798:19;;18457:366;;;:::o;18829:::-;18971:3;18992:67;19056:2;19051:3;18992:67;:::i;:::-;18985:74;;19068:93;19157:3;19068:93;:::i;:::-;19186:2;19181:3;19177:12;19170:19;;18829:366;;;:::o;19201:::-;19343:3;19364:67;19428:2;19423:3;19364:67;:::i;:::-;19357:74;;19440:93;19529:3;19440:93;:::i;:::-;19558:2;19553:3;19549:12;19542:19;;19201:366;;;:::o;19573:108::-;19650:24;19668:5;19650:24;:::i;:::-;19645:3;19638:37;19573:108;;:::o;19687:118::-;19774:24;19792:5;19774:24;:::i;:::-;19769:3;19762:37;19687:118;;:::o;19811:271::-;19941:3;19963:93;20052:3;20043:6;19963:93;:::i;:::-;19956:100;;20073:3;20066:10;;19811:271;;;;:::o;20088:435::-;20268:3;20290:95;20381:3;20372:6;20290:95;:::i;:::-;20283:102;;20402:95;20493:3;20484:6;20402:95;:::i;:::-;20395:102;;20514:3;20507:10;;20088:435;;;;;:::o;20529:222::-;20622:4;20660:2;20649:9;20645:18;20637:26;;20673:71;20741:1;20730:9;20726:17;20717:6;20673:71;:::i;:::-;20529:222;;;;:::o;20757:640::-;20952:4;20990:3;20979:9;20975:19;20967:27;;21004:71;21072:1;21061:9;21057:17;21048:6;21004:71;:::i;:::-;21085:72;21153:2;21142:9;21138:18;21129:6;21085:72;:::i;:::-;21167;21235:2;21224:9;21220:18;21211:6;21167:72;:::i;:::-;21286:9;21280:4;21276:20;21271:2;21260:9;21256:18;21249:48;21314:76;21385:4;21376:6;21314:76;:::i;:::-;21306:84;;20757:640;;;;;;;:::o;21403:373::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21633:9;21627:4;21623:20;21619:1;21608:9;21604:17;21597:47;21661:108;21764:4;21755:6;21661:108;:::i;:::-;21653:116;;21403:373;;;;:::o;21782:210::-;21869:4;21907:2;21896:9;21892:18;21884:26;;21920:65;21982:1;21971:9;21967:17;21958:6;21920:65;:::i;:::-;21782:210;;;;:::o;21998:313::-;22111:4;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:78;22299:4;22290:6;22226:78;:::i;:::-;22218:86;;21998:313;;;;:::o;22317:419::-;22483:4;22521:2;22510:9;22506:18;22498:26;;22570:9;22564:4;22560:20;22556:1;22545:9;22541:17;22534:47;22598:131;22724:4;22598:131;:::i;:::-;22590:139;;22317:419;;;:::o;22742:::-;22908:4;22946:2;22935:9;22931:18;22923:26;;22995:9;22989:4;22985:20;22981:1;22970:9;22966:17;22959:47;23023:131;23149:4;23023:131;:::i;:::-;23015:139;;22742:419;;;:::o;23167:::-;23333:4;23371:2;23360:9;23356:18;23348:26;;23420:9;23414:4;23410:20;23406:1;23395:9;23391:17;23384:47;23448:131;23574:4;23448:131;:::i;:::-;23440:139;;23167:419;;;:::o;23592:::-;23758:4;23796:2;23785:9;23781:18;23773:26;;23845:9;23839:4;23835:20;23831:1;23820:9;23816:17;23809:47;23873:131;23999:4;23873:131;:::i;:::-;23865:139;;23592:419;;;:::o;24017:::-;24183:4;24221:2;24210:9;24206:18;24198:26;;24270:9;24264:4;24260:20;24256:1;24245:9;24241:17;24234:47;24298:131;24424:4;24298:131;:::i;:::-;24290:139;;24017:419;;;:::o;24442:::-;24608:4;24646:2;24635:9;24631:18;24623:26;;24695:9;24689:4;24685:20;24681:1;24670:9;24666:17;24659:47;24723:131;24849:4;24723:131;:::i;:::-;24715:139;;24442:419;;;:::o;24867:::-;25033:4;25071:2;25060:9;25056:18;25048:26;;25120:9;25114:4;25110:20;25106:1;25095:9;25091:17;25084:47;25148:131;25274:4;25148:131;:::i;:::-;25140:139;;24867:419;;;:::o;25292:::-;25458:4;25496:2;25485:9;25481:18;25473:26;;25545:9;25539:4;25535:20;25531:1;25520:9;25516:17;25509:47;25573:131;25699:4;25573:131;:::i;:::-;25565:139;;25292:419;;;:::o;25717:::-;25883:4;25921:2;25910:9;25906:18;25898:26;;25970:9;25964:4;25960:20;25956:1;25945:9;25941:17;25934:47;25998:131;26124:4;25998:131;:::i;:::-;25990:139;;25717:419;;;:::o;26142:::-;26308:4;26346:2;26335:9;26331:18;26323:26;;26395:9;26389:4;26385:20;26381:1;26370:9;26366:17;26359:47;26423:131;26549:4;26423:131;:::i;:::-;26415:139;;26142:419;;;:::o;26567:::-;26733:4;26771:2;26760:9;26756:18;26748:26;;26820:9;26814:4;26810:20;26806:1;26795:9;26791:17;26784:47;26848:131;26974:4;26848:131;:::i;:::-;26840:139;;26567:419;;;:::o;26992:::-;27158:4;27196:2;27185:9;27181:18;27173:26;;27245:9;27239:4;27235:20;27231:1;27220:9;27216:17;27209:47;27273:131;27399:4;27273:131;:::i;:::-;27265:139;;26992:419;;;:::o;27417:::-;27583:4;27621:2;27610:9;27606:18;27598:26;;27670:9;27664:4;27660:20;27656:1;27645:9;27641:17;27634:47;27698:131;27824:4;27698:131;:::i;:::-;27690:139;;27417:419;;;:::o;27842:::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28095:9;28089:4;28085:20;28081:1;28070:9;28066:17;28059:47;28123:131;28249:4;28123:131;:::i;:::-;28115:139;;27842:419;;;:::o;28267:::-;28433:4;28471:2;28460:9;28456:18;28448:26;;28520:9;28514:4;28510:20;28506:1;28495:9;28491:17;28484:47;28548:131;28674:4;28548:131;:::i;:::-;28540:139;;28267:419;;;:::o;28692:::-;28858:4;28896:2;28885:9;28881:18;28873:26;;28945:9;28939:4;28935:20;28931:1;28920:9;28916:17;28909:47;28973:131;29099:4;28973:131;:::i;:::-;28965:139;;28692:419;;;:::o;29117:::-;29283:4;29321:2;29310:9;29306:18;29298:26;;29370:9;29364:4;29360:20;29356:1;29345:9;29341:17;29334:47;29398:131;29524:4;29398:131;:::i;:::-;29390:139;;29117:419;;;:::o;29542:::-;29708:4;29746:2;29735:9;29731:18;29723:26;;29795:9;29789:4;29785:20;29781:1;29770:9;29766:17;29759:47;29823:131;29949:4;29823:131;:::i;:::-;29815:139;;29542:419;;;:::o;29967:::-;30133:4;30171:2;30160:9;30156:18;30148:26;;30220:9;30214:4;30210:20;30206:1;30195:9;30191:17;30184:47;30248:131;30374:4;30248:131;:::i;:::-;30240:139;;29967:419;;;:::o;30392:::-;30558:4;30596:2;30585:9;30581:18;30573:26;;30645:9;30639:4;30635:20;30631:1;30620:9;30616:17;30609:47;30673:131;30799:4;30673:131;:::i;:::-;30665:139;;30392:419;;;:::o;30817:::-;30983:4;31021:2;31010:9;31006:18;30998:26;;31070:9;31064:4;31060:20;31056:1;31045:9;31041:17;31034:47;31098:131;31224:4;31098:131;:::i;:::-;31090:139;;30817:419;;;:::o;31242:::-;31408:4;31446:2;31435:9;31431:18;31423:26;;31495:9;31489:4;31485:20;31481:1;31470:9;31466:17;31459:47;31523:131;31649:4;31523:131;:::i;:::-;31515:139;;31242:419;;;:::o;31667:::-;31833:4;31871:2;31860:9;31856:18;31848:26;;31920:9;31914:4;31910:20;31906:1;31895:9;31891:17;31884:47;31948:131;32074:4;31948:131;:::i;:::-;31940:139;;31667:419;;;:::o;32092:222::-;32185:4;32223:2;32212:9;32208:18;32200:26;;32236:71;32304:1;32293:9;32289:17;32280:6;32236:71;:::i;:::-;32092:222;;;;:::o;32320:129::-;32354:6;32381:20;;:::i;:::-;32371:30;;32410:33;32438:4;32430:6;32410:33;:::i;:::-;32320:129;;;:::o;32455:75::-;32488:6;32521:2;32515:9;32505:19;;32455:75;:::o;32536:307::-;32597:4;32687:18;32679:6;32676:30;32673:56;;;32709:18;;:::i;:::-;32673:56;32747:29;32769:6;32747:29;:::i;:::-;32739:37;;32831:4;32825;32821:15;32813:23;;32536:307;;;:::o;32849:308::-;32911:4;33001:18;32993:6;32990:30;32987:56;;;33023:18;;:::i;:::-;32987:56;33061:29;33083:6;33061:29;:::i;:::-;33053:37;;33145:4;33139;33135:15;33127:23;;32849:308;;;:::o;33163:132::-;33230:4;33253:3;33245:11;;33283:4;33278:3;33274:14;33266:22;;33163:132;;;:::o;33301:114::-;33368:6;33402:5;33396:12;33386:22;;33301:114;;;:::o;33421:98::-;33472:6;33506:5;33500:12;33490:22;;33421:98;;;:::o;33525:99::-;33577:6;33611:5;33605:12;33595:22;;33525:99;;;:::o;33630:113::-;33700:4;33732;33727:3;33723:14;33715:22;;33630:113;;;:::o;33749:184::-;33848:11;33882:6;33877:3;33870:19;33922:4;33917:3;33913:14;33898:29;;33749:184;;;;:::o;33939:168::-;34022:11;34056:6;34051:3;34044:19;34096:4;34091:3;34087:14;34072:29;;33939:168;;;;:::o;34113:147::-;34214:11;34251:3;34236:18;;34113:147;;;;:::o;34266:169::-;34350:11;34384:6;34379:3;34372:19;34424:4;34419:3;34415:14;34400:29;;34266:169;;;;:::o;34441:148::-;34543:11;34580:3;34565:18;;34441:148;;;;:::o;34595:305::-;34635:3;34654:20;34672:1;34654:20;:::i;:::-;34649:25;;34688:20;34706:1;34688:20;:::i;:::-;34683:25;;34842:1;34774:66;34770:74;34767:1;34764:81;34761:107;;;34848:18;;:::i;:::-;34761:107;34892:1;34889;34885:9;34878:16;;34595:305;;;;:::o;34906:185::-;34946:1;34963:20;34981:1;34963:20;:::i;:::-;34958:25;;34997:20;35015:1;34997:20;:::i;:::-;34992:25;;35036:1;35026:35;;35041:18;;:::i;:::-;35026:35;35083:1;35080;35076:9;35071:14;;34906:185;;;;:::o;35097:348::-;35137:7;35160:20;35178:1;35160:20;:::i;:::-;35155:25;;35194:20;35212:1;35194:20;:::i;:::-;35189:25;;35382:1;35314:66;35310:74;35307:1;35304:81;35299:1;35292:9;35285:17;35281:105;35278:131;;;35389:18;;:::i;:::-;35278:131;35437:1;35434;35430:9;35419:20;;35097:348;;;;:::o;35451:191::-;35491:4;35511:20;35529:1;35511:20;:::i;:::-;35506:25;;35545:20;35563:1;35545:20;:::i;:::-;35540:25;;35584:1;35581;35578:8;35575:34;;;35589:18;;:::i;:::-;35575:34;35634:1;35631;35627:9;35619:17;;35451:191;;;;:::o;35648:96::-;35685:7;35714:24;35732:5;35714:24;:::i;:::-;35703:35;;35648:96;;;:::o;35750:104::-;35795:7;35824:24;35842:5;35824:24;:::i;:::-;35813:35;;35750:104;;;:::o;35860:90::-;35894:7;35937:5;35930:13;35923:21;35912:32;;35860:90;;;:::o;35956:149::-;35992:7;36032:66;36025:5;36021:78;36010:89;;35956:149;;;:::o;36111:126::-;36148:7;36188:42;36181:5;36177:54;36166:65;;36111:126;;;:::o;36243:77::-;36280:7;36309:5;36298:16;;36243:77;;;:::o;36326:154::-;36410:6;36405:3;36400;36387:30;36472:1;36463:6;36458:3;36454:16;36447:27;36326:154;;;:::o;36486:307::-;36554:1;36564:113;36578:6;36575:1;36572:13;36564:113;;;36663:1;36658:3;36654:11;36648:18;36644:1;36639:3;36635:11;36628:39;36600:2;36597:1;36593:10;36588:15;;36564:113;;;36695:6;36692:1;36689:13;36686:101;;;36775:1;36766:6;36761:3;36757:16;36750:27;36686:101;36535:258;36486:307;;;:::o;36799:320::-;36843:6;36880:1;36874:4;36870:12;36860:22;;36927:1;36921:4;36917:12;36948:18;36938:81;;37004:4;36996:6;36992:17;36982:27;;36938:81;37066:2;37058:6;37055:14;37035:18;37032:38;37029:84;;;37085:18;;:::i;:::-;37029:84;36850:269;36799:320;;;:::o;37125:281::-;37208:27;37230:4;37208:27;:::i;:::-;37200:6;37196:40;37338:6;37326:10;37323:22;37302:18;37290:10;37287:34;37284:62;37281:88;;;37349:18;;:::i;:::-;37281:88;37389:10;37385:2;37378:22;37168:238;37125:281;;:::o;37412:233::-;37451:3;37474:24;37492:5;37474:24;:::i;:::-;37465:33;;37520:66;37513:5;37510:77;37507:103;;;37590:18;;:::i;:::-;37507:103;37637:1;37630:5;37626:13;37619:20;;37412:233;;;:::o;37651:176::-;37683:1;37700:20;37718:1;37700:20;:::i;:::-;37695:25;;37734:20;37752:1;37734:20;:::i;:::-;37729:25;;37773:1;37763:35;;37778:18;;:::i;:::-;37763:35;37819:1;37816;37812:9;37807:14;;37651:176;;;;:::o;37833:180::-;37881:77;37878:1;37871:88;37978:4;37975:1;37968:15;38002:4;37999:1;37992:15;38019:180;38067:77;38064:1;38057:88;38164:4;38161:1;38154:15;38188:4;38185:1;38178:15;38205:180;38253:77;38250:1;38243:88;38350:4;38347:1;38340:15;38374:4;38371:1;38364:15;38391:180;38439:77;38436:1;38429:88;38536:4;38533:1;38526:15;38560:4;38557:1;38550:15;38577:180;38625:77;38622:1;38615:88;38722:4;38719:1;38712:15;38746:4;38743:1;38736:15;38763:180;38811:77;38808:1;38801:88;38908:4;38905:1;38898:15;38932:4;38929:1;38922:15;38949:117;39058:1;39055;39048:12;39072:117;39181:1;39178;39171:12;39195:117;39304:1;39301;39294:12;39318:117;39427:1;39424;39417:12;39441:102;39482:6;39533:2;39529:7;39524:2;39517:5;39513:14;39509:28;39499:38;;39441:102;;;:::o;39549:229::-;39689:34;39685:1;39677:6;39673:14;39666:58;39758:12;39753:2;39745:6;39741:15;39734:37;39549:229;:::o;39784:237::-;39924:34;39920:1;39912:6;39908:14;39901:58;39993:20;39988:2;39980:6;39976:15;39969:45;39784:237;:::o;40027:225::-;40167:34;40163:1;40155:6;40151:14;40144:58;40236:8;40231:2;40223:6;40219:15;40212:33;40027:225;:::o;40258:178::-;40398:30;40394:1;40386:6;40382:14;40375:54;40258:178;:::o;40442:223::-;40582:34;40578:1;40570:6;40566:14;40559:58;40651:6;40646:2;40638:6;40634:15;40627:31;40442:223;:::o;40671:175::-;40811:27;40807:1;40799:6;40795:14;40788:51;40671:175;:::o;40852:181::-;40992:33;40988:1;40980:6;40976:14;40969:57;40852:181;:::o;41039:225::-;41179:34;41175:1;41167:6;41163:14;41156:58;41248:8;41243:2;41235:6;41231:15;41224:33;41039:225;:::o;41270:231::-;41410:34;41406:1;41398:6;41394:14;41387:58;41479:14;41474:2;41466:6;41462:15;41455:39;41270:231;:::o;41507:243::-;41647:34;41643:1;41635:6;41631:14;41624:58;41716:26;41711:2;41703:6;41699:15;41692:51;41507:243;:::o;41756:229::-;41896:34;41892:1;41884:6;41880:14;41873:58;41965:12;41960:2;41952:6;41948:15;41941:37;41756:229;:::o;41991:228::-;42131:34;42127:1;42119:6;42115:14;42108:58;42200:11;42195:2;42187:6;42183:15;42176:36;41991:228;:::o;42225:221::-;42365:34;42361:1;42353:6;42349:14;42342:58;42434:4;42429:2;42421:6;42417:15;42410:29;42225:221;:::o;42452:182::-;42592:34;42588:1;42580:6;42576:14;42569:58;42452:182;:::o;42640:231::-;42780:34;42776:1;42768:6;42764:14;42757:58;42849:14;42844:2;42836:6;42832:15;42825:39;42640:231;:::o;42877:182::-;43017:34;43013:1;43005:6;43001:14;42994:58;42877:182;:::o;43065:228::-;43205:34;43201:1;43193:6;43189:14;43182:58;43274:11;43269:2;43261:6;43257:15;43250:36;43065:228;:::o;43299:234::-;43439:34;43435:1;43427:6;43423:14;43416:58;43508:17;43503:2;43495:6;43491:15;43484:42;43299:234;:::o;43539:220::-;43679:34;43675:1;43667:6;43663:14;43656:58;43748:3;43743:2;43735:6;43731:15;43724:28;43539:220;:::o;43765:236::-;43905:34;43901:1;43893:6;43889:14;43882:58;43974:19;43969:2;43961:6;43957:15;43950:44;43765:236;:::o;44007:179::-;44147:31;44143:1;44135:6;44131:14;44124:55;44007:179;:::o;44192:182::-;44332:34;44328:1;44320:6;44316:14;44309:58;44192:182;:::o;44380:220::-;44520:34;44516:1;44508:6;44504:14;44497:58;44589:3;44584:2;44576:6;44572:15;44565:28;44380:220;:::o;44606:122::-;44679:24;44697:5;44679:24;:::i;:::-;44672:5;44669:35;44659:63;;44718:1;44715;44708:12;44659:63;44606:122;:::o;44734:138::-;44815:32;44841:5;44815:32;:::i;:::-;44808:5;44805:43;44795:71;;44862:1;44859;44852:12;44795:71;44734:138;:::o;44878:116::-;44948:21;44963:5;44948:21;:::i;:::-;44941:5;44938:32;44928:60;;44984:1;44981;44974:12;44928:60;44878:116;:::o;45000:120::-;45072:23;45089:5;45072:23;:::i;:::-;45065:5;45062:34;45052:62;;45110:1;45107;45100:12;45052:62;45000:120;:::o;45126:122::-;45199:24;45217:5;45199:24;:::i;:::-;45192:5;45189:35;45179:63;;45238:1;45235;45228:12;45179:63;45126:122;:::o

Swarm Source

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