Overview [ERC-721]
Max Total Supply:
10,482 WDYM
Holders:
9,856
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WDYM_NFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at basescan.org on 2023-10-13 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries( address registrant, address registrantToCopy ) external; function unregister(address addr) external; function updateOperator( address registrant, address operator, bool filtered ) external; function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe( address(this), subscriptionOrRegistrantToCopy ); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries( address(this), subscriptionOrRegistrantToCopy ); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if ( !OPERATOR_FILTER_REGISTRY.isOperatorAllowed( address(this), operator ) ) { revert OperatorNotAllowed(operator); } } } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // 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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @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); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721A: 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 { _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 { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal returns (uint256) { return _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal returns (uint256) { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); return startTokenId; } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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(), "You are 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 { _transferOwnership(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" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } contract VerifySignature { function getMessageHash( address signer, uint256 nameLength, uint256 nonce, address minter ) public pure returns (bytes32) { return keccak256(abi.encodePacked(signer, nameLength, nonce, minter)); } function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", _messageHash ) ); } function verify( address signer, uint256 nameLength, uint256 nonce, address minter, bytes memory signature ) public pure returns (bool) { bytes32 messageHash = getMessageHash(signer, nameLength, nonce, minter); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == signer; } function recoverSigner( bytes32 _ethSignedMessageHash, bytes memory _signature ) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) public pure returns ( bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } } library StringUtils { /** * @dev Returns the length of a given string * * @param s The string to measure the length of * @return The length of the input string */ function strlen(string memory s) internal pure returns (uint256) { uint256 len; uint256 i = 0; uint256 bytelength = bytes(s).length; for (len = 0; i < bytelength; len++) { bytes1 b = bytes(s)[i]; if (b < 0x80) { i += 1; } else if (b < 0xE0) { i += 2; } else if (b < 0xF0) { i += 3; } else if (b < 0xF8) { i += 4; } else if (b < 0xFC) { i += 5; } else { i += 6; } } return len; } } contract WDYM_NFT is ERC721A, ERC2981, Ownable, DefaultOperatorFilterer, VerifySignature { event RefWithdraw( address to, uint256 tokenId, uint256 amount, uint256 nonce ); event TokenMetadata(uint256 tokenId); string public baseURI = "https://wdym.wtf/api/wdym/nft/json/"; struct NameRange { uint256 min; uint256 max; uint256 price; uint256 id; } NameRange[] tokenPrices; uint256 public constant MAX_TOKENS = 1_000_000_000_000; struct TokenMeta { uint256 nameLength; string name; } mapping(uint256 => TokenMeta) tokenMetadata; address public signer = 0x7fF4F4bA1dAB6Cfc1F018e0367Ba32AD599478C9; enum TokenURIMode { MODE_ONE, MODE_TWO, MODE_THREE } TokenURIMode private tokenUriMode = TokenURIMode.MODE_TWO; mapping(uint256 => bool) usedNonce; constructor() ERC721A("WDYM.WTF", "WDYM", 100, MAX_TOKENS) { _setDefaultRoyalty(msg.sender, 500); tokenPrices.push(NameRange({min: 3, max: 3, price: 0.4 ether, id: 1})); tokenPrices.push(NameRange({min: 4, max: 4, price: 0.1 ether, id: 2})); tokenPrices.push( NameRange({min: 5, max: 12, price: 0.0069 ether, id: 3}) ); tokenPrices.push( NameRange({min: 13, max: 31, price: 0.0032 ether, id: 4}) ); } function getUsedNonce(uint256 nonce) public view returns (bool) { return usedNonce[nonce]; } function getTokenPrices() public view returns (NameRange[] memory) { return tokenPrices; } function withdraw(uint256 amount) public onlyOwner { require( amount > 0 && amount <= address(this).balance, "Invalid amount" ); payable(msg.sender).transfer(amount); } function refWithdraw( address to, uint256 tokenId, uint256 amount, uint256 nonce, bytes calldata signature ) public { bool verified = verify(signer, amount + tokenId, nonce, to, signature); require(ownerOf(tokenId) == to, "Invalid owner"); require(to == msg.sender, "Invalid sender"); require( amount > 0 && amount <= address(this).balance, "Invalid amount" ); require( !usedNonce[nonce] && verified && nonce / 1000 >= block.timestamp, "Invalid signature" ); payable(to).transfer(amount); usedNonce[nonce] = true; emit RefWithdraw(to, tokenId, amount, nonce); } function setBaseURI(string memory newURI) public onlyOwner { baseURI = newURI; } function setSigner(address _signer) public onlyOwner { signer = _signer; } function setTokenPrice( uint256 _min, uint256 _max, uint256 _price, uint256 _id ) public onlyOwner { for (uint256 i = 0; i < tokenPrices.length; ) { if (tokenPrices[i].id == _id) { tokenPrices[i].min = _min; tokenPrices[i].max = _max; tokenPrices[i].price = _price; break; } unchecked { i++; } } } function getTokeMetadata(uint256 tokenId) public view returns (TokenMeta memory) { return tokenMetadata[tokenId]; } function getTokenPrice(uint256 nameLength) public view returns (uint256) { for (uint256 i = 0; i < tokenPrices.length; ) { if ( nameLength >= tokenPrices[i].min && nameLength <= tokenPrices[i].max ) { return tokenPrices[i].price; } unchecked { i++; } } return 0; } function mintToken( string calldata _name, address to, uint256 nameLength, uint256 nonce, bytes calldata signature ) public payable { bool verified = verify(signer, nameLength, nonce, to, signature); uint256 price = getTokenPrice(nameLength); require(price > 0, "Invalid name length"); require(StringUtils.strlen(_name) == nameLength, "Invalid name"); require( msg.value >= price || (verified && !usedNonce[nonce] && numberMinted(to) <= 0), "Not enough ether" ); require(to == msg.sender, "Invalid sender"); uint256 tokenId = _safeMint(to, 1); tokenMetadata[tokenId] = TokenMeta({ nameLength: nameLength, name: _name }); usedNonce[nonce] = true; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); if (tokenUriMode == TokenURIMode.MODE_TWO) { return bytes(baseURI).length > 0 ? string( abi.encodePacked(baseURI, Strings.toString(_tokenId)) ) : ""; } else if (tokenUriMode == TokenURIMode.MODE_ONE) { return bytes(baseURI).length > 0 ? string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ) : ""; } else if (tokenUriMode == TokenURIMode.MODE_THREE) { return baseURI; } return ""; } function setTokenURIMode(uint256 mode) external onlyOwner { if (mode == 2) { tokenUriMode = TokenURIMode.MODE_TWO; } else if (mode == 1) { tokenUriMode = TokenURIMode.MODE_ONE; } else { tokenUriMode = TokenURIMode.MODE_THREE; } } function setName(string calldata _name, uint256 tokenId) external onlyOwner { tokenMetadata[tokenId].name = _name; } function setNameLength(uint256 _nameLength, uint256 tokenId) external onlyOwner { tokenMetadata[tokenId].nameLength = _nameLength; } function updateTokenMetadata( uint256 _tokenId, string calldata _name, address to, uint256 nameLength, uint256 nonce, bytes calldata signature ) public payable { require(to == ownerOf(_tokenId), "Sender is not owner"); require(to == msg.sender, "Invalid sender"); require(getTokenPrice(nameLength) > 0, "Invalid name length"); require(StringUtils.strlen(_name) == nameLength, "Invalid name"); require( verify(signer, nameLength, nonce, to, signature) && !usedNonce[nonce], "Invalid signature" ); tokenMetadata[_tokenId] = TokenMeta({ nameLength: nameLength, name: _name }); usedNonce[nonce] = true; emit TokenMetadata(_tokenId); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function setRoyaltyInfo(address receiver, uint96 feeBasisPoints) external onlyOwner { _setDefaultRoyalty(receiver, feeBasisPoints); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"RefWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMetadata","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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"nameLength","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokeMetadata","outputs":[{"components":[{"internalType":"uint256","name":"nameLength","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct WDYM_NFT.TokenMeta","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nameLength","type":"uint256"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrices","outputs":[{"components":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct WDYM_NFT.NameRange[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getUsedNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nameLength","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"refWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameLength","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setNameLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setTokenURIMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nameLength","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"updateTokenMetadata","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"nameLength","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6000808055600755610120604052602360c081815290620045f460e039600b906200002b908262000718565b50600e80546001600160a81b03191674017ff4f4ba1dab6cfc1f018e0367ba32ad599478c91790553480156200006057600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb66001604051806040016040528060088152602001672ba22ca6972baa2360c11b815250604051806040016040528060048152602001635744594d60e01b815250606464e8d4a51000600081116200012b5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200018d5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000122565b60016200019b858262000718565b506002620001aa848262000718565b5060a09190915260805250620001c290503362000520565b6daaeb6d7670e522a718067333cd4e3b15620003075780156200025557604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200023657600080fd5b505af11580156200024b573d6000803e3d6000fd5b5050505062000307565b6001600160a01b03821615620002a65760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200021b565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620002ed57600080fd5b505af115801562000302573d6000803e3d6000fd5b505050505b50620003189050336101f462000572565b600c6040518060800160405280600381526020016003815260200167058d15e176280000815260200160018152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050600c6040518060800160405280600481526020016004815260200167016345785d8a0000815260200160028152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050600c604051806080016040528060058152602001600c81526020016618838370f34000815260200160038152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050600c6040518060800160405280600d8152602001601f8152602001660b5e620f480000815260200160048152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050620007e4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620005e25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000122565b6001600160a01b0382166200063a5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000122565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200069e57607f821691505b602082108103620006bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200071357600081815260208120601f850160051c81016020861015620006ee5750805b601f850160051c820191505b818110156200070f57828155600101620006fa565b5050505b505050565b81516001600160401b0381111562000734576200073462000673565b6200074c8162000745845462000689565b84620006c5565b602080601f8311600181146200078457600084156200076b5750858301515b600019600386901b1c1916600185901b1785556200070f565b600085815260208120601f198616915b82811015620007b55788860151825594840194600190910190840162000794565b5085821015620007d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051613ddf6200081560003960008181612398015281816123c20152612ed5015260005050613ddf6000f3fe6080604052600436106102815760003560e01c80638da5cb5b1161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c5146107c4578063f1664e981461080d578063f2fde38b1461082d578063f47c84c51461084d578063fa54080114610866578063ffa8ca3e1461088657600080fd5b8063c87b56dd1461071b578063cddeaba01461073b578063d7224ba01461075b578063db308b0614610771578063dc33e68114610784578063e5e49574146107a457600080fd5b8063a22cb46511610113578063a22cb4651461063b578063a7bb58031461065b578063aa13ca7614610699578063b88d4fde146106bb578063bfa4bf9a146106db578063c457fb37146106fb57600080fd5b80638da5cb5b146105b5578063900c71f5146105d357806392abaee5146105f357806395d89b411461060657806397aba7f91461061b57600080fd5b80633baa8170116101f357806367baaecd116101ac57806367baaecd146104fe5780636c0360eb1461052b5780636c19e7831461054057806370a0823114610560578063715018a6146105805780637ffc90941461059557600080fd5b80633baa81701461043c57806341f434341461045c57806342842e0e1461047e5780634f6ccce71461049e57806355f804b3146104be5780636352211e146104de57600080fd5b806318160ddd1161024557806318160ddd1461035e578063238ac9331461037d57806323b872dd1461039d5780632a55205a146103bd5780632e1a7d4d146103fc5780632f745c591461041c57600080fd5b806301ffc9a71461028d57806302fa7c47146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a836600461310a565b6108b6565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613143565b6108c7565b005b3480156102f057600080fd5b506102f9610908565b6040516102b991906131d6565b34801561031257600080fd5b506103266103213660046131e9565b61099a565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004613202565b610a25565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b50600e54610326906001600160a01b031681565b3480156103a957600080fd5b506102e26103b836600461322c565b610a3e565b3480156103c957600080fd5b506103dd6103d8366004613268565b610a69565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561040857600080fd5b506102e26104173660046131e9565b610b17565b34801561042857600080fd5b5061036f610437366004613202565b610bbb565b34801561044857600080fd5b506102e26104573660046132cb565b610d26565b34801561046857600080fd5b506103266daaeb6d7670e522a718067333cd4e81565b34801561048a57600080fd5b506102e261049936600461322c565b610d6c565b3480156104aa57600080fd5b5061036f6104b93660046131e9565b610d91565b3480156104ca57600080fd5b506102e26104d93660046133a1565b610df3565b3480156104ea57600080fd5b506103266104f93660046131e9565b610e29565b34801561050a57600080fd5b5061051e6105193660046131e9565b610e3b565b6040516102b991906133e9565b34801561053757600080fd5b506102f9610f11565b34801561054c57600080fd5b506102e261055b36600461340e565b610f9f565b34801561056c57600080fd5b5061036f61057b36600461340e565b610feb565b34801561058c57600080fd5b506102e261107c565b3480156105a157600080fd5b506102ad6105b0366004613449565b6110b2565b3480156105c157600080fd5b50600a546001600160a01b0316610326565b3480156105df57600080fd5b506102e26105ee3660046131e9565b6110fa565b6102e26106013660046134ba565b611183565b34801561061257600080fd5b506102f9611452565b34801561062757600080fd5b50610326610636366004613559565b611461565b34801561064757600080fd5b506102e26106563660046135ad565b6114e0565b34801561066757600080fd5b5061067b6106763660046135d9565b6114f4565b60408051938452602084019290925260ff16908201526060016102b9565b3480156106a557600080fd5b506106ae611568565b6040516102b9919061360d565b3480156106c757600080fd5b506102e26106d6366004613671565b6115ef565b3480156106e757600080fd5b5061036f6106f63660046136d8565b61161c565b34801561070757600080fd5b5061036f6107163660046131e9565b611677565b34801561072757600080fd5b506102f96107363660046131e9565b611720565b34801561074757600080fd5b506102e261075636600461371e565b611929565b34801561076757600080fd5b5061036f60075481565b6102e261077f366004613750565b611a13565b34801561079057600080fd5b5061036f61079f36600461340e565b611c89565b3480156107b057600080fd5b506102e26107bf366004613268565b611c94565b3480156107d057600080fd5b506102ad6107df3660046137e6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561081957600080fd5b506102e2610828366004613819565b611ccf565b34801561083957600080fd5b506102e261084836600461340e565b611f18565b34801561085957600080fd5b5061036f64e8d4a5100081565b34801561087257600080fd5b5061036f6108813660046131e9565b611fb0565b34801561089257600080fd5b506102ad6108a13660046131e9565b6000908152600f602052604090205460ff1690565b60006108c182612003565b92915050565b600a546001600160a01b031633146108fa5760405162461bcd60e51b81526004016108f190613889565b60405180910390fd5b6109048282612028565b5050565b606060018054610917906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610943906138b8565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a7826000541190565b610a095760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016108f1565b506000908152600560205260409020546001600160a01b031690565b81610a2f81612125565b610a3983836121de565b505050565b826001600160a01b0381163314610a5857610a5833612125565b610a638484846122f0565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ade5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610afd906001600160601b031687613908565b610b079190613935565b91519350909150505b9250929050565b600a546001600160a01b03163314610b415760405162461bcd60e51b81526004016108f190613889565b600081118015610b515750478111155b610b8e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016108f1565b604051339082156108fc029083906000818181858888f19350505050158015610904573d6000803e3d6000fd5b6000610bc683610feb565b8210610c1f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108f1565b600080549080805b83811015610cc6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c7957805192505b876001600160a01b0316836001600160a01b031603610cb357868403610ca5575093506108c192505050565b83610caf81613949565b9450505b5080610cbe81613949565b915050610c27565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108f1565b600a546001600160a01b03163314610d505760405162461bcd60e51b81526004016108f190613889565b6000818152600d60205260409020600101610a638385836139a8565b826001600160a01b0381163314610d8657610d8633612125565b610a638484846122fb565b600080548210610def5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108f1565b5090565b600a546001600160a01b03163314610e1d5760405162461bcd60e51b81526004016108f190613889565b600b6109048282613a67565b6000610e3482612316565b5192915050565b604080518082019091526000815260606020820152600d600083815260200190815260200160002060405180604001604052908160008201548152602001600182018054610e88906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb4906138b8565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b5050505050815250509050919050565b600b8054610f1e906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4a906138b8565b8015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b505050505081565b600a546001600160a01b03163314610fc95760405162461bcd60e51b81526004016108f190613889565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166110575760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108f1565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b600a546001600160a01b031633146110a65760405162461bcd60e51b81526004016108f190613889565b6110b060006124bf565b565b6000806110c18787878761161c565b905060006110ce82611fb0565b9050876001600160a01b03166110e48286611461565b6001600160a01b03161498975050505050505050565b600a546001600160a01b031633146111245760405162461bcd60e51b81526004016108f190613889565b8060020361114a57600e80546001919060ff60a01b1916600160a01b835b021790555050565b8060010361116c57600e80546000919060ff60a01b1916600160a01b83611142565b600e805460ff60a01b1916600160a11b1790555b50565b61118c88610e29565b6001600160a01b0316856001600160a01b0316146111e25760405162461bcd60e51b815260206004820152601360248201527229b2b73232b91034b9903737ba1037bbb732b960691b60448201526064016108f1565b6001600160a01b038516331461120a5760405162461bcd60e51b81526004016108f190613b3c565b600061121585611677565b116112585760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b60448201526064016108f1565b8361129888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061251192505050565b146112d45760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206e616d6560a01b60448201526064016108f1565b600e54604080516020601f8501819004810282018101909252838152611325926001600160a01b031691879187918a919088908890819084018382808284376000920191909152506110b292505050565b801561134057506000838152600f602052604090205460ff16155b6113805760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016108f1565b604051806040016040528085815260200188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250508a8152600d60209081526040909120835181559083015190915060018201906113f29082613a67565b5050506000838152600f602052604090819020805460ff19166001179055517f90a42ce51b7a58da7ae88d732a0621d41cd152a57c2f1ebd09a061a1ade71f9e90611440908a815260200190565b60405180910390a15050505050505050565b606060028054610917906138b8565b600080600080611470856114f4565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156114cb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b816114ea81612125565b610a398383612614565b6000806000835160411461154a5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016108f1565b50505060208101516040820151606090920151909260009190911a90565b6060600c805480602002602001604051908101604052809291908181526020016000905b828210156115e657838290600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250508152602001906001019061158c565b50505050905090565b836001600160a01b03811633146116095761160933612125565b611615858585856126d8565b5050505050565b6040516bffffffffffffffffffffffff19606086811b82166020840152603483018690526054830185905283901b1660748201526000906088016040516020818303038152906040528051906020012090505b949350505050565b6000805b600c5481101561171757600c818154811061169857611698613b64565b90600052602060002090600402016000015483101580156116dd5750600c81815481106116c7576116c7613b64565b9060005260206000209060040201600101548311155b1561170f57600c81815481106116f5576116f5613b64565b906000526020600020906004020160020154915050919050565b60010161167b565b50600092915050565b606061172d826000541190565b6117715760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016108f1565b6001600e54600160a01b900460ff16600281111561179157611791613b26565b036117f2576000600b80546117a5906138b8565b9050116117c157604051806020016040528060008152506108c1565b600b6117cc8361270b565b6040516020016117dd929190613bed565b60405160208183030381529060405292915050565b6000600e54600160a01b900460ff16600281111561181257611812613b26565b0361185e576000600b8054611826906138b8565b90501161184257604051806020016040528060008152506108c1565b600b61184d8361270b565b6040516020016117dd929190613c12565b6002600e54600160a01b900460ff16600281111561187e5761187e613b26565b0361191557600b8054611890906138b8565b80601f01602080910402602001604051908101604052809291908181526020018280546118bc906138b8565b80156119095780601f106118de57610100808354040283529160200191611909565b820191906000526020600020905b8154815290600101906020018083116118ec57829003601f168201915b50505050509050919050565b505060408051602081019091526000815290565b600a546001600160a01b031633146119535760405162461bcd60e51b81526004016108f190613889565b60005b600c548110156116155781600c828154811061197457611974613b64565b90600052602060002090600402016003015403611a0b5784600c828154811061199f5761199f613b64565b90600052602060002090600402016000018190555083600c82815481106119c8576119c8613b64565b90600052602060002090600402016001018190555082600c82815481106119f1576119f1613b64565b906000526020600020906004020160020181905550611615565b600101611956565b6000611a6d600e60009054906101000a90046001600160a01b031686868987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110b292505050565b90506000611a7a86611677565b905060008111611ac25760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b60448201526064016108f1565b85611b028a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061251192505050565b14611b3e5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206e616d6560a01b60448201526064016108f1565b8034101580611b795750818015611b6457506000858152600f602052604090205460ff16155b8015611b7957506000611b7688611c89565b11155b611bb85760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41032ba3432b960811b60448201526064016108f1565b6001600160a01b0387163314611be05760405162461bcd60e51b81526004016108f190613b3c565b6000611bed88600161280b565b905060405180604001604052808881526020018b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050838152600d6020908152604090912083518155908301519091506001820190611c619082613a67565b50505060009586525050600f60205250506040909120805460ff191660011790555050505050565b60006108c18261282e565b600a546001600160a01b03163314611cbe5760405162461bcd60e51b81526004016108f190613889565b6000908152600d6020526040902055565b600e54600090611d2a906001600160a01b0316611cec8888613c47565b868a87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110b292505050565b9050866001600160a01b0316611d3f87610e29565b6001600160a01b031614611d855760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b60448201526064016108f1565b6001600160a01b0387163314611dad5760405162461bcd60e51b81526004016108f190613b3c565b600085118015611dbd5750478511155b611dfa5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016108f1565b6000848152600f602052604090205460ff16158015611e165750805b8015611e2d575042611e2a6103e886613935565b10155b611e6d5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016108f1565b6040516001600160a01b0388169086156108fc029087906000818181858888f19350505050158015611ea3573d6000803e3d6000fd5b506000848152600f6020908152604091829020805460ff1916600117905581516001600160a01b038a168152908101889052908101869052606081018590527faebf0870b5bee8adeaee773c731ae75945be7b245a7ba5da9e4867e2f230547c9060800160405180910390a150505050505050565b600a546001600160a01b03163314611f425760405162461bcd60e51b81526004016108f190613889565b6001600160a01b038116611fa75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f1565b611180816124bf565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60006001600160e01b0319821663152a902d60e11b14806108c157506108c1826128cc565b6127106001600160601b03821611156120965760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108f1565b6001600160a01b0382166120ec5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108f1565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6daaeb6d7670e522a718067333cd4e3b1561118057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190613c5a565b61118057604051633b79c77360e21b81526001600160a01b03821660048201526024016108f1565b60006121e982610e29565b9050806001600160a01b0316836001600160a01b0316036122575760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108f1565b336001600160a01b0382161480612273575061227381336107df565b6122e55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108f1565b610a39838383612937565b610a39838383612993565b610a39838383604051806020016040528060008152506115ef565b6040805180820190915260008082526020820152612335826000541190565b6123945760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108f1565b60007f000000000000000000000000000000000000000000000000000000000000000083106123f5576123e77f000000000000000000000000000000000000000000000000000000000000000084613c77565b6123f2906001613c47565b90505b825b81811061245e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561244b57949350505050565b508061245681613c8a565b9150506123f7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108f1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051600090819081905b8082101561260b57600085838151811061253757612537613b64565b01602001516001600160f81b0319169050600160ff1b8110156125665761255f600184613c47565b92506125f8565b600760fd1b6001600160f81b0319821610156125875761255f600284613c47565b600f60fc1b6001600160f81b0319821610156125a85761255f600384613c47565b601f60fb1b6001600160f81b0319821610156125c95761255f600484613c47565b603f60fa1b6001600160f81b0319821610156125ea5761255f600584613c47565b6125f5600684613c47565b92505b508261260381613949565b93505061251b565b50909392505050565b336001600160a01b0383160361266c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108f1565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6126e3848484612993565b6126ef84848484612d19565b610a635760405162461bcd60e51b81526004016108f190613ca1565b6060816000036127325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561275c578061274681613949565b91506127559050600a83613935565b9150612736565b6000816001600160401b0381111561277657612776613316565b6040519080825280601f01601f1916602001820160405280156127a0576020820181803683370190505b5090505b841561166f576127b5600183613c77565b91506127c2600a86613cf4565b6127cd906030613c47565b60f81b8183815181106127e2576127e2613b64565b60200101906001600160f81b031916908160001a905350612804600a86613935565b94506127a4565b6000612827838360405180602001604052806000815250612e17565b9392505050565b60006001600160a01b0382166128a05760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016108f1565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b60006001600160e01b031982166380ac58cd60e01b14806128fd57506001600160e01b03198216635b5e139f60e01b145b8061291857506001600160e01b0319821663780e9d6360e01b145b806108c157506301ffc9a760e01b6001600160e01b03198316146108c1565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061299e82612316565b80519091506000906001600160a01b0316336001600160a01b031614806129d55750336129ca8461099a565b6001600160a01b0316145b806129e7575081516129e790336107df565b905080612a515760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108f1565b846001600160a01b031682600001516001600160a01b031614612ac55760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108f1565b6001600160a01b038416612b295760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108f1565b612b396000848460000151612937565b6001600160a01b0385166000908152600460205260408120805460019290612b6b9084906001600160801b0316613d08565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612bb791859116613d2f565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c3e846001613c47565b6000818152600360205260409020549091506001600160a01b0316612ccf57612c68816000541190565b15612ccf5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60006001600160a01b0384163b15612e0f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d5d903390899088908890600401613d4f565b6020604051808303816000875af1925050508015612d98575060408051601f3d908101601f19168201909252612d9591810190613d8c565b60015b612df5573d808015612dc6576040519150601f19603f3d011682016040523d82523d6000602084013e612dcb565b606091505b508051600003612ded5760405162461bcd60e51b81526004016108f190613ca1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061166f565b50600161166f565b600080546001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108f1565b612e86816000541190565b15612ed35760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108f1565b7f0000000000000000000000000000000000000000000000000000000000000000841115612f4e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108f1565b6001600160a01b0385166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612faa908890613d2f565b6001600160801b03168152602001868360200151612fc89190613d2f565b6001600160801b039081169091526001600160a01b0380891660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156130e75760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130ab6000898489612d19565b6130c75760405162461bcd60e51b81526004016108f190613ca1565b816130d181613949565b92505080806130df90613949565b91505061305e565b5060005550949350505050565b6001600160e01b03198116811461118057600080fd5b60006020828403121561311c57600080fd5b8135612827816130f4565b80356001600160a01b038116811461313e57600080fd5b919050565b6000806040838503121561315657600080fd5b61315f83613127565b915060208301356001600160601b038116811461317b57600080fd5b809150509250929050565b60005b838110156131a1578181015183820152602001613189565b50506000910152565b600081518084526131c2816020860160208601613186565b601f01601f19169290920160200192915050565b60208152600061282760208301846131aa565b6000602082840312156131fb57600080fd5b5035919050565b6000806040838503121561321557600080fd5b61321e83613127565b946020939093013593505050565b60008060006060848603121561324157600080fd5b61324a84613127565b925061325860208501613127565b9150604084013590509250925092565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b60008083601f84011261329c57600080fd5b5081356001600160401b038111156132b357600080fd5b602083019150836020828501011115610b1057600080fd5b6000806000604084860312156132e057600080fd5b83356001600160401b038111156132f657600080fd5b6133028682870161328a565b909790965060209590950135949350505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561334657613346613316565b604051601f8501601f19908116603f0116810190828211818310171561336e5761336e613316565b8160405280935085815286868601111561338757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156133b357600080fd5b81356001600160401b038111156133c957600080fd5b8201601f810184136133da57600080fd5b61166f8482356020840161332c565b60208152815160208201526000602083015160408084015261166f60608401826131aa565b60006020828403121561342057600080fd5b61282782613127565b600082601f83011261343a57600080fd5b6128278383356020850161332c565b600080600080600060a0868803121561346157600080fd5b61346a86613127565b9450602086013593506040860135925061348660608701613127565b915060808601356001600160401b038111156134a157600080fd5b6134ad88828901613429565b9150509295509295909350565b60008060008060008060008060c0898b0312156134d657600080fd5b8835975060208901356001600160401b03808211156134f457600080fd5b6135008c838d0161328a565b909950975087915061351460408c01613127565b965060608b0135955060808b0135945060a08b013591508082111561353857600080fd5b506135458b828c0161328a565b999c989b5096995094979396929594505050565b6000806040838503121561356c57600080fd5b8235915060208301356001600160401b0381111561358957600080fd5b61359585828601613429565b9150509250929050565b801515811461118057600080fd5b600080604083850312156135c057600080fd5b6135c983613127565b9150602083013561317b8161359f565b6000602082840312156135eb57600080fd5b81356001600160401b0381111561360157600080fd5b61166f84828501613429565b602080825282518282018190526000919060409081850190868401855b828110156136645781518051855286810151878601528581015186860152606090810151908501526080909301929085019060010161362a565b5091979650505050505050565b6000806000806080858703121561368757600080fd5b61369085613127565b935061369e60208601613127565b92506040850135915060608501356001600160401b038111156136c057600080fd5b6136cc87828801613429565b91505092959194509250565b600080600080608085870312156136ee57600080fd5b6136f785613127565b9350602085013592506040850135915061371360608601613127565b905092959194509250565b6000806000806080858703121561373457600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600080600060a0888a03121561376b57600080fd5b87356001600160401b038082111561378257600080fd5b61378e8b838c0161328a565b90995097508791506137a260208b01613127565b965060408a0135955060608a0135945060808a01359150808211156137c657600080fd5b506137d38a828b0161328a565b989b979a50959850939692959293505050565b600080604083850312156137f957600080fd5b61380283613127565b915061381060208401613127565b90509250929050565b60008060008060008060a0878903121561383257600080fd5b61383b87613127565b955060208701359450604087013593506060870135925060808701356001600160401b0381111561386b57600080fd5b61387789828a0161328a565b979a9699509497509295939492505050565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b600181811c908216806138cc57607f821691505b6020821081036138ec57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108c1576108c16138f2565b634e487b7160e01b600052601260045260246000fd5b6000826139445761394461391f565b500490565b60006001820161395b5761395b6138f2565b5060010190565b601f821115610a3957600081815260208120601f850160051c810160208610156139895750805b601f850160051c820191505b81811015612d1157828155600101613995565b6001600160401b038311156139bf576139bf613316565b6139d3836139cd83546138b8565b83613962565b6000601f841160018114613a0757600085156139ef5750838201355b600019600387901b1c1916600186901b178355611615565b600083815260209020601f19861690835b82811015613a385786850135825560209485019460019092019101613a18565b5086821015613a555760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115613a8057613a80613316565b613a9481613a8e84546138b8565b84613962565b602080601f831160018114613ac95760008415613ab15750858301515b600019600386901b1c1916600185901b178555612d11565b600085815260208120601f198616915b82811015613af857888601518255948401946001909101908401613ad9565b5085821015613b165787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b6020808252600e908201526d24b73b30b634b21039b2b73232b960911b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008154613b87816138b8565b60018281168015613b9f5760018114613bb457613be3565b60ff1984168752821515830287019450613be3565b8560005260208060002060005b85811015613bda5781548a820152908401908201613bc1565b50505082870194505b5050505092915050565b6000613bf98285613b7a565b8351613c09818360208801613186565b01949350505050565b6000613c1e8285613b7a565b8351613c2e818360208801613186565b64173539b7b760d91b9101908152600501949350505050565b808201808211156108c1576108c16138f2565b600060208284031215613c6c57600080fd5b81516128278161359f565b818103818111156108c1576108c16138f2565b600081613c9957613c996138f2565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082613d0357613d0361391f565b500690565b6001600160801b03828116828216039080821115613d2857613d286138f2565b5092915050565b6001600160801b03818116838216019080821115613d2857613d286138f2565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d82908301846131aa565b9695505050505050565b600060208284031215613d9e57600080fd5b8151612827816130f456fea2646970667358221220c39e9c4d5c87addf382ddfb67c286a01e40d57ce6d527003d7f6f946edf91fc264736f6c6343000812003368747470733a2f2f7764796d2e7774662f6170692f7764796d2f6e66742f6a736f6e2f
Deployed Bytecode
0x6080604052600436106102815760003560e01c80638da5cb5b1161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c5146107c4578063f1664e981461080d578063f2fde38b1461082d578063f47c84c51461084d578063fa54080114610866578063ffa8ca3e1461088657600080fd5b8063c87b56dd1461071b578063cddeaba01461073b578063d7224ba01461075b578063db308b0614610771578063dc33e68114610784578063e5e49574146107a457600080fd5b8063a22cb46511610113578063a22cb4651461063b578063a7bb58031461065b578063aa13ca7614610699578063b88d4fde146106bb578063bfa4bf9a146106db578063c457fb37146106fb57600080fd5b80638da5cb5b146105b5578063900c71f5146105d357806392abaee5146105f357806395d89b411461060657806397aba7f91461061b57600080fd5b80633baa8170116101f357806367baaecd116101ac57806367baaecd146104fe5780636c0360eb1461052b5780636c19e7831461054057806370a0823114610560578063715018a6146105805780637ffc90941461059557600080fd5b80633baa81701461043c57806341f434341461045c57806342842e0e1461047e5780634f6ccce71461049e57806355f804b3146104be5780636352211e146104de57600080fd5b806318160ddd1161024557806318160ddd1461035e578063238ac9331461037d57806323b872dd1461039d5780632a55205a146103bd5780632e1a7d4d146103fc5780632f745c591461041c57600080fd5b806301ffc9a71461028d57806302fa7c47146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a836600461310a565b6108b6565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613143565b6108c7565b005b3480156102f057600080fd5b506102f9610908565b6040516102b991906131d6565b34801561031257600080fd5b506103266103213660046131e9565b61099a565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004613202565b610a25565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b50600e54610326906001600160a01b031681565b3480156103a957600080fd5b506102e26103b836600461322c565b610a3e565b3480156103c957600080fd5b506103dd6103d8366004613268565b610a69565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561040857600080fd5b506102e26104173660046131e9565b610b17565b34801561042857600080fd5b5061036f610437366004613202565b610bbb565b34801561044857600080fd5b506102e26104573660046132cb565b610d26565b34801561046857600080fd5b506103266daaeb6d7670e522a718067333cd4e81565b34801561048a57600080fd5b506102e261049936600461322c565b610d6c565b3480156104aa57600080fd5b5061036f6104b93660046131e9565b610d91565b3480156104ca57600080fd5b506102e26104d93660046133a1565b610df3565b3480156104ea57600080fd5b506103266104f93660046131e9565b610e29565b34801561050a57600080fd5b5061051e6105193660046131e9565b610e3b565b6040516102b991906133e9565b34801561053757600080fd5b506102f9610f11565b34801561054c57600080fd5b506102e261055b36600461340e565b610f9f565b34801561056c57600080fd5b5061036f61057b36600461340e565b610feb565b34801561058c57600080fd5b506102e261107c565b3480156105a157600080fd5b506102ad6105b0366004613449565b6110b2565b3480156105c157600080fd5b50600a546001600160a01b0316610326565b3480156105df57600080fd5b506102e26105ee3660046131e9565b6110fa565b6102e26106013660046134ba565b611183565b34801561061257600080fd5b506102f9611452565b34801561062757600080fd5b50610326610636366004613559565b611461565b34801561064757600080fd5b506102e26106563660046135ad565b6114e0565b34801561066757600080fd5b5061067b6106763660046135d9565b6114f4565b60408051938452602084019290925260ff16908201526060016102b9565b3480156106a557600080fd5b506106ae611568565b6040516102b9919061360d565b3480156106c757600080fd5b506102e26106d6366004613671565b6115ef565b3480156106e757600080fd5b5061036f6106f63660046136d8565b61161c565b34801561070757600080fd5b5061036f6107163660046131e9565b611677565b34801561072757600080fd5b506102f96107363660046131e9565b611720565b34801561074757600080fd5b506102e261075636600461371e565b611929565b34801561076757600080fd5b5061036f60075481565b6102e261077f366004613750565b611a13565b34801561079057600080fd5b5061036f61079f36600461340e565b611c89565b3480156107b057600080fd5b506102e26107bf366004613268565b611c94565b3480156107d057600080fd5b506102ad6107df3660046137e6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561081957600080fd5b506102e2610828366004613819565b611ccf565b34801561083957600080fd5b506102e261084836600461340e565b611f18565b34801561085957600080fd5b5061036f64e8d4a5100081565b34801561087257600080fd5b5061036f6108813660046131e9565b611fb0565b34801561089257600080fd5b506102ad6108a13660046131e9565b6000908152600f602052604090205460ff1690565b60006108c182612003565b92915050565b600a546001600160a01b031633146108fa5760405162461bcd60e51b81526004016108f190613889565b60405180910390fd5b6109048282612028565b5050565b606060018054610917906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610943906138b8565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a7826000541190565b610a095760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016108f1565b506000908152600560205260409020546001600160a01b031690565b81610a2f81612125565b610a3983836121de565b505050565b826001600160a01b0381163314610a5857610a5833612125565b610a638484846122f0565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ade5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610afd906001600160601b031687613908565b610b079190613935565b91519350909150505b9250929050565b600a546001600160a01b03163314610b415760405162461bcd60e51b81526004016108f190613889565b600081118015610b515750478111155b610b8e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016108f1565b604051339082156108fc029083906000818181858888f19350505050158015610904573d6000803e3d6000fd5b6000610bc683610feb565b8210610c1f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108f1565b600080549080805b83811015610cc6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c7957805192505b876001600160a01b0316836001600160a01b031603610cb357868403610ca5575093506108c192505050565b83610caf81613949565b9450505b5080610cbe81613949565b915050610c27565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108f1565b600a546001600160a01b03163314610d505760405162461bcd60e51b81526004016108f190613889565b6000818152600d60205260409020600101610a638385836139a8565b826001600160a01b0381163314610d8657610d8633612125565b610a638484846122fb565b600080548210610def5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108f1565b5090565b600a546001600160a01b03163314610e1d5760405162461bcd60e51b81526004016108f190613889565b600b6109048282613a67565b6000610e3482612316565b5192915050565b604080518082019091526000815260606020820152600d600083815260200190815260200160002060405180604001604052908160008201548152602001600182018054610e88906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb4906138b8565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b5050505050815250509050919050565b600b8054610f1e906138b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4a906138b8565b8015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b505050505081565b600a546001600160a01b03163314610fc95760405162461bcd60e51b81526004016108f190613889565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166110575760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108f1565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b600a546001600160a01b031633146110a65760405162461bcd60e51b81526004016108f190613889565b6110b060006124bf565b565b6000806110c18787878761161c565b905060006110ce82611fb0565b9050876001600160a01b03166110e48286611461565b6001600160a01b03161498975050505050505050565b600a546001600160a01b031633146111245760405162461bcd60e51b81526004016108f190613889565b8060020361114a57600e80546001919060ff60a01b1916600160a01b835b021790555050565b8060010361116c57600e80546000919060ff60a01b1916600160a01b83611142565b600e805460ff60a01b1916600160a11b1790555b50565b61118c88610e29565b6001600160a01b0316856001600160a01b0316146111e25760405162461bcd60e51b815260206004820152601360248201527229b2b73232b91034b9903737ba1037bbb732b960691b60448201526064016108f1565b6001600160a01b038516331461120a5760405162461bcd60e51b81526004016108f190613b3c565b600061121585611677565b116112585760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b60448201526064016108f1565b8361129888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061251192505050565b146112d45760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206e616d6560a01b60448201526064016108f1565b600e54604080516020601f8501819004810282018101909252838152611325926001600160a01b031691879187918a919088908890819084018382808284376000920191909152506110b292505050565b801561134057506000838152600f602052604090205460ff16155b6113805760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016108f1565b604051806040016040528085815260200188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250508a8152600d60209081526040909120835181559083015190915060018201906113f29082613a67565b5050506000838152600f602052604090819020805460ff19166001179055517f90a42ce51b7a58da7ae88d732a0621d41cd152a57c2f1ebd09a061a1ade71f9e90611440908a815260200190565b60405180910390a15050505050505050565b606060028054610917906138b8565b600080600080611470856114f4565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156114cb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b816114ea81612125565b610a398383612614565b6000806000835160411461154a5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016108f1565b50505060208101516040820151606090920151909260009190911a90565b6060600c805480602002602001604051908101604052809291908181526020016000905b828210156115e657838290600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250508152602001906001019061158c565b50505050905090565b836001600160a01b03811633146116095761160933612125565b611615858585856126d8565b5050505050565b6040516bffffffffffffffffffffffff19606086811b82166020840152603483018690526054830185905283901b1660748201526000906088016040516020818303038152906040528051906020012090505b949350505050565b6000805b600c5481101561171757600c818154811061169857611698613b64565b90600052602060002090600402016000015483101580156116dd5750600c81815481106116c7576116c7613b64565b9060005260206000209060040201600101548311155b1561170f57600c81815481106116f5576116f5613b64565b906000526020600020906004020160020154915050919050565b60010161167b565b50600092915050565b606061172d826000541190565b6117715760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b60448201526064016108f1565b6001600e54600160a01b900460ff16600281111561179157611791613b26565b036117f2576000600b80546117a5906138b8565b9050116117c157604051806020016040528060008152506108c1565b600b6117cc8361270b565b6040516020016117dd929190613bed565b60405160208183030381529060405292915050565b6000600e54600160a01b900460ff16600281111561181257611812613b26565b0361185e576000600b8054611826906138b8565b90501161184257604051806020016040528060008152506108c1565b600b61184d8361270b565b6040516020016117dd929190613c12565b6002600e54600160a01b900460ff16600281111561187e5761187e613b26565b0361191557600b8054611890906138b8565b80601f01602080910402602001604051908101604052809291908181526020018280546118bc906138b8565b80156119095780601f106118de57610100808354040283529160200191611909565b820191906000526020600020905b8154815290600101906020018083116118ec57829003601f168201915b50505050509050919050565b505060408051602081019091526000815290565b600a546001600160a01b031633146119535760405162461bcd60e51b81526004016108f190613889565b60005b600c548110156116155781600c828154811061197457611974613b64565b90600052602060002090600402016003015403611a0b5784600c828154811061199f5761199f613b64565b90600052602060002090600402016000018190555083600c82815481106119c8576119c8613b64565b90600052602060002090600402016001018190555082600c82815481106119f1576119f1613b64565b906000526020600020906004020160020181905550611615565b600101611956565b6000611a6d600e60009054906101000a90046001600160a01b031686868987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110b292505050565b90506000611a7a86611677565b905060008111611ac25760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b60448201526064016108f1565b85611b028a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061251192505050565b14611b3e5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206e616d6560a01b60448201526064016108f1565b8034101580611b795750818015611b6457506000858152600f602052604090205460ff16155b8015611b7957506000611b7688611c89565b11155b611bb85760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41032ba3432b960811b60448201526064016108f1565b6001600160a01b0387163314611be05760405162461bcd60e51b81526004016108f190613b3c565b6000611bed88600161280b565b905060405180604001604052808881526020018b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050838152600d6020908152604090912083518155908301519091506001820190611c619082613a67565b50505060009586525050600f60205250506040909120805460ff191660011790555050505050565b60006108c18261282e565b600a546001600160a01b03163314611cbe5760405162461bcd60e51b81526004016108f190613889565b6000908152600d6020526040902055565b600e54600090611d2a906001600160a01b0316611cec8888613c47565b868a87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110b292505050565b9050866001600160a01b0316611d3f87610e29565b6001600160a01b031614611d855760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b60448201526064016108f1565b6001600160a01b0387163314611dad5760405162461bcd60e51b81526004016108f190613b3c565b600085118015611dbd5750478511155b611dfa5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016108f1565b6000848152600f602052604090205460ff16158015611e165750805b8015611e2d575042611e2a6103e886613935565b10155b611e6d5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016108f1565b6040516001600160a01b0388169086156108fc029087906000818181858888f19350505050158015611ea3573d6000803e3d6000fd5b506000848152600f6020908152604091829020805460ff1916600117905581516001600160a01b038a168152908101889052908101869052606081018590527faebf0870b5bee8adeaee773c731ae75945be7b245a7ba5da9e4867e2f230547c9060800160405180910390a150505050505050565b600a546001600160a01b03163314611f425760405162461bcd60e51b81526004016108f190613889565b6001600160a01b038116611fa75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f1565b611180816124bf565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60006001600160e01b0319821663152a902d60e11b14806108c157506108c1826128cc565b6127106001600160601b03821611156120965760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108f1565b6001600160a01b0382166120ec5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108f1565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6daaeb6d7670e522a718067333cd4e3b1561118057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190613c5a565b61118057604051633b79c77360e21b81526001600160a01b03821660048201526024016108f1565b60006121e982610e29565b9050806001600160a01b0316836001600160a01b0316036122575760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108f1565b336001600160a01b0382161480612273575061227381336107df565b6122e55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108f1565b610a39838383612937565b610a39838383612993565b610a39838383604051806020016040528060008152506115ef565b6040805180820190915260008082526020820152612335826000541190565b6123945760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108f1565b60007f000000000000000000000000000000000000000000000000000000000000006483106123f5576123e77f000000000000000000000000000000000000000000000000000000000000006484613c77565b6123f2906001613c47565b90505b825b81811061245e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561244b57949350505050565b508061245681613c8a565b9150506123f7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108f1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051600090819081905b8082101561260b57600085838151811061253757612537613b64565b01602001516001600160f81b0319169050600160ff1b8110156125665761255f600184613c47565b92506125f8565b600760fd1b6001600160f81b0319821610156125875761255f600284613c47565b600f60fc1b6001600160f81b0319821610156125a85761255f600384613c47565b601f60fb1b6001600160f81b0319821610156125c95761255f600484613c47565b603f60fa1b6001600160f81b0319821610156125ea5761255f600584613c47565b6125f5600684613c47565b92505b508261260381613949565b93505061251b565b50909392505050565b336001600160a01b0383160361266c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108f1565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6126e3848484612993565b6126ef84848484612d19565b610a635760405162461bcd60e51b81526004016108f190613ca1565b6060816000036127325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561275c578061274681613949565b91506127559050600a83613935565b9150612736565b6000816001600160401b0381111561277657612776613316565b6040519080825280601f01601f1916602001820160405280156127a0576020820181803683370190505b5090505b841561166f576127b5600183613c77565b91506127c2600a86613cf4565b6127cd906030613c47565b60f81b8183815181106127e2576127e2613b64565b60200101906001600160f81b031916908160001a905350612804600a86613935565b94506127a4565b6000612827838360405180602001604052806000815250612e17565b9392505050565b60006001600160a01b0382166128a05760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016108f1565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b60006001600160e01b031982166380ac58cd60e01b14806128fd57506001600160e01b03198216635b5e139f60e01b145b8061291857506001600160e01b0319821663780e9d6360e01b145b806108c157506301ffc9a760e01b6001600160e01b03198316146108c1565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061299e82612316565b80519091506000906001600160a01b0316336001600160a01b031614806129d55750336129ca8461099a565b6001600160a01b0316145b806129e7575081516129e790336107df565b905080612a515760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108f1565b846001600160a01b031682600001516001600160a01b031614612ac55760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108f1565b6001600160a01b038416612b295760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108f1565b612b396000848460000151612937565b6001600160a01b0385166000908152600460205260408120805460019290612b6b9084906001600160801b0316613d08565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612bb791859116613d2f565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c3e846001613c47565b6000818152600360205260409020549091506001600160a01b0316612ccf57612c68816000541190565b15612ccf5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60006001600160a01b0384163b15612e0f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d5d903390899088908890600401613d4f565b6020604051808303816000875af1925050508015612d98575060408051601f3d908101601f19168201909252612d9591810190613d8c565b60015b612df5573d808015612dc6576040519150601f19603f3d011682016040523d82523d6000602084013e612dcb565b606091505b508051600003612ded5760405162461bcd60e51b81526004016108f190613ca1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061166f565b50600161166f565b600080546001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108f1565b612e86816000541190565b15612ed35760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108f1565b7f0000000000000000000000000000000000000000000000000000000000000064841115612f4e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108f1565b6001600160a01b0385166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612faa908890613d2f565b6001600160801b03168152602001868360200151612fc89190613d2f565b6001600160801b039081169091526001600160a01b0380891660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156130e75760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46130ab6000898489612d19565b6130c75760405162461bcd60e51b81526004016108f190613ca1565b816130d181613949565b92505080806130df90613949565b91505061305e565b5060005550949350505050565b6001600160e01b03198116811461118057600080fd5b60006020828403121561311c57600080fd5b8135612827816130f4565b80356001600160a01b038116811461313e57600080fd5b919050565b6000806040838503121561315657600080fd5b61315f83613127565b915060208301356001600160601b038116811461317b57600080fd5b809150509250929050565b60005b838110156131a1578181015183820152602001613189565b50506000910152565b600081518084526131c2816020860160208601613186565b601f01601f19169290920160200192915050565b60208152600061282760208301846131aa565b6000602082840312156131fb57600080fd5b5035919050565b6000806040838503121561321557600080fd5b61321e83613127565b946020939093013593505050565b60008060006060848603121561324157600080fd5b61324a84613127565b925061325860208501613127565b9150604084013590509250925092565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b60008083601f84011261329c57600080fd5b5081356001600160401b038111156132b357600080fd5b602083019150836020828501011115610b1057600080fd5b6000806000604084860312156132e057600080fd5b83356001600160401b038111156132f657600080fd5b6133028682870161328a565b909790965060209590950135949350505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561334657613346613316565b604051601f8501601f19908116603f0116810190828211818310171561336e5761336e613316565b8160405280935085815286868601111561338757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156133b357600080fd5b81356001600160401b038111156133c957600080fd5b8201601f810184136133da57600080fd5b61166f8482356020840161332c565b60208152815160208201526000602083015160408084015261166f60608401826131aa565b60006020828403121561342057600080fd5b61282782613127565b600082601f83011261343a57600080fd5b6128278383356020850161332c565b600080600080600060a0868803121561346157600080fd5b61346a86613127565b9450602086013593506040860135925061348660608701613127565b915060808601356001600160401b038111156134a157600080fd5b6134ad88828901613429565b9150509295509295909350565b60008060008060008060008060c0898b0312156134d657600080fd5b8835975060208901356001600160401b03808211156134f457600080fd5b6135008c838d0161328a565b909950975087915061351460408c01613127565b965060608b0135955060808b0135945060a08b013591508082111561353857600080fd5b506135458b828c0161328a565b999c989b5096995094979396929594505050565b6000806040838503121561356c57600080fd5b8235915060208301356001600160401b0381111561358957600080fd5b61359585828601613429565b9150509250929050565b801515811461118057600080fd5b600080604083850312156135c057600080fd5b6135c983613127565b9150602083013561317b8161359f565b6000602082840312156135eb57600080fd5b81356001600160401b0381111561360157600080fd5b61166f84828501613429565b602080825282518282018190526000919060409081850190868401855b828110156136645781518051855286810151878601528581015186860152606090810151908501526080909301929085019060010161362a565b5091979650505050505050565b6000806000806080858703121561368757600080fd5b61369085613127565b935061369e60208601613127565b92506040850135915060608501356001600160401b038111156136c057600080fd5b6136cc87828801613429565b91505092959194509250565b600080600080608085870312156136ee57600080fd5b6136f785613127565b9350602085013592506040850135915061371360608601613127565b905092959194509250565b6000806000806080858703121561373457600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600080600060a0888a03121561376b57600080fd5b87356001600160401b038082111561378257600080fd5b61378e8b838c0161328a565b90995097508791506137a260208b01613127565b965060408a0135955060608a0135945060808a01359150808211156137c657600080fd5b506137d38a828b0161328a565b989b979a50959850939692959293505050565b600080604083850312156137f957600080fd5b61380283613127565b915061381060208401613127565b90509250929050565b60008060008060008060a0878903121561383257600080fd5b61383b87613127565b955060208701359450604087013593506060870135925060808701356001600160401b0381111561386b57600080fd5b61387789828a0161328a565b979a9699509497509295939492505050565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b600181811c908216806138cc57607f821691505b6020821081036138ec57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108c1576108c16138f2565b634e487b7160e01b600052601260045260246000fd5b6000826139445761394461391f565b500490565b60006001820161395b5761395b6138f2565b5060010190565b601f821115610a3957600081815260208120601f850160051c810160208610156139895750805b601f850160051c820191505b81811015612d1157828155600101613995565b6001600160401b038311156139bf576139bf613316565b6139d3836139cd83546138b8565b83613962565b6000601f841160018114613a0757600085156139ef5750838201355b600019600387901b1c1916600186901b178355611615565b600083815260209020601f19861690835b82811015613a385786850135825560209485019460019092019101613a18565b5086821015613a555760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115613a8057613a80613316565b613a9481613a8e84546138b8565b84613962565b602080601f831160018114613ac95760008415613ab15750858301515b600019600386901b1c1916600185901b178555612d11565b600085815260208120601f198616915b82811015613af857888601518255948401946001909101908401613ad9565b5085821015613b165787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b6020808252600e908201526d24b73b30b634b21039b2b73232b960911b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008154613b87816138b8565b60018281168015613b9f5760018114613bb457613be3565b60ff1984168752821515830287019450613be3565b8560005260208060002060005b85811015613bda5781548a820152908401908201613bc1565b50505082870194505b5050505092915050565b6000613bf98285613b7a565b8351613c09818360208801613186565b01949350505050565b6000613c1e8285613b7a565b8351613c2e818360208801613186565b64173539b7b760d91b9101908152600501949350505050565b808201808211156108c1576108c16138f2565b600060208284031215613c6c57600080fd5b81516128278161359f565b818103818111156108c1576108c16138f2565b600081613c9957613c996138f2565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082613d0357613d0361391f565b500690565b6001600160801b03828116828216039080821115613d2857613d286138f2565b5092915050565b6001600160801b03818116838216019080821115613d2857613d286138f2565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d82908301846131aa565b9695505050505050565b600060208284031215613d9e57600080fd5b8151612827816130f456fea2646970667358221220c39e9c4d5c87addf382ddfb67c286a01e40d57ce6d527003d7f6f946edf91fc264736f6c63430008120033
Deployed ByteCode Sourcemap
53882:9195:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61560:221;;;;;;;;;;-1:-1:-1;61560:221:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;61560:221:0;;;;;;;;61789:170;;;;;;;;;;-1:-1:-1;61789:170:0;;;;;:::i;:::-;;:::i;:::-;;32113:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33825:292::-;;;;;;;;;;-1:-1:-1;33825:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2246:32:1;;;2228:51;;2216:2;2201:18;33825:292:0;2082:203:1;62183:189:0;;;;;;;;;;-1:-1:-1;62183:189:0;;;;;:::i;:::-;;:::i;28508:100::-;;;;;;;;;;-1:-1:-1;28561:7:0;28588:12;28508:100;;;2695:25:1;;;2683:2;2668:18;28508:100:0;2549:177:1;54606:66:0;;;;;;;;;;-1:-1:-1;54606:66:0;;;;-1:-1:-1;;;;;54606:66:0;;;62380:197;;;;;;;;;;-1:-1:-1;62380:197:0;;;;;:::i;:::-;;:::i;48128:505::-;;;;;;;;;;-1:-1:-1;48128:505:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3509:32:1;;;3491:51;;3573:2;3558:18;;3551:34;;;;3464:18;48128:505:0;3317:274:1;55612:226:0;;;;;;;;;;-1:-1:-1;55612:226:0;;;;;:::i;:::-;;:::i;29216:864::-;;;;;;;;;;-1:-1:-1;29216:864:0;;;;;:::i;:::-;;:::i;60124:153::-;;;;;;;;;;-1:-1:-1;60124:153:0;;;;;:::i;:::-;;:::i;2763:143::-;;;;;;;;;;;;2863:42;2763:143;;62585:205;;;;;;;;;;-1:-1:-1;62585:205:0;;;;;:::i;:::-;;:::i;28685:228::-;;;;;;;;;;-1:-1:-1;28685:228:0;;;;;:::i;:::-;;:::i;56612:94::-;;;;;;;;;;-1:-1:-1;56612:94:0;;;;;:::i;:::-;;:::i;31922:124::-;;;;;;;;;;-1:-1:-1;31922:124:0;;;;;:::i;:::-;;:::i;57316:161::-;;;;;;;;;;-1:-1:-1;57316:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54174:70::-;;;;;;;;;;;;;:::i;56714:88::-;;;;;;;;;;-1:-1:-1;56714:88:0;;;;;:::i;:::-;;:::i;30638:258::-;;;;;;;;;;-1:-1:-1;30638:258:0;;;;;:::i;:::-;;:::i;45874:103::-;;;;;;;;;;;;;:::i;51411:430::-;;;;;;;;;;-1:-1:-1;51411:430:0;;;;;:::i;:::-;;:::i;45234:87::-;;;;;;;;;;-1:-1:-1;45307:6:0;;-1:-1:-1;;;;;45307:6:0;45234:87;;59807:309;;;;;;;;;;-1:-1:-1;59807:309:0;;;;;:::i;:::-;;:::i;60462:853::-;;;;;;:::i;:::-;;:::i;32282:104::-;;;;;;;;;;;;;:::i;51849:274::-;;;;;;;;;;-1:-1:-1;51849:274:0;;;;;:::i;:::-;;:::i;61967:208::-;;;;;;;;;;-1:-1:-1;61967:208:0;;;;;:::i;:::-;;:::i;52131:891::-;;;;;;;;;;-1:-1:-1;52131:891:0;;;;;:::i;:::-;;:::i;:::-;;;;9699:25:1;;;9755:2;9740:18;;9733:34;;;;9815:4;9803:17;9783:18;;;9776:45;9687:2;9672:18;52131:891:0;9501:326:1;55500:104:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;62798:239::-;;;;;;;;;;-1:-1:-1;62798:239:0;;;;;:::i;:::-;;:::i;50817:252::-;;;;;;;;;;-1:-1:-1;50817:252:0;;;;;:::i;:::-;;:::i;57485:429::-;;;;;;;;;;-1:-1:-1;57485:429:0;;;;;:::i;:::-;;:::i;58800:999::-;;;;;;;;;;-1:-1:-1;58800:999:0;;;;;:::i;:::-;;:::i;56810:498::-;;;;;;;;;;-1:-1:-1;56810:498:0;;;;;:::i;:::-;;:::i;40353:43::-;;;;;;;;;;;;;;;;57922:870;;;;;;:::i;:::-;;:::i;61439:113::-;;;;;;;;;;-1:-1:-1;61439:113:0;;;;;:::i;:::-;;:::i;60285:169::-;;;;;;;;;;-1:-1:-1;60285:169:0;;;;;:::i;:::-;;:::i;34588:214::-;;;;;;;;;;-1:-1:-1;34588:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34759:25:0;;;34730:4;34759:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34588:214;55846:758;;;;;;;;;;-1:-1:-1;55846:758:0;;;;;:::i;:::-;;:::i;46132:238::-;;;;;;;;;;-1:-1:-1;46132:238:0;;;;;:::i;:::-;;:::i;54407:54::-;;;;;;;;;;;;54444:17;54407:54;;51077:326;;;;;;;;;;-1:-1:-1;51077:326:0;;;;;:::i;:::-;;:::i;55386:106::-;;;;;;;;;;-1:-1:-1;55386:106:0;;;;;:::i;:::-;55444:4;55468:16;;;:9;:16;;;;;;;;;55386:106;61560:221;61708:4;61737:36;61761:11;61737:23;:36::i;:::-;61730:43;61560:221;-1:-1:-1;;61560:221:0:o;61789:170::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;;;;;;;;;61907:44:::1;61926:8;61936:14;61907:18;:44::i;:::-;61789:170:::0;;:::o;32113:100::-;32167:13;32200:5;32193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32113:100;:::o;33825:292::-;33929:7;33976:16;33984:7;36041:4;36075:12;-1:-1:-1;36065:22:0;35984:111;33976:16;33954:111;;;;-1:-1:-1;;;33954:111:0;;15299:2:1;33954:111:0;;;15281:21:1;15338:2;15318:18;;;15311:30;15377:34;15357:18;;;15350:62;-1:-1:-1;;;15428:18:1;;;15421:43;15481:19;;33954:111:0;15097:409:1;33954:111:0;-1:-1:-1;34085:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34085:24:0;;33825:292::o;62183:189::-;62306:8;4418:30;4439:8;4418:20;:30::i;:::-;62332:32:::1;62346:8;62356:7;62332:13;:32::i;:::-;62183:189:::0;;;:::o;62380:197::-;62515:4;-1:-1:-1;;;;;4238:18:0;;4246:10;4238:18;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;62532:37:::1;62551:4;62557:2;62561:7;62532:18;:37::i;:::-;62380:197:::0;;;;:::o;48128:505::-;48270:7;48333:27;;;:17;:27;;;;;;;;48304:56;;;;;;;;;-1:-1:-1;;;;;48304:56:0;;;;;-1:-1:-1;;;48304:56:0;;;-1:-1:-1;;;;;48304:56:0;;;;;;;;48270:7;;48373:92;;-1:-1:-1;48424:29:0;;;;;;;;;48434:19;48424:29;-1:-1:-1;;;;;48424:29:0;;;;-1:-1:-1;;;48424:29:0;;-1:-1:-1;;;;;48424:29:0;;;;;48373:92;48515:23;;;;48477:21;;48999:5;;48502:36;;-1:-1:-1;;;;;48502:36:0;:10;:36;:::i;:::-;48501:71;;;;:::i;:::-;48593:16;;;-1:-1:-1;48477:95:0;;-1:-1:-1;;48128:505:0;;;;;;:::o;55612:226::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;55705:1:::1;55696:6;:10;:45;;;;;55720:21;55710:6;:31;;55696:45;55674:109;;;::::0;-1:-1:-1;;;55674:109:0;;16275:2:1;55674:109:0::1;::::0;::::1;16257:21:1::0;16314:2;16294:18;;;16287:30;-1:-1:-1;;;16333:18:1;;;16326:44;16387:18;;55674:109:0::1;16073:338:1::0;55674:109:0::1;55794:36;::::0;55802:10:::1;::::0;55794:36;::::1;;;::::0;55823:6;;55794:36:::1;::::0;;;55823:6;55802:10;55794:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;29216:864:::0;29341:7;29382:16;29392:5;29382:9;:16::i;:::-;29374:5;:24;29366:71;;;;-1:-1:-1;;;29366:71:0;;16618:2:1;29366:71:0;;;16600:21:1;16657:2;16637:18;;;16630:30;16696:34;16676:18;;;16669:62;-1:-1:-1;;;16747:18:1;;;16740:32;16789:19;;29366:71:0;16416:398:1;29366:71:0;29448:22;28588:12;;;29448:22;;29580:426;29604:14;29600:1;:18;29580:426;;;29640:31;29674:14;;;:11;:14;;;;;;;;;29640:48;;;;;;;;;-1:-1:-1;;;;;29640:48:0;;;;;-1:-1:-1;;;29640:48:0;;;-1:-1:-1;;;;;29640:48:0;;;;;;;;29707:28;29703:103;;29776:14;;;-1:-1:-1;29703:103:0;29845:5;-1:-1:-1;;;;;29824:26:0;:17;-1:-1:-1;;;;;29824:26:0;;29820:175;;29890:5;29875:11;:20;29871:77;;-1:-1:-1;29927:1:0;-1:-1:-1;29920:8:0;;-1:-1:-1;;;29920:8:0;29871:77;29966:13;;;;:::i;:::-;;;;29820:175;-1:-1:-1;29620:3:0;;;;:::i;:::-;;;;29580:426;;;-1:-1:-1;30016:56:0;;-1:-1:-1;;;30016:56:0;;17161:2:1;30016:56:0;;;17143:21:1;17200:2;17180:18;;;17173:30;17239:34;17219:18;;;17212:62;-1:-1:-1;;;17290:18:1;;;17283:44;17344:19;;30016:56:0;16959:410:1;60124:153:0;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;60234:22:::1;::::0;;;:13:::1;:22;::::0;;;;:27:::1;;:35;60264:5:::0;;60234:27;:35:::1;:::i;62585:205::-:0;62724:4;-1:-1:-1;;;;;4238:18:0;;4246:10;4238:18;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;62741:41:::1;62764:4;62770:2;62774:7;62741:22;:41::i;28685:228::-:0;28788:7;28588:12;;28821:5;:21;28813:69;;;;-1:-1:-1;;;28813:69:0;;19634:2:1;28813:69:0;;;19616:21:1;19673:2;19653:18;;;19646:30;19712:34;19692:18;;;19685:62;-1:-1:-1;;;19763:18:1;;;19756:33;19806:19;;28813:69:0;19432:399:1;28813:69:0;-1:-1:-1;28900:5:0;28685:228::o;56612:94::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;56682:7:::1;:16;56692:6:::0;56682:7;:16:::1;:::i;31922:124::-:0;31986:7;32013:20;32025:7;32013:11;:20::i;:::-;:25;;31922:124;-1:-1:-1;;31922:124:0:o;57316:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;57447:13:0;:22;57461:7;57447:22;;;;;;;;;;;57440:29;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57316:161;;;:::o;54174:70::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56714:88::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;56778:6:::1;:16:::0;;-1:-1:-1;;;;;;56778:16:0::1;-1:-1:-1::0;;;;;56778:16:0;;;::::1;::::0;;;::::1;::::0;;56714:88::o;30638:258::-;30702:7;-1:-1:-1;;;;;30744:19:0;;30722:112;;;;-1:-1:-1;;;30722:112:0;;21395:2:1;30722:112:0;;;21377:21:1;21434:2;21414:18;;;21407:30;21473:34;21453:18;;;21446:62;-1:-1:-1;;;21524:18:1;;;21517:41;21575:19;;30722:112:0;21193:407:1;30722:112:0;-1:-1:-1;;;;;;30860:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30860:27:0;;30638:258::o;45874:103::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;45939:30:::1;45966:1;45939:18;:30::i;:::-;45874:103::o:0;51411:430::-;51591:4;51608:19;51630:49;51645:6;51653:10;51665:5;51672:6;51630:14;:49::i;:::-;51608:71;;51690:28;51721:36;51745:11;51721:23;:36::i;:::-;51690:67;;51827:6;-1:-1:-1;;;;;51777:56:0;:46;51791:20;51813:9;51777:13;:46::i;:::-;-1:-1:-1;;;;;51777:56:0;;;51411:430;-1:-1:-1;;;;;;;;51411:430:0:o;59807:309::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;59880:4:::1;59888:1;59880:9:::0;59876:233:::1;;59906:12;:36:::0;;59921:21:::1;::::0;59906:12;-1:-1:-1;;;;59906:36:0::1;-1:-1:-1::0;;;59921:21:0;59906:36:::1;;;;;;59807:309:::0;:::o;59876:233::-:1;59964:4;59972:1;59964:9:::0;59960:149:::1;;59990:12;:36:::0;;60005:21:::1;::::0;59990:12;-1:-1:-1;;;;59990:36:0::1;-1:-1:-1::0;;;60005:21:0;59990:36:::1;::::0;59960:149:::1;60059:12;:38:::0;;-1:-1:-1;;;;60059:38:0::1;-1:-1:-1::0;;;60059:38:0::1;::::0;;59960:149:::1;59807:309:::0;:::o;60462:853::-;60706:17;60714:8;60706:7;:17::i;:::-;-1:-1:-1;;;;;60700:23:0;:2;-1:-1:-1;;;;;60700:23:0;;60692:55;;;;-1:-1:-1;;;60692:55:0;;21939:2:1;60692:55:0;;;21921:21:1;21978:2;21958:18;;;21951:30;-1:-1:-1;;;21997:18:1;;;21990:49;22056:18;;60692:55:0;21737:343:1;60692:55:0;-1:-1:-1;;;;;60766:16:0;;60772:10;60766:16;60758:43;;;;-1:-1:-1;;;60758:43:0;;;;;;;:::i;:::-;60848:1;60820:25;60834:10;60820:13;:25::i;:::-;:29;60812:61;;;;-1:-1:-1;;;60812:61:0;;22630:2:1;60812:61:0;;;22612:21:1;22669:2;22649:18;;;22642:30;-1:-1:-1;;;22688:18:1;;;22681:49;22747:18;;60812:61:0;22428:343:1;60812:61:0;60921:10;60892:25;60911:5;;60892:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60892:18:0;;-1:-1:-1;;;60892:25:0:i;:::-;:39;60884:64;;;;-1:-1:-1;;;60884:64:0;;22978:2:1;60884:64:0;;;22960:21:1;23017:2;22997:18;;;22990:30;-1:-1:-1;;;23036:18:1;;;23029:42;23088:18;;60884:64:0;22776:336:1;60884:64:0;60988:6;;60981:48;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60988:6:0;;60996:10;;61008:5;;61015:2;;60981:48;61019:9;;;;;;60981:48;;61019:9;;;;60981:48;;;;;;;;;-1:-1:-1;60981:6:0;;-1:-1:-1;;;60981:48:0:i;:::-;:86;;;;-1:-1:-1;61051:16:0;;;;:9;:16;;;;;;;;61050:17;60981:86;60959:153;;;;-1:-1:-1;;;60959:153:0;;23319:2:1;60959:153:0;;;23301:21:1;23358:2;23338:18;;;23331:30;-1:-1:-1;;;23377:18:1;;;23370:47;23434:18;;60959:153:0;23117:341:1;60959:153:0;61149:85;;;;;;;;61186:10;61149:85;;;;61217:5;;61149:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61149:85:0;;;;-1:-1:-1;;61123:23:0;;;:13;:23;;;;;;;;:111;;;;;;;;:23;;-1:-1:-1;61123:111:0;;;;;;;;:::i;:::-;-1:-1:-1;;;61245:16:0;;;;:9;:16;;;;;;;:23;;-1:-1:-1;;61245:23:0;61264:4;61245:23;;;61284;;;;;61298:8;2695:25:1;;2683:2;2668:18;;2549:177;61284:23:0;;;;;;;;60462:853;;;;;;;;:::o;32282:104::-;32338:13;32371:7;32364:14;;;;;:::i;51849:274::-;51974:7;51995:9;52006;52017:7;52028:26;52043:10;52028:14;:26::i;:::-;52074:41;;;;;;;;;;;;23690:25:1;;;23763:4;23751:17;;23731:18;;;23724:45;;;;23785:18;;;23778:34;;;23828:18;;;23821:34;;;51994:60:0;;-1:-1:-1;51994:60:0;;-1:-1:-1;51994:60:0;-1:-1:-1;52074:41:0;;23662:19:1;;52074:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52074:41:0;;-1:-1:-1;;52074:41:0;;;51849:274;-1:-1:-1;;;;;;;51849:274:0:o;61967:208::-;62098:8;4418:30;4439:8;4418:20;:30::i;:::-;62124:43:::1;62148:8;62158;62124:23;:43::i;52131:891::-:0;52235:9;52259;52283:7;52326:3;:10;52340:2;52326:16;52318:53;;;;-1:-1:-1;;;52318:53:0;;24068:2:1;52318:53:0;;;24050:21:1;24107:2;24087:18;;;24080:30;24146:26;24126:18;;;24119:54;24190:18;;52318:53:0;23866:348:1;52318:53:0;-1:-1:-1;;;52780:2:0;52771:12;;52765:19;52850:2;52841:12;;52835:19;52957:2;52948:12;;;52942:19;52765;;52939:1;52934:28;;;;;52131:891::o;55500:104::-;55547:18;55585:11;55578:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55500:104;:::o;62798:239::-;62965:4;-1:-1:-1;;;;;4238:18:0;;4246:10;4238:18;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;62982:47:::1;63005:4;63011:2;63015:7;63024:4;62982:22;:47::i;:::-;62798:239:::0;;;;;:::o;50817:252::-;51009:51;;-1:-1:-1;;24502:2:1;24498:15;;;24494:24;;51009:51:0;;;24482:37:1;24535:12;;;24528:28;;;24572:12;;;24565:28;;;24627:15;;;24623:24;24609:12;;;24602:46;50972:7:0;;24664:13:1;;51009:51:0;;;;;;;;;;;;50999:62;;;;;;50992:69;;50817:252;;;;;;;:::o;57485:429::-;57549:7;;57569:319;57593:11;:18;57589:22;;57569:319;;;57666:11;57678:1;57666:14;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;57652:10;:32;;:85;;;;;57719:11;57731:1;57719:14;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;57705:10;:32;;57652:85;57630:185;;;57779:11;57791:1;57779:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57772:27;;;57485:429;;;:::o;57630:185::-;57858:3;;57569:319;;;-1:-1:-1;57905:1:0;;57485:429;-1:-1:-1;;57485:429:0:o;58800:999::-;58902:13;58941:17;58949:8;36041:4;36075:12;-1:-1:-1;36065:22:0;35984:111;58941:17;58933:51;;;;-1:-1:-1;;;58933:51:0;;25022:2:1;58933:51:0;;;25004:21:1;25061:2;25041:18;;;25034:30;-1:-1:-1;;;25080:18:1;;;25073:51;25141:18;;58933:51:0;24820:345:1;58933:51:0;59015:21;58999:12;;-1:-1:-1;;;58999:12:0;;;;:37;;;;;;;;:::i;:::-;;58995:777;;59101:1;59083:7;59077:21;;;;;:::i;:::-;;;:25;:184;;;;;;;;;;;;;;;;;59176:7;59185:26;59202:8;59185:16;:26::i;:::-;59159:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59053:208;58800:999;-1:-1:-1;;58800:999:0:o;58995:777::-;59299:21;59283:12;;-1:-1:-1;;;59283:12:0;;;;:37;;;;;;;;:::i;:::-;;59279:493;;59385:1;59367:7;59361:21;;;;;:::i;:::-;;;:25;:307;;;;;;;;;;;;;;;;;59490:7;59528:26;59545:8;59528:16;:26::i;:::-;59443:176;;;;;;;;;:::i;59279:493::-;59706:23;59690:12;;-1:-1:-1;;;59690:12:0;;;;:39;;;;;;;;:::i;:::-;;59686:86;;59753:7;59746:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58800:999;;;:::o;59686:86::-;-1:-1:-1;;59782:9:0;;;;;;;;;-1:-1:-1;59782:9:0;;;58800:999::o;56810:498::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;56966:9:::1;56961:340;56985:11;:18:::0;56981:22;::::1;56961:340;;;57047:3;57026:11;57038:1;57026:14;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;:24:::0;57022:206:::1;;57092:4;57071:11;57083:1;57071:14;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;:25;;;;57136:4;57115:11;57127:1;57115:14;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;:25;;;;57182:6;57159:11;57171:1;57159:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;:29;;;;57207:5;;57022:206;57271:3;;56961:340;;57922:870:::0;58115:13;58131:48;58138:6;;;;;;;;;-1:-1:-1;;;;;58138:6:0;58146:10;58158:5;58165:2;58169:9;;58131:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58131:6:0;;-1:-1:-1;;;58131:48:0:i;:::-;58115:64;;58190:13;58206:25;58220:10;58206:13;:25::i;:::-;58190:41;;58258:1;58250:5;:9;58242:41;;;;-1:-1:-1;;;58242:41:0;;22630:2:1;58242:41:0;;;22612:21:1;22669:2;22649:18;;;22642:30;-1:-1:-1;;;22688:18:1;;;22681:49;22747:18;;58242:41:0;22428:343:1;58242:41:0;58331:10;58302:25;58321:5;;58302:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58302:18:0;;-1:-1:-1;;;58302:25:0:i;:::-;:39;58294:64;;;;-1:-1:-1;;;58294:64:0;;22978:2:1;58294:64:0;;;22960:21:1;23017:2;22997:18;;;22990:30;-1:-1:-1;;;23036:18:1;;;23029:42;23088:18;;58294:64:0;22776:336:1;58294:64:0;58404:5;58391:9;:18;;:95;;;;58431:8;:29;;;;-1:-1:-1;58444:16:0;;;;:9;:16;;;;;;;;58443:17;58431:29;:54;;;;;58484:1;58464:16;58477:2;58464:12;:16::i;:::-;:21;;58431:54;58369:161;;;;-1:-1:-1;;;58369:161:0;;27054:2:1;58369:161:0;;;27036:21:1;27093:2;27073:18;;;27066:30;-1:-1:-1;;;27112:18:1;;;27105:46;27168:18;;58369:161:0;26852:340:1;58369:161:0;-1:-1:-1;;;;;58549:16:0;;58555:10;58549:16;58541:43;;;;-1:-1:-1;;;58541:43:0;;;;;;;:::i;:::-;58595:15;58613:16;58623:2;58627:1;58613:9;:16::i;:::-;58595:34;;58665:85;;;;;;;;58702:10;58665:85;;;;58733:5;;58665:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58665:85:0;;;;-1:-1:-1;;58640:22:0;;;:13;:22;;;;;;;;:110;;;;;;;;:22;;-1:-1:-1;58640:110:0;;;;;;;;:::i;:::-;-1:-1:-1;;;58761:16:0;;;;-1:-1:-1;;58761:9:0;:16;;-1:-1:-1;;58761:16:0;;;;:23;;-1:-1:-1;;58761:23:0;58780:4;58761:23;;;-1:-1:-1;;;;;57922:870:0:o;61439:113::-;61497:7;61524:20;61538:5;61524:13;:20::i;60285:169::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;60399:22:::1;::::0;;;:13:::1;:22;::::0;;;;:47;60285:169::o;55846:758::-;56046:6;;56023:13;;56039:54;;-1:-1:-1;;;;;56046:6:0;56054:16;56063:7;56054:6;:16;:::i;:::-;56072:5;56079:2;56083:9;;56039:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56039:6:0;;-1:-1:-1;;;56039:54:0:i;:::-;56023:70;;56132:2;-1:-1:-1;;;;;56112:22:0;:16;56120:7;56112;:16::i;:::-;-1:-1:-1;;;;;56112:22:0;;56104:48;;;;-1:-1:-1;;;56104:48:0;;27529:2:1;56104:48:0;;;27511:21:1;27568:2;27548:18;;;27541:30;-1:-1:-1;;;27587:18:1;;;27580:43;27640:18;;56104:48:0;27327:337:1;56104:48:0;-1:-1:-1;;;;;56171:16:0;;56177:10;56171:16;56163:43;;;;-1:-1:-1;;;56163:43:0;;;;;;;:::i;:::-;56248:1;56239:6;:10;:45;;;;;56263:21;56253:6;:31;;56239:45;56217:109;;;;-1:-1:-1;;;56217:109:0;;16275:2:1;56217:109:0;;;16257:21:1;16314:2;16294:18;;;16287:30;-1:-1:-1;;;16333:18:1;;;16326:44;16387:18;;56217:109:0;16073:338:1;56217:109:0;56360:16;;;;:9;:16;;;;;;;;56359:17;:29;;;;;56380:8;56359:29;:64;;;;-1:-1:-1;56408:15:0;56392:12;56400:4;56392:5;:12;:::i;:::-;:31;;56359:64;56337:131;;;;-1:-1:-1;;;56337:131:0;;23319:2:1;56337:131:0;;;23301:21:1;23358:2;23338:18;;;23331:30;-1:-1:-1;;;23377:18:1;;;23370:47;23434:18;;56337:131:0;23117:341:1;56337:131:0;56479:28;;-1:-1:-1;;;;;56479:20:0;;;:28;;;;;56500:6;;56479:28;;;;56500:6;56479:20;:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56518:16:0;;;;:9;:16;;;;;;;;;:23;;-1:-1:-1;;56518:23:0;56537:4;56518:23;;;56557:39;;-1:-1:-1;;;;;27918:32:1;;27900:51;;27967:18;;;27960:34;;;28010:18;;;28003:34;;;28068:2;28053:18;;28046:34;;;56557:39:0;;27887:3:1;27872:19;56557:39:0;;;;;;;56012:592;55846:758;;;;;;:::o;46132:238::-;45307:6;;-1:-1:-1;;;;;45307:6:0;22929:10;45454:23;45446:57;;;;-1:-1:-1;;;45446:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46235:22:0;::::1;46213:110;;;::::0;-1:-1:-1;;;46213:110:0;;28293:2:1;46213:110:0::1;::::0;::::1;28275:21:1::0;28332:2;28312:18;;;28305:30;28371:34;28351:18;;;28344:62;-1:-1:-1;;;28422:18:1;;;28415:36;28468:19;;46213:110:0::1;28091:402:1::0;46213:110:0::1;46334:28;46353:8;46334:18;:28::i;51077:326::-:0;51253:127;;28740:66:1;51253:127:0;;;28728:79:1;28823:12;;;28816:28;;;51180:7:0;;28860:12:1;;51253:127:0;;;;;;;;;;;;51225:170;;;;;;51205:190;;51077:326;;;:::o;47782:291::-;47929:4;-1:-1:-1;;;;;;47971:41:0;;-1:-1:-1;;;47971:41:0;;:94;;;48029:36;48053:11;48029:23;:36::i;49283:392::-;48999:5;-1:-1:-1;;;;;49423:33:0;;;;49401:125;;;;-1:-1:-1;;;49401:125:0;;29085:2:1;49401:125:0;;;29067:21:1;29124:2;29104:18;;;29097:30;29163:34;29143:18;;;29136:62;-1:-1:-1;;;29214:18:1;;;29207:40;29264:19;;49401:125:0;28883:406:1;49401:125:0;-1:-1:-1;;;;;49545:22:0;;49537:60;;;;-1:-1:-1;;;49537:60:0;;29496:2:1;49537:60:0;;;29478:21:1;29535:2;29515:18;;;29508:30;29574:27;29554:18;;;29547:55;29619:18;;49537:60:0;29294:349:1;49537:60:0;49632:35;;;;;;;;;-1:-1:-1;;;;;49632:35:0;;;;;;-1:-1:-1;;;;;49632:35:0;;;;;;;;;;-1:-1:-1;;;49610:57:0;;;;:19;:57;49283:392::o;4476:512::-;2863:42;4667:45;:49;4663:318;;4756:128;;-1:-1:-1;;;4756:128:0;;4829:4;4756:128;;;29860:34:1;-1:-1:-1;;;;;29930:15:1;;29910:18;;;29903:43;2863:42:0;;4756;;29795:18:1;;4756:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4733:237;;4926:28;;-1:-1:-1;;;4926:28:0;;-1:-1:-1;;;;;2246:32:1;;4926:28:0;;;2228:51:1;2201:18;;4926:28:0;2082:203:1;33338:421:0;33419:13;33435:24;33451:7;33435:15;:24::i;:::-;33419:40;;33484:5;-1:-1:-1;;;;;33478:11:0;:2;-1:-1:-1;;;;;33478:11:0;;33470:58;;;;-1:-1:-1;;;33470:58:0;;30409:2:1;33470:58:0;;;30391:21:1;30448:2;30428:18;;;30421:30;30487:34;30467:18;;;30460:62;-1:-1:-1;;;30538:18:1;;;30531:32;30580:19;;33470:58:0;30207:398:1;33470:58:0;22929:10;-1:-1:-1;;;;;33563:21:0;;;;:62;;-1:-1:-1;33588:37:0;33605:5;22929:10;34588:214;:::i;33588:37::-;33541:169;;;;-1:-1:-1;;;33541:169:0;;30812:2:1;33541:169:0;;;30794:21:1;30851:2;30831:18;;;30824:30;30890:34;30870:18;;;30863:62;30961:27;30941:18;;;30934:55;31006:19;;33541:169:0;30610:421:1;33541:169:0;33723:28;33732:2;33736:7;33745:5;33723:8;:28::i;34869:170::-;35003:28;35013:4;35019:2;35023:7;35003:9;:28::i;35110:185::-;35248:39;35265:4;35271:2;35275:7;35248:39;;;;;;;;;;;;:16;:39::i;31178:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;31313:16:0;31321:7;36041:4;36075:12;-1:-1:-1;36065:22:0;35984:111;31313:16;31305:71;;;;-1:-1:-1;;;31305:71:0;;31238:2:1;31305:71:0;;;31220:21:1;31277:2;31257:18;;;31250:30;31316:34;31296:18;;;31289:62;-1:-1:-1;;;31367:18:1;;;31360:40;31417:19;;31305:71:0;31036:406:1;31305:71:0;31389:26;31441:12;31430:7;:23;31426:103;;31491:22;31501:12;31491:7;:22;:::i;:::-;:26;;31516:1;31491:26;:::i;:::-;31470:47;;31426:103;31561:7;31541:242;31578:18;31570:4;:26;31541:242;;31621:31;31655:17;;;:11;:17;;;;;;;;;31621:51;;;;;;;;;-1:-1:-1;;;;;31621:51:0;;;;;-1:-1:-1;;;31621:51:0;;;-1:-1:-1;;;;;31621:51:0;;;;;;;;31691:28;31687:85;;31747:9;31178:682;-1:-1:-1;;;;31178:682:0:o;31687:85::-;-1:-1:-1;31598:6:0;;;;:::i;:::-;;;;31541:242;;;-1:-1:-1;31795:57:0;;-1:-1:-1;;;31795:57:0;;31923:2:1;31795:57:0;;;31905:21:1;31962:2;31942:18;;;31935:30;32001:34;31981:18;;;31974:62;-1:-1:-1;;;32052:18:1;;;32045:45;32107:19;;31795:57:0;31721:411:1;46530:191:0;46623:6;;;-1:-1:-1;;;;;46640:17:0;;;-1:-1:-1;;;;;;46640:17:0;;;;;;;46673:40;;46623:6;;;46640:17;46623:6;;46673:40;;46604:16;;46673:40;46593:128;46530:191;:::o;53232:643::-;53375:15;;53288:7;;;;;;53401:446;53419:10;53415:1;:14;53401:446;;;53453:8;53470:1;53473;53464:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;53464:11:0;;-1:-1:-1;;;;53494:8:0;;53490:346;;;53523:6;53528:1;53523:6;;:::i;:::-;;;53490:346;;;-1:-1:-1;;;;;;;;;53555:8:0;;;53551:285;;;53584:6;53589:1;53584:6;;:::i;53551:285::-;-1:-1:-1;;;;;;;;;53616:8:0;;;53612:224;;;53645:6;53650:1;53645:6;;:::i;53612:224::-;-1:-1:-1;;;;;;;;;53677:8:0;;;53673:163;;;53706:6;53711:1;53706:6;;:::i;53673:163::-;-1:-1:-1;;;;;;;;;53738:8:0;;;53734:102;;;53767:6;53772:1;53767:6;;:::i;53734:102::-;53814:6;53819:1;53814:6;;:::i;:::-;;;53734:102;-1:-1:-1;53431:5:0;;;;:::i;:::-;;;;53401:446;;;-1:-1:-1;53864:3:0;;53232:643;-1:-1:-1;;;53232:643:0:o;34189:328::-;22929:10;-1:-1:-1;;;;;34324:24:0;;;34316:63;;;;-1:-1:-1;;;34316:63:0;;32339:2:1;34316:63:0;;;32321:21:1;32378:2;32358:18;;;32351:30;32417:28;32397:18;;;32390:56;32463:18;;34316:63:0;32137:350:1;34316:63:0;22929:10;34392:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34392:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34392:53:0;;;;;;;;;;34461:48;;540:41:1;;;34392:42:0;;22929:10;34461:48;;513:18:1;34461:48:0;;;;;;;34189:328;;:::o;35366:363::-;35533:28;35543:4;35549:2;35553:7;35533:9;:28::i;:::-;35594:48;35617:4;35623:2;35627:7;35636:5;35594:22;:48::i;:::-;35572:149;;;;-1:-1:-1;;;35572:149:0;;;;;;;:::i;23345:723::-;23401:13;23622:5;23631:1;23622:10;23618:53;;-1:-1:-1;;23649:10:0;;;;;;;;;;;;-1:-1:-1;;;23649:10:0;;;;;23345:723::o;23618:53::-;23696:5;23681:12;23737:78;23744:9;;23737:78;;23770:8;;;;:::i;:::-;;-1:-1:-1;23793:10:0;;-1:-1:-1;23801:2:0;23793:10;;:::i;:::-;;;23737:78;;;23825:19;23857:6;-1:-1:-1;;;;;23847:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23847:17:0;;23825:39;;23875:154;23882:10;;23875:154;;23909:11;23919:1;23909:11;;:::i;:::-;;-1:-1:-1;23978:10:0;23986:2;23978:5;:10;:::i;:::-;23965:24;;:2;:24;:::i;:::-;23952:39;;23935:6;23942;23935:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23935:56:0;;;;;;;;-1:-1:-1;24006:11:0;24015:2;24006:11;;:::i;:::-;;;23875:154;;36103:152;36188:7;36220:27;36230:2;36234:8;36220:27;;;;;;;;;;;;:9;:27::i;:::-;36213:34;36103:152;-1:-1:-1;;;36103:152:0:o;30904:266::-;30965:7;-1:-1:-1;;;;;31007:19:0;;30985:118;;;;-1:-1:-1;;;30985:118:0;;33231:2:1;30985:118:0;;;33213:21:1;33270:2;33250:18;;;33243:30;33309:34;33289:18;;;33282:62;-1:-1:-1;;;33360:18:1;;;33353:47;33417:19;;30985:118:0;33029:413:1;30985:118:0;-1:-1:-1;;;;;;31129:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;31129:32:0;;-1:-1:-1;;;;;31129:32:0;;30904:266::o;30152:422::-;30299:4;-1:-1:-1;;;;;;30341:40:0;;-1:-1:-1;;;30341:40:0;;:105;;-1:-1:-1;;;;;;;30398:48:0;;-1:-1:-1;;;30398:48:0;30341:105;:172;;;-1:-1:-1;;;;;;;30463:50:0;;-1:-1:-1;;;30463:50:0;30341:172;:225;;;-1:-1:-1;;;;;;;;;;13663:40:0;;;30530:36;13504:207;40149:196;40264:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40264:29:0;-1:-1:-1;;;;;40264:29:0;;;;;;;;;40309:28;;40264:24;;40309:28;;;;;;;40149:196;;;:::o;38322:1709::-;38437:35;38475:20;38487:7;38475:11;:20::i;:::-;38550:18;;38437:58;;-1:-1:-1;38508:22:0;;-1:-1:-1;;;;;38534:34:0;22929:10;-1:-1:-1;;;;;38534:34:0;;:87;;;-1:-1:-1;22929:10:0;38585:20;38597:7;38585:11;:20::i;:::-;-1:-1:-1;;;;;38585:36:0;;38534:87;:154;;;-1:-1:-1;38655:18:0;;38638:50;;22929:10;34588:214;:::i;38638:50::-;38508:181;;38724:17;38702:117;;;;-1:-1:-1;;;38702:117:0;;33649:2:1;38702:117:0;;;33631:21:1;33688:2;33668:18;;;33661:30;33727:34;33707:18;;;33700:62;-1:-1:-1;;;33778:18:1;;;33771:48;33836:19;;38702:117:0;33447:414:1;38702:117:0;38876:4;-1:-1:-1;;;;;38854:26:0;:13;:18;;;-1:-1:-1;;;;;38854:26:0;;38832:114;;;;-1:-1:-1;;;38832:114:0;;34068:2:1;38832:114:0;;;34050:21:1;34107:2;34087:18;;;34080:30;34146:34;34126:18;;;34119:62;-1:-1:-1;;;34197:18:1;;;34190:36;34243:19;;38832:114:0;33866:402:1;38832:114:0;-1:-1:-1;;;;;38965:16:0;;38957:66;;;;-1:-1:-1;;;38957:66:0;;34475:2:1;38957:66:0;;;34457:21:1;34514:2;34494:18;;;34487:30;34553:34;34533:18;;;34526:62;-1:-1:-1;;;34604:18:1;;;34597:35;34649:19;;38957:66:0;34273:401:1;38957:66:0;39144:49;39161:1;39165:7;39174:13;:18;;;39144:8;:49::i;:::-;-1:-1:-1;;;;;39206:18:0;;;;;;:12;:18;;;;;:31;;39236:1;;39206:18;:31;;39236:1;;-1:-1:-1;;;;;39206:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;39206:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39248:16:0;;-1:-1:-1;39248:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;39248:16:0;;:29;;-1:-1:-1;;39248:29:0;;:::i;:::-;;;-1:-1:-1;;;;;39248:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39311:43:0;;;;;;;;-1:-1:-1;;;;;39311:43:0;;;;;-1:-1:-1;;;;;39337:15:0;39311:43;;;;;;;;;-1:-1:-1;39288:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;39288:66:0;-1:-1:-1;;;;;;39288:66:0;;;;;;;;;;;39616:11;39300:7;-1:-1:-1;39616:11:0;:::i;:::-;39683:1;39642:24;;;:11;:24;;;;;:29;39594:33;;-1:-1:-1;;;;;;39642:29:0;39638:288;;39706:20;39714:11;36041:4;36075:12;-1:-1:-1;36065:22:0;35984:111;39706:20;39702:213;;;39774:125;;;;;;;;39811:18;;-1:-1:-1;;;;;39774:125:0;;;;;;39852:28;;;;-1:-1:-1;;;;;39774:125:0;;;;;;;;;-1:-1:-1;39747:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;39747:152:0;-1:-1:-1;;;;;;39747:152:0;;;;;;;;;;;;39702:213;39962:7;39958:2;-1:-1:-1;;;;;39943:27:0;39952:4;-1:-1:-1;;;;;39943:27:0;;;;;;;;;;;39981:42;38426:1605;;;38322:1709;;;:::o;42024:985::-;42179:4;-1:-1:-1;;;;;42200:13:0;;14778:20;14826:8;42196:806;;42253:175;;-1:-1:-1;;;42253:175:0;;-1:-1:-1;;;;;42253:36:0;;;;;:175;;22929:10;;42347:4;;42374:7;;42404:5;;42253:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42253:175:0;;;;;;;;-1:-1:-1;;42253:175:0;;;;;;;;;;;;:::i;:::-;;;42232:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42615:6;:13;42632:1;42615:18;42611:321;;42658:109;;-1:-1:-1;;;42658:109:0;;;;;;;:::i;42611:321::-;42882:6;42876:13;42867:6;42863:2;42859:15;42852:38;42232:715;-1:-1:-1;;;;;;42492:55:0;-1:-1:-1;;;42492:55:0;;-1:-1:-1;42485:62:0;;42196:806;-1:-1:-1;42986:4:0;42979:11;;36618:1450;36739:7;36782:12;;-1:-1:-1;;;;;36813:16:0;;36805:62;;;;-1:-1:-1;;;36805:62:0;;36036:2:1;36805:62:0;;;36018:21:1;36075:2;36055:18;;;36048:30;36114:34;36094:18;;;36087:62;-1:-1:-1;;;36165:18:1;;;36158:31;36206:19;;36805:62:0;35834:397:1;36805:62:0;37012:21;37020:12;36041:4;36075:12;-1:-1:-1;36065:22:0;35984:111;37012:21;37011:22;37003:64;;;;-1:-1:-1;;;37003:64:0;;36438:2:1;37003:64:0;;;36420:21:1;36477:2;36457:18;;;36450:30;36516:31;36496:18;;;36489:59;36565:18;;37003:64:0;36236:353:1;37003:64:0;37098:12;37086:8;:24;;37078:71;;;;-1:-1:-1;;;37078:71:0;;36796:2:1;37078:71:0;;;36778:21:1;36835:2;36815:18;;;36808:30;36874:34;36854:18;;;36847:62;-1:-1:-1;;;36925:18:1;;;36918:32;36967:19;;37078:71:0;36594:398:1;37078:71:0;-1:-1:-1;;;;;37269:16:0;;37236:30;37269:16;;;:12;:16;;;;;;;;;37236:49;;;;;;;;;-1:-1:-1;;;;;37236:49:0;;;;;-1:-1:-1;;;37236:49:0;;;;;;;;;;;37315:135;;;;;;;;37341:19;;37236:49;;37315:135;;;37341:39;;37371:8;;37341:39;:::i;:::-;-1:-1:-1;;;;;37315:135:0;;;;;37430:8;37395:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;37315:135:0;;;;;;-1:-1:-1;;;;;37296:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;37296:154:0;;;;;;;;;;;;37489:43;;;;;;;;;;-1:-1:-1;;;;;37515:15:0;37489:43;;;;;;;;37461:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;37461:71:0;-1:-1:-1;;;;;;37461:71:0;;;;;;;;;;;;;;;;;;37473:12;;37593:325;37617:8;37613:1;:12;37593:325;;;37652:38;;37677:12;;-1:-1:-1;;;;;37652:38:0;;;37669:1;;37652:38;;37669:1;;37652:38;37731:59;37762:1;37766:2;37770:12;37784:5;37731:22;:59::i;:::-;37705:172;;;;-1:-1:-1;;;37705:172:0;;;;;;;:::i;:::-;37892:14;;;;:::i;:::-;;;;37627:3;;;;;:::i;:::-;;;;37593:325;;;-1:-1:-1;37930:12:0;:27;-1:-1:-1;38048:12:0;;-1:-1:-1;;;;36618:1450:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:250::-;1226:1;1236:113;1250:6;1247:1;1244:13;1236:113;;;1326:11;;;1320:18;1307:11;;;1300:39;1272:2;1265:10;1236:113;;;-1:-1:-1;;1383:1:1;1365:16;;1358:27;1141:250::o;1396:271::-;1438:3;1476:5;1470:12;1503:6;1498:3;1491:19;1519:76;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1519:76;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1396:271;-1:-1:-1;;1396:271:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2290:254::-;2358:6;2366;2419:2;2407:9;2398:7;2394:23;2390:32;2387:52;;;2435:1;2432;2425:12;2387:52;2458:29;2477:9;2458:29;:::i;:::-;2448:39;2534:2;2519:18;;;;2506:32;;-1:-1:-1;;;2290:254:1:o;2731:328::-;2808:6;2816;2824;2877:2;2865:9;2856:7;2852:23;2848:32;2845:52;;;2893:1;2890;2883:12;2845:52;2916:29;2935:9;2916:29;:::i;:::-;2906:39;;2964:38;2998:2;2987:9;2983:18;2964:38;:::i;:::-;2954:48;;3049:2;3038:9;3034:18;3021:32;3011:42;;2731:328;;;;;:::o;3064:248::-;3132:6;3140;3193:2;3181:9;3172:7;3168:23;3164:32;3161:52;;;3209:1;3206;3199:12;3161:52;-1:-1:-1;;3232:23:1;;;3302:2;3287:18;;;3274:32;;-1:-1:-1;3064:248:1:o;3596:348::-;3648:8;3658:6;3712:3;3705:4;3697:6;3693:17;3689:27;3679:55;;3730:1;3727;3720:12;3679:55;-1:-1:-1;3753:20:1;;-1:-1:-1;;;;;3785:30:1;;3782:50;;;3828:1;3825;3818:12;3782:50;3865:4;3857:6;3853:17;3841:29;;3917:3;3910:4;3901:6;3893;3889:19;3885:30;3882:39;3879:59;;;3934:1;3931;3924:12;3949:479;4029:6;4037;4045;4098:2;4086:9;4077:7;4073:23;4069:32;4066:52;;;4114:1;4111;4104:12;4066:52;4154:9;4141:23;-1:-1:-1;;;;;4179:6:1;4176:30;4173:50;;;4219:1;4216;4209:12;4173:50;4258:59;4309:7;4300:6;4289:9;4285:22;4258:59;:::i;:::-;4336:8;;4232:85;;-1:-1:-1;4418:2:1;4403:18;;;;4390:32;;3949:479;-1:-1:-1;;;;3949:479:1:o;4672:127::-;4733:10;4728:3;4724:20;4721:1;4714:31;4764:4;4761:1;4754:15;4788:4;4785:1;4778:15;4804:632;4869:5;-1:-1:-1;;;;;4940:2:1;4932:6;4929:14;4926:40;;;4946:18;;:::i;:::-;5021:2;5015:9;4989:2;5075:15;;-1:-1:-1;;5071:24:1;;;5097:2;5067:33;5063:42;5051:55;;;5121:18;;;5141:22;;;5118:46;5115:72;;;5167:18;;:::i;:::-;5207:10;5203:2;5196:22;5236:6;5227:15;;5266:6;5258;5251:22;5306:3;5297:6;5292:3;5288:16;5285:25;5282:45;;;5323:1;5320;5313:12;5282:45;5373:6;5368:3;5361:4;5353:6;5349:17;5336:44;5428:1;5421:4;5412:6;5404;5400:19;5396:30;5389:41;;;;4804:632;;;;;:::o;5441:451::-;5510:6;5563:2;5551:9;5542:7;5538:23;5534:32;5531:52;;;5579:1;5576;5569:12;5531:52;5619:9;5606:23;-1:-1:-1;;;;;5644:6:1;5641:30;5638:50;;;5684:1;5681;5674:12;5638:50;5707:22;;5760:4;5752:13;;5748:27;-1:-1:-1;5738:55:1;;5789:1;5786;5779:12;5738:55;5812:74;5878:7;5873:2;5860:16;5855:2;5851;5847:11;5812:74;:::i;5897:404::-;6080:2;6069:9;6062:21;6125:6;6119:13;6114:2;6103:9;6099:18;6092:41;6043:4;6180:2;6172:6;6168:15;6162:22;6222:4;6215;6204:9;6200:20;6193:34;6244:51;6291:2;6280:9;6276:18;6262:12;6244:51;:::i;6306:186::-;6365:6;6418:2;6406:9;6397:7;6393:23;6389:32;6386:52;;;6434:1;6431;6424:12;6386:52;6457:29;6476:9;6457:29;:::i;6497:221::-;6539:5;6592:3;6585:4;6577:6;6573:17;6569:27;6559:55;;6610:1;6607;6600:12;6559:55;6632:80;6708:3;6699:6;6686:20;6679:4;6671:6;6667:17;6632:80;:::i;6723:606::-;6827:6;6835;6843;6851;6859;6912:3;6900:9;6891:7;6887:23;6883:33;6880:53;;;6929:1;6926;6919:12;6880:53;6952:29;6971:9;6952:29;:::i;:::-;6942:39;;7028:2;7017:9;7013:18;7000:32;6990:42;;7079:2;7068:9;7064:18;7051:32;7041:42;;7102:38;7136:2;7125:9;7121:18;7102:38;:::i;:::-;7092:48;;7191:3;7180:9;7176:19;7163:33;-1:-1:-1;;;;;7211:6:1;7208:30;7205:50;;;7251:1;7248;7241:12;7205:50;7274:49;7315:7;7306:6;7295:9;7291:22;7274:49;:::i;:::-;7264:59;;;6723:606;;;;;;;;:::o;7334:1001::-;7461:6;7469;7477;7485;7493;7501;7509;7517;7570:3;7558:9;7549:7;7545:23;7541:33;7538:53;;;7587:1;7584;7577:12;7538:53;7623:9;7610:23;7600:33;;7684:2;7673:9;7669:18;7656:32;-1:-1:-1;;;;;7748:2:1;7740:6;7737:14;7734:34;;;7764:1;7761;7754:12;7734:34;7803:59;7854:7;7845:6;7834:9;7830:22;7803:59;:::i;:::-;7881:8;;-1:-1:-1;7777:85:1;-1:-1:-1;7777:85:1;;-1:-1:-1;7935:38:1;7969:2;7954:18;;7935:38;:::i;:::-;7925:48;;8020:2;8009:9;8005:18;7992:32;7982:42;;8071:3;8060:9;8056:19;8043:33;8033:43;;8129:3;8118:9;8114:19;8101:33;8085:49;;8159:2;8149:8;8146:16;8143:36;;;8175:1;8172;8165:12;8143:36;;8214:61;8267:7;8256:8;8245:9;8241:24;8214:61;:::i;:::-;7334:1001;;;;-1:-1:-1;7334:1001:1;;-1:-1:-1;7334:1001:1;;;;;;8294:8;-1:-1:-1;;;7334:1001:1:o;8340:388::-;8417:6;8425;8478:2;8466:9;8457:7;8453:23;8449:32;8446:52;;;8494:1;8491;8484:12;8446:52;8530:9;8517:23;8507:33;;8591:2;8580:9;8576:18;8563:32;-1:-1:-1;;;;;8610:6:1;8607:30;8604:50;;;8650:1;8647;8640:12;8604:50;8673:49;8714:7;8705:6;8694:9;8690:22;8673:49;:::i;:::-;8663:59;;;8340:388;;;;;:::o;8733:118::-;8819:5;8812:13;8805:21;8798:5;8795:32;8785:60;;8841:1;8838;8831:12;8856:315;8921:6;8929;8982:2;8970:9;8961:7;8957:23;8953:32;8950:52;;;8998:1;8995;8988:12;8950:52;9021:29;9040:9;9021:29;:::i;:::-;9011:39;;9100:2;9089:9;9085:18;9072:32;9113:28;9135:5;9113:28;:::i;9176:320::-;9244:6;9297:2;9285:9;9276:7;9272:23;9268:32;9265:52;;;9313:1;9310;9303:12;9265:52;9353:9;9340:23;-1:-1:-1;;;;;9378:6:1;9375:30;9372:50;;;9418:1;9415;9408:12;9372:50;9441:49;9482:7;9473:6;9462:9;9458:22;9441:49;:::i;9832:927::-;10057:2;10109:21;;;10179:13;;10082:18;;;10201:22;;;10028:4;;10057:2;10242;;10260:18;;;;10301:15;;;10028:4;10344:389;10358:6;10355:1;10352:13;10344:389;;;10417:13;;10455:9;;10443:22;;10505:11;;;10499:18;10485:12;;;10478:40;10558:11;;;10552:18;10538:12;;;10531:40;10594:4;10638:11;;;10632:18;10618:12;;;10611:40;10680:4;10671:14;;;;10708:15;;;;10380:1;10373:9;10344:389;;;-1:-1:-1;10750:3:1;;9832:927;-1:-1:-1;;;;;;;9832:927:1:o;10764:537::-;10859:6;10867;10875;10883;10936:3;10924:9;10915:7;10911:23;10907:33;10904:53;;;10953:1;10950;10943:12;10904:53;10976:29;10995:9;10976:29;:::i;:::-;10966:39;;11024:38;11058:2;11047:9;11043:18;11024:38;:::i;:::-;11014:48;;11109:2;11098:9;11094:18;11081:32;11071:42;;11164:2;11153:9;11149:18;11136:32;-1:-1:-1;;;;;11183:6:1;11180:30;11177:50;;;11223:1;11220;11213:12;11177:50;11246:49;11287:7;11278:6;11267:9;11263:22;11246:49;:::i;:::-;11236:59;;;10764:537;;;;;;;:::o;11306:397::-;11392:6;11400;11408;11416;11469:3;11457:9;11448:7;11444:23;11440:33;11437:53;;;11486:1;11483;11476:12;11437:53;11509:29;11528:9;11509:29;:::i;:::-;11499:39;;11585:2;11574:9;11570:18;11557:32;11547:42;;11636:2;11625:9;11621:18;11608:32;11598:42;;11659:38;11693:2;11682:9;11678:18;11659:38;:::i;:::-;11649:48;;11306:397;;;;;;;:::o;11890:385::-;11976:6;11984;11992;12000;12053:3;12041:9;12032:7;12028:23;12024:33;12021:53;;;12070:1;12067;12060:12;12021:53;-1:-1:-1;;12093:23:1;;;12163:2;12148:18;;12135:32;;-1:-1:-1;12214:2:1;12199:18;;12186:32;;12265:2;12250:18;12237:32;;-1:-1:-1;11890:385:1;-1:-1:-1;11890:385:1:o;12280:932::-;12398:6;12406;12414;12422;12430;12438;12446;12499:3;12487:9;12478:7;12474:23;12470:33;12467:53;;;12516:1;12513;12506:12;12467:53;12556:9;12543:23;-1:-1:-1;;;;;12626:2:1;12618:6;12615:14;12612:34;;;12642:1;12639;12632:12;12612:34;12681:59;12732:7;12723:6;12712:9;12708:22;12681:59;:::i;:::-;12759:8;;-1:-1:-1;12655:85:1;-1:-1:-1;12655:85:1;;-1:-1:-1;12813:38:1;12847:2;12832:18;;12813:38;:::i;:::-;12803:48;;12898:2;12887:9;12883:18;12870:32;12860:42;;12949:2;12938:9;12934:18;12921:32;12911:42;;13006:3;12995:9;12991:19;12978:33;12962:49;;13036:2;13026:8;13023:16;13020:36;;;13052:1;13049;13042:12;13020:36;;13091:61;13144:7;13133:8;13122:9;13118:24;13091:61;:::i;:::-;12280:932;;;;-1:-1:-1;12280:932:1;;-1:-1:-1;12280:932:1;;;;13065:87;;-1:-1:-1;;;12280:932:1:o;13217:260::-;13285:6;13293;13346:2;13334:9;13325:7;13321:23;13317:32;13314:52;;;13362:1;13359;13352:12;13314:52;13385:29;13404:9;13385:29;:::i;:::-;13375:39;;13433:38;13467:2;13456:9;13452:18;13433:38;:::i;:::-;13423:48;;13217:260;;;;;:::o;13482:690::-;13588:6;13596;13604;13612;13620;13628;13681:3;13669:9;13660:7;13656:23;13652:33;13649:53;;;13698:1;13695;13688:12;13649:53;13721:29;13740:9;13721:29;:::i;:::-;13711:39;;13797:2;13786:9;13782:18;13769:32;13759:42;;13848:2;13837:9;13833:18;13820:32;13810:42;;13899:2;13888:9;13884:18;13871:32;13861:42;;13954:3;13943:9;13939:19;13926:33;-1:-1:-1;;;;;13974:6:1;13971:30;13968:50;;;14014:1;14011;14004:12;13968:50;14053:59;14104:7;14095:6;14084:9;14080:22;14053:59;:::i;:::-;13482:690;;;;-1:-1:-1;13482:690:1;;-1:-1:-1;13482:690:1;;14131:8;;13482:690;-1:-1:-1;;;13482:690:1:o;14362:345::-;14564:2;14546:21;;;14603:2;14583:18;;;14576:30;-1:-1:-1;;;14637:2:1;14622:18;;14615:51;14698:2;14683:18;;14362:345::o;14712:380::-;14791:1;14787:12;;;;14834;;;14855:61;;14909:4;14901:6;14897:17;14887:27;;14855:61;14962:2;14954:6;14951:14;14931:18;14928:38;14925:161;;15008:10;15003:3;14999:20;14996:1;14989:31;15043:4;15040:1;15033:15;15071:4;15068:1;15061:15;14925:161;;14712:380;;;:::o;15511:127::-;15572:10;15567:3;15563:20;15560:1;15553:31;15603:4;15600:1;15593:15;15627:4;15624:1;15617:15;15643:168;15716:9;;;15747;;15764:15;;;15758:22;;15744:37;15734:71;;15785:18;;:::i;15816:127::-;15877:10;15872:3;15868:20;15865:1;15858:31;15908:4;15905:1;15898:15;15932:4;15929:1;15922:15;15948:120;15988:1;16014;16004:35;;16019:18;;:::i;:::-;-1:-1:-1;16053:9:1;;15948:120::o;16819:135::-;16858:3;16879:17;;;16876:43;;16899:18;;:::i;:::-;-1:-1:-1;16946:1:1;16935:13;;16819:135::o;17500:545::-;17602:2;17597:3;17594:11;17591:448;;;17638:1;17663:5;17659:2;17652:17;17708:4;17704:2;17694:19;17778:2;17766:10;17762:19;17759:1;17755:27;17749:4;17745:38;17814:4;17802:10;17799:20;17796:47;;;-1:-1:-1;17837:4:1;17796:47;17892:2;17887:3;17883:12;17880:1;17876:20;17870:4;17866:31;17856:41;;17947:82;17965:2;17958:5;17955:13;17947:82;;;18010:17;;;17991:1;17980:13;17947:82;;18221:1206;-1:-1:-1;;;;;18340:3:1;18337:27;18334:53;;;18367:18;;:::i;:::-;18396:94;18486:3;18446:38;18478:4;18472:11;18446:38;:::i;:::-;18440:4;18396:94;:::i;:::-;18516:1;18541:2;18536:3;18533:11;18558:1;18553:616;;;;19213:1;19230:3;19227:93;;;-1:-1:-1;19286:19:1;;;19273:33;19227:93;-1:-1:-1;;18178:1:1;18174:11;;;18170:24;18166:29;18156:40;18202:1;18198:11;;;18153:57;19333:78;;18526:895;;18553:616;17447:1;17440:14;;;17484:4;17471:18;;-1:-1:-1;;18589:17:1;;;18690:9;18712:229;18726:7;18723:1;18720:14;18712:229;;;18815:19;;;18802:33;18787:49;;18922:4;18907:20;;;;18875:1;18863:14;;;;18742:12;18712:229;;;18716:3;18969;18960:7;18957:16;18954:159;;;19093:1;19089:6;19083:3;19077;19074:1;19070:11;19066:21;19062:34;19058:39;19045:9;19040:3;19036:19;19023:33;19019:79;19011:6;19004:95;18954:159;;;19156:1;19150:3;19147:1;19143:11;19139:19;19133:4;19126:33;18526:895;;18221:1206;;;:::o;19836:1352::-;19962:3;19956:10;-1:-1:-1;;;;;19981:6:1;19978:30;19975:56;;;20011:18;;:::i;:::-;20040:97;20130:6;20090:38;20122:4;20116:11;20090:38;:::i;:::-;20084:4;20040:97;:::i;:::-;20192:4;;20256:2;20245:14;;20273:1;20268:663;;;;20975:1;20992:6;20989:89;;;-1:-1:-1;21044:19:1;;;21038:26;20989:89;-1:-1:-1;;18178:1:1;18174:11;;;18170:24;18166:29;18156:40;18202:1;18198:11;;;18153:57;21091:81;;20238:944;;20268:663;17447:1;17440:14;;;17484:4;17471:18;;-1:-1:-1;;20304:20:1;;;20422:236;20436:7;20433:1;20430:14;20422:236;;;20525:19;;;20519:26;20504:42;;20617:27;;;;20585:1;20573:14;;;;20452:19;;20422:236;;;20426:3;20686:6;20677:7;20674:19;20671:201;;;20747:19;;;20741:26;-1:-1:-1;;20830:1:1;20826:14;;;20842:3;20822:24;20818:37;20814:42;20799:58;20784:74;;20671:201;-1:-1:-1;;;;;20918:1:1;20902:14;;;20898:22;20885:36;;-1:-1:-1;19836:1352:1:o;21605:127::-;21666:10;21661:3;21657:20;21654:1;21647:31;21697:4;21694:1;21687:15;21721:4;21718:1;21711:15;22085:338;22287:2;22269:21;;;22326:2;22306:18;;;22299:30;-1:-1:-1;;;22360:2:1;22345:18;;22338:44;22414:2;22399:18;;22085:338::o;24688:127::-;24749:10;24744:3;24740:20;24737:1;24730:31;24780:4;24777:1;24770:15;24804:4;24801:1;24794:15;25170:722;25220:3;25261:5;25255:12;25290:36;25316:9;25290:36;:::i;:::-;25345:1;25362:18;;;25389:133;;;;25536:1;25531:355;;;;25355:531;;25389:133;-1:-1:-1;;25422:24:1;;25410:37;;25495:14;;25488:22;25476:35;;25467:45;;;-1:-1:-1;25389:133:1;;25531:355;25562:5;25559:1;25552:16;25591:4;25636:2;25633:1;25623:16;25661:1;25675:165;25689:6;25686:1;25683:13;25675:165;;;25767:14;;25754:11;;;25747:35;25810:16;;;;25704:10;;25675:165;;;25679:3;;;25869:6;25864:3;25860:16;25853:23;;25355:531;;;;;25170:722;;;;:::o;25897:389::-;26073:3;26101:38;26135:3;26127:6;26101:38;:::i;:::-;26168:6;26162:13;26184:65;26242:6;26238:2;26231:4;26223:6;26219:17;26184:65;:::i;:::-;26265:15;;25897:389;-1:-1:-1;;;;25897:389:1:o;26291:556::-;26568:3;26596:38;26630:3;26622:6;26596:38;:::i;:::-;26663:6;26657:13;26679:65;26737:6;26733:2;26726:4;26718:6;26714:17;26679:65;:::i;:::-;-1:-1:-1;;;26766:15:1;;26790:22;;;26839:1;26828:13;;26291:556;-1:-1:-1;;;;26291:556:1:o;27197:125::-;27262:9;;;27283:10;;;27280:36;;;27296:18;;:::i;29957:245::-;30024:6;30077:2;30065:9;30056:7;30052:23;30048:32;30045:52;;;30093:1;30090;30083:12;30045:52;30125:9;30119:16;30144:28;30166:5;30144:28;:::i;31447:128::-;31514:9;;;31535:11;;;31532:37;;;31549:18;;:::i;31580:136::-;31619:3;31647:5;31637:39;;31656:18;;:::i;:::-;-1:-1:-1;;;31692:18:1;;31580:136::o;32492:415::-;32694:2;32676:21;;;32733:2;32713:18;;;32706:30;32772:34;32767:2;32752:18;;32745:62;-1:-1:-1;;;32838:2:1;32823:18;;32816:49;32897:3;32882:19;;32492:415::o;32912:112::-;32944:1;32970;32960:35;;32975:18;;:::i;:::-;-1:-1:-1;33009:9:1;;32912:112::o;34679:200::-;-1:-1:-1;;;;;34815:10:1;;;34803;;;34799:27;;34838:12;;;34835:38;;;34853:18;;:::i;:::-;34835:38;34679:200;;;;:::o;34884:197::-;-1:-1:-1;;;;;35006:10:1;;;35018;;;35002:27;;35041:11;;;35038:37;;;35055:18;;:::i;35086:489::-;-1:-1:-1;;;;;35355:15:1;;;35337:34;;35407:15;;35402:2;35387:18;;35380:43;35454:2;35439:18;;35432:34;;;35502:3;35497:2;35482:18;;35475:31;;;35280:4;;35523:46;;35549:19;;35541:6;35523:46;:::i;:::-;35515:54;35086:489;-1:-1:-1;;;;;;35086:489:1:o;35580:249::-;35649:6;35702:2;35690:9;35681:7;35677:23;35673:32;35670:52;;;35718:1;35715;35708:12;35670:52;35750:9;35744:16;35769:30;35793:5;35769:30;:::i
Swarm Source
ipfs://c39e9c4d5c87addf382ddfb67c286a01e40d57ce6d527003d7f6f946edf91fc2