Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Shroomies
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-16 */ // SPDX-License-Identifier: MIT /** * @author - Roi Di Segni (@sheeeev66 of @thecoredevs) */ pragma solidity ^0.8.7; 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); } // File: contracts/OperatorFilterer.sol /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); function __initialize_OperatorFilterer(address subscriptionOrRegistrantToCopy, bool subscribe) internal { // 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 { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // 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) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) 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); } } _; } } // File: contracts/DefaultOperatorFilterer.sol /** * @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); function __initialize_DefaultOperatorFilterer() internal {__initialize_OperatorFilterer(DEFAULT_SUBSCRIPTION, true);} } // File: contracts/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. * * Source: openzeppelin */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @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() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Strings.sol /** * Source: Openzeppelin */ /** * @dev String operations. */ library Strings { /** * @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); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: Address.sol0 /** * Source: Openzeppelin */ /** * @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; } } // File: 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); } // File: IERC165.sol // https://eips.ethereum.org/EIPS/eip-165 interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } // File: IERC2981.sol /** * Source: Openzeppelin */ /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: ERC165.sol /** * Source: Openzeppelin */ /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: IERC721.sol // https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } // File: 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); } // File: ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension * Made for efficiancy! */ contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable, DefaultOperatorFilterer { using Address for address; using Strings for uint256; bool public initialized; uint internal idTracker; string public baseURI; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _balances; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) external view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() external pure override returns (string memory) { return "Shroomies"; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external pure override returns (string memory) { return "SHROOM"; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external override onlyAllowedOperatorApproval(to) { address owner = _owners[tokenId]; require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) external override onlyAllowedOperatorApproval(operator) { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external override onlyAllowedOperator(from) { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external override { // modifier already executed by the called contract safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override onlyAllowedOperator(from) { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = _owners[tokenId]; return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(uint256 amount, address to, uint tokenId) internal { for (uint i; i < amount;) { unchecked { ++tokenId; ++i; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } unchecked { _balances[to] += amount; idTracker += amount; } require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); // checking it once will make sure that the address can recieve NFTs } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(_owners[tokenId] == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); unchecked { --_balances[from]; ++_balances[to]; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 ) internal returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } } // File: Shroomies.sol contract Shroomies is Ownable, IERC2981, ERC721 { bool public mintingEnabled; bool public wl1Enabled; bool public wl2Enabled; address evolvedContractAddr; IERC721 PAD; uint private pprice; uint private wprice; uint public maxTotalSupply; uint private EIP2981RoyaltyPercent; mapping(address => uint8) amountMinted; mapping(bytes32 => bool) usedHash; function initialize( address _evolvedContractAddr, IERC721 pad, uint _royalty, uint publicPrice, uint whitelistPrice, uint _maxTotalSupply, string memory _baseURI ) external { require(!initialized, "contract already initialized"); _setOwner(msg.sender); __initialize_DefaultOperatorFilterer(); evolvedContractAddr = _evolvedContractAddr; PAD = pad; EIP2981RoyaltyPercent = _royalty; baseURI = _baseURI; pprice = publicPrice; wprice = whitelistPrice; maxTotalSupply = _maxTotalSupply; initialized = true; } function mint(uint256 amount) external payable { require(mintingEnabled, "Minting is not enabled!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(msg.value == amount * pprice, "ETH Amount is not correct!"); _mint(amount, msg.sender, tokenId); } // paid wl function wl1Mint(bytes calldata sig, uint256 amount, uint nonce) external payable { require(wl1Enabled, "Minting is not enabled!"); bytes32 hash = _getW1Msg(msg.sender, amount, nonce); require(_checkSig(hash, sig), "invalid or used sig/hash!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(msg.value == amount * wprice, "ETH Amount is not correct!"); require(amount + amountMinted[msg.sender] <= PAD.balanceOf(msg.sender), "address cannot mint more than it owns"); usedHash[hash] = true; amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } // free mint function wl2Mint(bytes calldata sig, uint256 amount, uint nonce) external { require(wl2Enabled, "Minting is not enabled!"); bytes32 hash = _getW2Msg(msg.sender, amount, nonce); require(_checkSig(hash, sig), "invalid or used sig/hash!"); uint tokenId = idTracker; require(amount + tokenId <= maxTotalSupply, "Request exceeds max supply!"); require(amount + amountMinted[msg.sender] <= PAD.balanceOf(msg.sender), "address cannot mint more than it owns"); usedHash[hash] = true; amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } function _checkSig(bytes32 hash, bytes memory _signature) private view returns(bool) { if (usedHash[hash]) return false; return ECDSA.recover( ECDSA.toEthSignedMessageHash(hash), _signature ) == owner(); } function getW1Msg(address _wallet, uint amount, uint nonce) external pure returns(bytes32) { return _getW1Msg(_wallet, amount, nonce); } function _getW1Msg(address _wallet, uint amount, uint nonce) private pure returns(bytes32) { return keccak256(abi.encodePacked("w1", _wallet, amount, nonce)); } function getW2Msg(address _wallet, uint amount, uint nonce) external pure returns(bytes32) { return _getW2Msg(_wallet, amount, nonce); } function _getW2Msg(address _wallet, uint amount, uint nonce) private pure returns(bytes32) { return keccak256(abi.encodePacked("w2", _wallet, amount, nonce)); } /** * @notice returns royalty info for EIP2981 supporting marketplaces * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Royality querry for non-existant token!"); return(owner(), salePrice * EIP2981RoyaltyPercent / 10000); } /** * @notice sets the royalty percentage for EIP2981 supporting marketplaces * @dev percentage is in bassis points (parts per 10,000). Example: 5% = 500, 0.5% = 50 * @param amount - percent amount */ function setRoyaltyPercent(uint256 amount) external onlyOwner { EIP2981RoyaltyPercent = amount; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function withdraw() onlyOwner external { uint bal = address(this).balance; bool success; (success, ) = payable(msg.sender).call{value: bal, gas: 3000}(""); require(success, "Transfer to contract owner failed!"); } /** * @notice toggles minting */ function toggleMinting() external onlyOwner { mintingEnabled = !mintingEnabled; } function toggleW1Mint() external onlyOwner { wl1Enabled = !wl1Enabled; } function toggleW2Mint() external onlyOwner { wl2Enabled = !wl2Enabled; } function toggleAll(bool state) external onlyOwner { wl1Enabled = state; wl2Enabled = state; mintingEnabled = state; } function setEvolvedContract(address addr) external onlyOwner { evolvedContractAddr = addr; } function setMaxTotalSupply(uint newSupply) external onlyOwner { require(newSupply >= idTracker, "max supply cant be less than total supply"); maxTotalSupply = newSupply; } function setPublicPrice(uint price) external onlyOwner { pprice = price; } function setWLPrice(uint price) external onlyOwner { wprice = price; } function setPAD(IERC721 pad) external onlyOwner { PAD = pad; } function getPrices() external view returns (uint publicMint, uint whitelistMint) { publicMint = pprice; whitelistMint = wprice; } function getContractAddrs() external view returns(address evolved, address pad) { evolved = evolvedContractAddr; pad = address(PAD); } function tokensOfOwner(address owner) external view returns(uint[] memory) { uint[] memory tokens = new uint[](_balances[owner]); uint y = idTracker + 1; uint x; for (uint i = 1; i < y;) { if (_owners[i] == owner) { tokens[x] = i; unchecked{ ++x; } } unchecked{ ++i; } } return tokens; } function burnShroomie(uint id, address addr) external { require(msg.sender == evolvedContractAddr, "only evolved contract"); require(_owners[id] == addr, "addr doesnt own id"); unchecked { --_balances[addr]; } delete _owners[id]; delete _tokenApprovals[id]; emit Transfer(addr, address(0), id); } function burnShroomies(uint[] memory ids, address addr) external { require(msg.sender == evolvedContractAddr, "only evolved contract"); uint amount = ids.length; uint cId; for(uint i; i < amount;) { assembly { cId := mload(add(add(ids, 0x20), mul(i, 0x20))) } require(_owners[cId] == addr, "addr doesnt own id "); unchecked { delete _owners[cId]; ++i; } delete _tokenApprovals[cId]; emit Transfer(addr, address(0), cId); } unchecked { _balances[addr] -= amount; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"burnShroomie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"addr","type":"address"}],"name":"burnShroomies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractAddrs","outputs":[{"internalType":"address","name":"evolved","type":"address"},{"internalType":"address","name":"pad","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrices","outputs":[{"internalType":"uint256","name":"publicMint","type":"uint256"},{"internalType":"uint256","name":"whitelistMint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getW1Msg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getW2Msg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_evolvedContractAddr","type":"address"},{"internalType":"contract IERC721","name":"pad","type":"address"},{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","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":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setEvolvedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"pad","type":"address"}],"name":"setPAD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"toggleAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleW1Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleW2Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"wl1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wl2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"wl2Mint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614610806100206000396000f3fe6080604052600436106103085760003560e01c8063715018a61161019a578063b88d4fde116100e1578063ca0b7f011161008a578063f2fde38b11610064578063f2fde38b14610948578063f6a5b8e614610968578063f7cc8c1b1461098857600080fd5b8063ca0b7f01146108bf578063d83fd51c146108df578063e985e9c5146108ff57600080fd5b8063c2ccb992116100bb578063c2ccb9921461085f578063c62752551461087f578063c87b56dd1461089f57600080fd5b8063b88d4fde146107f7578063bce1879714610817578063bd9a548b1461083757600080fd5b80638da5cb5b116101435780639fd6db121161011d5780639fd6db12146107aa578063a0712d68146107c4578063a22cb465146107d757600080fd5b80638da5cb5b1461072657806395d89b41146107445780639a4fc6401461078a57600080fd5b8063805434671161017457806380543467146106a05780638462151c146106bf578063892ebb42146106ec57600080fd5b8063715018a614610661578063785b5086146106765780637d55094d1461068b57600080fd5b80632b8a5e0e1161025e57806355f804b3116102075780636352211e116101e15780636352211e1461060c5780636c0360eb1461062c57806370a082311461064157600080fd5b806355f804b3146105b75780635acdaa9f146105d75780635b351ed8146105f757600080fd5b80633f3e4c11116102385780633f3e4c111461055557806341f434341461057557806342842e0e1461059757600080fd5b80632b8a5e0e146105005780633bab5670146105205780633ccfd60b1461054057600080fd5b806310c785ab116102c05780632954ddf61161029a5780632954ddf61461048b5780632a55205a146104ab5780632ab4d052146104ea57600080fd5b806310c785ab1461040b578063158ef93e1461043957806323b872dd1461046b57600080fd5b8063081812fc116102f1578063081812fc14610391578063095ea7b3146103c957806310698f96146103eb57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613f73565b61099b565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5060408051808201909152600981527f5368726f6f6d696573000000000000000000000000000000000000000000000060208201525b60405161033991906142ca565b34801561039d57600080fd5b506103b16103ac366004614061565b6109f7565b6040516001600160a01b039091168152602001610339565b3480156103d557600080fd5b506103e96103e4366004613e19565b610aa2565b005b3480156103f757600080fd5b506103e9610406366004613f39565b610ceb565b34801561041757600080fd5b5061042b610426366004613e45565b610dd6565b604051908152602001610339565b34801561044557600080fd5b5060005461032d9074010000000000000000000000000000000000000000900460ff1681565b34801561047757600080fd5b506103e9610486366004613ca1565b610deb565b34801561049757600080fd5b506103e96104a6366004613fad565b610ff8565b3480156104b757600080fd5b506104cb6104c63660046140b8565b6112f0565b604080516001600160a01b039093168352602083019190915201610339565b3480156104f657600080fd5b5061042b600b5481565b34801561050c57600080fd5b506103e961051b366004614093565b6113af565b34801561052c57600080fd5b506103e961053b366004613d90565b61152a565b34801561054c57600080fd5b506103e9611680565b34801561056157600080fd5b506103e9610570366004614061565b6117b4565b34801561058157600080fd5b506103b16daaeb6d7670e522a718067333cd4e81565b3480156105a357600080fd5b506103e96105b2366004613ca1565b61189a565b3480156105c357600080fd5b506103e96105d236600461402c565b6118ba565b3480156105e357600080fd5b5061042b6105f2366004613e45565b611936565b34801561060357600080fd5b506103e9611943565b34801561061857600080fd5b506103b1610627366004614061565b6119e6565b34801561063857600080fd5b50610384611a71565b34801561064d57600080fd5b5061042b61065c366004613c4b565b611aff565b34801561066d57600080fd5b506103e9611b99565b34801561068257600080fd5b506103e9611c0e565b34801561069757600080fd5b506103e9611cb2565b3480156106ac57600080fd5b5060075461032d90610100900460ff1681565b3480156106cb57600080fd5b506106df6106da366004613c4b565b611d4d565b6040516103399190614286565b3480156106f857600080fd5b506007546008546040805163010000009093046001600160a01b039081168452909116602083015201610339565b34801561073257600080fd5b506000546001600160a01b03166103b1565b34801561075057600080fd5b5060408051808201909152600681527f5348524f4f4d00000000000000000000000000000000000000000000000000006020820152610384565b34801561079657600080fd5b506103e96107a5366004614061565b611e28565b3480156107b657600080fd5b5060075461032d9060ff1681565b6103e96107d2366004614061565b611e96565b3480156107e357600080fd5b506103e96107f2366004613d62565b611fac565b34801561080357600080fd5b506103e9610812366004613ce2565b6120b2565b34801561082357600080fd5b506103e9610832366004613e7a565b6122c8565b34801561084357600080fd5b50600954600a5460408051928352602083019190915201610339565b34801561086b57600080fd5b5060075461032d9062010000900460ff1681565b34801561088b57600080fd5b506103e961089a366004614061565b61245e565b3480156108ab57600080fd5b506103846108ba366004614061565b6124cc565b3480156108cb57600080fd5b506103e96108da366004613c4b565b61258b565b3480156108eb57600080fd5b506103e96108fa366004613c4b565b612635565b34801561090b57600080fd5b5061032d61091a366004613c68565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103e9610963366004613c4b565b6126d8565b34801561097457600080fd5b506103e9610983366004614061565b6127c9565b6103e9610996366004613fad565b612837565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806109f157506109f1826129e2565b92915050565b6000818152600360205260408120546001600160a01b0316610a865760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610b9d576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190613f56565b610b9d576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a7d565b6000828152600360205260409020546001600160a01b03908116908416811415610c2f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b336001600160a01b0382161480610c6957506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b610cdb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a7d565b610ce58484612ac5565b50505050565b33610cfe6000546001600160a01b031690565b6001600160a01b031614610d545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff166101009215159283027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1617620100008302177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b6000610de3848484612b4b565b949350505050565b826daaeb6d7670e522a718067333cd4e3b15610f71576001600160a01b038116331415610e9e57610e1c3383612bd4565b610e8e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b610e99848484612cd5565b610ce5565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190613f56565b610f71576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610a7d565b610f7b3383612bd4565b610fed5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b610ce5848484612cd5565b60075462010000900460ff166110505760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600061105d338484612e9d565b905061109f8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0b92505050565b6110eb5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206f722075736564207369672f6861736821000000000000006044820152606401610a7d565b600154600b546110fb828661432c565b11156111495760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b6008546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd919061407a565b336000908152600d60205260409020546111fa9060ff168661432c565b111561126e5760405162461bcd60e51b815260206004820152602560248201527f616464726573732063616e6e6f74206d696e74206d6f7265207468616e20697460448201527f206f776e730000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000828152600e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055338352600d909152812080548692906112c590849060ff16614344565b92506101000a81548160ff021916908360ff1602179055506112e8843383612fa7565b505050505050565b60008281526003602052604081205481906001600160a01b031661137c5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000546001600160a01b0316612710600c5485611399919061437d565b6113a39190614369565b915091505b9250929050565b600754630100000090046001600160a01b031633146114105760405162461bcd60e51b815260206004820152601560248201527f6f6e6c792065766f6c76656420636f6e747261637400000000000000000000006044820152606401610a7d565b6000828152600360205260409020546001600160a01b038281169116146114795760405162461bcd60e51b815260206004820152601260248201527f6164647220646f65736e74206f776e20696400000000000000000000000000006044820152606401610a7d565b6001600160a01b038116600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558583526003825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560059092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60005474010000000000000000000000000000000000000000900460ff16156115955760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610a7d565b61159e336130e6565b6115a661314e565b600780547fffffffffffffffffff0000000000000000000000000000000000000000ffffff1663010000006001600160a01b038a81169190910291909117909155600880547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600c859055805161162e906002906020840190613b05565b5050600992909255600a55600b555050600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550565b336116936000546001600160a01b031690565b6001600160a01b0316146116e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b60405147906000903390610bb890849084818181858888f193505050503d8060008114611732576040519150601f19603f3d011682016040523d82523d6000602084013e611737565b606091505b505080915050806117b05760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f64210000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b5050565b336117c76000546001600160a01b031690565b6001600160a01b03161461181d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b6001548110156118955760405162461bcd60e51b815260206004820152602960248201527f6d617820737570706c792063616e74206265206c657373207468616e20746f7460448201527f616c20737570706c7900000000000000000000000000000000000000000000006064820152608401610a7d565b600b55565b6118b5838383604051806020016040528060008152506120b2565b505050565b336118cd6000546001600160a01b031690565b6001600160a01b0316146119235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b80516117b0906002906020840190613b05565b6000610de3848484612e9d565b336119566000546001600160a01b031690565b6001600160a01b0316146119ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6000818152600360205260408120546001600160a01b0316806109f15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a7d565b60028054611a7e906143fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaa906143fd565b8015611af75780601f10611acc57610100808354040283529160200191611af7565b820191906000526020600020905b815481529060010190602001808311611ada57829003601f168201915b505050505081565b60006001600160a01b038216611b7d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a7d565b506001600160a01b031660009081526004602052604090205490565b33611bac6000546001600160a01b031690565b6001600160a01b031614611c025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b611c0c60006130e6565b565b33611c216000546001600160a01b031690565b6001600160a01b031614611c775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b33611cc56000546001600160a01b031690565b6001600160a01b031614611d1b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115611d8257611d8261455a565b604051908082528060200260200182016040528015611dab578160200160208202803683370190505b50905060006001546001611dbf919061432c565b9050600060015b82811015611e1e576000818152600360205260409020546001600160a01b0387811691161415611e165780848381518110611e0357611e0361452b565b6020026020010181815250508160010191505b600101611dc6565b5091949350505050565b33611e3b6000546001600160a01b031690565b6001600160a01b031614611e915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600c55565b60075460ff16611ee85760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600154600b54611ef8828461432c565b1115611f465760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b600954611f53908361437d565b3414611fa15760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610a7d565b6117b0823383612fa7565b816daaeb6d7670e522a718067333cd4e3b156120a7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561202e57600080fd5b505afa158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190613f56565b6120a7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a7d565b6118b533848461316d565b836daaeb6d7670e522a718067333cd4e3b15612239576001600160a01b038116331415612166576120e33384612bd4565b6121555760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b6121618585858561325a565b6122c1565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156121c957600080fd5b505afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122019190613f56565b612239576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610a7d565b6122433384612bd4565b6122b55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b6122c18585858561325a565b5050505050565b600754630100000090046001600160a01b031633146123295760405162461bcd60e51b815260206004820152601560248201527f6f6e6c792065766f6c76656420636f6e747261637400000000000000000000006044820152606401610a7d565b81516000805b828110156124385760208181028601810151600081815260039092526040909120549092506001600160a01b038581169116146123ae5760405162461bcd60e51b815260206004820152601360248201527f6164647220646f65736e74206f776e20696420000000000000000000000000006044820152606401610a7d565b600082815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556005909252808320805490921690915551600192909201918391906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461232f565b50506001600160a01b039091166000908152600460205260409020805491909103905550565b336124716000546001600160a01b031690565b6001600160a01b0316146124c75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600955565b6000818152600360205260409020546060906001600160a01b03166125595760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a7d565b6002612564836132e3565b604051602001612575929190614140565b6040516020818303038152906040529050919050565b3361259e6000546001600160a01b031690565b6001600160a01b0316146125f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b336126486000546001600160a01b031690565b6001600160a01b03161461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b336126eb6000546001600160a01b031690565b6001600160a01b0316146127415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b6001600160a01b0381166127bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a7d565b6127c6816130e6565b50565b336127dc6000546001600160a01b031690565b6001600160a01b0316146128325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600a55565b600754610100900460ff1661288e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600061289b338484612b4b565b90506128dd8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0b92505050565b6129295760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206f722075736564207369672f6861736821000000000000006044820152606401610a7d565b600154600b54612939828661432c565b11156129875760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b600a54612994908561437d565b34146111495760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610a7d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612a7557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109f157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146109f1565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612b12826119e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040517f773100000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602282015260368101839052605681018290526000906076015b6040516020818303038152906040528051906020012090509392505050565b6000818152600360205260408120546001600160a01b0316612c5e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a7d565b6000828152600360205260409020546001600160a01b03908116908416811480612ca15750836001600160a01b0316612c96846109f7565b6001600160a01b0316145b80610de357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16610de3565b6000818152600360205260409020546001600160a01b03848116911614612d645760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6001600160a01b038216612ddf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b612dea600082612ac5565b6001600160a01b03808416600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600390915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040517f773200000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660228201526036810183905260568101829052600090607601612bb5565b6000828152600e602052604081205460ff1615612f2a575060006109f1565b6000546001600160a01b0316612f96612f90856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84613415565b6001600160a01b0316149392505050565b60005b8381101561303257600191820160008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519294939093019284929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612faa565b506001600160a01b0382166000908152600460209081526040808320805487019055600180548701905580519182019052818152613074919084908490613439565b6118b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611c0c733cc6cdda760b79bafa08df41ecfa224f810dceb66001613604565b816001600160a01b0316836001600160a01b031614156131cf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a7d565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613265848484612cd5565b61327184848484613439565b610ce55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b60608161332357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561334d578061333781614451565b91506133469050600a83614369565b9150613327565b60008167ffffffffffffffff8111156133685761336861455a565b6040519080825280601f01601f191660200182016040528015613392576020820181803683370190505b5090505b8415610de3576133a76001836143ba565b91506133b4600a8661448a565b6133bf90603061432c565b60f81b8183815181106133d4576133d461452b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061340e600a86614369565b9450613396565b60008060006134248585613754565b91509150613431816137c1565b509392505050565b60006001600160a01b0384163b156135f9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061349690339089908890889060040161424a565b602060405180830381600087803b1580156134b057600080fd5b505af19250505080156134fe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526134fb91810190613f90565b60015b6135ae573d80801561352c576040519150601f19603f3d011682016040523d82523d6000602084013e613531565b606091505b5080516135a65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610de3565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b156117b05780156136a2576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561368e57600080fd5b505af11580156112e8573d6000803e3d6000fd5b6001600160a01b0382161561370a576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401613674565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401613674565b60008082516041141561378b5760208301516040840151606085015160001a61377f878285856139b2565b945094505050506113a8565b8251604014156137b557602083015160408401516137aa868383613abd565b9350935050506113a8565b506000905060026113a8565b60008160048111156137d5576137d56144fc565b14156137de5750565b60018160048111156137f2576137f26144fc565b14156138405760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a7d565b6002816004811115613854576138546144fc565b14156138a25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a7d565b60038160048111156138b6576138b66144fc565b141561392a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b600481600481111561393e5761393e6144fc565b14156127c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156139e95750600090506003613ab4565b8460ff16601b14158015613a0157508460ff16601c14155b15613a125750600090506004613ab4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613a66573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116613aad57600060019250925050613ab4565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613af7878288856139b2565b935093505050935093915050565b828054613b11906143fd565b90600052602060002090601f016020900481019282613b335760008555613b79565b82601f10613b4c57805160ff1916838001178555613b79565b82800160010185558215613b79579182015b82811115613b79578251825591602001919060010190613b5e565b50613b85929150613b89565b5090565b5b80821115613b855760008155600101613b8a565b600067ffffffffffffffff831115613bb857613bb861455a565b613be960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016142dd565b9050828152838383011115613bfd57600080fd5b828260208301376000602084830101529392505050565b8035613c1f81614589565b919050565b600082601f830112613c3557600080fd5b613c4483833560208501613b9e565b9392505050565b600060208284031215613c5d57600080fd5b8135613c4481614589565b60008060408385031215613c7b57600080fd5b8235613c8681614589565b91506020830135613c9681614589565b809150509250929050565b600080600060608486031215613cb657600080fd5b8335613cc181614589565b92506020840135613cd181614589565b929592945050506040919091013590565b60008060008060808587031215613cf857600080fd5b8435613d0381614589565b93506020850135613d1381614589565b925060408501359150606085013567ffffffffffffffff811115613d3657600080fd5b8501601f81018713613d4757600080fd5b613d5687823560208401613b9e565b91505092959194509250565b60008060408385031215613d7557600080fd5b8235613d8081614589565b91506020830135613c968161459e565b600080600080600080600060e0888a031215613dab57600080fd5b8735613db681614589565b96506020880135613dc681614589565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115613dfe57600080fd5b613e0a8a828b01613c24565b91505092959891949750929550565b60008060408385031215613e2c57600080fd5b8235613e3781614589565b946020939093013593505050565b600080600060608486031215613e5a57600080fd5b8335613e6581614589565b95602085013595506040909401359392505050565b60008060408385031215613e8d57600080fd5b823567ffffffffffffffff80821115613ea557600080fd5b818501915085601f830112613eb957600080fd5b8135602082821115613ecd57613ecd61455a565b8160051b9250613ede8184016142dd565b8281528181019085830185870184018b1015613ef957600080fd5b600096505b84871015613f1c578035835260019690960195918301918301613efe565b509650613f2c9050878201613c14565b9450505050509250929050565b600060208284031215613f4b57600080fd5b8135613c448161459e565b600060208284031215613f6857600080fd5b8151613c448161459e565b600060208284031215613f8557600080fd5b8135613c44816145ac565b600060208284031215613fa257600080fd5b8151613c44816145ac565b60008060008060608587031215613fc357600080fd5b843567ffffffffffffffff80821115613fdb57600080fd5b818701915087601f830112613fef57600080fd5b813581811115613ffe57600080fd5b88602082850101111561401057600080fd5b6020928301999098509187013596604001359550909350505050565b60006020828403121561403e57600080fd5b813567ffffffffffffffff81111561405557600080fd5b610de384828501613c24565b60006020828403121561407357600080fd5b5035919050565b60006020828403121561408c57600080fd5b5051919050565b600080604083850312156140a657600080fd5b823591506020830135613c9681614589565b600080604083850312156140cb57600080fd5b50508035926020909101359150565b600081518084526140f28160208601602086016143d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516141368185602086016143d1565b9290920192915050565b600080845481600182811c91508083168061415c57607f831692505b6020808410821415614195577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156141a957600181146141d857614205565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614205565b60008b81526020902060005b868110156141fd5781548b8201529085019083016141e4565b505084890196505b5050505050506142416142188286614124565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261427c60808301846140da565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156142be578351835292840192918401916001016142a2565b50909695505050505050565b602081526000613c4460208301846140da565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143245761432461455a565b604052919050565b6000821982111561433f5761433f61449e565b500190565b600060ff821660ff84168060ff038211156143615761436161449e565b019392505050565b600082614378576143786144cd565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143b5576143b561449e565b500290565b6000828210156143cc576143cc61449e565b500390565b60005b838110156143ec5781810151838201526020016143d4565b83811115610ce55750506000910152565b600181811c9082168061441157607f821691505b6020821081141561444b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144835761448361449e565b5060010190565b600082614499576144996144cd565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146127c657600080fd5b80151581146127c657600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127c657600080fdfea264697066735822122048b4ac5be65fe9de700a5819aef1151e79f9aea5a129ce655ec941b4a92db4ba64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103085760003560e01c8063715018a61161019a578063b88d4fde116100e1578063ca0b7f011161008a578063f2fde38b11610064578063f2fde38b14610948578063f6a5b8e614610968578063f7cc8c1b1461098857600080fd5b8063ca0b7f01146108bf578063d83fd51c146108df578063e985e9c5146108ff57600080fd5b8063c2ccb992116100bb578063c2ccb9921461085f578063c62752551461087f578063c87b56dd1461089f57600080fd5b8063b88d4fde146107f7578063bce1879714610817578063bd9a548b1461083757600080fd5b80638da5cb5b116101435780639fd6db121161011d5780639fd6db12146107aa578063a0712d68146107c4578063a22cb465146107d757600080fd5b80638da5cb5b1461072657806395d89b41146107445780639a4fc6401461078a57600080fd5b8063805434671161017457806380543467146106a05780638462151c146106bf578063892ebb42146106ec57600080fd5b8063715018a614610661578063785b5086146106765780637d55094d1461068b57600080fd5b80632b8a5e0e1161025e57806355f804b3116102075780636352211e116101e15780636352211e1461060c5780636c0360eb1461062c57806370a082311461064157600080fd5b806355f804b3146105b75780635acdaa9f146105d75780635b351ed8146105f757600080fd5b80633f3e4c11116102385780633f3e4c111461055557806341f434341461057557806342842e0e1461059757600080fd5b80632b8a5e0e146105005780633bab5670146105205780633ccfd60b1461054057600080fd5b806310c785ab116102c05780632954ddf61161029a5780632954ddf61461048b5780632a55205a146104ab5780632ab4d052146104ea57600080fd5b806310c785ab1461040b578063158ef93e1461043957806323b872dd1461046b57600080fd5b8063081812fc116102f1578063081812fc14610391578063095ea7b3146103c957806310698f96146103eb57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613f73565b61099b565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5060408051808201909152600981527f5368726f6f6d696573000000000000000000000000000000000000000000000060208201525b60405161033991906142ca565b34801561039d57600080fd5b506103b16103ac366004614061565b6109f7565b6040516001600160a01b039091168152602001610339565b3480156103d557600080fd5b506103e96103e4366004613e19565b610aa2565b005b3480156103f757600080fd5b506103e9610406366004613f39565b610ceb565b34801561041757600080fd5b5061042b610426366004613e45565b610dd6565b604051908152602001610339565b34801561044557600080fd5b5060005461032d9074010000000000000000000000000000000000000000900460ff1681565b34801561047757600080fd5b506103e9610486366004613ca1565b610deb565b34801561049757600080fd5b506103e96104a6366004613fad565b610ff8565b3480156104b757600080fd5b506104cb6104c63660046140b8565b6112f0565b604080516001600160a01b039093168352602083019190915201610339565b3480156104f657600080fd5b5061042b600b5481565b34801561050c57600080fd5b506103e961051b366004614093565b6113af565b34801561052c57600080fd5b506103e961053b366004613d90565b61152a565b34801561054c57600080fd5b506103e9611680565b34801561056157600080fd5b506103e9610570366004614061565b6117b4565b34801561058157600080fd5b506103b16daaeb6d7670e522a718067333cd4e81565b3480156105a357600080fd5b506103e96105b2366004613ca1565b61189a565b3480156105c357600080fd5b506103e96105d236600461402c565b6118ba565b3480156105e357600080fd5b5061042b6105f2366004613e45565b611936565b34801561060357600080fd5b506103e9611943565b34801561061857600080fd5b506103b1610627366004614061565b6119e6565b34801561063857600080fd5b50610384611a71565b34801561064d57600080fd5b5061042b61065c366004613c4b565b611aff565b34801561066d57600080fd5b506103e9611b99565b34801561068257600080fd5b506103e9611c0e565b34801561069757600080fd5b506103e9611cb2565b3480156106ac57600080fd5b5060075461032d90610100900460ff1681565b3480156106cb57600080fd5b506106df6106da366004613c4b565b611d4d565b6040516103399190614286565b3480156106f857600080fd5b506007546008546040805163010000009093046001600160a01b039081168452909116602083015201610339565b34801561073257600080fd5b506000546001600160a01b03166103b1565b34801561075057600080fd5b5060408051808201909152600681527f5348524f4f4d00000000000000000000000000000000000000000000000000006020820152610384565b34801561079657600080fd5b506103e96107a5366004614061565b611e28565b3480156107b657600080fd5b5060075461032d9060ff1681565b6103e96107d2366004614061565b611e96565b3480156107e357600080fd5b506103e96107f2366004613d62565b611fac565b34801561080357600080fd5b506103e9610812366004613ce2565b6120b2565b34801561082357600080fd5b506103e9610832366004613e7a565b6122c8565b34801561084357600080fd5b50600954600a5460408051928352602083019190915201610339565b34801561086b57600080fd5b5060075461032d9062010000900460ff1681565b34801561088b57600080fd5b506103e961089a366004614061565b61245e565b3480156108ab57600080fd5b506103846108ba366004614061565b6124cc565b3480156108cb57600080fd5b506103e96108da366004613c4b565b61258b565b3480156108eb57600080fd5b506103e96108fa366004613c4b565b612635565b34801561090b57600080fd5b5061032d61091a366004613c68565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103e9610963366004613c4b565b6126d8565b34801561097457600080fd5b506103e9610983366004614061565b6127c9565b6103e9610996366004613fad565b612837565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806109f157506109f1826129e2565b92915050565b6000818152600360205260408120546001600160a01b0316610a865760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610b9d576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190613f56565b610b9d576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a7d565b6000828152600360205260409020546001600160a01b03908116908416811415610c2f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b336001600160a01b0382161480610c6957506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b610cdb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a7d565b610ce58484612ac5565b50505050565b33610cfe6000546001600160a01b031690565b6001600160a01b031614610d545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff166101009215159283027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1617620100008302177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b6000610de3848484612b4b565b949350505050565b826daaeb6d7670e522a718067333cd4e3b15610f71576001600160a01b038116331415610e9e57610e1c3383612bd4565b610e8e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b610e99848484612cd5565b610ce5565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190613f56565b610f71576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610a7d565b610f7b3383612bd4565b610fed5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b610ce5848484612cd5565b60075462010000900460ff166110505760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600061105d338484612e9d565b905061109f8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0b92505050565b6110eb5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206f722075736564207369672f6861736821000000000000006044820152606401610a7d565b600154600b546110fb828661432c565b11156111495760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b6008546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd919061407a565b336000908152600d60205260409020546111fa9060ff168661432c565b111561126e5760405162461bcd60e51b815260206004820152602560248201527f616464726573732063616e6e6f74206d696e74206d6f7265207468616e20697460448201527f206f776e730000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000828152600e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055338352600d909152812080548692906112c590849060ff16614344565b92506101000a81548160ff021916908360ff1602179055506112e8843383612fa7565b505050505050565b60008281526003602052604081205481906001600160a01b031661137c5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000546001600160a01b0316612710600c5485611399919061437d565b6113a39190614369565b915091505b9250929050565b600754630100000090046001600160a01b031633146114105760405162461bcd60e51b815260206004820152601560248201527f6f6e6c792065766f6c76656420636f6e747261637400000000000000000000006044820152606401610a7d565b6000828152600360205260409020546001600160a01b038281169116146114795760405162461bcd60e51b815260206004820152601260248201527f6164647220646f65736e74206f776e20696400000000000000000000000000006044820152606401610a7d565b6001600160a01b038116600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558583526003825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560059092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60005474010000000000000000000000000000000000000000900460ff16156115955760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610a7d565b61159e336130e6565b6115a661314e565b600780547fffffffffffffffffff0000000000000000000000000000000000000000ffffff1663010000006001600160a01b038a81169190910291909117909155600880547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600c859055805161162e906002906020840190613b05565b5050600992909255600a55600b555050600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550565b336116936000546001600160a01b031690565b6001600160a01b0316146116e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b60405147906000903390610bb890849084818181858888f193505050503d8060008114611732576040519150601f19603f3d011682016040523d82523d6000602084013e611737565b606091505b505080915050806117b05760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f64210000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b5050565b336117c76000546001600160a01b031690565b6001600160a01b03161461181d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b6001548110156118955760405162461bcd60e51b815260206004820152602960248201527f6d617820737570706c792063616e74206265206c657373207468616e20746f7460448201527f616c20737570706c7900000000000000000000000000000000000000000000006064820152608401610a7d565b600b55565b6118b5838383604051806020016040528060008152506120b2565b505050565b336118cd6000546001600160a01b031690565b6001600160a01b0316146119235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b80516117b0906002906020840190613b05565b6000610de3848484612e9d565b336119566000546001600160a01b031690565b6001600160a01b0316146119ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6000818152600360205260408120546001600160a01b0316806109f15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a7d565b60028054611a7e906143fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaa906143fd565b8015611af75780601f10611acc57610100808354040283529160200191611af7565b820191906000526020600020905b815481529060010190602001808311611ada57829003601f168201915b505050505081565b60006001600160a01b038216611b7d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a7d565b506001600160a01b031660009081526004602052604090205490565b33611bac6000546001600160a01b031690565b6001600160a01b031614611c025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b611c0c60006130e6565b565b33611c216000546001600160a01b031690565b6001600160a01b031614611c775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b33611cc56000546001600160a01b031690565b6001600160a01b031614611d1b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115611d8257611d8261455a565b604051908082528060200260200182016040528015611dab578160200160208202803683370190505b50905060006001546001611dbf919061432c565b9050600060015b82811015611e1e576000818152600360205260409020546001600160a01b0387811691161415611e165780848381518110611e0357611e0361452b565b6020026020010181815250508160010191505b600101611dc6565b5091949350505050565b33611e3b6000546001600160a01b031690565b6001600160a01b031614611e915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600c55565b60075460ff16611ee85760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600154600b54611ef8828461432c565b1115611f465760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b600954611f53908361437d565b3414611fa15760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610a7d565b6117b0823383612fa7565b816daaeb6d7670e522a718067333cd4e3b156120a7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561202e57600080fd5b505afa158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190613f56565b6120a7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a7d565b6118b533848461316d565b836daaeb6d7670e522a718067333cd4e3b15612239576001600160a01b038116331415612166576120e33384612bd4565b6121555760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b6121618585858561325a565b6122c1565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156121c957600080fd5b505afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122019190613f56565b612239576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610a7d565b6122433384612bd4565b6122b55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a7d565b6122c18585858561325a565b5050505050565b600754630100000090046001600160a01b031633146123295760405162461bcd60e51b815260206004820152601560248201527f6f6e6c792065766f6c76656420636f6e747261637400000000000000000000006044820152606401610a7d565b81516000805b828110156124385760208181028601810151600081815260039092526040909120549092506001600160a01b038581169116146123ae5760405162461bcd60e51b815260206004820152601360248201527f6164647220646f65736e74206f776e20696420000000000000000000000000006044820152606401610a7d565b600082815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556005909252808320805490921690915551600192909201918391906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461232f565b50506001600160a01b039091166000908152600460205260409020805491909103905550565b336124716000546001600160a01b031690565b6001600160a01b0316146124c75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600955565b6000818152600360205260409020546060906001600160a01b03166125595760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a7d565b6002612564836132e3565b604051602001612575929190614140565b6040516020818303038152906040529050919050565b3361259e6000546001600160a01b031690565b6001600160a01b0316146125f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600780546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b336126486000546001600160a01b031690565b6001600160a01b03161461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b336126eb6000546001600160a01b031690565b6001600160a01b0316146127415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b6001600160a01b0381166127bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a7d565b6127c6816130e6565b50565b336127dc6000546001600160a01b031690565b6001600160a01b0316146128325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7d565b600a55565b600754610100900460ff1661288e5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610a7d565b600061289b338484612b4b565b90506128dd8186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0b92505050565b6129295760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206f722075736564207369672f6861736821000000000000006044820152606401610a7d565b600154600b54612939828661432c565b11156129875760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610a7d565b600a54612994908561437d565b34146111495760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610a7d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612a7557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109f157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146109f1565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612b12826119e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040517f773100000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602282015260368101839052605681018290526000906076015b6040516020818303038152906040528051906020012090509392505050565b6000818152600360205260408120546001600160a01b0316612c5e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a7d565b6000828152600360205260409020546001600160a01b03908116908416811480612ca15750836001600160a01b0316612c96846109f7565b6001600160a01b0316145b80610de357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16610de3565b6000818152600360205260409020546001600160a01b03848116911614612d645760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6001600160a01b038216612ddf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b612dea600082612ac5565b6001600160a01b03808416600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600390915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040517f773200000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660228201526036810183905260568101829052600090607601612bb5565b6000828152600e602052604081205460ff1615612f2a575060006109f1565b6000546001600160a01b0316612f96612f90856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84613415565b6001600160a01b0316149392505050565b60005b8381101561303257600191820160008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519294939093019284929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612faa565b506001600160a01b0382166000908152600460209081526040808320805487019055600180548701905580519182019052818152613074919084908490613439565b6118b55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611c0c733cc6cdda760b79bafa08df41ecfa224f810dceb66001613604565b816001600160a01b0316836001600160a01b031614156131cf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a7d565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613265848484612cd5565b61327184848484613439565b610ce55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b60608161332357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561334d578061333781614451565b91506133469050600a83614369565b9150613327565b60008167ffffffffffffffff8111156133685761336861455a565b6040519080825280601f01601f191660200182016040528015613392576020820181803683370190505b5090505b8415610de3576133a76001836143ba565b91506133b4600a8661448a565b6133bf90603061432c565b60f81b8183815181106133d4576133d461452b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061340e600a86614369565b9450613396565b60008060006134248585613754565b91509150613431816137c1565b509392505050565b60006001600160a01b0384163b156135f9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061349690339089908890889060040161424a565b602060405180830381600087803b1580156134b057600080fd5b505af19250505080156134fe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526134fb91810190613f90565b60015b6135ae573d80801561352c576040519150601f19603f3d011682016040523d82523d6000602084013e613531565b606091505b5080516135a65760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a7d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610de3565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b156117b05780156136a2576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561368e57600080fd5b505af11580156112e8573d6000803e3d6000fd5b6001600160a01b0382161561370a576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401613674565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401613674565b60008082516041141561378b5760208301516040840151606085015160001a61377f878285856139b2565b945094505050506113a8565b8251604014156137b557602083015160408401516137aa868383613abd565b9350935050506113a8565b506000905060026113a8565b60008160048111156137d5576137d56144fc565b14156137de5750565b60018160048111156137f2576137f26144fc565b14156138405760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a7d565b6002816004811115613854576138546144fc565b14156138a25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a7d565b60038160048111156138b6576138b66144fc565b141561392a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b600481600481111561393e5761393e6144fc565b14156127c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610a7d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156139e95750600090506003613ab4565b8460ff16601b14158015613a0157508460ff16601c14155b15613a125750600090506004613ab4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613a66573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116613aad57600060019250925050613ab4565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613af7878288856139b2565b935093505050935093915050565b828054613b11906143fd565b90600052602060002090601f016020900481019282613b335760008555613b79565b82601f10613b4c57805160ff1916838001178555613b79565b82800160010185558215613b79579182015b82811115613b79578251825591602001919060010190613b5e565b50613b85929150613b89565b5090565b5b80821115613b855760008155600101613b8a565b600067ffffffffffffffff831115613bb857613bb861455a565b613be960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016142dd565b9050828152838383011115613bfd57600080fd5b828260208301376000602084830101529392505050565b8035613c1f81614589565b919050565b600082601f830112613c3557600080fd5b613c4483833560208501613b9e565b9392505050565b600060208284031215613c5d57600080fd5b8135613c4481614589565b60008060408385031215613c7b57600080fd5b8235613c8681614589565b91506020830135613c9681614589565b809150509250929050565b600080600060608486031215613cb657600080fd5b8335613cc181614589565b92506020840135613cd181614589565b929592945050506040919091013590565b60008060008060808587031215613cf857600080fd5b8435613d0381614589565b93506020850135613d1381614589565b925060408501359150606085013567ffffffffffffffff811115613d3657600080fd5b8501601f81018713613d4757600080fd5b613d5687823560208401613b9e565b91505092959194509250565b60008060408385031215613d7557600080fd5b8235613d8081614589565b91506020830135613c968161459e565b600080600080600080600060e0888a031215613dab57600080fd5b8735613db681614589565b96506020880135613dc681614589565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115613dfe57600080fd5b613e0a8a828b01613c24565b91505092959891949750929550565b60008060408385031215613e2c57600080fd5b8235613e3781614589565b946020939093013593505050565b600080600060608486031215613e5a57600080fd5b8335613e6581614589565b95602085013595506040909401359392505050565b60008060408385031215613e8d57600080fd5b823567ffffffffffffffff80821115613ea557600080fd5b818501915085601f830112613eb957600080fd5b8135602082821115613ecd57613ecd61455a565b8160051b9250613ede8184016142dd565b8281528181019085830185870184018b1015613ef957600080fd5b600096505b84871015613f1c578035835260019690960195918301918301613efe565b509650613f2c9050878201613c14565b9450505050509250929050565b600060208284031215613f4b57600080fd5b8135613c448161459e565b600060208284031215613f6857600080fd5b8151613c448161459e565b600060208284031215613f8557600080fd5b8135613c44816145ac565b600060208284031215613fa257600080fd5b8151613c44816145ac565b60008060008060608587031215613fc357600080fd5b843567ffffffffffffffff80821115613fdb57600080fd5b818701915087601f830112613fef57600080fd5b813581811115613ffe57600080fd5b88602082850101111561401057600080fd5b6020928301999098509187013596604001359550909350505050565b60006020828403121561403e57600080fd5b813567ffffffffffffffff81111561405557600080fd5b610de384828501613c24565b60006020828403121561407357600080fd5b5035919050565b60006020828403121561408c57600080fd5b5051919050565b600080604083850312156140a657600080fd5b823591506020830135613c9681614589565b600080604083850312156140cb57600080fd5b50508035926020909101359150565b600081518084526140f28160208601602086016143d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516141368185602086016143d1565b9290920192915050565b600080845481600182811c91508083168061415c57607f831692505b6020808410821415614195577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156141a957600181146141d857614205565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614205565b60008b81526020902060005b868110156141fd5781548b8201529085019083016141e4565b505084890196505b5050505050506142416142188286614124565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261427c60808301846140da565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156142be578351835292840192918401916001016142a2565b50909695505050505050565b602081526000613c4460208301846140da565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143245761432461455a565b604052919050565b6000821982111561433f5761433f61449e565b500190565b600060ff821660ff84168060ff038211156143615761436161449e565b019392505050565b600082614378576143786144cd565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143b5576143b561449e565b500290565b6000828210156143cc576143cc61449e565b500390565b60005b838110156143ec5781810151838201526020016143d4565b83811115610ce55750506000910152565b600181811c9082168061441157607f821691505b6020821081141561444b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144835761448361449e565b5060010190565b600082614499576144996144cd565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146127c657600080fd5b80151581146127c657600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127c657600080fdfea264697066735822122048b4ac5be65fe9de700a5819aef1151e79f9aea5a129ce655ec941b4a92db4ba64736f6c63430008070033
Deployed Bytecode Sourcemap
38187:8492:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43239:241;;;;;;;;;;-1:-1:-1;43239:241:0;;;;;:::i;:::-;;:::i;:::-;;;14958:14:1;;14951:22;14933:41;;14921:2;14906:18;43239:241:0;;;;;;;;29004:100;;;;;;;;;;-1:-1:-1;29078:18:0;;;;;;;;;;;;;;;;;29004:100;;;;;;;:::i;30254:213::-;;;;;;;;;;-1:-1:-1;30254:213:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12939:55:1;;;12921:74;;12909:2;12894:18;30254:213:0;12775:226:1;29762:426:0;;;;;;;;;;-1:-1:-1;29762:426:0;;;;;:::i;:::-;;:::i;:::-;;44091:149;;;;;;;;;;-1:-1:-1;44091:149:0;;;;;:::i;:::-;;:::i;41359:150::-;;;;;;;;;;-1:-1:-1;41359:150:0;;;;;:::i;:::-;;:::i;:::-;;;15131:25:1;;;15119:2;15104:18;41359:150:0;14985:177:1;27471:23:0;;;;;;;;;;-1:-1:-1;27471:23:0;;;;;;;;;;;31018:357;;;;;;;;;;-1:-1:-1;31018:357:0;;;;;:::i;:::-;;:::i;40436:644::-;;;;;;;;;;-1:-1:-1;40436:644:0;;;;;:::i;:::-;;:::i;42526:279::-;;;;;;;;;;-1:-1:-1;42526:279:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14046:55:1;;;14028:74;;14133:2;14118:18;;14111:34;;;;14001:18;42526:279:0;13854:297:1;38445:26:0;;;;;;;;;;;;;;;;45597:377;;;;;;;;;;-1:-1:-1;45597:377:0;;;;;:::i;:::-;;:::i;38610:677::-;;;;;;;;;;-1:-1:-1;38610:677:0;;;;;:::i;:::-;;:::i;43488:254::-;;;;;;;;;;;;;:::i;44363:194::-;;;;;;;;;;-1:-1:-1;44363:194:0;;;;;:::i;:::-;;:::i;2907:143::-;;;;;;;;;;;;3007:42;2907:143;;31446:231;;;;;;;;;;-1:-1:-1;31446:231:0;;;;;:::i;:::-;;:::i;29610:90::-;;;;;;;;;;-1:-1:-1;29610:90:0;;;;;:::i;:::-;;:::i;41699:150::-;;;;;;;;;;-1:-1:-1;41699:150:0;;;;;:::i;:::-;;:::i;43903:86::-;;;;;;;;;;;;;:::i;28706:231::-;;;;;;;;;;-1:-1:-1;28706:231:0;;;;;:::i;:::-;;:::i;27539:21::-;;;;;;;;;;;;;:::i;28442:202::-;;;;;;;;;;-1:-1:-1;28442:202:0;;;;;:::i;:::-;;:::i;7132:96::-;;;;;;;;;;;;;:::i;43997:86::-;;;;;;;;;;;;;:::i;43800:95::-;;;;;;;;;;;;;:::i;38277:22::-;;;;;;;;;;-1:-1:-1;38277:22:0;;;;;;;;;;;45166:423;;;;;;;;;;-1:-1:-1;45166:423:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45001:157::-;;;;;;;;;;-1:-1:-1;45102:19:0;;45146:3;;45001:157;;;45102:19;;;;-1:-1:-1;;;;;45102:19:0;;;13241:34:1;;45146:3:0;;;13306:2:1;13291:18;;13284:43;13153:18;45001:157:0;13006:327:1;6483:87:0;;;;;;;;;;-1:-1:-1;6529:7:0;6556:6;-1:-1:-1;;;;;6556:6:0;6483:87;;29173:99;;;;;;;;;;-1:-1:-1;29249:15:0;;;;;;;;;;;;;;;;;29173:99;;43056:111;;;;;;;;;;-1:-1:-1;43056:111:0;;;;;:::i;:::-;;:::i;38244:26::-;;;;;;;;;;-1:-1:-1;38244:26:0;;;;;;;;39295:361;;;;;;:::i;:::-;;:::i;30539:185::-;;;;;;;;;;-1:-1:-1;30539:185:0;;;;;:::i;:::-;;:::i;31748:344::-;;;;;;;;;;-1:-1:-1;31748:344:0;;;;;:::i;:::-;;:::i;45982:694::-;;;;;;;;;;-1:-1:-1;45982:694:0;;;;;:::i;:::-;;:::i;44841:152::-;;;;;;;;;;-1:-1:-1;44946:6:0;;44979;;44841:152;;;28037:25:1;;;28093:2;28078:18;;28071:34;;;;28010:18;44841:152:0;27863:248:1;38306:22:0;;;;;;;;;;-1:-1:-1;38306:22:0;;;;;;;;;;;44565:88;;;;;;;;;;-1:-1:-1;44565:88:0;;;;;:::i;:::-;;:::i;29343:259::-;;;;;;;;;;-1:-1:-1;29343:259:0;;;;;:::i;:::-;;:::i;44249:106::-;;;;;;;;;;-1:-1:-1;44249:106:0;;;;;:::i;:::-;;:::i;44757:76::-;;;;;;;;;;-1:-1:-1;44757:76:0;;;;;:::i;:::-;;:::i;30795:156::-;;;;;;;;;;-1:-1:-1;30795:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;30908:25:0;;;30884:4;30908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30795:156;7383:194;;;;;;;;;;-1:-1:-1;7383:194:0;;;;;:::i;:::-;;:::i;44665:84::-;;;;;;;;;;-1:-1:-1;44665:84:0;;;;;:::i;:::-;;:::i;39680:730::-;;;;;;:::i;:::-;;:::i;43239:241::-;43341:4;43378:41;;;43393:26;43378:41;;:94;;;43436:36;43460:11;43436:23;:36::i;:::-;43358:114;43239:241;-1:-1:-1;;43239:241:0:o;30254:213::-;30322:7;33622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33622:16:0;30342:73;;;;-1:-1:-1;;;30342:73:0;;25163:2:1;30342:73:0;;;25145:21:1;25202:2;25182:18;;;25175:30;25241:34;25221:18;;;25214:62;25312:14;25292:18;;;25285:42;25344:19;;30342:73:0;;;;;;;;;-1:-1:-1;30435:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30435:24:0;;30254:213::o;29762:426::-;29854:2;3007:42;4937:45;:49;4933:225;;5008:67;;;;;5059:4;5008:67;;;13241:34:1;-1:-1:-1;;;;;13311:15:1;;13291:18;;;13284:43;3007:42:0;;5008;;13153:18:1;;5008:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5103:28;;;;;-1:-1:-1;;;;;12939:55:1;;5103:28:0;;;12921:74:1;12894:18;;5103:28:0;12775:226:1;5003:144:0;29869:13:::1;29885:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;29885:16:0;;::::1;::::0;29920:11;::::1;::::0;::::1;;29912:57;;;::::0;-1:-1:-1;;;29912:57:0;;26353:2:1;29912:57:0::1;::::0;::::1;26335:21:1::0;26392:2;26372:18;;;26365:30;26431:34;26411:18;;;26404:62;26502:3;26482:18;;;26475:31;26523:19;;29912:57:0::1;26151:397:1::0;29912:57:0::1;30004:10;-1:-1:-1::0;;;;;30004:19:0;::::1;;::::0;:58:::1;;-1:-1:-1::0;;;;;;30908:25:0;;30884:4;30908:25;;;:18;:25;;;;;;;;30051:10:::1;30908:35:::0;;;;;;;;;;30027::::1;29982:164;;;::::0;-1:-1:-1;;;29982:164:0;;22290:2:1;29982:164:0::1;::::0;::::1;22272:21:1::0;22329:2;22309:18;;;22302:30;22368:34;22348:18;;;22341:62;22439:26;22419:18;;;22412:54;22483:19;;29982:164:0::1;22088:420:1::0;29982:164:0::1;30159:21;30168:2;30172:7;30159:8;:21::i;:::-;29858:330;29762:426:::0;;;:::o;44091:149::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44152:10:::1;:18:::0;;44181;;44152::::1;::::0;::::1;;::::0;;::::1;44181::::0;;;;;::::1;;44210:22:::0;::::1;::::0;;::::1;::::0;;44091:149::o;41359:150::-;41441:7;41468:33;41478:7;41487:6;41495:5;41468:9;:33::i;:::-;41461:40;41359:150;-1:-1:-1;;;;41359:150:0:o;31018:357::-;31155:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31233:39:::1;31252:10;31264:7;31233:18;:39::i;:::-;31225:101;;;::::0;-1:-1:-1;;;31225:101:0;;26755:2:1;31225:101:0::1;::::0;::::1;26737:21:1::0;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;26904:19;26884:18;;;26877:47;26941:19;;31225:101:0::1;26553:413:1::0;31225:101:0::1;31339:28;31349:4;31355:2;31359:7;31339:9;:28::i;:::-;4531:7:::0;;4468:85;4572:69;;;;;4623:4;4572:69;;;13241:34:1;4630:10:0;13291:18:1;;;13284:43;3007:42:0;;4572;;13153:18:1;;4572:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4669:30;;;;;4688:10;4669:30;;;12921:74:1;12894:18;;4669:30:0;12775:226:1;4567:148:0;31233:39:::1;31252:10;31264:7;31233:18;:39::i;:::-;31225:101;;;::::0;-1:-1:-1;;;31225:101:0;;26755:2:1;31225:101:0::1;::::0;::::1;26737:21:1::0;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;26904:19;26884:18;;;26877:47;26941:19;;31225:101:0::1;26553:413:1::0;31225:101:0::1;31339:28;31349:4;31355:2;31359:7;31339:9;:28::i;40436:644::-:0;40529:10;;;;;;;40521:46;;;;-1:-1:-1;;;40521:46:0;;20070:2:1;40521:46:0;;;20052:21:1;20109:2;20089:18;;;20082:30;20148:25;20128:18;;;20121:53;20191:18;;40521:46:0;19868:347:1;40521:46:0;40578:12;40593:36;40603:10;40615:6;40623:5;40593:9;:36::i;:::-;40578:51;;40648:20;40658:4;40664:3;;40648:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40648:9:0;;-1:-1:-1;;;40648:20:0:i;:::-;40640:58;;;;-1:-1:-1;;;40640:58:0;;27529:2:1;40640:58:0;;;27511:21:1;27568:2;27548:18;;;27541:30;27607:27;27587:18;;;27580:55;27652:18;;40640:58:0;27327:349:1;40640:58:0;40724:9;;40772:14;;40752:16;40724:9;40752:6;:16;:::i;:::-;:34;;40744:74;;;;-1:-1:-1;;;40744:74:0;;27173:2:1;40744:74:0;;;27155:21:1;27212:2;27192:18;;;27185:30;27251:29;27231:18;;;27224:57;27298:18;;40744:74:0;26971:351:1;40744:74:0;40874:3;;:25;;;;;40888:10;40874:25;;;12921:74:1;-1:-1:-1;;;;;40874:3:0;;;;:13;;12894:18:1;;40874:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40859:10;40846:24;;;;:12;:24;;;;;;40837:33;;40846:24;;40837:6;:33;:::i;:::-;:62;;40829:112;;;;-1:-1:-1;;;40829:112:0;;23536:2:1;40829:112:0;;;23518:21:1;23575:2;23555:18;;;23548:30;23614:34;23594:18;;;23587:62;23685:7;23665:18;;;23658:35;23710:19;;40829:112:0;23334:401:1;40829:112:0;40954:14;;;;:8;:14;;;;;;;;:21;;;;40971:4;40954:21;;;40999:10;40986:24;;:12;:24;;;;;:41;;41020:6;;40954:14;40986:41;;41020:6;;40954:21;40986:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41038:34;41044:6;41052:10;41064:7;41038:5;:34::i;:::-;40510:570;;40436:644;;;;:::o;42526:279::-;42608:16;33622;;;:7;:16;;;;;;42608;;-1:-1:-1;;;;;33622:16:0;42660:68;;;;-1:-1:-1;;;42660:68:0;;24755:2:1;42660:68:0;;;24737:21:1;24794:2;24774:18;;;24767:30;24833:34;24813:18;;;24806:62;24904:9;24884:18;;;24877:37;24931:19;;42660:68:0;24553:403:1;42660:68:0;6529:7;6556:6;-1:-1:-1;;;;;6556:6:0;42791:5;42767:21;;42755:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;42739:58;;;;42526:279;;;;;;:::o;45597:377::-;45684:19;;;;;-1:-1:-1;;;;;45684:19:0;45670:10;:33;45662:67;;;;-1:-1:-1;;;45662:67:0;;21940:2:1;45662:67:0;;;21922:21:1;21979:2;21959:18;;;21952:30;22018:23;21998:18;;;21991:51;22059:18;;45662:67:0;21738:345:1;45662:67:0;45748:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;45748:19:0;;;:11;;:19;45740:50;;;;-1:-1:-1;;;45740:50:0;;21180:2:1;45740:50:0;;;21162:21:1;21219:2;21199:18;;;21192:30;21258:20;21238:18;;;21231:48;21296:18;;45740:50:0;20978:342:1;45740:50:0;-1:-1:-1;;;;;45828:15:0;;;;;;:9;:15;;;;;;;;45826:17;;;;;;45872:11;;;:7;:11;;;;;45865:18;;;;;;;;;45901:15;:19;;;;;;45894:26;;;;;;;;45936:30;45880:2;;45828:15;45936:30;;45828:15;;45936:30;45597:377;;:::o;38610:677::-;38872:11;;;;;;;38871:12;38863:53;;;;-1:-1:-1;;;38863:53:0;;16611:2:1;38863:53:0;;;16593:21:1;16650:2;16630:18;;;16623:30;16689;16669:18;;;16662:58;16737:18;;38863:53:0;16409:352:1;38863:53:0;38927:21;38937:10;38927:9;:21::i;:::-;38959:38;:36;:38::i;:::-;39008:19;:42;;;;;-1:-1:-1;;;;;39008:42:0;;;;;;;;;;;;;;39061:3;:9;;;;;;;;;;;;;39081:21;:32;;;39124:18;;;;:7;;:18;;;;;:::i;:::-;-1:-1:-1;;39153:6:0;:20;;;;39184:6;:23;39218:14;:32;-1:-1:-1;;;39261:18:0;;;;;;;;-1:-1:-1;38610:677:0:o;43488:254::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;43618:51:::1;::::0;43549:21:::1;::::0;43538:8:::1;::::0;43626:10:::1;::::0;43660:4:::1;::::0;43549:21;;43538:8;43618:51;43538:8;43618:51;43549:21;43626:10;43660:4;43618:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43604:65;;;;;43688:7;43680:54;;;::::0;-1:-1:-1;;;43680:54:0;;18560:2:1;43680:54:0::1;::::0;::::1;18542:21:1::0;18599:2;18579:18;;;18572:30;18638:34;18618:18;;;18611:62;18709:4;18689:18;;;18682:32;18731:19;;43680:54:0::1;18358:398:1::0;43680:54:0::1;43527:215;;43488:254::o:0;44363:194::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44457:9:::1;;44444;:22;;44436:76;;;::::0;-1:-1:-1;;;44436:76:0;;24345:2:1;44436:76:0::1;::::0;::::1;24327:21:1::0;24384:2;24364:18;;;24357:30;24423:34;24403:18;;;24396:62;24494:11;24474:18;;;24467:39;24523:19;;44436:76:0::1;24143:405:1::0;44436:76:0::1;44523:14;:26:::0;44363:194::o;31446:231::-;31630:39;31647:4;31653:2;31657:7;31630:39;;;;;;;;;;;;:16;:39::i;:::-;31446:231;;;:::o;29610:90::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;29679:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;41699:150::-:0;41781:7;41808:33;41818:7;41827:6;41835:5;41808:9;:33::i;43903:86::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;43971:10:::1;::::0;;43957:24;;::::1;43971:10;::::0;;;::::1;;;43970:11;43957:24:::0;;::::1;;::::0;;43903:86::o;28706:231::-;28770:7;28806:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28806:16:0;28841:19;28833:73;;;;-1:-1:-1;;;28833:73:0;;23126:2:1;28833:73:0;;;23108:21:1;23165:2;23145:18;;;23138:30;23204:34;23184:18;;;23177:62;23275:11;23255:18;;;23248:39;23304:19;;28833:73:0;22924:405:1;27539:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28442:202::-;28508:7;-1:-1:-1;;;;;28536:19:0;;28528:74;;;;-1:-1:-1;;;28528:74:0;;22715:2:1;28528:74:0;;;22697:21:1;22754:2;22734:18;;;22727:30;22793:34;22773:18;;;22766:62;22864:12;22844:18;;;22837:40;22894:19;;28528:74:0;22513:406:1;28528:74:0;-1:-1:-1;;;;;;28620:16:0;;;;;:9;:16;;;;;;;28442:202::o;7132:96::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;7199:21:::1;7217:1;7199:9;:21::i;:::-;7132:96::o:0;43997:86::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44065:10:::1;::::0;;44051:24;;::::1;44065:10:::0;;;;::::1;;;44064:11;44051:24:::0;;::::1;;::::0;;43997:86::o;43800:95::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;43873:14:::1;::::0;;43855:32;;::::1;43873:14;::::0;;::::1;43872:15;43855:32;::::0;;43800:95::o;45166:423::-;-1:-1:-1;;;;;45286:16:0;;45252:20;45286:16;;;:9;:16;;;;;;45226:13;;45252:20;45275:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45275:28:0;;45252:51;;45314:6;45323:9;;45335:1;45323:13;;;;:::i;:::-;45314:22;-1:-1:-1;45347:6:0;45380:1;45366:190;45387:1;45383;:5;45366:190;;;45410:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;45410:19:0;;;:10;;:19;45406:108;;;45462:1;45450:6;45457:1;45450:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;45493:3;;;;;45406:108;45539:3;;45366:190;;;-1:-1:-1;45575:6:0;;45166:423;-1:-1:-1;;;;45166:423:0:o;43056:111::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;43129:21:::1;:30:::0;43056:111::o;39295:361::-;39361:14;;;;39353:50;;;;-1:-1:-1;;;39353:50:0;;20070:2:1;39353:50:0;;;20052:21:1;20109:2;20089:18;;;20082:30;20148:25;20128:18;;;20121:53;20191:18;;39353:50:0;19868:347:1;39353:50:0;39429:9;;39477:14;;39457:16;39429:9;39457:6;:16;:::i;:::-;:34;;39449:74;;;;-1:-1:-1;;;39449:74:0;;27173:2:1;39449:74:0;;;27155:21:1;27212:2;27192:18;;;27185:30;27251:29;27231:18;;;27224:57;27298:18;;39449:74:0;26971:351:1;39449:74:0;39564:6;;39555:15;;:6;:15;:::i;:::-;39542:9;:28;39534:67;;;;-1:-1:-1;;;39534:67:0;;20422:2:1;39534:67:0;;;20404:21:1;20461:2;20441:18;;;20434:30;20500:28;20480:18;;;20473:56;20546:18;;39534:67:0;20220:350:1;39534:67:0;39614:34;39620:6;39628:10;39640:7;39614:5;:34::i;30539:185::-;30645:8;3007:42;4937:45;:49;4933:225;;5008:67;;;;;5059:4;5008:67;;;13241:34:1;-1:-1:-1;;;;;13311:15:1;;13291:18;;;13284:43;3007:42:0;;5008;;13153:18:1;;5008:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5103:28;;;;;-1:-1:-1;;;;;12939:55:1;;5103:28:0;;;12921:74:1;12894:18;;5103:28:0;12775:226:1;5003:144:0;30666:50:::1;30685:10;30697:8;30707;30666:18;:50::i;31748:344::-:0;31916:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31941:39:::1;31960:10;31972:7;31941:18;:39::i;:::-;31933:101;;;::::0;-1:-1:-1;;;31933:101:0;;26755:2:1;31933:101:0::1;::::0;::::1;26737:21:1::0;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;26904:19;26884:18;;;26877:47;26941:19;;31933:101:0::1;26553:413:1::0;31933:101:0::1;32045:39;32059:4;32065:2;32069:7;32078:5;32045:13;:39::i;:::-;4531:7:::0;;4468:85;4572:69;;;;;4623:4;4572:69;;;13241:34:1;4630:10:0;13291:18:1;;;13284:43;3007:42:0;;4572;;13153:18:1;;4572:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4669:30;;;;;4688:10;4669:30;;;12921:74:1;12894:18;;4669:30:0;12775:226:1;4567:148:0;31941:39:::1;31960:10;31972:7;31941:18;:39::i;:::-;31933:101;;;::::0;-1:-1:-1;;;31933:101:0;;26755:2:1;31933:101:0::1;::::0;::::1;26737:21:1::0;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;26904:19;26884:18;;;26877:47;26941:19;;31933:101:0::1;26553:413:1::0;31933:101:0::1;32045:39;32059:4;32065:2;32069:7;32078:5;32045:13;:39::i;:::-;31748:344:::0;;;;;:::o;45982:694::-;46080:19;;;;;-1:-1:-1;;;;;46080:19:0;46066:10;:33;46058:67;;;;-1:-1:-1;;;46058:67:0;;21940:2:1;46058:67:0;;;21922:21:1;21979:2;21959:18;;;21952:30;22018:23;21998:18;;;21991:51;22059:18;;46058:67:0;21738:345:1;46058:67:0;46152:10;;46138:11;;46194:401;46210:6;46206:1;:10;46194:401;;;46302:4;46295:12;;;46275:33;;;;46269:40;46346:12;;;;:7;:12;;;;;;;;46269:40;;-1:-1:-1;;;;;;46346:20:0;;;:12;;:20;46338:52;;;;-1:-1:-1;;;46338:52:0;;19722:2:1;46338:52:0;;;19704:21:1;19761:2;19741:18;;;19734:30;19800:21;19780:18;;;19773:49;19839:18;;46338:52:0;19520:343:1;46338:52:0;46441:12;;;;:7;:12;;;;;;;;46434:19;;;;;;;;;46512:15;:20;;;;;;46505:27;;;;;;;;46552:31;46434:19;46472:3;;;;;46449;;46441:12;-1:-1:-1;;;;;46552:31:0;;;;;46441:12;;46552:31;46194:401;;;-1:-1:-1;;;;;;;46632:15:0;;;;;;;:9;:15;;;;;:25;;;;;;;;-1:-1:-1;45982:694:0:o;44565:88::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44631:6:::1;:14:::0;44565:88::o;29343:259::-;33598:4;33622:16;;;:7;:16;;;;;;29410:13;;-1:-1:-1;;;;;33622:16:0;29436:76;;;;-1:-1:-1;;;29436:76:0;;25937:2:1;29436:76:0;;;25919:21:1;25976:2;25956:18;;;25949:30;26015:34;25995:18;;;25988:62;26086:17;26066:18;;;26059:45;26121:19;;29436:76:0;25735:411:1;29436:76:0;29556:7;29565:18;:7;:16;:18::i;:::-;29539:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29525:69;;29343:259;;;:::o;44249:106::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44321:19:::1;:26:::0;;-1:-1:-1;;;;;44321:26:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44249:106::o;44757:76::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44816:3:::1;:9:::0;;;::::1;-1:-1:-1::0;;;;;44816:9:0;;;::::1;::::0;;;::::1;::::0;;44757:76::o;7383:194::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;-1:-1:-1;;;;;7474:22:0;::::1;7466:73;;;::::0;-1:-1:-1;;;7466:73:0;;17747:2:1;7466:73:0::1;::::0;::::1;17729:21:1::0;17786:2;17766:18;;;17759:30;17825:34;17805:18;;;17798:62;17896:8;17876:18;;;17869:36;17922:19;;7466:73:0::1;17545:402:1::0;7466:73:0::1;7550:19;7560:8;7550:9;:19::i;:::-;7383:194:::0;:::o;44665:84::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;25576:2:1;6695:66:0;;;25558:21:1;;;25595:18;;;25588:30;25654:34;25634:18;;;25627:62;25706:18;;6695:66:0;25374:356:1;6695:66:0;44727:6:::1;:14:::0;44665:84::o;39680:730::-;39781:10;;;;;;;39773:46;;;;-1:-1:-1;;;39773:46:0;;20070:2:1;39773:46:0;;;20052:21:1;20109:2;20089:18;;;20082:30;20148:25;20128:18;;;20121:53;20191:18;;39773:46:0;19868:347:1;39773:46:0;39830:12;39845:36;39855:10;39867:6;39875:5;39845:9;:36::i;:::-;39830:51;;39900:20;39910:4;39916:3;;39900:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39900:9:0;;-1:-1:-1;;;39900:20:0:i;:::-;39892:58;;;;-1:-1:-1;;;39892:58:0;;27529:2:1;39892:58:0;;;27511:21:1;27568:2;27548:18;;;27541:30;27607:27;27587:18;;;27580:55;27652:18;;39892:58:0;27327:349:1;39892:58:0;39976:9;;40024:14;;40004:16;39976:9;40004:6;:16;:::i;:::-;:34;;39996:74;;;;-1:-1:-1;;;39996:74:0;;27173:2:1;39996:74:0;;;27155:21:1;27212:2;27192:18;;;27185:30;27251:29;27231:18;;;27224:57;27298:18;;39996:74:0;26971:351:1;39996:74:0;40111:6;;40102:15;;:6;:15;:::i;:::-;40089:9;:28;40081:67;;;;-1:-1:-1;;;40081:67:0;;20422:2:1;40081:67:0;;;20404:21:1;20461:2;20441:18;;;20434:30;20500:28;20480:18;;;20473:56;20546:18;;40081:67:0;20220:350:1;28073:305:0;28175:4;28212:40;;;28227:25;28212:40;;:105;;-1:-1:-1;28269:48:0;;;28284:33;28269:48;28212:105;:158;;;-1:-1:-1;20535:25:0;20520:40;;;;28334:36;20411:157;36158:174;36233:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;36233:29:0;;;;;;;;:24;;36287:23;36233:24;36287:14;:23::i;:::-;-1:-1:-1;;;;;36278:46:0;;;;;;;;;;;36158:174;;:::o;41517:::-;41636:46;;12539:4:1;41636:46:0;;;12527:17:1;12594:66;12581:2;12577:15;;;12573:88;12560:11;;;12553:109;12678:12;;;12671:28;;;12715:12;;;12708:28;;;41599:7:0;;12752:12:1;;41636:46:0;;;;;;;;;;;;;41626:57;;;;;;41619:64;;41517:174;;;;;:::o;33827:341::-;33920:4;33622:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33622:16:0;33937:73;;;;-1:-1:-1;;;33937:73:0;;21527:2:1;33937:73:0;;;21509:21:1;21566:2;21546:18;;;21539:30;21605:34;21585:18;;;21578:62;21676:14;21656:18;;;21649:42;21708:19;;33937:73:0;21325:408:1;33937:73:0;34021:13;34037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34037:16:0;;;;34072;;;;;:51;;;34116:7;-1:-1:-1;;;;;34092:31:0;:20;34104:7;34092:11;:20::i;:::-;-1:-1:-1;;;;;34092:31:0;;34072:51;:87;;;-1:-1:-1;;;;;;30908:25:0;;;30884:4;30908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34127:32;30795:156;35485:555;35617:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;35617:24:0;;;:16;;:24;35609:74;;;;-1:-1:-1;;;35609:74:0;;18154:2:1;35609:74:0;;;18136:21:1;18193:2;18173:18;;;18166:30;18232:34;18212:18;;;18205:62;18303:7;18283:18;;;18276:35;18328:19;;35609:74:0;17952:401:1;35609:74:0;-1:-1:-1;;;;;35702:16:0;;35694:65;;;;-1:-1:-1;;;35694:65:0;;18963:2:1;35694:65:0;;;18945:21:1;19002:2;18982:18;;;18975:30;19041:34;19021:18;;;19014:62;19112:6;19092:18;;;19085:34;19136:19;;35694:65:0;18761:400:1;35694:65:0;35824:29;35841:1;35845:7;35824:8;:29::i;:::-;-1:-1:-1;;;;;35897:15:0;;;;;;;:9;:15;;;;;;;;35895:17;;;;;;35929:13;;;;;;;;;35927:15;;35895:17;35927:15;;;35966:16;;;:7;:16;;;;;;:21;;;;;;;;36005:27;;35974:7;;35929:13;35897:15;36005:27;;;35485:555;;;:::o;41857:174::-;41976:46;;11795:4:1;41976:46:0;;;11783:17:1;11850:66;11837:2;11833:15;;;11829:88;11816:11;;;11809:109;11934:12;;;11927:28;;;11971:12;;;11964:28;;;41939:7:0;;12008:12:1;;41976:46:0;11497:529:1;41088:263:0;41167:4;41188:14;;;:8;:14;;;;;;;;41184:32;;;-1:-1:-1;41211:5:0;41204:12;;41184:32;6529:7;6556:6;-1:-1:-1;;;;;6556:6:0;41234:98;41262:34;41291:4;16249:58;;11354:66:1;16249:58:0;;;11342:79:1;11437:12;;;11430:28;;;16116:7:0;;11474:12:1;;16249:58:0;;;;;;;;;;;;16239:69;;;;;;16232:76;;16047:269;;;;41262:34;41311:10;41234:13;:98::i;:::-;-1:-1:-1;;;;;41234:109:0;;;41088:263;-1:-1:-1;;;41088:263:0:o;34504:644::-;34588:6;34583:219;34600:6;34596:1;:10;34583:219;;;34653:9;;;;34716:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;34716:21:0;;;;;;;;34757:33;;34653:9;;34681:3;;;;;34653:9;;34716:21;;:16;34757:33;;34716:16;;34757:33;34583:219;;;-1:-1:-1;;;;;;34839:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;-1:-1:-1;34877:19:0;;;;;;34942:51;;;;;;;;;;;;34839:13;34849:2;;34981:7;;34942:22;:51::i;:::-;34920:151;;;;-1:-1:-1;;;34920:151:0;;17328:2:1;34920:151:0;;;17310:21:1;17367:2;17347:18;;;17340:30;17406:34;17386:18;;;17379:62;17477:20;17457:18;;;17450:48;17515:19;;34920:151:0;17126:414:1;7585:174:0;7642:16;7661:6;;-1:-1:-1;;;;;7678:17:0;;;;;;;;;;7711:40;;7661:6;;;;;;;7711:40;;7642:16;7711:40;7631:128;7585:174;:::o;5558:117::-;5616:57;5506:42;5668:4;5616:29;:57::i;36474:315::-;36629:8;-1:-1:-1;;;;;36620:17:0;:5;-1:-1:-1;;;;;36620:17:0;;;36612:55;;;;-1:-1:-1;;;36612:55:0;;19368:2:1;36612:55:0;;;19350:21:1;19407:2;19387:18;;;19380:30;19446:27;19426:18;;;19419:55;19491:18;;36612:55:0;19166:349:1;36612:55:0;-1:-1:-1;;;;;36678:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;36740:41;;14933::1;;;36740::0;;14906:18:1;36740:41:0;;;;;;;36474:315;;;:::o;32974:::-;33131:28;33141:4;33147:2;33151:7;33131:9;:28::i;:::-;33178:48;33201:4;33207:2;33211:7;33220:5;33178:22;:48::i;:::-;33170:111;;;;-1:-1:-1;;;33170:111:0;;17328:2:1;33170:111:0;;;17310:21:1;17367:2;17347:18;;;17340:30;17406:34;17386:18;;;17379:62;17477:20;17457:18;;;17450:48;17515:19;;33170:111:0;17126:414:1;7988:723:0;8044:13;8265:10;8261:53;;-1:-1:-1;;8292:10:0;;;;;;;;;;;;;;;;;;7988:723::o;8261:53::-;8339:5;8324:12;8380:78;8387:9;;8380:78;;8413:8;;;;:::i;:::-;;-1:-1:-1;8436:10:0;;-1:-1:-1;8444:2:0;8436:10;;:::i;:::-;;;8380:78;;;8468:19;8500:6;8490:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8490:17:0;;8468:39;;8518:154;8525:10;;8518:154;;8552:11;8562:1;8552:11;;:::i;:::-;;-1:-1:-1;8621:10:0;8629:2;8621:5;:10;:::i;:::-;8608:24;;:2;:24;:::i;:::-;8595:39;;8578:6;8585;8578:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;8649:11:0;8658:2;8649:11;;:::i;:::-;;;8518:154;;13048:231;13126:7;13147:17;13166:18;13188:27;13199:4;13205:9;13188:10;:27::i;:::-;13146:69;;;;13226:18;13238:5;13226:11;:18::i;:::-;-1:-1:-1;13262:9:0;13048:231;-1:-1:-1;;;13048:231:0:o;37354:798::-;37510:4;-1:-1:-1;;;;;37531:13:0;;17391:20;17439:8;37527:618;;37567:70;;;;;-1:-1:-1;;;;;37567:36:0;;;;;:70;;37604:10;;37616:4;;37622:7;;37631:5;;37567:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37567:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37563:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37807:13:0;;37803:272;;37850:60;;-1:-1:-1;;;37850:60:0;;17328:2:1;37850:60:0;;;17310:21:1;17367:2;17347:18;;;17340:30;17406:34;17386:18;;;17379:62;17477:20;17457:18;;;17450:48;17515:19;;37850:60:0;17126:414:1;37803:272:0;38025:6;38019:13;38010:6;38006:2;38002:15;37995:38;37563:527;37688:51;;37698:41;37688:51;;-1:-1:-1;37681:58:0;;37527:618;-1:-1:-1;38129:4:0;37354:798;;;;;;:::o;3059:952::-;3007:42;3461:45;:49;3457:547;;3531:9;3527:466;;;3561:92;;;;;3615:4;3561:92;;;13241:34:1;-1:-1:-1;;;;;13311:15:1;;13291:18;;;13284:43;3007:42:0;;3561:45;;13153:18:1;;3561:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3527:466;-1:-1:-1;;;;;3698:44:0;;;3694:284;;3767:94;;;;;3823:4;3767:94;;;13241:34:1;-1:-1:-1;;;;;13311:15:1;;13291:18;;;13284:43;3007:42:0;;3767:47;;13153:18:1;;3767:94:0;13006:327:1;3694:284:0;3910:48;;;;;3952:4;3910:48;;;12921:74:1;3007:42:0;;3910:33;;12894:18:1;;3910:48:0;12775:226:1;10938:1308:0;11019:7;11028:12;11253:9;:16;11273:2;11253:22;11249:990;;;11549:4;11534:20;;11528:27;11599:4;11584:20;;11578:27;11657:4;11642:20;;11636:27;11292:9;11628:36;11700:25;11711:4;11628:36;11528:27;11578;11700:10;:25::i;:::-;11693:32;;;;;;;;;11249:990;11747:9;:16;11767:2;11747:22;11743:496;;;12022:4;12007:20;;12001:27;12073:4;12058:20;;12052:27;12115:23;12126:4;12001:27;12052;12115:10;:23::i;:::-;12108:30;;;;;;;;11743:496;-1:-1:-1;12187:1:0;;-1:-1:-1;12191:35:0;12171:56;;9209:643;9287:20;9278:5;:29;;;;;;;;:::i;:::-;;9274:571;;;9209:643;:::o;9274:571::-;9385:29;9376:5;:38;;;;;;;;:::i;:::-;;9372:473;;;9431:34;;-1:-1:-1;;;9431:34:0;;16258:2:1;9431:34:0;;;16240:21:1;16297:2;16277:18;;;16270:30;16336:26;16316:18;;;16309:54;16380:18;;9431:34:0;16056:348:1;9372:473:0;9496:35;9487:5;:44;;;;;;;;:::i;:::-;;9483:362;;;9548:41;;-1:-1:-1;;;9548:41:0;;16968:2:1;9548:41:0;;;16950:21:1;17007:2;16987:18;;;16980:30;17046:33;17026:18;;;17019:61;17097:18;;9548:41:0;16766:355:1;9483:362:0;9620:30;9611:5;:39;;;;;;;;:::i;:::-;;9607:238;;;9667:44;;-1:-1:-1;;;9667:44:0;;20777:2:1;9667:44:0;;;20759:21:1;20816:2;20796:18;;;20789:30;20855:34;20835:18;;;20828:62;20926:4;20906:18;;;20899:32;20948:19;;9667:44:0;20575:398:1;9607:238:0;9742:30;9733:5;:39;;;;;;;;:::i;:::-;;9729:116;;;9789:44;;-1:-1:-1;;;9789:44:0;;23942:2:1;9789:44:0;;;23924:21:1;23981:2;23961:18;;;23954:30;24020:34;24000:18;;;23993:62;24091:4;24071:18;;;24064:32;24113:19;;9789:44:0;23740:398:1;14115:1632:0;14246:7;;15180:66;15167:79;;15163:163;;;-1:-1:-1;15279:1:0;;-1:-1:-1;15283:30:0;15263:51;;15163:163;15340:1;:7;;15345:2;15340:7;;:18;;;;;15351:1;:7;;15356:2;15351:7;;15340:18;15336:102;;;-1:-1:-1;15391:1:0;;-1:-1:-1;15395:30:0;15375:51;;15336:102;15552:24;;;15535:14;15552:24;;;;;;;;;15394:25:1;;;15467:4;15455:17;;15435:18;;;15428:45;;;;15489:18;;;15482:34;;;15532:18;;;15525:34;;;15552:24:0;;15366:19:1;;15552:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15552:24:0;;;;;;-1:-1:-1;;;;;;;15591:20:0;;15587:103;;15644:1;15648:29;15628:50;;;;;;;15587:103;15710:6;-1:-1:-1;15718:20:0;;-1:-1:-1;14115:1632:0;;;;;;;;:::o;13542:391::-;13656:7;;13765:66;13757:75;;13859:3;13855:12;;;13869:2;13851:21;13900:25;13911:4;13851:21;13920:1;13757:75;13900:10;:25::i;:::-;13893:32;;;;;;13542:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:134::-;552:20;;581:31;552:20;581:31;:::i;:::-;484:134;;;:::o;623:221::-;666:5;719:3;712:4;704:6;700:17;696:27;686:55;;737:1;734;727:12;686:55;759:79;834:3;825:6;812:20;805:4;797:6;793:17;759:79;:::i;:::-;750:88;623:221;-1:-1:-1;;;623:221:1:o;849:247::-;908:6;961:2;949:9;940:7;936:23;932:32;929:52;;;977:1;974;967:12;929:52;1016:9;1003:23;1035:31;1060:5;1035:31;:::i;1101:388::-;1169:6;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:52;;;1246:1;1243;1236:12;1198:52;1285:9;1272:23;1304:31;1329:5;1304:31;:::i;:::-;1354:5;-1:-1:-1;1411:2:1;1396:18;;1383:32;1424:33;1383:32;1424:33;:::i;:::-;1476:7;1466:17;;;1101:388;;;;;:::o;1494:456::-;1571:6;1579;1587;1640:2;1628:9;1619:7;1615:23;1611:32;1608:52;;;1656:1;1653;1646:12;1608:52;1695:9;1682:23;1714:31;1739:5;1714:31;:::i;:::-;1764:5;-1:-1:-1;1821:2:1;1806:18;;1793:32;1834:33;1793:32;1834:33;:::i;:::-;1494:456;;1886:7;;-1:-1:-1;;;1940:2:1;1925:18;;;;1912:32;;1494:456::o;1955:794::-;2050:6;2058;2066;2074;2127:3;2115:9;2106:7;2102:23;2098:33;2095:53;;;2144:1;2141;2134:12;2095:53;2183:9;2170:23;2202:31;2227:5;2202:31;:::i;:::-;2252:5;-1:-1:-1;2309:2:1;2294:18;;2281:32;2322:33;2281:32;2322:33;:::i;:::-;2374:7;-1:-1:-1;2428:2:1;2413:18;;2400:32;;-1:-1:-1;2483:2:1;2468:18;;2455:32;2510:18;2499:30;;2496:50;;;2542:1;2539;2532:12;2496:50;2565:22;;2618:4;2610:13;;2606:27;-1:-1:-1;2596:55:1;;2647:1;2644;2637:12;2596:55;2670:73;2735:7;2730:2;2717:16;2712:2;2708;2704:11;2670:73;:::i;:::-;2660:83;;;1955:794;;;;;;;:::o;2754:382::-;2819:6;2827;2880:2;2868:9;2859:7;2855:23;2851:32;2848:52;;;2896:1;2893;2886:12;2848:52;2935:9;2922:23;2954:31;2979:5;2954:31;:::i;:::-;3004:5;-1:-1:-1;3061:2:1;3046:18;;3033:32;3074:30;3033:32;3074:30;:::i;3141:890::-;3280:6;3288;3296;3304;3312;3320;3328;3381:3;3369:9;3360:7;3356:23;3352:33;3349:53;;;3398:1;3395;3388:12;3349:53;3437:9;3424:23;3456:31;3481:5;3456:31;:::i;:::-;3506:5;-1:-1:-1;3563:2:1;3548:18;;3535:32;3576:33;3535:32;3576:33;:::i;:::-;3628:7;-1:-1:-1;3682:2:1;3667:18;;3654:32;;-1:-1:-1;3733:2:1;3718:18;;3705:32;;-1:-1:-1;3784:3:1;3769:19;;3756:33;;-1:-1:-1;3836:3:1;3821:19;;3808:33;;-1:-1:-1;3892:3:1;3877:19;;3864:33;3920:18;3909:30;;3906:50;;;3952:1;3949;3942:12;3906:50;3975;4017:7;4008:6;3997:9;3993:22;3975:50;:::i;:::-;3965:60;;;3141:890;;;;;;;;;;:::o;4036:315::-;4104:6;4112;4165:2;4153:9;4144:7;4140:23;4136:32;4133:52;;;4181:1;4178;4171:12;4133:52;4220:9;4207:23;4239:31;4264:5;4239:31;:::i;:::-;4289:5;4341:2;4326:18;;;;4313:32;;-1:-1:-1;;;4036:315:1:o;4356:383::-;4433:6;4441;4449;4502:2;4490:9;4481:7;4477:23;4473:32;4470:52;;;4518:1;4515;4508:12;4470:52;4557:9;4544:23;4576:31;4601:5;4576:31;:::i;:::-;4626:5;4678:2;4663:18;;4650:32;;-1:-1:-1;4729:2:1;4714:18;;;4701:32;;4356:383;-1:-1:-1;;;4356:383:1:o;4744:1033::-;4837:6;4845;4898:2;4886:9;4877:7;4873:23;4869:32;4866:52;;;4914:1;4911;4904:12;4866:52;4954:9;4941:23;4983:18;5024:2;5016:6;5013:14;5010:34;;;5040:1;5037;5030:12;5010:34;5078:6;5067:9;5063:22;5053:32;;5123:7;5116:4;5112:2;5108:13;5104:27;5094:55;;5145:1;5142;5135:12;5094:55;5181:2;5168:16;5203:4;5226:2;5222;5219:10;5216:36;;;5232:18;;:::i;:::-;5278:2;5275:1;5271:10;5261:20;;5301:28;5325:2;5321;5317:11;5301:28;:::i;:::-;5363:15;;;5394:12;;;;5426:11;;;5456;;;5452:20;;5449:33;-1:-1:-1;5446:53:1;;;5495:1;5492;5485:12;5446:53;5517:1;5508:10;;5527:163;5541:2;5538:1;5535:9;5527:163;;;5598:17;;5586:30;;5559:1;5552:9;;;;;5636:12;;;;5668;;5527:163;;;-1:-1:-1;5709:5:1;-1:-1:-1;5733:38:1;;-1:-1:-1;5752:18:1;;;5733:38;:::i;:::-;5723:48;;;;;;4744:1033;;;;;:::o;5782:241::-;5838:6;5891:2;5879:9;5870:7;5866:23;5862:32;5859:52;;;5907:1;5904;5897:12;5859:52;5946:9;5933:23;5965:28;5987:5;5965:28;:::i;6028:245::-;6095:6;6148:2;6136:9;6127:7;6123:23;6119:32;6116:52;;;6164:1;6161;6154:12;6116:52;6196:9;6190:16;6215:28;6237:5;6215:28;:::i;6278:245::-;6336:6;6389:2;6377:9;6368:7;6364:23;6360:32;6357:52;;;6405:1;6402;6395:12;6357:52;6444:9;6431:23;6463:30;6487:5;6463:30;:::i;6528:249::-;6597:6;6650:2;6638:9;6629:7;6625:23;6621:32;6618:52;;;6666:1;6663;6656:12;6618:52;6698:9;6692:16;6717:30;6741:5;6717:30;:::i;6782:733::-;6870:6;6878;6886;6894;6947:2;6935:9;6926:7;6922:23;6918:32;6915:52;;;6963:1;6960;6953:12;6915:52;7003:9;6990:23;7032:18;7073:2;7065:6;7062:14;7059:34;;;7089:1;7086;7079:12;7059:34;7127:6;7116:9;7112:22;7102:32;;7172:7;7165:4;7161:2;7157:13;7153:27;7143:55;;7194:1;7191;7184:12;7143:55;7234:2;7221:16;7260:2;7252:6;7249:14;7246:34;;;7276:1;7273;7266:12;7246:34;7323:7;7316:4;7307:6;7303:2;7299:15;7295:26;7292:39;7289:59;;;7344:1;7341;7334:12;7289:59;7375:4;7367:13;;;;7399:6;;-1:-1:-1;7437:20:1;;;7424:34;;7505:2;7490:18;7477:32;;-1:-1:-1;6782:733:1;;-1:-1:-1;;;;6782:733:1:o;7788:322::-;7857:6;7910:2;7898:9;7889:7;7885:23;7881:32;7878:52;;;7926:1;7923;7916:12;7878:52;7966:9;7953:23;7999:18;7991:6;7988:30;7985:50;;;8031:1;8028;8021:12;7985:50;8054;8096:7;8087:6;8076:9;8072:22;8054:50;:::i;8115:180::-;8174:6;8227:2;8215:9;8206:7;8202:23;8198:32;8195:52;;;8243:1;8240;8233:12;8195:52;-1:-1:-1;8266:23:1;;8115:180;-1:-1:-1;8115:180:1:o;8300:184::-;8370:6;8423:2;8411:9;8402:7;8398:23;8394:32;8391:52;;;8439:1;8436;8429:12;8391:52;-1:-1:-1;8462:16:1;;8300:184;-1:-1:-1;8300:184:1:o;8489:315::-;8557:6;8565;8618:2;8606:9;8597:7;8593:23;8589:32;8586:52;;;8634:1;8631;8624:12;8586:52;8670:9;8657:23;8647:33;;8730:2;8719:9;8715:18;8702:32;8743:31;8768:5;8743:31;:::i;8809:248::-;8877:6;8885;8938:2;8926:9;8917:7;8913:23;8909:32;8906:52;;;8954:1;8951;8944:12;8906:52;-1:-1:-1;;8977:23:1;;;9047:2;9032:18;;;9019:32;;-1:-1:-1;8809:248:1:o;9062:316::-;9103:3;9141:5;9135:12;9168:6;9163:3;9156:19;9184:63;9240:6;9233:4;9228:3;9224:14;9217:4;9210:5;9206:16;9184:63;:::i;:::-;9292:2;9280:15;9297:66;9276:88;9267:98;;;;9367:4;9263:109;;9062:316;-1:-1:-1;;9062:316:1:o;9383:185::-;9425:3;9463:5;9457:12;9478:52;9523:6;9518:3;9511:4;9504:5;9500:16;9478:52;:::i;:::-;9546:16;;;;;9383:185;-1:-1:-1;;9383:185:1:o;9691:1416::-;9968:3;9997:1;10030:6;10024:13;10060:3;10082:1;10110:9;10106:2;10102:18;10092:28;;10170:2;10159:9;10155:18;10192;10182:61;;10236:4;10228:6;10224:17;10214:27;;10182:61;10262:2;10310;10302:6;10299:14;10279:18;10276:38;10273:222;;;10349:77;10344:3;10337:90;10450:4;10447:1;10440:15;10480:4;10475:3;10468:17;10273:222;10511:18;10538:162;;;;10714:1;10709:320;;;;10504:525;;10538:162;10586:66;10575:9;10571:82;10566:3;10559:95;10683:6;10678:3;10674:16;10667:23;;10538:162;;10709:320;28528:1;28521:14;;;28565:4;28552:18;;10804:1;10818:165;10832:6;10829:1;10826:13;10818:165;;;10910:14;;10897:11;;;10890:35;10953:16;;;;10847:10;;10818:165;;;10822:3;;11012:6;11007:3;11003:16;10996:23;;10504:525;;;;;;;11045:56;11070:30;11096:3;11088:6;11070:30;:::i;:::-;9645:7;9633:20;;9678:1;9669:11;;9573:113;11045:56;11038:63;9691:1416;-1:-1:-1;;;;;9691:1416:1:o;13338:511::-;13532:4;-1:-1:-1;;;;;13642:2:1;13634:6;13630:15;13619:9;13612:34;13694:2;13686:6;13682:15;13677:2;13666:9;13662:18;13655:43;;13734:6;13729:2;13718:9;13714:18;13707:34;13777:3;13772:2;13761:9;13757:18;13750:31;13798:45;13838:3;13827:9;13823:19;13815:6;13798:45;:::i;:::-;13790:53;13338:511;-1:-1:-1;;;;;;13338:511:1:o;14156:632::-;14327:2;14379:21;;;14449:13;;14352:18;;;14471:22;;;14298:4;;14327:2;14550:15;;;;14524:2;14509:18;;;14298:4;14593:169;14607:6;14604:1;14601:13;14593:169;;;14668:13;;14656:26;;14737:15;;;;14702:12;;;;14629:1;14622:9;14593:169;;;-1:-1:-1;14779:3:1;;14156:632;-1:-1:-1;;;;;;14156:632:1:o;15832:219::-;15981:2;15970:9;15963:21;15944:4;16001:44;16041:2;16030:9;16026:18;16018:6;16001:44;:::i;28116:334::-;28187:2;28181:9;28243:2;28233:13;;28248:66;28229:86;28217:99;;28346:18;28331:34;;28367:22;;;28328:62;28325:88;;;28393:18;;:::i;:::-;28429:2;28422:22;28116:334;;-1:-1:-1;28116:334:1:o;28581:128::-;28621:3;28652:1;28648:6;28645:1;28642:13;28639:39;;;28658:18;;:::i;:::-;-1:-1:-1;28694:9:1;;28581:128::o;28714:204::-;28752:3;28788:4;28785:1;28781:12;28820:4;28817:1;28813:12;28855:3;28849:4;28845:14;28840:3;28837:23;28834:49;;;28863:18;;:::i;:::-;28899:13;;28714:204;-1:-1:-1;;;28714:204:1:o;28923:120::-;28963:1;28989;28979:35;;28994:18;;:::i;:::-;-1:-1:-1;29028:9:1;;28923:120::o;29048:228::-;29088:7;29214:1;29146:66;29142:74;29139:1;29136:81;29131:1;29124:9;29117:17;29113:105;29110:131;;;29221:18;;:::i;:::-;-1:-1:-1;29261:9:1;;29048:228::o;29281:125::-;29321:4;29349:1;29346;29343:8;29340:34;;;29354:18;;:::i;:::-;-1:-1:-1;29391:9:1;;29281:125::o;29411:258::-;29483:1;29493:113;29507:6;29504:1;29501:13;29493:113;;;29583:11;;;29577:18;29564:11;;;29557:39;29529:2;29522:10;29493:113;;;29624:6;29621:1;29618:13;29615:48;;;-1:-1:-1;;29659:1:1;29641:16;;29634:27;29411:258::o;29674:437::-;29753:1;29749:12;;;;29796;;;29817:61;;29871:4;29863:6;29859:17;29849:27;;29817:61;29924:2;29916:6;29913:14;29893:18;29890:38;29887:218;;;29961:77;29958:1;29951:88;30062:4;30059:1;30052:15;30090:4;30087:1;30080:15;29887:218;;29674:437;;;:::o;30116:195::-;30155:3;30186:66;30179:5;30176:77;30173:103;;;30256:18;;:::i;:::-;-1:-1:-1;30303:1:1;30292:13;;30116:195::o;30316:112::-;30348:1;30374;30364:35;;30379:18;;:::i;:::-;-1:-1:-1;30413:9:1;;30316:112::o;30433:184::-;30485:77;30482:1;30475:88;30582:4;30579:1;30572:15;30606:4;30603:1;30596:15;30622:184;30674:77;30671:1;30664:88;30771:4;30768:1;30761:15;30795:4;30792:1;30785:15;30811:184;30863:77;30860:1;30853:88;30960:4;30957:1;30950:15;30984:4;30981:1;30974:15;31000:184;31052:77;31049:1;31042:88;31149:4;31146:1;31139:15;31173:4;31170:1;31163:15;31189:184;31241:77;31238:1;31231:88;31338:4;31335:1;31328:15;31362:4;31359:1;31352:15;31378:154;-1:-1:-1;;;;;31457:5:1;31453:54;31446:5;31443:65;31433:93;;31522:1;31519;31512:12;31537:118;31623:5;31616:13;31609:21;31602:5;31599:32;31589:60;;31645:1;31642;31635:12;31660:177;31745:66;31738:5;31734:78;31727:5;31724:89;31714:117;;31827:1;31824;31817:12
Swarm Source
ipfs://48b4ac5be65fe9de700a5819aef1151e79f9aea5a129ce655ec941b4a92db4ba
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.