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
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ChadInuVIPClub
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: MIT import "./ERC721Upgradeable.sol"; import "./Counters.sol"; import "./IERC20.sol"; import "./StringsUpgradeable.sol"; import "./Initializable.sol"; import "./OwnableUpgradable.sol"; import "./ContextUpgradeable.sol"; pragma solidity ^0.8.0; contract ChadInuVIPClub is Initializable, OwnableUpgradeable, ERC721Upgradeable { using Counters for Counters.Counter; struct VIPCardEntity { uint256 creationTime; address account; string referrerCode; uint256 rewardAmount; bool isReferred; bool isOutDeadline; } mapping(address => string[]) private _subRefOfUser; mapping(string => VIPCardEntity) private _vipCardOfUser; mapping(address => string) private _userOfAccount; mapping(address => uint256) private _ownerOfId; mapping(address => bool) public _isWhitelisted; Counters.Counter private _tokenIds; mapping (uint256 => string) private _tokenURIs; IERC20 public token; uint256 public refFee; uint256 public escowFee; uint256 public primaryFee; address public secondaryDevAddress; uint256 public referralDeadline; uint256 public mintingPrice; uint256 public mintingPriceWithRef; string public baseTokenURI; event NFTMinted ( uint256 tokenId, address account, string usercode, string referrerCode, string metadataUri ); function initialize() public initializer { __ERC721_init_unchained("Chadinu VIP Card", "VIP Card"); __Ownable_init_unchained(); refFee = 33; escowFee = 33; primaryFee = 75; secondaryDevAddress = 0xC040e348fC48Ecd2ab355499211BF208B3891837; referralDeadline = 86400 * 14; mintingPrice = 2 * 10**17; mintingPriceWithRef = 15 * 10**16; } function _transfer( address from, address to, uint256 tokenId ) internal override { require(from == address(0), "You can't transfer this NFT."); super._transfer( from, to, tokenId ); } function mintNFT(address owner, string memory metadataURI) internal returns (uint256) { _tokenIds.increment(); uint256 id = _tokenIds.current(); _safeMint( owner, id ); _setTokenURI( id, metadataURI ); return id; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(baseTokenURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked( baseTokenURI, _tokenURI )); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked( baseTokenURI, StringsUpgradeable.toString(tokenId) )); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function MintVIPCard( string memory usercode, string memory metadataURI ) external payable returns (uint256) { require(msg.value >= mintingPrice || _isWhitelisted[msg.sender], "Insufficient Fund"); payToMintWithoutReferrer( _msgSender(), usercode ); uint256 id = mintNFT( _msgSender(), metadataURI ); _ownerOfId[_msgSender()] = id; if (msg.value > mintingPrice) payable(_msgSender()).transfer(msg.value - mintingPrice); emit NFTMinted( id, _msgSender(), usercode, "", metadataURI ); return id; } function MintVIPCardWithReferreral( string memory usercode, string memory referrerCode, string memory metadataURI ) external payable returns (uint256) { require(msg.value >= mintingPriceWithRef, "Insufficient Fund"); payToMintWithReferrer( _msgSender(), usercode, referrerCode ); uint256 id = mintNFT( _msgSender(), metadataURI ); _ownerOfId[_msgSender()] = id; if (msg.value > mintingPriceWithRef) payable(_msgSender()).transfer(msg.value - mintingPriceWithRef); emit NFTMinted( id, _msgSender(), usercode, referrerCode, metadataURI ); return id; } function payToMintWithoutReferrer(address creator, string memory usercode) internal { require(bytes(_userOfAccount[creator]).length < 2, "Account has already minted an NFT."); require(bytes(usercode).length > 1 && bytes(usercode).length < 16, "ERROR: user code length is invalid"); require(creator != address(0), "CSHT: zero address can't create"); require(_vipCardOfUser[usercode].account == address(0), "user code is already used"); _vipCardOfUser[usercode] = VIPCardEntity({ creationTime: block.timestamp, account: creator, referrerCode: "", rewardAmount: 0, isReferred: false, isOutDeadline: false }); _userOfAccount[creator] = usercode; if (_isWhitelisted[creator]) return; payable(secondaryDevAddress).transfer(mintingPrice); } function payToMintWithReferrer(address creator, string memory usercode, string memory referrerCode) internal returns (bool) { require(bytes(_userOfAccount[creator]).length < 2, "Account has already minted an NFT."); require(bytes(usercode).length > 1 && bytes(usercode).length < 16, "ERROR: user code length is invalid"); require(bytes(referrerCode).length > 1 && bytes(referrerCode).length < 16, "ERROR: referrer code length is invalid"); require(_vipCardOfUser[usercode].account == address(0), "usercode is already used"); require(creator != address(0), "CSHT: creation from the zero address"); require(_vipCardOfUser[referrerCode].account != address(0), "referrer code is not exisiting"); require(_vipCardOfUser[referrerCode].account != creator, "creator couldn't be same as referrer"); uint256 escrowAmount = (mintingPriceWithRef * escowFee) / 100; uint256 refAmount = (mintingPriceWithRef * refFee) / 100; uint256 devAmount = mintingPriceWithRef - escrowAmount - refAmount; VIPCardEntity memory _ref = _vipCardOfUser[referrerCode]; _subRefOfUser[_ref.account].push(usercode); if (_ref.isOutDeadline != true && bytes(_ref.referrerCode).length > 1) { VIPCardEntity storage _refT = _vipCardOfUser[referrerCode]; if (block.timestamp - _ref.creationTime < referralDeadline) { if(_ref.rewardAmount > 0) payable(_vipCardOfUser[_ref.referrerCode].account).transfer(_ref.rewardAmount); _refT.isReferred = true; } else { _refT.isReferred = false; } _refT.isOutDeadline = true; } if (mintingPriceWithRef > 100) { payable(_ref.account).transfer(refAmount); payable(secondaryDevAddress).transfer(devAmount); } _vipCardOfUser[usercode] = VIPCardEntity({ creationTime: block.timestamp, account: creator, referrerCode: referrerCode, rewardAmount: escrowAmount, isReferred: false, isOutDeadline: false }); _userOfAccount[creator] = usercode; return true; } function isCodeAvailable(string memory code) external view returns(bool) { return ( _vipCardOfUser[code].creationTime==0 && bytes(code).length > 1 && bytes(code).length < 16 ); } function addWhitelist(address account, bool value) external { require(msg.sender == address(token) || msg.sender == owner(), "Access Denied"); _isWhitelisted[account] = value; } function checkWhitelisted(address account) external view returns(bool) { return _isWhitelisted[account]; } function getSubReferralLength(address account) external view returns (uint256) { return _subRefOfUser[account].length; } function getSubReferral(address account, uint16 startIndex, uint16 endIndex) external view returns (string memory) { require(_subRefOfUser[account].length > endIndex, "GET SUB REFERRERS: Out of Range"); string[] memory subRefs = _subRefOfUser[account]; VIPCardEntity memory _ref; string memory refsStr = ""; string memory separator = "#"; for (uint256 i=startIndex; i < endIndex+1; i++) { _ref = _vipCardOfUser[subRefs[i]]; refsStr = string(abi.encodePacked( refsStr, separator, _userOfAccount[_ref.account], separator, toAsciiString(_ref.account), separator, StringsUpgradeable.toString(_ref.creationTime), separator, StringsUpgradeable.toString(_ref.rewardAmount) )); if (_ref.isReferred == true) { string[] memory childRefStrs = _subRefOfUser[_ref.account]; VIPCardEntity memory _childRef = _vipCardOfUser[childRefStrs[0]]; refsStr = string(abi.encodePacked(refsStr, separator, "1", separator, StringsUpgradeable.toString(_childRef.creationTime))); } else { refsStr = string(abi.encodePacked(refsStr, separator, "0", separator, "0")); } if (_ref.isOutDeadline == true) { refsStr = string(abi.encodePacked(refsStr, separator, "1")); } else { refsStr = string(abi.encodePacked(refsStr, separator, "0")); } } return refsStr; } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } receive() external payable {} function boostProject(uint256 amount) public onlyOwner { if (amount > address(this).balance) amount = address(this).balance; payable(owner()).transfer(amount); } function setBaseToken(address newAddress) external onlyOwner { require(newAddress!=address(token), "New token address is same as old one"); token = IERC20(newAddress); } function getbalanceOf(address account) external view returns (uint256) { return token.balanceOf(account); } function getIdOfUser(address account) external view returns (uint256) { require(account != address(0), "address CAN'T BE ZERO"); return _ownerOfId[account]; } function getUsercode(address account) external view returns (string memory) { return _userOfAccount[account]; } function getMintPrice() external view returns (uint256) { return mintingPrice; } function setMintingPrice(uint256 newMintingPrice) external onlyOwner { mintingPrice = newMintingPrice; } function getMintPriceWithRef() external view returns (uint256) { return mintingPriceWithRef; } function setMintingPriceWithRef(uint256 newMintingPriceWithRef) external onlyOwner { mintingPriceWithRef = newMintingPriceWithRef; } function getSecondaryDevAddress() external view returns (address) { return secondaryDevAddress; } function setSecondaryDevAddress(address newAddress) external onlyOwner { require(newAddress!=secondaryDevAddress, "New secondary dev address is same as old one"); secondaryDevAddress = newAddress; } function getReferreralDeadline() external view returns (uint256) { return referralDeadline; } function changeReferreralDeadline(uint256 newDeadline) external onlyOwner { referralDeadline = newDeadline; } function changeRefFee(uint256 value) external onlyOwner { refFee = value; } function changeEscowFee(uint256 value) external onlyOwner { escowFee = value; } function changePrimaryFee(uint256 value) external onlyOwner { primaryFee = value; } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) external onlyOwner { baseTokenURI = baseURI; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "./Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "./Initializable.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; import "./IERC721ReceiverUpgradeable.sol"; import "./IERC721MetadataUpgradeable.sol"; import "./AddressUpgradeable.sol"; import "./ContextUpgradeable.sol"; import "./StringsUpgradeable.sol"; import "./ERC165Upgradeable.sol"; import "./Initializable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev 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 ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "./AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./ContextUpgradeable.sol"; import "./Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"string","name":"usercode","type":"string"},{"indexed":false,"internalType":"string","name":"referrerCode","type":"string"},{"indexed":false,"internalType":"string","name":"metadataUri","type":"string"}],"name":"NFTMinted","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":[{"internalType":"string","name":"usercode","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"MintVIPCard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"usercode","type":"string"},{"internalType":"string","name":"referrerCode","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"MintVIPCardWithReferreral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boostProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeEscowFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changePrimaryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeRefFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"changeReferreralDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escowFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getIdOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPriceWithRef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferreralDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"}],"name":"getSubReferral","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getSubReferralLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUsercode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getbalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"isCodeAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPriceWithRef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingPrice","type":"uint256"}],"name":"setMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingPriceWithRef","type":"uint256"}],"name":"setMintingPriceWithRef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSecondaryDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061428b806100206000396000f3fe6080604052600436106102e85760003560e01c80638129fc1c11610190578063c87b56dd116100dc578063decc1a8611610095578063f2fde38b1161006f578063f2fde38b146108de578063f9cb9e89146108fe578063fc0c546a14610914578063fcc9d2621461093457600080fd5b8063decc1a861461085f578063e985e9c51461087f578063ec2e0ab3146108c857600080fd5b8063c87b56dd146107c0578063d547cfb7146107e0578063d68cda3b146107f5578063d848f3ea1461080a578063dc88fdb71461082a578063dcf141ea1461083f57600080fd5b8063a22cb46511610149578063b211e93811610123578063b211e9381461074d578063b24f4b8d14610760578063b65076a214610780578063b88d4fde146107a057600080fd5b8063a22cb465146106f8578063a7f93ebd14610718578063a879b6321461072d57600080fd5b80638129fc1c146106425780638417b47f146106575780638ae21b66146106775780638da5cb5b1461069557806395d89b41146106b35780639cee2142146106c857600080fd5b806342842e0e1161024f5780636352211e11610208578063715018a6116101e2578063715018a6146105d75780637561a71d146105ec57806378e8cde1146106025780637c43548c1461062257600080fd5b80636352211e1461057757806370a082311461059757806370e224ba146105b757600080fd5b806342842e0e146104ce57806343fa5e6a146104ee57806347e851fa1461050157806348ed51ca146105215780635580d89c1461054157806355f804b31461055757600080fd5b806317061e65116102a157806317061e65146103e957806320d8dad01461040957806323b872dd1461044257806335db70b5146104625780633714020e1461047857806340015e601461049857600080fd5b806301ffc9a7146102f457806306fdde0314610329578063081812fc1461034b578063095ea7b3146103835780630e68460e146103a557806316bb6c13146103c957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613585565b610954565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061033e6109a6565b60405161032091906135fa565b34801561035757600080fd5b5061036b61036636600461360d565b610a38565b6040516001600160a01b039091168152602001610320565b34801561038f57600080fd5b506103a361039e36600461363d565b610ad2565b005b3480156103b157600080fd5b506103bb60d75481565b604051908152602001610320565b3480156103d557600080fd5b506103a36103e4366004613667565b610be8565b3480156103f557600080fd5b506103a361040436600461360d565b610c9e565b34801561041557600080fd5b50610314610424366004613667565b6001600160a01b0316600090815260cd602052604090205460ff1690565b34801561044e57600080fd5b506103a361045d366004613682565b610d11565b34801561046e57600080fd5b506103bb60d65481565b34801561048457600080fd5b506103a36104933660046136be565b610d42565b3480156104a457600080fd5b506103bb6104b3366004613667565b6001600160a01b0316600090815260c9602052604090205490565b3480156104da57600080fd5b506103a36104e9366004613682565b610dcc565b6103bb6104fc3660046137a6565b610de7565b34801561050d57600080fd5b506103bb61051c366004613667565b610eeb565b34801561052d57600080fd5b5061033e61053c366004613840565b610f5a565b34801561054d57600080fd5b506103bb60d55481565b34801561056357600080fd5b506103a3610572366004613883565b6115cb565b34801561058357600080fd5b5061036b61059236600461360d565b611608565b3480156105a357600080fd5b506103bb6105b2366004613667565b61167f565b3480156105c357600080fd5b506103bb6105d2366004613667565b611706565b3480156105e357600080fd5b506103a3611772565b3480156105f857600080fd5b506103bb60d35481565b34801561060e57600080fd5b506103a361061d36600461360d565b6117a8565b34801561062e57600080fd5b506103a361063d36600461360d565b6117d7565b34801561064e57600080fd5b506103a3611806565b34801561066357600080fd5b506103a361067236600461360d565b6118ed565b34801561068357600080fd5b5060d4546001600160a01b031661036b565b3480156106a157600080fd5b506033546001600160a01b031661036b565b3480156106bf57600080fd5b5061033e61191c565b3480156106d457600080fd5b506103146106e3366004613667565b60cd6020526000908152604090205460ff1681565b34801561070457600080fd5b506103a36107133660046136be565b61192b565b34801561072457600080fd5b5060d6546103bb565b34801561073957600080fd5b5060d45461036b906001600160a01b031681565b6103bb61075b3660046138b8565b611936565b34801561076c57600080fd5b5061031461077b366004613883565b611a4d565b34801561078c57600080fd5b506103a361079b36600461360d565b611a8c565b3480156107ac57600080fd5b506103a36107bb36600461391c565b611abb565b3480156107cc57600080fd5b5061033e6107db36600461360d565b611af3565b3480156107ec57600080fd5b5061033e611c74565b34801561080157600080fd5b5060d7546103bb565b34801561081657600080fd5b506103a361082536600461360d565b611d02565b34801561083657600080fd5b5060d5546103bb565b34801561084b57600080fd5b506103a361085a366004613667565b611d31565b34801561086b57600080fd5b506103a361087a36600461360d565b611df0565b34801561088b57600080fd5b5061031461089a366004613998565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b3480156108d457600080fd5b506103bb60d15481565b3480156108ea57600080fd5b506103a36108f9366004613667565b611e1f565b34801561090a57600080fd5b506103bb60d25481565b34801561092057600080fd5b5060d05461036b906001600160a01b031681565b34801561094057600080fd5b5061033e61094f366004613667565b611eb7565b60006001600160e01b031982166380ac58cd60e01b148061098557506001600160e01b03198216635b5e139f60e01b145b806109a057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609780546109b5906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e1906139cb565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000818152609960205260408120546001600160a01b0316610ab65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609b60205260409020546001600160a01b031690565b6000610add82611608565b9050806001600160a01b0316836001600160a01b03161415610b4b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610aad565b336001600160a01b0382161480610b675750610b67813361089a565b610bd95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610aad565b610be38383611f63565b505050565b6033546001600160a01b03163314610c125760405162461bcd60e51b8152600401610aad90613a06565b60d0546001600160a01b0382811691161415610c7c5760405162461bcd60e51b8152602060048201526024808201527f4e657720746f6b656e20616464726573732069732073616d65206173206f6c64604482015263206f6e6560e01b6064820152608401610aad565b60d080546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610aad90613a06565b47811115610cd35750475b6033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d0d573d6000803e3d6000fd5b5050565b610d1b3382611fd1565b610d375760405162461bcd60e51b8152600401610aad90613a3b565b610be38383836120c8565b60d0546001600160a01b0316331480610d6557506033546001600160a01b031633145b610da15760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b6044820152606401610aad565b6001600160a01b0391909116600090815260cd60205260409020805460ff1916911515919091179055565b610be383838360405180602001604052806000815250611abb565b600060d754341015610e2f5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610aad565b610e3a33858561212a565b506000610e48335b8461283e565b33600090815260cc6020526040902081905560d754909150341115610ea45760d75433906108fc90610e7a9034613aa2565b6040518115909202916000818181858888f19350505050158015610ea2573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb8133878787604051610edb959493929190613ab9565b60405180910390a1949350505050565b60d0546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401602060405180830381865afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190613b15565b6001600160a01b038316600090815260c9602052604090205460609061ffff831610610fc85760405162461bcd60e51b815260206004820152601f60248201527f47455420535542205245464552524552533a204f7574206f662052616e6765006044820152606401610aad565b6001600160a01b038416600090815260c96020908152604080832080548251818502810185019093528083529192909190849084015b828210156110aa57838290600052602060002001805461101d906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611049906139cb565b80156110965780601f1061106b57610100808354040283529160200191611096565b820191906000526020600020905b81548152906001019060200180831161107957829003601f168201915b505050505081526020019060010190610ffe565b5050505090506110f66040518060c001604052806000815260200160006001600160a01b0316815260200160608152602001600081526020016000151581526020016000151581525090565b604080516020808201835260008252825180840190935260018352602360f81b908301529061ffff87165b61112c876001613b2e565b61ffff168110156115be5760ca85828151811061114b5761114b613b54565b60200260200101516040516111609190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916111a5906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546111d1906139cb565b801561121e5780601f106111f35761010080835404028352916020019161121e565b820191906000526020600020905b81548152906001019060200180831161120157829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff808216151560408085019190915261010090920416151560609092019190915282820180516001600160a01b0316600090815260cb909352912090519195508491849190829061128b90612876565b866112998a600001516129bd565b886112a78c606001516129bd565b6040516020016112bf99989796959493929190613c20565b604051602081830303815290604052925083608001511515600115151415611528576020808501516001600160a01b0316600090815260c9825260408082208054825181860281018601909352808352929391929091849084015b828210156113c6578382906000526020600020018054611339906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611365906139cb565b80156113b25780601f10611387576101008083540402835291602001916113b2565b820191906000526020600020905b81548152906001019060200180831161139557829003601f168201915b50505050508152602001906001019061131a565b505050509050600060ca826000815181106113e3576113e3613b54565b60200260200101516040516113f89190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b031691840191909152600281018054919284019161143d906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611469906139cb565b80156114b65780601f1061148b576101008083540402835291602001916114b6565b820191906000526020600020905b81548152906001019060200180831161149957829003601f168201915b50505091835250506003820154602082015260049091015460ff8082161515604084015261010090910416151560609091015280519091508590859081906114fd906129bd565b6040516020016115109493929190613cd4565b6040516020818303038152906040529450505061154f565b82828360405160200161153d93929190613d3b565b60405160208183030381529060405292505b60a0840151151560011415611587578282604051602001611571929190613d95565b60405160208183030381529060405292506115ac565b828260405160200161159a929190613dd0565b60405160208183030381529060405292505b806115b681613e0b565b915050611121565b5090979650505050505050565b6033546001600160a01b031633146115f55760405162461bcd60e51b8152600401610aad90613a06565b8051610d0d9060d89060208401906134d6565b6000818152609960205260408120546001600160a01b0316806109a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610aad565b60006001600160a01b0382166116ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610aad565b506001600160a01b03166000908152609a602052604090205490565b60006001600160a01b0382166117565760405162461bcd60e51b8152602060048201526015602482015274616464726573732043414e2754204245205a45524f60581b6044820152606401610aad565b506001600160a01b0316600090815260cc602052604090205490565b6033546001600160a01b0316331461179c5760405162461bcd60e51b8152600401610aad90613a06565b6117a66000612abb565b565b6033546001600160a01b031633146117d25760405162461bcd60e51b8152600401610aad90613a06565b60d555565b6033546001600160a01b031633146118015760405162461bcd60e51b8152600401610aad90613a06565b60d355565b60006118126001612b0d565b9050801561182a576000805461ff0019166101001790555b61187c6040518060400160405280601081526020016f10da18591a5b9d481592540810d85c9960821b815250604051806040016040528060088152602001671592540810d85c9960c21b815250612b9a565b611884612be8565b602160d181905560d255604b60d35560d480546001600160a01b03191673c040e348fc48ecd2ab355499211bf208b38918371790556212750060d5556702c68af0bb14000060d655670214e8348c4f000060d75580156118ea576000805461ff00191690555b50565b6033546001600160a01b031633146119175760405162461bcd60e51b8152600401610aad90613a06565b60d655565b6060609880546109b5906139cb565b610d0d338383612c18565b600060d65434101580611958575033600090815260cd602052604090205460ff165b6119985760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610aad565b6119a23384612ce7565b60006119ad33610e42565b33600090815260cc6020526040902081905560d654909150341115611a095760d65433906108fc906119df9034613aa2565b6040518115909202916000818181858888f19350505050158015611a07573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb81338686604051611a3e9493929190613e26565b60405180910390a19392505050565b600060ca82604051611a5f9190613b6a565b90815260405190819003602001902054158015611a7d575060018251115b80156109a05750505160101190565b6033546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610aad90613a06565b60d755565b611ac53383611fd1565b611ae15760405162461bcd60e51b8152600401610aad90613a3b565b611aed84848484612fac565b50505050565b6000818152609960205260409020546060906001600160a01b0316611b725760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610aad565b600082815260cf602052604081208054611b8b906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb7906139cb565b8015611c045780601f10611bd957610100808354040283529160200191611c04565b820191906000526020600020905b815481529060010190602001808311611be757829003601f168201915b5050505050905060d88054611c18906139cb565b15159050611c265792915050565b805115611c585760d881604051602001611c41929190613e7f565b604051602081830303815290604052915050919050565b60d8611c63846129bd565b604051602001611c41929190613e7f565b60d88054611c81906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad906139cb565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505081565b6033546001600160a01b03163314611d2c5760405162461bcd60e51b8152600401610aad90613a06565b60d255565b6033546001600160a01b03163314611d5b5760405162461bcd60e51b8152600401610aad90613a06565b60d4546001600160a01b0382811691161415611dce5760405162461bcd60e51b815260206004820152602c60248201527f4e6577207365636f6e646172792064657620616464726573732069732073616d60448201526b65206173206f6c64206f6e6560a01b6064820152608401610aad565b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611e1a5760405162461bcd60e51b8152600401610aad90613a06565b60d155565b6033546001600160a01b03163314611e495760405162461bcd60e51b8152600401610aad90613a06565b6001600160a01b038116611eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aad565b6118ea81612abb565b6001600160a01b038116600090815260cb60205260409020805460609190611ede906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0a906139cb565b8015611f575780601f10611f2c57610100808354040283529160200191611f57565b820191906000526020600020905b815481529060010190602001808311611f3a57829003601f168201915b50505050509050919050565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9882611608565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152609960205260408120546001600160a01b031661204a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610aad565b600061205583611608565b9050806001600160a01b0316846001600160a01b0316148061209c57506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b806120c05750836001600160a01b03166120b584610a38565b6001600160a01b0316145b949350505050565b6001600160a01b0383161561211f5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e2774207472616e736665722074686973204e46542e000000006044820152606401610aad565b610be3838383612fdf565b6001600160a01b038316600090815260cb60205260408120805460029190612151906139cb565b9050106121705760405162461bcd60e51b8152600401610aad90613e9b565b60018351118015612182575060108351105b61219e5760405162461bcd60e51b8152600401610aad90613edd565b600182511180156121b0575060108251105b61220c5760405162461bcd60e51b815260206004820152602760248201527f4552524f523a2020726566657272657220636f6465206c656e677468206973206044820152661a5b9d985b1a5960ca1b6064820152608401610aad565b60006001600160a01b031660ca846040516122279190613b6a565b908152604051908190036020019020600101546001600160a01b0316146122905760405162461bcd60e51b815260206004820152601860248201527f75736572636f646520697320616c7265616479207573656400000000000000006044820152606401610aad565b6001600160a01b0384166122f45760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aad565b60006001600160a01b031660ca8360405161230f9190613b6a565b908152604051908190036020019020600101546001600160a01b031614156123795760405162461bcd60e51b815260206004820152601e60248201527f726566657272657220636f6465206973206e6f7420657869736974696e6700006044820152606401610aad565b836001600160a01b031660ca836040516123939190613b6a565b908152604051908190036020019020600101546001600160a01b031614156124095760405162461bcd60e51b8152602060048201526024808201527f63726561746f7220636f756c646e27742062652073616d652061732072656665604482015263393932b960e11b6064820152608401610aad565b6000606460d25460d75461241d9190613f20565b6124279190613f55565b90506000606460d15460d75461243d9190613f20565b6124479190613f55565b90506000818360d75461245a9190613aa2565b6124649190613aa2565b9050600060ca866040516124789190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916124bd906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546124e9906139cb565b80156125365780601f1061250b57610100808354040283529160200191612536565b820191906000526020600020905b81548152906001019060200180831161251957829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff8082161515604080850191909152610100909204161515606090920191909152828201516001600160a01b0316600090815260c983529081208054600181018255908252908290208a519394506125b0939101918a01906134d6565b5060a081015115156001148015906125cd57506001816040015151115b156126aa57600060ca876040516125e49190613b6a565b9081526020016040518091039020905060d5548260000151426126079190613aa2565b101561268c576060820151156126785760ca826040015160405161262b9190613b6a565b9081526040519081900360200181206001015460608401516001600160a01b039091169181156108fc0291906000818181858888f19350505050158015612676573d6000803e3d6000fd5b505b60048101805460ff19166001179055612699565b60048101805460ff191690555b600401805461ff0019166101001790555b606460d754111561272f5780602001516001600160a01b03166108fc849081150290604051600060405180830381858888f193505050501580156126f2573d6000803e3d6000fd5b5060d4546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561272d573d6000803e3d6000fd5b505b6040805160c0810182524281526001600160a01b038a1660208201528082018890526060810186905260006080820181905260a0820152905160ca90612776908a90613b6a565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b0390921691909117905590830151805191926127ca926002850192909101906134d6565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038816600090815260cb60209081526040909120885161282f928a01906134d6565b50600198975050505050505050565b600061284e60ce80546001019055565b600061285960ce5490565b9050612865848261317b565b61286f8184613195565b9392505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b60148110156129b65760006128b3826013613aa2565b6128be906008613f20565b6128c990600261404d565b6128dc906001600160a01b038716613f55565b60f81b9050600060108260f81c6128f39190614059565b60f81b905060008160f81c601061290a919061407b565b8360f81c612918919061409c565b60f81b90506129268261322d565b85612932866002613f20565b8151811061294257612942613b54565b60200101906001600160f81b031916908160001a9053506129628161322d565b8561296e866002613f20565b6129799060016140bf565b8151811061298957612989613b54565b60200101906001600160f81b031916908160001a90535050505080806129ae90613e0b565b91505061289d565b5092915050565b6060816129e15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a0b57806129f581613e0b565b9150612a049050600a83613f55565b91506129e5565b60008167ffffffffffffffff811115612a2657612a266136fa565b6040519080825280601f01601f191660200182016040528015612a50576020820181803683370190505b5090505b84156120c057612a65600183613aa2565b9150612a72600a866140d7565b612a7d9060306140bf565b60f81b818381518110612a9257612a92613b54565b60200101906001600160f81b031916908160001a905350612ab4600a86613f55565b9450612a54565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615612b54578160ff166001148015612b305750303b155b612b4c5760405162461bcd60e51b8152600401610aad906140eb565b506000919050565b60005460ff808416911610612b7b5760405162461bcd60e51b8152600401610aad906140eb565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff16612bc15760405162461bcd60e51b8152600401610aad90614139565b8151612bd49060979060208501906134d6565b508051610be39060989060208401906134d6565b600054610100900460ff16612c0f5760405162461bcd60e51b8152600401610aad90614139565b6117a633612abb565b816001600160a01b0316836001600160a01b03161415612c7a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610aad565b6001600160a01b038381166000818152609c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038216600090815260cb60205260409020805460029190612d0e906139cb565b905010612d2d5760405162461bcd60e51b8152600401610aad90613e9b565b60018151118015612d3f575060108151105b612d5b5760405162461bcd60e51b8152600401610aad90613edd565b6001600160a01b038216612db15760405162461bcd60e51b815260206004820181905260248201527f435348543a20207a65726f20616464726573732063616e2774206372656174656044820152606401610aad565b60006001600160a01b031660ca82604051612dcc9190613b6a565b908152604051908190036020019020600101546001600160a01b031614612e355760405162461bcd60e51b815260206004820152601960248201527f7573657220636f646520697320616c72656164792075736564000000000000006044820152606401610aad565b6040518060c00160405280428152602001836001600160a01b03168152602001604051806020016040528060008152508152602001600081526020016000151581526020016000151581525060ca82604051612e919190613b6a565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b039092169190911790559083015180519192612ee5926002850192909101906134d6565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038216600090815260cb602090815260409091208251612f4a928401906134d6565b506001600160a01b038216600090815260cd602052604090205460ff1615612f70575050565b60d45460d6546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610be3573d6000803e3d6000fd5b612fb78484846120c8565b612fc384848484613263565b611aed5760405162461bcd60e51b8152600401610aad90614184565b826001600160a01b0316612ff282611608565b6001600160a01b0316146130565760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610aad565b6001600160a01b0382166130b85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aad565b6130c3600082611f63565b6001600160a01b0383166000908152609a602052604081208054600192906130ec908490613aa2565b90915550506001600160a01b0382166000908152609a6020526040812080546001929061311a9084906140bf565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d0d828260405180602001604052806000815250613361565b6000828152609960205260409020546001600160a01b031661320e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610aad565b600082815260cf602090815260409091208251610be3928401906134d6565b6000600a60f883901c10156132545761324b60f883901c60306141d6565b60f81b92915050565b61324b60f883901c60576141d6565b60006001600160a01b0384163b1561335657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132a79033908990889088906004016141fb565b6020604051808303816000875af19250505080156132e2575060408051601f3d908101601f191682019092526132df91810190614238565b60015b61333c573d808015613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5080516133345760405162461bcd60e51b8152600401610aad90614184565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120c0565b506001949350505050565b61336b8383613394565b6133786000848484613263565b610be35760405162461bcd60e51b8152600401610aad90614184565b6001600160a01b0382166133ea5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aad565b6000818152609960205260409020546001600160a01b03161561344f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aad565b6001600160a01b0382166000908152609a602052604081208054600192906134789084906140bf565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546134e2906139cb565b90600052602060002090601f016020900481019282613504576000855561354a565b82601f1061351d57805160ff191683800117855561354a565b8280016001018555821561354a579182015b8281111561354a57825182559160200191906001019061352f565b5061355692915061355a565b5090565b5b80821115613556576000815560010161355b565b6001600160e01b0319811681146118ea57600080fd5b60006020828403121561359757600080fd5b813561286f8161356f565b60005b838110156135bd5781810151838201526020016135a5565b83811115611aed5750506000910152565b600081518084526135e68160208601602086016135a2565b601f01601f19169290920160200192915050565b60208152600061286f60208301846135ce565b60006020828403121561361f57600080fd5b5035919050565b80356001600160a01b0381168114612b9557600080fd5b6000806040838503121561365057600080fd5b61365983613626565b946020939093013593505050565b60006020828403121561367957600080fd5b61286f82613626565b60008060006060848603121561369757600080fd5b6136a084613626565b92506136ae60208501613626565b9150604084013590509250925092565b600080604083850312156136d157600080fd5b6136da83613626565b9150602083013580151581146136ef57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561372b5761372b6136fa565b604051601f8501601f19908116603f01168101908282118183101715613753576137536136fa565b8160405280935085815286868601111561376c57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261379757600080fd5b61286f83833560208501613710565b6000806000606084860312156137bb57600080fd5b833567ffffffffffffffff808211156137d357600080fd5b6137df87838801613786565b945060208601359150808211156137f557600080fd5b61380187838801613786565b9350604086013591508082111561381757600080fd5b5061382486828701613786565b9150509250925092565b803561ffff81168114612b9557600080fd5b60008060006060848603121561385557600080fd5b61385e84613626565b925061386c6020850161382e565b915061387a6040850161382e565b90509250925092565b60006020828403121561389557600080fd5b813567ffffffffffffffff8111156138ac57600080fd5b6120c084828501613786565b600080604083850312156138cb57600080fd5b823567ffffffffffffffff808211156138e357600080fd5b6138ef86838701613786565b9350602085013591508082111561390557600080fd5b5061391285828601613786565b9150509250929050565b6000806000806080858703121561393257600080fd5b61393b85613626565b935061394960208601613626565b925060408501359150606085013567ffffffffffffffff81111561396c57600080fd5b8501601f8101871361397d57600080fd5b61398c87823560208401613710565b91505092959194509250565b600080604083850312156139ab57600080fd5b6139b483613626565b91506139c260208401613626565b90509250929050565b600181811c908216806139df57607f821691505b60208210811415613a0057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015613ab457613ab4613a8c565b500390565b8581526001600160a01b038516602082015260a060408201819052600090613ae3908301866135ce565b8281036060840152613af581866135ce565b90508281036080840152613b0981856135ce565b98975050505050505050565b600060208284031215613b2757600080fd5b5051919050565b600061ffff808316818516808303821115613b4b57613b4b613a8c565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008251613b7c8184602087016135a2565b9190910192915050565b8054600090600181811c9080831680613ba057607f831692505b6020808410821415613bc257634e487b7160e01b600052602260045260246000fd5b818015613bd65760018114613be757613c14565b60ff19861689528489019650613c14565b60008881526020902060005b86811015613c0c5781548b820152908501908301613bf3565b505084890196505b50505050505092915050565b60008a51613c32818460208f016135a2565b8a5190830190613c46818360208f016135a2565b613c528183018c613b86565b9150508851613c65818360208d016135a2565b8851910190613c78818360208c016135a2565b8751910190613c8b818360208b016135a2565b8651910190613c9e818360208a016135a2565b8551910190613cb18183602089016135a2565b8451910190613cc48183602088016135a2565b019b9a5050505050505050505050565b60008551613ce6818460208a016135a2565b855190830190613cfa818360208a016135a2565b603160f81b91019081528451613d178160018401602089016135a2565b8451910190613d2d8160018401602088016135a2565b016001019695505050505050565b60008451613d4d8184602089016135a2565b845190830190613d618183602089016135a2565b600360fc1b91018181528451909190613d818160018501602089016135a2565b600192019182015260020195945050505050565b60008351613da78184602088016135a2565b835190830190613dbb8183602088016135a2565b603160f81b9101908152600101949350505050565b60008351613de28184602088016135a2565b835190830190613df68183602088016135a2565b600360fc1b9101908152600101949350505050565b6000600019821415613e1f57613e1f613a8c565b5060010190565b8481526001600160a01b038416602082015260a060408201819052600090613e50908301856135ce565b8281038060608501526000825260208101608085015250613e7460208201856135ce565b979650505050505050565b6000613e8b8285613b86565b8351613b4b8183602088016135a2565b60208082526022908201527f4163636f756e742068617320616c7265616479206d696e74656420616e204e466040820152612a1760f11b606082015260800190565b60208082526023908201527f4552524f523a20207573657220636f6465206c656e67746820697320696e76616040820152621b1a5960ea1b606082015260800190565b6000816000190483118215151615613f3a57613f3a613a8c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f6457613f64613f3f565b500490565b600181815b80851115613fa4578160001904821115613f8a57613f8a613a8c565b80851615613f9757918102915b93841c9390800290613f6e565b509250929050565b600082613fbb575060016109a0565b81613fc8575060006109a0565b8160018114613fde5760028114613fe857614004565b60019150506109a0565b60ff841115613ff957613ff9613a8c565b50506001821b6109a0565b5060208310610133831016604e8410600b8410161715614027575081810a6109a0565b6140318383613f69565b806000190482111561404557614045613a8c565b029392505050565b600061286f8383613fac565b600060ff83168061406c5761406c613f3f565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561404557614045613a8c565b600060ff821660ff8416808210156140b6576140b6613a8c565b90039392505050565b600082198211156140d2576140d2613a8c565b500190565b6000826140e6576140e6613f3f565b500690565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060ff821660ff84168060ff038211156141f3576141f3613a8c565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061422e908301846135ce565b9695505050505050565b60006020828403121561424a57600080fd5b815161286f8161356f56fea26469706673582212209b79625ff45d365417bee60c8a0f64750c8c5b2567b43edaf22ba72f8223b62f64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c80638129fc1c11610190578063c87b56dd116100dc578063decc1a8611610095578063f2fde38b1161006f578063f2fde38b146108de578063f9cb9e89146108fe578063fc0c546a14610914578063fcc9d2621461093457600080fd5b8063decc1a861461085f578063e985e9c51461087f578063ec2e0ab3146108c857600080fd5b8063c87b56dd146107c0578063d547cfb7146107e0578063d68cda3b146107f5578063d848f3ea1461080a578063dc88fdb71461082a578063dcf141ea1461083f57600080fd5b8063a22cb46511610149578063b211e93811610123578063b211e9381461074d578063b24f4b8d14610760578063b65076a214610780578063b88d4fde146107a057600080fd5b8063a22cb465146106f8578063a7f93ebd14610718578063a879b6321461072d57600080fd5b80638129fc1c146106425780638417b47f146106575780638ae21b66146106775780638da5cb5b1461069557806395d89b41146106b35780639cee2142146106c857600080fd5b806342842e0e1161024f5780636352211e11610208578063715018a6116101e2578063715018a6146105d75780637561a71d146105ec57806378e8cde1146106025780637c43548c1461062257600080fd5b80636352211e1461057757806370a082311461059757806370e224ba146105b757600080fd5b806342842e0e146104ce57806343fa5e6a146104ee57806347e851fa1461050157806348ed51ca146105215780635580d89c1461054157806355f804b31461055757600080fd5b806317061e65116102a157806317061e65146103e957806320d8dad01461040957806323b872dd1461044257806335db70b5146104625780633714020e1461047857806340015e601461049857600080fd5b806301ffc9a7146102f457806306fdde0314610329578063081812fc1461034b578063095ea7b3146103835780630e68460e146103a557806316bb6c13146103c957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613585565b610954565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061033e6109a6565b60405161032091906135fa565b34801561035757600080fd5b5061036b61036636600461360d565b610a38565b6040516001600160a01b039091168152602001610320565b34801561038f57600080fd5b506103a361039e36600461363d565b610ad2565b005b3480156103b157600080fd5b506103bb60d75481565b604051908152602001610320565b3480156103d557600080fd5b506103a36103e4366004613667565b610be8565b3480156103f557600080fd5b506103a361040436600461360d565b610c9e565b34801561041557600080fd5b50610314610424366004613667565b6001600160a01b0316600090815260cd602052604090205460ff1690565b34801561044e57600080fd5b506103a361045d366004613682565b610d11565b34801561046e57600080fd5b506103bb60d65481565b34801561048457600080fd5b506103a36104933660046136be565b610d42565b3480156104a457600080fd5b506103bb6104b3366004613667565b6001600160a01b0316600090815260c9602052604090205490565b3480156104da57600080fd5b506103a36104e9366004613682565b610dcc565b6103bb6104fc3660046137a6565b610de7565b34801561050d57600080fd5b506103bb61051c366004613667565b610eeb565b34801561052d57600080fd5b5061033e61053c366004613840565b610f5a565b34801561054d57600080fd5b506103bb60d55481565b34801561056357600080fd5b506103a3610572366004613883565b6115cb565b34801561058357600080fd5b5061036b61059236600461360d565b611608565b3480156105a357600080fd5b506103bb6105b2366004613667565b61167f565b3480156105c357600080fd5b506103bb6105d2366004613667565b611706565b3480156105e357600080fd5b506103a3611772565b3480156105f857600080fd5b506103bb60d35481565b34801561060e57600080fd5b506103a361061d36600461360d565b6117a8565b34801561062e57600080fd5b506103a361063d36600461360d565b6117d7565b34801561064e57600080fd5b506103a3611806565b34801561066357600080fd5b506103a361067236600461360d565b6118ed565b34801561068357600080fd5b5060d4546001600160a01b031661036b565b3480156106a157600080fd5b506033546001600160a01b031661036b565b3480156106bf57600080fd5b5061033e61191c565b3480156106d457600080fd5b506103146106e3366004613667565b60cd6020526000908152604090205460ff1681565b34801561070457600080fd5b506103a36107133660046136be565b61192b565b34801561072457600080fd5b5060d6546103bb565b34801561073957600080fd5b5060d45461036b906001600160a01b031681565b6103bb61075b3660046138b8565b611936565b34801561076c57600080fd5b5061031461077b366004613883565b611a4d565b34801561078c57600080fd5b506103a361079b36600461360d565b611a8c565b3480156107ac57600080fd5b506103a36107bb36600461391c565b611abb565b3480156107cc57600080fd5b5061033e6107db36600461360d565b611af3565b3480156107ec57600080fd5b5061033e611c74565b34801561080157600080fd5b5060d7546103bb565b34801561081657600080fd5b506103a361082536600461360d565b611d02565b34801561083657600080fd5b5060d5546103bb565b34801561084b57600080fd5b506103a361085a366004613667565b611d31565b34801561086b57600080fd5b506103a361087a36600461360d565b611df0565b34801561088b57600080fd5b5061031461089a366004613998565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b3480156108d457600080fd5b506103bb60d15481565b3480156108ea57600080fd5b506103a36108f9366004613667565b611e1f565b34801561090a57600080fd5b506103bb60d25481565b34801561092057600080fd5b5060d05461036b906001600160a01b031681565b34801561094057600080fd5b5061033e61094f366004613667565b611eb7565b60006001600160e01b031982166380ac58cd60e01b148061098557506001600160e01b03198216635b5e139f60e01b145b806109a057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609780546109b5906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e1906139cb565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000818152609960205260408120546001600160a01b0316610ab65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609b60205260409020546001600160a01b031690565b6000610add82611608565b9050806001600160a01b0316836001600160a01b03161415610b4b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610aad565b336001600160a01b0382161480610b675750610b67813361089a565b610bd95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610aad565b610be38383611f63565b505050565b6033546001600160a01b03163314610c125760405162461bcd60e51b8152600401610aad90613a06565b60d0546001600160a01b0382811691161415610c7c5760405162461bcd60e51b8152602060048201526024808201527f4e657720746f6b656e20616464726573732069732073616d65206173206f6c64604482015263206f6e6560e01b6064820152608401610aad565b60d080546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610aad90613a06565b47811115610cd35750475b6033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d0d573d6000803e3d6000fd5b5050565b610d1b3382611fd1565b610d375760405162461bcd60e51b8152600401610aad90613a3b565b610be38383836120c8565b60d0546001600160a01b0316331480610d6557506033546001600160a01b031633145b610da15760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b6044820152606401610aad565b6001600160a01b0391909116600090815260cd60205260409020805460ff1916911515919091179055565b610be383838360405180602001604052806000815250611abb565b600060d754341015610e2f5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610aad565b610e3a33858561212a565b506000610e48335b8461283e565b33600090815260cc6020526040902081905560d754909150341115610ea45760d75433906108fc90610e7a9034613aa2565b6040518115909202916000818181858888f19350505050158015610ea2573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb8133878787604051610edb959493929190613ab9565b60405180910390a1949350505050565b60d0546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401602060405180830381865afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190613b15565b6001600160a01b038316600090815260c9602052604090205460609061ffff831610610fc85760405162461bcd60e51b815260206004820152601f60248201527f47455420535542205245464552524552533a204f7574206f662052616e6765006044820152606401610aad565b6001600160a01b038416600090815260c96020908152604080832080548251818502810185019093528083529192909190849084015b828210156110aa57838290600052602060002001805461101d906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611049906139cb565b80156110965780601f1061106b57610100808354040283529160200191611096565b820191906000526020600020905b81548152906001019060200180831161107957829003601f168201915b505050505081526020019060010190610ffe565b5050505090506110f66040518060c001604052806000815260200160006001600160a01b0316815260200160608152602001600081526020016000151581526020016000151581525090565b604080516020808201835260008252825180840190935260018352602360f81b908301529061ffff87165b61112c876001613b2e565b61ffff168110156115be5760ca85828151811061114b5761114b613b54565b60200260200101516040516111609190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916111a5906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546111d1906139cb565b801561121e5780601f106111f35761010080835404028352916020019161121e565b820191906000526020600020905b81548152906001019060200180831161120157829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff808216151560408085019190915261010090920416151560609092019190915282820180516001600160a01b0316600090815260cb909352912090519195508491849190829061128b90612876565b866112998a600001516129bd565b886112a78c606001516129bd565b6040516020016112bf99989796959493929190613c20565b604051602081830303815290604052925083608001511515600115151415611528576020808501516001600160a01b0316600090815260c9825260408082208054825181860281018601909352808352929391929091849084015b828210156113c6578382906000526020600020018054611339906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611365906139cb565b80156113b25780601f10611387576101008083540402835291602001916113b2565b820191906000526020600020905b81548152906001019060200180831161139557829003601f168201915b50505050508152602001906001019061131a565b505050509050600060ca826000815181106113e3576113e3613b54565b60200260200101516040516113f89190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b031691840191909152600281018054919284019161143d906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611469906139cb565b80156114b65780601f1061148b576101008083540402835291602001916114b6565b820191906000526020600020905b81548152906001019060200180831161149957829003601f168201915b50505091835250506003820154602082015260049091015460ff8082161515604084015261010090910416151560609091015280519091508590859081906114fd906129bd565b6040516020016115109493929190613cd4565b6040516020818303038152906040529450505061154f565b82828360405160200161153d93929190613d3b565b60405160208183030381529060405292505b60a0840151151560011415611587578282604051602001611571929190613d95565b60405160208183030381529060405292506115ac565b828260405160200161159a929190613dd0565b60405160208183030381529060405292505b806115b681613e0b565b915050611121565b5090979650505050505050565b6033546001600160a01b031633146115f55760405162461bcd60e51b8152600401610aad90613a06565b8051610d0d9060d89060208401906134d6565b6000818152609960205260408120546001600160a01b0316806109a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610aad565b60006001600160a01b0382166116ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610aad565b506001600160a01b03166000908152609a602052604090205490565b60006001600160a01b0382166117565760405162461bcd60e51b8152602060048201526015602482015274616464726573732043414e2754204245205a45524f60581b6044820152606401610aad565b506001600160a01b0316600090815260cc602052604090205490565b6033546001600160a01b0316331461179c5760405162461bcd60e51b8152600401610aad90613a06565b6117a66000612abb565b565b6033546001600160a01b031633146117d25760405162461bcd60e51b8152600401610aad90613a06565b60d555565b6033546001600160a01b031633146118015760405162461bcd60e51b8152600401610aad90613a06565b60d355565b60006118126001612b0d565b9050801561182a576000805461ff0019166101001790555b61187c6040518060400160405280601081526020016f10da18591a5b9d481592540810d85c9960821b815250604051806040016040528060088152602001671592540810d85c9960c21b815250612b9a565b611884612be8565b602160d181905560d255604b60d35560d480546001600160a01b03191673c040e348fc48ecd2ab355499211bf208b38918371790556212750060d5556702c68af0bb14000060d655670214e8348c4f000060d75580156118ea576000805461ff00191690555b50565b6033546001600160a01b031633146119175760405162461bcd60e51b8152600401610aad90613a06565b60d655565b6060609880546109b5906139cb565b610d0d338383612c18565b600060d65434101580611958575033600090815260cd602052604090205460ff165b6119985760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610aad565b6119a23384612ce7565b60006119ad33610e42565b33600090815260cc6020526040902081905560d654909150341115611a095760d65433906108fc906119df9034613aa2565b6040518115909202916000818181858888f19350505050158015611a07573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb81338686604051611a3e9493929190613e26565b60405180910390a19392505050565b600060ca82604051611a5f9190613b6a565b90815260405190819003602001902054158015611a7d575060018251115b80156109a05750505160101190565b6033546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610aad90613a06565b60d755565b611ac53383611fd1565b611ae15760405162461bcd60e51b8152600401610aad90613a3b565b611aed84848484612fac565b50505050565b6000818152609960205260409020546060906001600160a01b0316611b725760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610aad565b600082815260cf602052604081208054611b8b906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb7906139cb565b8015611c045780601f10611bd957610100808354040283529160200191611c04565b820191906000526020600020905b815481529060010190602001808311611be757829003601f168201915b5050505050905060d88054611c18906139cb565b15159050611c265792915050565b805115611c585760d881604051602001611c41929190613e7f565b604051602081830303815290604052915050919050565b60d8611c63846129bd565b604051602001611c41929190613e7f565b60d88054611c81906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad906139cb565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505081565b6033546001600160a01b03163314611d2c5760405162461bcd60e51b8152600401610aad90613a06565b60d255565b6033546001600160a01b03163314611d5b5760405162461bcd60e51b8152600401610aad90613a06565b60d4546001600160a01b0382811691161415611dce5760405162461bcd60e51b815260206004820152602c60248201527f4e6577207365636f6e646172792064657620616464726573732069732073616d60448201526b65206173206f6c64206f6e6560a01b6064820152608401610aad565b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611e1a5760405162461bcd60e51b8152600401610aad90613a06565b60d155565b6033546001600160a01b03163314611e495760405162461bcd60e51b8152600401610aad90613a06565b6001600160a01b038116611eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aad565b6118ea81612abb565b6001600160a01b038116600090815260cb60205260409020805460609190611ede906139cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0a906139cb565b8015611f575780601f10611f2c57610100808354040283529160200191611f57565b820191906000526020600020905b815481529060010190602001808311611f3a57829003601f168201915b50505050509050919050565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9882611608565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152609960205260408120546001600160a01b031661204a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610aad565b600061205583611608565b9050806001600160a01b0316846001600160a01b0316148061209c57506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b806120c05750836001600160a01b03166120b584610a38565b6001600160a01b0316145b949350505050565b6001600160a01b0383161561211f5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e2774207472616e736665722074686973204e46542e000000006044820152606401610aad565b610be3838383612fdf565b6001600160a01b038316600090815260cb60205260408120805460029190612151906139cb565b9050106121705760405162461bcd60e51b8152600401610aad90613e9b565b60018351118015612182575060108351105b61219e5760405162461bcd60e51b8152600401610aad90613edd565b600182511180156121b0575060108251105b61220c5760405162461bcd60e51b815260206004820152602760248201527f4552524f523a2020726566657272657220636f6465206c656e677468206973206044820152661a5b9d985b1a5960ca1b6064820152608401610aad565b60006001600160a01b031660ca846040516122279190613b6a565b908152604051908190036020019020600101546001600160a01b0316146122905760405162461bcd60e51b815260206004820152601860248201527f75736572636f646520697320616c7265616479207573656400000000000000006044820152606401610aad565b6001600160a01b0384166122f45760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aad565b60006001600160a01b031660ca8360405161230f9190613b6a565b908152604051908190036020019020600101546001600160a01b031614156123795760405162461bcd60e51b815260206004820152601e60248201527f726566657272657220636f6465206973206e6f7420657869736974696e6700006044820152606401610aad565b836001600160a01b031660ca836040516123939190613b6a565b908152604051908190036020019020600101546001600160a01b031614156124095760405162461bcd60e51b8152602060048201526024808201527f63726561746f7220636f756c646e27742062652073616d652061732072656665604482015263393932b960e11b6064820152608401610aad565b6000606460d25460d75461241d9190613f20565b6124279190613f55565b90506000606460d15460d75461243d9190613f20565b6124479190613f55565b90506000818360d75461245a9190613aa2565b6124649190613aa2565b9050600060ca866040516124789190613b6a565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916124bd906139cb565b80601f01602080910402602001604051908101604052809291908181526020018280546124e9906139cb565b80156125365780601f1061250b57610100808354040283529160200191612536565b820191906000526020600020905b81548152906001019060200180831161251957829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff8082161515604080850191909152610100909204161515606090920191909152828201516001600160a01b0316600090815260c983529081208054600181018255908252908290208a519394506125b0939101918a01906134d6565b5060a081015115156001148015906125cd57506001816040015151115b156126aa57600060ca876040516125e49190613b6a565b9081526020016040518091039020905060d5548260000151426126079190613aa2565b101561268c576060820151156126785760ca826040015160405161262b9190613b6a565b9081526040519081900360200181206001015460608401516001600160a01b039091169181156108fc0291906000818181858888f19350505050158015612676573d6000803e3d6000fd5b505b60048101805460ff19166001179055612699565b60048101805460ff191690555b600401805461ff0019166101001790555b606460d754111561272f5780602001516001600160a01b03166108fc849081150290604051600060405180830381858888f193505050501580156126f2573d6000803e3d6000fd5b5060d4546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561272d573d6000803e3d6000fd5b505b6040805160c0810182524281526001600160a01b038a1660208201528082018890526060810186905260006080820181905260a0820152905160ca90612776908a90613b6a565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b0390921691909117905590830151805191926127ca926002850192909101906134d6565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038816600090815260cb60209081526040909120885161282f928a01906134d6565b50600198975050505050505050565b600061284e60ce80546001019055565b600061285960ce5490565b9050612865848261317b565b61286f8184613195565b9392505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b60148110156129b65760006128b3826013613aa2565b6128be906008613f20565b6128c990600261404d565b6128dc906001600160a01b038716613f55565b60f81b9050600060108260f81c6128f39190614059565b60f81b905060008160f81c601061290a919061407b565b8360f81c612918919061409c565b60f81b90506129268261322d565b85612932866002613f20565b8151811061294257612942613b54565b60200101906001600160f81b031916908160001a9053506129628161322d565b8561296e866002613f20565b6129799060016140bf565b8151811061298957612989613b54565b60200101906001600160f81b031916908160001a90535050505080806129ae90613e0b565b91505061289d565b5092915050565b6060816129e15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a0b57806129f581613e0b565b9150612a049050600a83613f55565b91506129e5565b60008167ffffffffffffffff811115612a2657612a266136fa565b6040519080825280601f01601f191660200182016040528015612a50576020820181803683370190505b5090505b84156120c057612a65600183613aa2565b9150612a72600a866140d7565b612a7d9060306140bf565b60f81b818381518110612a9257612a92613b54565b60200101906001600160f81b031916908160001a905350612ab4600a86613f55565b9450612a54565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615612b54578160ff166001148015612b305750303b155b612b4c5760405162461bcd60e51b8152600401610aad906140eb565b506000919050565b60005460ff808416911610612b7b5760405162461bcd60e51b8152600401610aad906140eb565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff16612bc15760405162461bcd60e51b8152600401610aad90614139565b8151612bd49060979060208501906134d6565b508051610be39060989060208401906134d6565b600054610100900460ff16612c0f5760405162461bcd60e51b8152600401610aad90614139565b6117a633612abb565b816001600160a01b0316836001600160a01b03161415612c7a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610aad565b6001600160a01b038381166000818152609c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038216600090815260cb60205260409020805460029190612d0e906139cb565b905010612d2d5760405162461bcd60e51b8152600401610aad90613e9b565b60018151118015612d3f575060108151105b612d5b5760405162461bcd60e51b8152600401610aad90613edd565b6001600160a01b038216612db15760405162461bcd60e51b815260206004820181905260248201527f435348543a20207a65726f20616464726573732063616e2774206372656174656044820152606401610aad565b60006001600160a01b031660ca82604051612dcc9190613b6a565b908152604051908190036020019020600101546001600160a01b031614612e355760405162461bcd60e51b815260206004820152601960248201527f7573657220636f646520697320616c72656164792075736564000000000000006044820152606401610aad565b6040518060c00160405280428152602001836001600160a01b03168152602001604051806020016040528060008152508152602001600081526020016000151581526020016000151581525060ca82604051612e919190613b6a565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b039092169190911790559083015180519192612ee5926002850192909101906134d6565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038216600090815260cb602090815260409091208251612f4a928401906134d6565b506001600160a01b038216600090815260cd602052604090205460ff1615612f70575050565b60d45460d6546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610be3573d6000803e3d6000fd5b612fb78484846120c8565b612fc384848484613263565b611aed5760405162461bcd60e51b8152600401610aad90614184565b826001600160a01b0316612ff282611608565b6001600160a01b0316146130565760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610aad565b6001600160a01b0382166130b85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aad565b6130c3600082611f63565b6001600160a01b0383166000908152609a602052604081208054600192906130ec908490613aa2565b90915550506001600160a01b0382166000908152609a6020526040812080546001929061311a9084906140bf565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d0d828260405180602001604052806000815250613361565b6000828152609960205260409020546001600160a01b031661320e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610aad565b600082815260cf602090815260409091208251610be3928401906134d6565b6000600a60f883901c10156132545761324b60f883901c60306141d6565b60f81b92915050565b61324b60f883901c60576141d6565b60006001600160a01b0384163b1561335657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132a79033908990889088906004016141fb565b6020604051808303816000875af19250505080156132e2575060408051601f3d908101601f191682019092526132df91810190614238565b60015b61333c573d808015613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5080516133345760405162461bcd60e51b8152600401610aad90614184565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120c0565b506001949350505050565b61336b8383613394565b6133786000848484613263565b610be35760405162461bcd60e51b8152600401610aad90614184565b6001600160a01b0382166133ea5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aad565b6000818152609960205260409020546001600160a01b03161561344f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aad565b6001600160a01b0382166000908152609a602052604081208054600192906134789084906140bf565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546134e2906139cb565b90600052602060002090601f016020900481019282613504576000855561354a565b82601f1061351d57805160ff191683800117855561354a565b8280016001018555821561354a579182015b8281111561354a57825182559160200191906001019061352f565b5061355692915061355a565b5090565b5b80821115613556576000815560010161355b565b6001600160e01b0319811681146118ea57600080fd5b60006020828403121561359757600080fd5b813561286f8161356f565b60005b838110156135bd5781810151838201526020016135a5565b83811115611aed5750506000910152565b600081518084526135e68160208601602086016135a2565b601f01601f19169290920160200192915050565b60208152600061286f60208301846135ce565b60006020828403121561361f57600080fd5b5035919050565b80356001600160a01b0381168114612b9557600080fd5b6000806040838503121561365057600080fd5b61365983613626565b946020939093013593505050565b60006020828403121561367957600080fd5b61286f82613626565b60008060006060848603121561369757600080fd5b6136a084613626565b92506136ae60208501613626565b9150604084013590509250925092565b600080604083850312156136d157600080fd5b6136da83613626565b9150602083013580151581146136ef57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561372b5761372b6136fa565b604051601f8501601f19908116603f01168101908282118183101715613753576137536136fa565b8160405280935085815286868601111561376c57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261379757600080fd5b61286f83833560208501613710565b6000806000606084860312156137bb57600080fd5b833567ffffffffffffffff808211156137d357600080fd5b6137df87838801613786565b945060208601359150808211156137f557600080fd5b61380187838801613786565b9350604086013591508082111561381757600080fd5b5061382486828701613786565b9150509250925092565b803561ffff81168114612b9557600080fd5b60008060006060848603121561385557600080fd5b61385e84613626565b925061386c6020850161382e565b915061387a6040850161382e565b90509250925092565b60006020828403121561389557600080fd5b813567ffffffffffffffff8111156138ac57600080fd5b6120c084828501613786565b600080604083850312156138cb57600080fd5b823567ffffffffffffffff808211156138e357600080fd5b6138ef86838701613786565b9350602085013591508082111561390557600080fd5b5061391285828601613786565b9150509250929050565b6000806000806080858703121561393257600080fd5b61393b85613626565b935061394960208601613626565b925060408501359150606085013567ffffffffffffffff81111561396c57600080fd5b8501601f8101871361397d57600080fd5b61398c87823560208401613710565b91505092959194509250565b600080604083850312156139ab57600080fd5b6139b483613626565b91506139c260208401613626565b90509250929050565b600181811c908216806139df57607f821691505b60208210811415613a0057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015613ab457613ab4613a8c565b500390565b8581526001600160a01b038516602082015260a060408201819052600090613ae3908301866135ce565b8281036060840152613af581866135ce565b90508281036080840152613b0981856135ce565b98975050505050505050565b600060208284031215613b2757600080fd5b5051919050565b600061ffff808316818516808303821115613b4b57613b4b613a8c565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008251613b7c8184602087016135a2565b9190910192915050565b8054600090600181811c9080831680613ba057607f831692505b6020808410821415613bc257634e487b7160e01b600052602260045260246000fd5b818015613bd65760018114613be757613c14565b60ff19861689528489019650613c14565b60008881526020902060005b86811015613c0c5781548b820152908501908301613bf3565b505084890196505b50505050505092915050565b60008a51613c32818460208f016135a2565b8a5190830190613c46818360208f016135a2565b613c528183018c613b86565b9150508851613c65818360208d016135a2565b8851910190613c78818360208c016135a2565b8751910190613c8b818360208b016135a2565b8651910190613c9e818360208a016135a2565b8551910190613cb18183602089016135a2565b8451910190613cc48183602088016135a2565b019b9a5050505050505050505050565b60008551613ce6818460208a016135a2565b855190830190613cfa818360208a016135a2565b603160f81b91019081528451613d178160018401602089016135a2565b8451910190613d2d8160018401602088016135a2565b016001019695505050505050565b60008451613d4d8184602089016135a2565b845190830190613d618183602089016135a2565b600360fc1b91018181528451909190613d818160018501602089016135a2565b600192019182015260020195945050505050565b60008351613da78184602088016135a2565b835190830190613dbb8183602088016135a2565b603160f81b9101908152600101949350505050565b60008351613de28184602088016135a2565b835190830190613df68183602088016135a2565b600360fc1b9101908152600101949350505050565b6000600019821415613e1f57613e1f613a8c565b5060010190565b8481526001600160a01b038416602082015260a060408201819052600090613e50908301856135ce565b8281038060608501526000825260208101608085015250613e7460208201856135ce565b979650505050505050565b6000613e8b8285613b86565b8351613b4b8183602088016135a2565b60208082526022908201527f4163636f756e742068617320616c7265616479206d696e74656420616e204e466040820152612a1760f11b606082015260800190565b60208082526023908201527f4552524f523a20207573657220636f6465206c656e67746820697320696e76616040820152621b1a5960ea1b606082015260800190565b6000816000190483118215151615613f3a57613f3a613a8c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f6457613f64613f3f565b500490565b600181815b80851115613fa4578160001904821115613f8a57613f8a613a8c565b80851615613f9757918102915b93841c9390800290613f6e565b509250929050565b600082613fbb575060016109a0565b81613fc8575060006109a0565b8160018114613fde5760028114613fe857614004565b60019150506109a0565b60ff841115613ff957613ff9613a8c565b50506001821b6109a0565b5060208310610133831016604e8410600b8410161715614027575081810a6109a0565b6140318383613f69565b806000190482111561404557614045613a8c565b029392505050565b600061286f8383613fac565b600060ff83168061406c5761406c613f3f565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561404557614045613a8c565b600060ff821660ff8416808210156140b6576140b6613a8c565b90039392505050565b600082198211156140d2576140d2613a8c565b500190565b6000826140e6576140e6613f3f565b500690565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060ff821660ff84168060ff038211156141f3576141f3613a8c565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061422e908301846135ce565b9695505050505050565b60006020828403121561424a57600080fd5b815161286f8161356f56fea26469706673582212209b79625ff45d365417bee60c8a0f64750c8c5b2567b43edaf22ba72f8223b62f64736f6c634300080a0033
Deployed Bytecode Sourcemap
286:13338:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1906:344:5;;;;;;;;;;-1:-1:-1;1906:344:5;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;1906:344:5;;;;;;;;2868:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4391:217::-;;;;;;;;;;-1:-1:-1;4391:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:14;;;1674:51;;1662:2;1647:18;4391:217:5;1528:203:14;3918:412:5;;;;;;;;;;-1:-1:-1;3918:412:5;;;;;:::i;:::-;;:::i;:::-;;1245:34:1;;;;;;;;;;;;;;;;;;;2319:25:14;;;2307:2;2292:18;1245:34:1;2173:177:14;11347:192:1;;;;;;;;;;-1:-1:-1;11347:192:1;;;;;:::i;:::-;;:::i;11155:184::-;;;;;;;;;;-1:-1:-1;11155:184:1;;;;;:::i;:::-;;:::i;8533:152::-;;;;;;;;;;-1:-1:-1;8533:152:1;;;;;:::i;:::-;-1:-1:-1;;;;;8654:23:1;8625:4;8654:23;;;:14;:23;;;;;;;;;8533:152;5118:330:5;;;;;;;;;;-1:-1:-1;5118:330:5;;;;;:::i;:::-;;:::i;1211:27:1:-;;;;;;;;;;;;;;;;8311:214;;;;;;;;;;-1:-1:-1;8311:214:1;;;;;:::i;:::-;;:::i;8693:134::-;;;;;;;;;;-1:-1:-1;8693:134:1;;;;;:::i;:::-;-1:-1:-1;;;;;8790:22:1;8763:7;8790:22;;;:13;:22;;;;;:29;;8693:134;5514:179:5;;;;;;;;;;-1:-1:-1;5514:179:5;;;;;:::i;:::-;;:::i;4120:691:1:-;;;;;;:::i;:::-;;:::i;11547:121::-;;;;;;;;;;-1:-1:-1;11547:121:1;;;;;:::i;:::-;;:::i;8835:1625::-;;;;;;;;;;-1:-1:-1;8835:1625:1;;;;;:::i;:::-;;:::i;1173:31::-;;;;;;;;;;;;;;;;13518:103;;;;;;;;;;-1:-1:-1;13518:103:1;;;;;:::i;:::-;;:::i;2571:235:5:-;;;;;;;;;;-1:-1:-1;2571:235:5;;;;;:::i;:::-;;:::i;2309:205::-;;;;;;;;;;-1:-1:-1;2309:205:5;;;;;:::i;:::-;;:::i;11676:181:1:-;;;;;;;;;;-1:-1:-1;11676:181:1;;;;;:::i;:::-;;:::i;1946:103:12:-;;;;;;;;;;;;;:::i;1096:25:1:-;;;;;;;;;;;;;;;;12963:123;;;;;;;;;;-1:-1:-1;12963:123:1;;;;;:::i;:::-;;:::i;13292:97::-;;;;;;;;;;-1:-1:-1;13292:97:1;;;;;:::i;:::-;;:::i;1495:432::-;;;;;;;;;;;;;:::i;12100:118::-;;;;;;;;;;-1:-1:-1;12100:118:1;;;;;:::i;:::-;;:::i;12496:111::-;;;;;;;;;;-1:-1:-1;12580:19:1;;-1:-1:-1;;;;;12580:19:1;12496:111;;1295:87:12;;;;;;;;;;-1:-1:-1;1368:6:12;;-1:-1:-1;;;;;1368:6:12;1295:87;;3030:102:5;;;;;;;;;;;;;:::i;859:46:1:-;;;;;;;;;;-1:-1:-1;859:46:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;4675:153:5;;;;;;;;;;-1:-1:-1;4675:153:5;;;;;:::i;:::-;;:::i;11998:94:1:-;;;;;;;;;;-1:-1:-1;12072:12:1;;11998:94;;1130:34;;;;;;;;;;-1:-1:-1;1130:34:1;;;;-1:-1:-1;;;;;1130:34:1;;;3489:623;;;;;;:::i;:::-;;:::i;8042:257::-;;;;;;;;;;-1:-1:-1;8042:257:1;;;;;:::i;:::-;;:::i;12342:146::-;;;;;;;;;;-1:-1:-1;12342:146:1;;;;;:::i;:::-;;:::i;5759:320:5:-;;;;;;;;;;-1:-1:-1;5759:320:5;;;;;:::i;:::-;;:::i;2469:789:1:-;;;;;;;;;;-1:-1:-1;2469:789:1;;;;;:::i;:::-;;:::i;1286:26::-;;;;;;;;;;;;;:::i;12226:108::-;;;;;;;;;;-1:-1:-1;12307:19:1;;12226:108;;13191:93;;;;;;;;;;-1:-1:-1;13191:93:1;;;;;:::i;:::-;;:::i;12844:107::-;;;;;;;;;;-1:-1:-1;12927:16:1;;12844:107;;12615:221;;;;;;;;;;-1:-1:-1;12615:221:1;;;;;:::i;:::-;;:::i;13094:89::-;;;;;;;;;;-1:-1:-1;13094:89:1;;;;;:::i;:::-;;:::i;4894:162:5:-;;;;;;;;;;-1:-1:-1;4894:162:5;;;;;:::i;:::-;-1:-1:-1;;;;;5014:25:5;;;4991:4;5014:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4894:162;1038:21:1;;;;;;;;;;;;;;;;2204:201:12;;;;;;;;;;-1:-1:-1;2204:201:12;;;;;:::i;:::-;;:::i;1066:23:1:-;;;;;;;;;;;;;;;;1010:19;;;;;;;;;;-1:-1:-1;1010:19:1;;;;-1:-1:-1;;;;;1010:19:1;;;11865:125;;;;;;;;;;-1:-1:-1;11865:125:1;;;;;:::i;:::-;;:::i;1906:344:5:-;2030:4;-1:-1:-1;;;;;;2065:51:5;;-1:-1:-1;;;2065:51:5;;:126;;-1:-1:-1;;;;;;;2132:59:5;;-1:-1:-1;;;2132:59:5;2065:126;:178;;;-1:-1:-1;;;;;;;;;;1152:51:4;;;2207:36:5;2046:197;1906:344;-1:-1:-1;;1906:344:5:o;2868:98::-;2922:13;2954:5;2947:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:98;:::o;4391:217::-;4467:7;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;4486:73;;;;-1:-1:-1;;;4486:73:5;;8096:2:14;4486:73:5;;;8078:21:14;8135:2;8115:18;;;8108:30;8174:34;8154:18;;;8147:62;-1:-1:-1;;;8225:18:14;;;8218:42;8277:19;;4486:73:5;;;;;;;;;-1:-1:-1;4577:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4577:24:5;;4391:217::o;3918:412::-;3998:13;4014:34;4040:7;4014:25;:34::i;:::-;3998:50;;4072:5;-1:-1:-1;;;;;4066:11:5;:2;-1:-1:-1;;;;;4066:11:5;;;4058:57;;;;-1:-1:-1;;;4058:57:5;;8509:2:14;4058:57:5;;;8491:21:14;8548:2;8528:18;;;8521:30;8587:34;8567:18;;;8560:62;-1:-1:-1;;;8638:18:14;;;8631:31;8679:19;;4058:57:5;8307:397:14;4058:57:5;916:10:2;-1:-1:-1;;;;;4147:21:5;;;;:62;;-1:-1:-1;4172:37:5;4189:5;916:10:2;4894:162:5;:::i;4172:37::-;4126:165;;;;-1:-1:-1;;;4126:165:5;;8911:2:14;4126:165:5;;;8893:21:14;8950:2;8930:18;;;8923:30;8989:34;8969:18;;;8962:62;9060:26;9040:18;;;9033:54;9104:19;;4126:165:5;8709:420:14;4126:165:5;4302:21;4311:2;4315:7;4302:8;:21::i;:::-;3988:342;3918:412;;:::o;11347:192:1:-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;11447:5:1::1;::::0;-1:-1:-1;;;;;11427:26:1;;::::1;11447:5:::0;::::1;11427:26;;11419:75;;;::::0;-1:-1:-1;;;11419:75:1;;9697:2:14;11419:75:1::1;::::0;::::1;9679:21:14::0;9736:2;9716:18;;;9709:30;9775:34;9755:18;;;9748:62;-1:-1:-1;;;9826:18:14;;;9819:34;9870:19;;11419:75:1::1;9495:400:14::0;11419:75:1::1;11505:5;:26:::0;;-1:-1:-1;;;;;;11505:26:1::1;-1:-1:-1::0;;;;;11505:26:1;;;::::1;::::0;;;::::1;::::0;;11347:192::o;11155:184::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;11234:21:1::1;11225:6;:30;11221:66;;;-1:-1:-1::0;11266:21:1::1;11221:66;1368:6:12::0;;11298:33:1::1;::::0;-1:-1:-1;;;;;1368:6:12;;;;11298:33:1;::::1;;;::::0;11324:6;;11298:33:::1;::::0;;;11324:6;1368::12;11298:33:1;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;11155:184:::0;:::o;5118:330:5:-;5307:41;916:10:2;5340:7:5;5307:18;:41::i;:::-;5299:103;;;;-1:-1:-1;;;5299:103:5;;;;;;;:::i;:::-;5413:28;5423:4;5429:2;5433:7;5413:9;:28::i;8311:214:1:-;8426:5;;-1:-1:-1;;;;;8426:5:1;8404:10;:28;;:53;;-1:-1:-1;1368:6:12;;-1:-1:-1;;;;;1368:6:12;8436:10:1;:21;8404:53;8396:79;;;;-1:-1:-1;;;8396:79:1;;10520:2:14;8396:79:1;;;10502:21:14;10559:2;10539:18;;;10532:30;-1:-1:-1;;;10578:18:14;;;10571:43;10631:18;;8396:79:1;10318:337:14;8396:79:1;-1:-1:-1;;;;;8486:23:1;;;;;;;;:14;:23;;;;;:31;;-1:-1:-1;;8486:31:1;;;;;;;;;;8311:214::o;5514:179:5:-;5647:39;5664:4;5670:2;5674:7;5647:39;;;;;;;;;;;;:16;:39::i;4120:691:1:-;4326:7;4373:19;;4360:9;:32;;4352:62;;;;-1:-1:-1;;;4352:62:1;;10862:2:14;4352:62:1;;;10844:21:14;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:14;;;10913:47;10977:18;;4352:62:1;10660:341:14;4352:62:1;4427:61;916:10:2;4464:8:1;4474:12;4427:21;:61::i;:::-;-1:-1:-1;4499:10:1;4512:36;916:10:2;4521:12:1;4535:11;4512:7;:36::i;:::-;916:10:2;4559:24:1;;;;:10;:24;;;;;:29;;;4615:19;;4499:49;;-1:-1:-1;4603:9:1;:31;4599:100;;;4679:19;;916:10:2;;4636:63:1;;4667:31;;:9;:31;:::i;:::-;4636:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4599:100;4717:66;4728:2;916:10:2;4746:8:1;4756:12;4770:11;4717:66;;;;;;;;;;:::i;:::-;;;;;;;;4801:2;4120:691;-1:-1:-1;;;;4120:691:1:o;11547:121::-;11636:5;;:24;;-1:-1:-1;;;11636:24:1;;-1:-1:-1;;;;;1692:32:14;;;11636:24:1;;;1674:51:14;11609:7:1;;11636:5;;:15;;1647:18:14;;11636:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8835:1625::-;-1:-1:-1;;;;;8969:22:1;;;;;;:13;:22;;;;;:29;8935:13;;8969:40;;;-1:-1:-1;8961:84:1;;;;-1:-1:-1;;;8961:84:1;;12381:2:14;8961:84:1;;;12363:21:14;12420:2;12400:18;;;12393:30;12459:33;12439:18;;;12432:61;12510:18;;8961:84:1;12179:355:14;8961:84:1;-1:-1:-1;;;;;9082:22:1;;9056:23;9082:22;;;:13;:22;;;;;;;;9056:48;;;;;;;;;;;;;;;;;;;9082:22;;9056:48;:23;;:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9115:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9115:25:1;9151:26;;;;;;;;;:21;:26;;9188:29;;;;;;;;;;;-1:-1:-1;;;9188:29:1;;;;9151:26;9243:20;;;9238:1188;9269:10;:8;9278:1;9269:10;:::i;:::-;9265:14;;:1;:14;9238:1188;;;9308:14;9323:7;9331:1;9323:10;;;;;;;;:::i;:::-;;;;;;;9308:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9301:33;;;;;;;;;;;;;-1:-1:-1;;;;;9301:33:1;;;;;;;;;;;;;9308:26;;9301:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9301:33:1;;;-1:-1:-1;;9301:33:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9454:12;;;;;-1:-1:-1;;;;;9439:28:1;-1:-1:-1;9439:28:1;;;:14;:28;;;;;9512:12;;9301:33;;-1:-1:-1;9401:7:1;;9428:9;;9439:28;9428:9;;9498:27;;:13;:27::i;:::-;9545:9;9556:46;9584:4;:17;;;9556:27;:46::i;:::-;9622:9;9633:46;9661:4;:17;;;9633:27;:46::i;:::-;9366:328;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9349:346;;9716:4;:15;;;:23;;9735:4;9716:23;;;9712:463;;;9805:12;;;;;-1:-1:-1;;;;;9791:27:1;9760:28;9791:27;;;:13;:27;;;;;;9760:58;;;;;;;;;;;;;;;;;:28;;:58;;9791:27;;9760:28;;:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9837:30;9870:14;9885:12;9898:1;9885:15;;;;;;;;:::i;:::-;;;;;;;9870:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9837:64;;;;;;;;;;;;;-1:-1:-1;;;;;9837:64:1;;;;;;;;;;;;;9870:31;;9837:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9837:64:1;;;-1:-1:-1;;9837:64:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10018:22;;9837:64;;-1:-1:-1;9954:7:1;;9963:9;;;;9990:51;;:27;:51::i;:::-;9937:105;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9920:123;;9741:318;;9712:463;;;10118:7;10127:9;10143;10101:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10084:75;;9712:463;10193:18;;;;:26;;10215:4;10193:26;10189:226;;;10274:7;10283:9;10257:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10240:59;;10189:226;;;10374:7;10383:9;10357:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10340:59;;10189:226;9281:3;;;;:::i;:::-;;;;9238:1188;;;-1:-1:-1;10445:7:1;;8835:1625;-1:-1:-1;;;;;;;8835:1625:1:o;13518:103::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13591:22:1;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;2571:235:5:-:0;2643:7;2678:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2678:16:5;2712:19;2704:73;;;;-1:-1:-1;;;2704:73:5;;19606:2:14;2704:73:5;;;19588:21:14;19645:2;19625:18;;;19618:30;19684:34;19664:18;;;19657:62;-1:-1:-1;;;19735:18:14;;;19728:39;19784:19;;2704:73:5;19404:405:14;2309:205:5;2381:7;-1:-1:-1;;;;;2408:19:5;;2400:74;;;;-1:-1:-1;;;2400:74:5;;20016:2:14;2400:74:5;;;19998:21:14;20055:2;20035:18;;;20028:30;20094:34;20074:18;;;20067:62;-1:-1:-1;;;20145:18:14;;;20138:40;20195:19;;2400:74:5;19814:406:14;2400:74:5;-1:-1:-1;;;;;;2491:16:5;;;;;:9;:16;;;;;;;2309:205::o;11676:181:1:-;11737:7;-1:-1:-1;;;;;11765:21:1;;11757:55;;;;-1:-1:-1;;;11757:55:1;;20427:2:14;11757:55:1;;;20409:21:14;20466:2;20446:18;;;20439:30;-1:-1:-1;;;20485:18:14;;;20478:51;20546:18;;11757:55:1;20225:345:14;11757:55:1;-1:-1:-1;;;;;;11830:19:1;;;;;:10;:19;;;;;;;11676:181::o;1946:103:12:-;1368:6;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;2011:30:::1;2038:1;2011:18;:30::i;:::-;1946:103::o:0;12963:123:1:-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13048:16:1::1;:30:::0;12963:123::o;13292:97::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13363:10:1::1;:18:::0;13292:97::o;1495:432::-;3040:19:11;3062:25;3085:1;3062:22;:25::i;:::-;3040:47;;3102:14;3098:67;;;3133:13;:20;;-1:-1:-1;;3133:20:11;;;;;3098:67;1548:55:1::1;;;;;;;;;;;;;;-1:-1:-1::0;;;1548:55:1::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;1548:55:1::1;;::::0;:23:::1;:55::i;:::-;1614:26;:24;:26::i;:::-;1670:2;1661:6;:11:::0;;;1683:8:::1;:13:::0;1720:2:::1;1707:10;:15:::0;1735:19:::1;:64:::0;;-1:-1:-1;;;;;;1735:64:1::1;1757:42;1735:64;::::0;;1829:10:::1;1810:16;:29:::0;1865:10:::1;1850:12;:25:::0;1908:11:::1;1886:19;:33:::0;3187:68:11;;;;3238:5;3222:21;;-1:-1:-1;;3222:21:11;;;3187:68;3029:233;1495:432:1:o;12100:118::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;12180:12:1::1;:30:::0;12100:118::o;3030:102:5:-;3086:13;3118:7;3111:14;;;;;:::i;4675:153::-;4769:52;916:10:2;4802:8:5;4812;4769:18;:52::i;3489:623:1:-;3643:7;3690:12;;3677:9;:25;;:55;;;-1:-1:-1;3721:10:1;3706:26;;;;:14;:26;;;;;;;;3677:55;3669:85;;;;-1:-1:-1;;;3669:85:1;;10862:2:14;3669:85:1;;;10844:21:14;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:14;;;10913:47;10977:18;;3669:85:1;10660:341:14;3669:85:1;3765:50;916:10:2;3805:8:1;3765:24;:50::i;:::-;3826:10;3839:36;916:10:2;3848:12:1;837:96:2;3839:36:1;916:10:2;3886:24:1;;;;:10;:24;;;;;:29;;;3942:12;;3826:49;;-1:-1:-1;3930:9:1;:24;3926:86;;;3999:12;;916:10:2;;3956:56:1;;3987:24;;:9;:24;:::i;:::-;3956:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3926:86;4028:56;4039:2;916:10:2;4057:8:1;4071:11;4028:56;;;;;;;;;:::i;:::-;;;;;;;;4102:2;3489:623;-1:-1:-1;;;3489:623:1:o;8042:257::-;8109:4;8149:14;8164:4;8149:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;:36;:76;;;;;8224:1;8209:4;8203:18;:22;8149:76;:117;;;;-1:-1:-1;;8243:18:1;8264:2;-1:-1:-1;8243:23:1;8042:257::o;12342:146::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;12436:19:1::1;:44:::0;12342:146::o;5759:320:5:-;5928:41;916:10:2;5961:7:5;5928:18;:41::i;:::-;5920:103;;;;-1:-1:-1;;;5920:103:5;;;;;;;:::i;:::-;6033:39;6047:4;6053:2;6057:7;6066:5;6033:13;:39::i;:::-;5759:320;;;;:::o;2469:789:1:-;7616:4:5;7639:16;;;:7;:16;;;;;;2534:13:1;;-1:-1:-1;;;;;7639:16:5;2560:76:1;;;;-1:-1:-1;;;2560:76:1;;21541:2:14;2560:76:1;;;21523:21:14;21580:2;21560:18;;;21553:30;21619:34;21599:18;;;21592:62;-1:-1:-1;;;21670:18:14;;;21663:45;21725:19;;2560:76:1;21339:411:14;2560:76:1;2649:23;2675:19;;;:10;:19;;;;;2649:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2776:12;2770:26;;;;;:::i;:::-;:31;2766:80;;-1:-1:-1;2766:80:1;;2825:9;2469:789;-1:-1:-1;;2469:789:1:o;2766:80::-;2950:23;;:27;2946:118;;3026:12;3040:9;3008:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2994:58;;;2469:789;;;:::o;2946:118::-;3197:12;3211:36;3239:7;3211:27;:36::i;:::-;3179:70;;;;;;;;;:::i;1286:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13191:93::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13260:8:1::1;:16:::0;13191:93::o;12615:221::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;12717:19:1::1;::::0;-1:-1:-1;;;;;12705:31:1;;::::1;12717:19:::0;::::1;12705:31;;12697:88;;;::::0;-1:-1:-1;;;12697:88:1;;22338:2:14;12697:88:1::1;::::0;::::1;22320:21:14::0;22377:2;22357:18;;;22350:30;22416:34;22396:18;;;22389:62;-1:-1:-1;;;22467:18:14;;;22460:42;22519:19;;12697:88:1::1;22136:408:14::0;12697:88:1::1;12796:19;:32:::0;;-1:-1:-1;;;;;;12796:32:1::1;-1:-1:-1::0;;;;;12796:32:1;;;::::1;::::0;;;::::1;::::0;;12615:221::o;13094:89::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13161:6:1::1;:14:::0;13094:89::o;2204:201:12:-;1368:6;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2293:22:12;::::1;2285:73;;;::::0;-1:-1:-1;;;2285:73:12;;22751:2:14;2285:73:12::1;::::0;::::1;22733:21:14::0;22790:2;22770:18;;;22763:30;22829:34;22809:18;;;22802:62;-1:-1:-1;;;22880:18:14;;;22873:36;22926:19;;2285:73:12::1;22549:402:14::0;2285:73:12::1;2369:28;2388:8;2369:18;:28::i;11865:125:1:-:0;-1:-1:-1;;;;;11959:23:1;;;;;;:14;:23;;;;;11952:30;;11926:13;;11959:23;11952:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11865:125;;;:::o;11593:182:5:-;11667:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11667:29:5;-1:-1:-1;;;;;11667:29:5;;;;;;;;:24;;11720:34;11667:24;11720:25;:34::i;:::-;-1:-1:-1;;;;;11711:57:5;;;;;;;;;;;11593:182;;:::o;7834:355::-;7927:4;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;7943:73;;;;-1:-1:-1;;;7943:73:5;;23158:2:14;7943:73:5;;;23140:21:14;23197:2;23177:18;;;23170:30;23236:34;23216:18;;;23209:62;-1:-1:-1;;;23287:18:14;;;23280:42;23339:19;;7943:73:5;22956:408:14;7943:73:5;8026:13;8042:34;8068:7;8042:25;:34::i;:::-;8026:50;;8105:5;-1:-1:-1;;;;;8094:16:5;:7;-1:-1:-1;;;;;8094:16:5;;:52;;;-1:-1:-1;;;;;;5014:25:5;;;4991:4;5014:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8114:32;8094:87;;;;8174:7;-1:-1:-1;;;;;8150:31:5;:20;8162:7;8150:11;:20::i;:::-;-1:-1:-1;;;;;8150:31:5;;8094:87;8086:96;7834:355;-1:-1:-1;;;;7834:355:5:o;1935:249:1:-;-1:-1:-1;;;;;2068:18:1;;;2060:59;;;;-1:-1:-1;;;2060:59:1;;23571:2:14;2060:59:1;;;23553:21:14;23610:2;23590:18;;;23583:30;23649;23629:18;;;23622:58;23697:18;;2060:59:1;23369:352:14;2060:59:1;2140:36;2157:4;2163:2;2167:7;2140:15;:36::i;5740:2294::-;-1:-1:-1;;;;;5889:23:1;;5858:4;5889:23;;;:14;:23;;;;;5883:37;;5923:1;;5889:23;5883:37;;;:::i;:::-;;;:41;5875:88;;;;-1:-1:-1;;;5875:88:1;;;;;;;:::i;:::-;6007:1;5988:8;5982:22;:26;:57;;;;;6037:2;6018:8;6012:22;:27;5982:57;5974:105;;;;-1:-1:-1;;;5974:105:1;;;;;;;:::i;:::-;6127:1;6104:12;6098:26;:30;:65;;;;;6161:2;6138:12;6132:26;:31;6098:65;6090:117;;;;-1:-1:-1;;;6090:117:1;;24735:2:14;6090:117:1;;;24717:21:14;24774:2;24754:18;;;24747:30;24813:34;24793:18;;;24786:62;-1:-1:-1;;;24864:18:14;;;24857:37;24911:19;;6090:117:1;24533:403:14;6090:117:1;6270:1;-1:-1:-1;;;;;6226:46:1;:14;6241:8;6226:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;-1:-1:-1;;;;;6226:32:1;:46;6218:83;;;;-1:-1:-1;;;6218:83:1;;25143:2:14;6218:83:1;;;25125:21:14;25182:2;25162:18;;;25155:30;25221:26;25201:18;;;25194:54;25265:18;;6218:83:1;24941:348:14;6218:83:1;-1:-1:-1;;;;;6320:21:1;;6312:71;;;;-1:-1:-1;;;6312:71:1;;25496:2:14;6312:71:1;;;25478:21:14;25535:2;25515:18;;;25508:30;25574:34;25554:18;;;25547:62;-1:-1:-1;;;25625:18:14;;;25618:35;25670:19;;6312:71:1;25294:401:14;6312:71:1;6450:1;-1:-1:-1;;;;;6402:50:1;:14;6417:12;6402:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;-1:-1:-1;;;;;6402:36:1;:50;;6394:93;;;;-1:-1:-1;;;6394:93:1;;25902:2:14;6394:93:1;;;25884:21:14;25941:2;25921:18;;;25914:30;25980:32;25960:18;;;25953:60;26030:18;;6394:93:1;25700:354:14;6394:93:1;6546:7;-1:-1:-1;;;;;6506:47:1;:14;6521:12;6506:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;-1:-1:-1;;;;;6506:36:1;:47;;6498:96;;;;-1:-1:-1;;;6498:96:1;;26261:2:14;6498:96:1;;;26243:21:14;26300:2;26280:18;;;26273:30;26339:34;26319:18;;;26312:62;-1:-1:-1;;;26390:18:14;;;26383:34;26434:19;;6498:96:1;26059:400:14;6498:96:1;6607:20;6665:3;6653:8;;6631:19;;:30;;;;:::i;:::-;6630:38;;;;:::i;:::-;6607:61;;6679:17;6732:3;6722:6;;6700:19;;:28;;;;:::i;:::-;6699:36;;;;:::i;:::-;6679:56;;6746:17;6803:9;6788:12;6766:19;;:34;;;;:::i;:::-;:46;;;;:::i;:::-;6746:66;;6825:25;6853:14;6868:12;6853:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6825:56;;;;;;;;;;;;;-1:-1:-1;;;;;6825:56:1;;;;;;;;;;;;;6853:28;;6825:56;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6825:56:1;;;-1:-1:-1;;6825:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6906:12;;;;-1:-1:-1;;;;;6892:27:1;-1:-1:-1;6892:27:1;;;:13;:27;;;;;:42;;6825:56;6892:42;;;;;;;;;;;;;6825:56;;-1:-1:-1;6892:42:1;;;;;;;;;:::i;:::-;-1:-1:-1;6951:18:1;;;;:26;;6973:4;6951:26;;;;:65;;;7015:1;6987:4;:17;;;6981:31;:35;6951:65;6947:547;;;7042:27;7072:14;7087:12;7072:28;;;;;;:::i;:::-;;;;;;;;;;;;;7042:58;;7157:16;;7137:4;:17;;;7119:15;:35;;;;:::i;:::-;:54;7115:327;;;7197:17;;;;:21;7194:125;;7249:14;7264:4;:17;;;7249:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;7301:17;;;;-1:-1:-1;;;;;7249:41:1;;;;7241:78;;;;;7301:17;7249:41;:33;:41;:33;7301:17;7249:41;7241:78;;;;;;;;;;;;;;;;;;;;;7194:125;7338:16;;;:23;;-1:-1:-1;;7338:23:1;7357:4;7338:23;;;7115:327;;;7402:16;;;:24;;-1:-1:-1;;7402:24:1;;;7115:327;7456:19;;:26;;-1:-1:-1;;7456:26:1;;;;;6947:547;7532:3;7510:19;;:25;7506:162;;;7560:4;:12;;;-1:-1:-1;;;;;7552:30:1;:41;7583:9;7552:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7616:19:1;;7608:48;;-1:-1:-1;;;;;7616:19:1;;;;7608:48;;;;;7646:9;;7616:19;7608:48;7616:19;7608:48;7646:9;7616:19;7608:48;;;;;;;;;;;;;;;;;;;;;7506:162;7707:250;;;;;;;;7750:15;7707:250;;-1:-1:-1;;;;;7707:250:1;;;;;;;;;;;;;;;;;;-1:-1:-1;7707:250:1;;;;;;;;;;7680:24;;:14;;:24;;7695:8;;7680:24;:::i;:::-;;;;;;;;;;;;;;;;:277;;;;;;;;;;;;;-1:-1:-1;;;;;;7680:277:1;-1:-1:-1;;;;;7680:277:1;;;;;;;;;;;;;;;:24;;:277;;;;;;;;;;;:::i;:::-;-1:-1:-1;7680:277:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7680:277:1;;;;;;;-1:-1:-1;;7680:277:1;;;;;;;;;;-1:-1:-1;;;;;7968:23:1;;7680:277;7968:23;;;:14;:23;;;;;;;;:34;;;;;;;;:::i;:::-;-1:-1:-1;8022:4:1;;5740:2294;-1:-1:-1;;;;;;;;5740:2294:1:o;2192:269::-;2269:7;2294:21;:9;1032:19:3;;1050:1;1032:19;;;945:123;2294:21:1;2326:10;2339:19;:9;918:14:3;;827:112;2339:19:1;2326:32;;2369:22;2380:5;2387:2;2369:9;:22::i;:::-;2402:31;2416:2;2420:11;2402:12;:31::i;:::-;2451:2;2192:269;-1:-1:-1;;;2192:269:1:o;10468:463::-;10568:13;;;10578:2;10568:13;;;10525;10568;;;;;;10551:14;;10568:13;;;;;;;;;;;-1:-1:-1;10568:13:1;10551:30;;10597:6;10592:305;10613:2;10609:1;:6;10592:305;;;10637:8;10688:6;10693:1;10688:2;:6;:::i;:::-;10685:10;;:1;:10;:::i;:::-;10681:15;;:1;:15;:::i;:::-;10661:36;;-1:-1:-1;;;;;10661:16:1;;:36;:::i;:::-;10648:51;;10637:62;;10714:9;10744:2;10739:1;10733:8;;:13;;;;:::i;:::-;10726:21;;10714:33;;10762:9;10803:2;10797:9;;10792:2;:14;;;;:::i;:::-;10787:1;10781:8;;:25;;;;:::i;:::-;10774:33;;10762:45;;10831:8;10836:2;10831:4;:8::i;:::-;10822:1;10824:3;10826:1;10824;:3;:::i;:::-;10822:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;10822:17:1;;;;;;;;;10865:8;10870:2;10865:4;:8::i;:::-;10854:1;10856:3;10858:1;10856;:3;:::i;:::-;:5;;10860:1;10856:5;:::i;:::-;10854:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;10854:19:1;;;;;;;;;10622:275;;;10617:3;;;;;:::i;:::-;;;;10592:305;;;-1:-1:-1;10921:1:1;10468:463;-1:-1:-1;;10468:463:1:o;339:703:13:-;395:13;612:10;608:51;;-1:-1:-1;;638:10:13;;;;;;;;;;;;-1:-1:-1;;;638:10:13;;;;;339:703::o;608:51::-;683:5;668:12;722:75;729:9;;722:75;;754:8;;;;:::i;:::-;;-1:-1:-1;776:10:13;;-1:-1:-1;784:2:13;776:10;;:::i;:::-;;;722:75;;;806:19;838:6;828:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;828:17:13;;806:39;;855:150;862:10;;855:150;;888:11;898:1;888:11;;:::i;:::-;;-1:-1:-1;956:10:13;964:2;956:5;:10;:::i;:::-;943:24;;:2;:24;:::i;:::-;930:39;;913:6;920;913:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;913:56:13;;;;;;;;-1:-1:-1;983:11:13;992:2;983:11;;:::i;:::-;;;855:150;;2565:191:12;2658:6;;;-1:-1:-1;;;;;2675:17:12;;;-1:-1:-1;;;;;;2675:17:12;;;;;;;2708:40;;2658:6;;;2675:17;2658:6;;2708:40;;2639:16;;2708:40;2628:128;2565:191;:::o;5196:823:11:-;5260:4;5597:13;;;;;;;5593:419;;;5653:7;:12;;5664:1;5653:12;:61;;;;-1:-1:-1;5708:4:11;1476:19:0;:23;5653:61:11;5627:169;;;;-1:-1:-1;;;5627:169:11;;;;;;;:::i;:::-;-1:-1:-1;5818:5:11;;5196:823;-1:-1:-1;5196:823:11:o;5593:419::-;5864:12;;:22;;;;:12;;:22;5856:81;;;;-1:-1:-1;;;5856:81:11;;;;;;;:::i;:::-;-1:-1:-1;5952:12:11;:22;;-1:-1:-1;;5952:22:11;;;;;;;;;;;;-1:-1:-1;;5196:823:11:o;5593:419::-;5196:823;;;:::o;1679:160:5:-;4593:13:11;;;;;;;4585:69;;;;-1:-1:-1;;;4585:69:11;;;;;;;:::i;:::-;1792:13:5;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;1815:17:5;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;1101:113:12:-:0;4593:13:11;;;;;;;4585:69;;;;-1:-1:-1;;;4585:69:11;;;;;;;:::i;:::-;1174:32:12::1;916:10:2::0;1174:18:12::1;:32::i;11910:307:5:-:0;12060:8;-1:-1:-1;;;;;12051:17:5;:5;-1:-1:-1;;;;;12051:17:5;;;12043:55;;;;-1:-1:-1;;;12043:55:5;;30160:2:14;12043:55:5;;;30142:21:14;30199:2;30179:18;;;30172:30;30238:27;30218:18;;;30211:55;30283:18;;12043:55:5;29958:349:14;12043:55:5;-1:-1:-1;;;;;12108:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12108:46:5;;;;;;;;;;12169:41;;540::14;;;12169::5;;513:18:14;12169:41:5;;;;;;;11910:307;;;:::o;4819:913:1:-;-1:-1:-1;;;;;4928:23:1;;;;;;:14;:23;;;;;4922:37;;4962:1;;4928:23;4922:37;;;:::i;:::-;;;:41;4914:88;;;;-1:-1:-1;;;4914:88:1;;;;;;;:::i;:::-;5046:1;5027:8;5021:22;:26;:57;;;;;5076:2;5057:8;5051:22;:27;5021:57;5013:105;;;;-1:-1:-1;;;5013:105:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5137:21:1;;5129:66;;;;-1:-1:-1;;;5129:66:1;;30514:2:14;5129:66:1;;;30496:21:14;;;30533:18;;;30526:30;30592:34;30572:18;;;30565:62;30644:18;;5129:66:1;30312:356:14;5129:66:1;5258:1;-1:-1:-1;;;;;5214:46:1;:14;5229:8;5214:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;-1:-1:-1;;;;;5214:32:1;:46;5206:84;;;;-1:-1:-1;;;5206:84:1;;30875:2:14;5206:84:1;;;30857:21:14;30914:2;30894:18;;;30887:30;30953:27;30933:18;;;30926:55;30998:18;;5206:84:1;30673:349:14;5206:84:1;5330:229;;;;;;;;5373:15;5330:229;;;;5412:7;-1:-1:-1;;;;;5330:229:1;;;;;;;;;;;;;;;;;;;;;5479:1;5330:229;;;;5507:5;5330:229;;;;;;5542:5;5330:229;;;;;5303:14;5318:8;5303:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:256;;;;;;;;;;;;;-1:-1:-1;;;;;;5303:256:1;-1:-1:-1;;;;;5303:256:1;;;;;;;;;;;;;;;:24;;:256;;;;;;;;;;;:::i;:::-;-1:-1:-1;5303:256:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5303:256:1;;;;;;;-1:-1:-1;;5303:256:1;;;;;;;;;;-1:-1:-1;;;;;5570:23:1;;5303:256;5570:23;;;:14;:23;;;;;;;;:34;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;5621:23:1;;;;;;:14;:23;;;;;;;;5617:36;;;4819:913;;:::o;5617:36::-;5681:19;;5711:12;;5673:51;;-1:-1:-1;;;;;5681:19:1;;;;5673:51;;;;;5711:12;5681:19;5673:51;5681:19;5673:51;5711:12;5681:19;5673:51;;;;;;;;;;;;;;;;;;;6941:307:5;7092:28;7102:4;7108:2;7112:7;7092:9;:28::i;:::-;7138:48;7161:4;7167:2;7171:7;7180:5;7138:22;:48::i;:::-;7130:111;;;;-1:-1:-1;;;7130:111:5;;;;;;;:::i;10866:616::-;11031:4;-1:-1:-1;;;;;10993:42:5;:34;11019:7;10993:25;:34::i;:::-;-1:-1:-1;;;;;10993:42:5;;10985:92;;;;-1:-1:-1;;;10985:92:5;;31648:2:14;10985:92:5;;;31630:21:14;31687:2;31667:18;;;31660:30;31726:34;31706:18;;;31699:62;-1:-1:-1;;;31777:18:14;;;31770:35;31822:19;;10985:92:5;31446:401:14;10985:92:5;-1:-1:-1;;;;;11095:16:5;;11087:65;;;;-1:-1:-1;;;11087:65:5;;32054:2:14;11087:65:5;;;32036:21:14;32093:2;32073:18;;;32066:30;32132:34;32112:18;;;32105:62;-1:-1:-1;;;32183:18:14;;;32176:34;32227:19;;11087:65:5;31852:400:14;11087:65:5;11264:29;11281:1;11285:7;11264:8;:29::i;:::-;-1:-1:-1;;;;;11304:15:5;;;;;;:9;:15;;;;;:20;;11323:1;;11304:15;:20;;11323:1;;11304:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11334:13:5;;;;;;:9;:13;;;;;:18;;11351:1;;11334:13;:18;;11351:1;;11334:18;:::i;:::-;;;;-1:-1:-1;;11362:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11362:21:5;-1:-1:-1;;;;;11362:21:5;;;;;;;;;11399:27;;11362:16;;11399:27;;;;;;;3988:342;3918:412;;:::o;8519:108::-;8594:26;8604:2;8608:7;8594:26;;;;;;;;;;;;:9;:26::i;3266:215:1:-;7616:4:5;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;3358:73:1;;;;-1:-1:-1;;;3358:73:1;;32459:2:14;3358:73:1;;;32441:21:14;32498:2;32478:18;;;32471:30;32537:34;32517:18;;;32510:62;-1:-1:-1;;;32588:18:14;;;32581:42;32640:19;;3358:73:1;32257:408:14;3358:73:1;3442:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;10939:171::-;10986:8;11022:2;11011:8;;;;:13;11007:95;;;11040:15;:8;;;;11051:4;11040:15;:::i;:::-;11033:23;;;10939:171;-1:-1:-1;;10939:171:1:o;11007:95::-;11086:15;:8;;;;11097:4;11086:15;:::i;12770:800:5:-;12920:4;-1:-1:-1;;;;;12940:13:5;;1476:19:0;:23;12936:628:5;;12975:83;;-1:-1:-1;;;12975:83:5;;-1:-1:-1;;;;;12975:47:5;;;;;:83;;916:10:2;;13037:4:5;;13043:7;;13052:5;;12975:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12975:83:5;;;;;;;;-1:-1:-1;;12975:83:5;;;;;;;;;;;;:::i;:::-;;;12971:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13236:13:5;;13232:266;;13278:60;;-1:-1:-1;;;13278:60:5;;;;;;;:::i;13232:266::-;13450:6;13444:13;13435:6;13431:2;13427:15;13420:38;12971:541;-1:-1:-1;;;;;;13108:62:5;-1:-1:-1;;;13108:62:5;;-1:-1:-1;13101:69:5;;12936:628;-1:-1:-1;13549:4:5;12770:800;;;;;;:::o;8848:311::-;8973:18;8979:2;8983:7;8973:5;:18::i;:::-;9022:54;9053:1;9057:2;9061:7;9070:5;9022:22;:54::i;:::-;9001:151;;;;-1:-1:-1;;;9001:151:5;;;;;;;:::i;9481:427::-;-1:-1:-1;;;;;9560:16:5;;9552:61;;;;-1:-1:-1;;;9552:61:5;;33829:2:14;9552:61:5;;;33811:21:14;;;33848:18;;;33841:30;33907:34;33887:18;;;33880:62;33959:18;;9552:61:5;33627:356:14;9552:61:5;7616:4;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;:30;9623:58;;;;-1:-1:-1;;;9623:58:5;;34190:2:14;9623:58:5;;;34172:21:14;34229:2;34209:18;;;34202:30;34268;34248:18;;;34241:58;34316:18;;9623:58:5;33988:352:14;9623:58:5;-1:-1:-1;;;;;9748:13:5;;;;;;:9;:13;;;;;:18;;9765:1;;9748:13;:18;;9765:1;;9748:18;:::i;:::-;;;;-1:-1:-1;;9776:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9776:21:5;-1:-1:-1;;;;;9776:21:5;;;;;;;;9813:33;;9776:16;;;9813:33;;9776:16;;9813:33;11298::1::1;11155:184:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:14;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:14;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:14:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:14;;1343:180;-1:-1:-1;1343:180:14:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:14;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:14:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:347::-;2944:6;2952;3005:2;2993:9;2984:7;2980:23;2976:32;2973:52;;;3021:1;3018;3011:12;2973:52;3044:29;3063:9;3044:29;:::i;:::-;3034:39;;3123:2;3112:9;3108:18;3095:32;3170:5;3163:13;3156:21;3149:5;3146:32;3136:60;;3192:1;3189;3182:12;3136:60;3215:5;3205:15;;;2879:347;;;;;:::o;3231:127::-;3292:10;3287:3;3283:20;3280:1;3273:31;3323:4;3320:1;3313:15;3347:4;3344:1;3337:15;3363:632;3428:5;3458:18;3499:2;3491:6;3488:14;3485:40;;;3505:18;;:::i;:::-;3580:2;3574:9;3548:2;3634:15;;-1:-1:-1;;3630:24:14;;;3656:2;3626:33;3622:42;3610:55;;;3680:18;;;3700:22;;;3677:46;3674:72;;;3726:18;;:::i;:::-;3766:10;3762:2;3755:22;3795:6;3786:15;;3825:6;3817;3810:22;3865:3;3856:6;3851:3;3847:16;3844:25;3841:45;;;3882:1;3879;3872:12;3841:45;3932:6;3927:3;3920:4;3912:6;3908:17;3895:44;3987:1;3980:4;3971:6;3963;3959:19;3955:30;3948:41;;;;3363:632;;;;;:::o;4000:222::-;4043:5;4096:3;4089:4;4081:6;4077:17;4073:27;4063:55;;4114:1;4111;4104:12;4063:55;4136:80;4212:3;4203:6;4190:20;4183:4;4175:6;4171:17;4136:80;:::i;4227:743::-;4334:6;4342;4350;4403:2;4391:9;4382:7;4378:23;4374:32;4371:52;;;4419:1;4416;4409:12;4371:52;4459:9;4446:23;4488:18;4529:2;4521:6;4518:14;4515:34;;;4545:1;4542;4535:12;4515:34;4568:50;4610:7;4601:6;4590:9;4586:22;4568:50;:::i;:::-;4558:60;;4671:2;4660:9;4656:18;4643:32;4627:48;;4700:2;4690:8;4687:16;4684:36;;;4716:1;4713;4706:12;4684:36;4739:52;4783:7;4772:8;4761:9;4757:24;4739:52;:::i;:::-;4729:62;;4844:2;4833:9;4829:18;4816:32;4800:48;;4873:2;4863:8;4860:16;4857:36;;;4889:1;4886;4879:12;4857:36;;4912:52;4956:7;4945:8;4934:9;4930:24;4912:52;:::i;:::-;4902:62;;;4227:743;;;;;:::o;4975:159::-;5042:20;;5102:6;5091:18;;5081:29;;5071:57;;5124:1;5121;5114:12;5139:330;5214:6;5222;5230;5283:2;5271:9;5262:7;5258:23;5254:32;5251:52;;;5299:1;5296;5289:12;5251:52;5322:29;5341:9;5322:29;:::i;:::-;5312:39;;5370:37;5403:2;5392:9;5388:18;5370:37;:::i;:::-;5360:47;;5426:37;5459:2;5448:9;5444:18;5426:37;:::i;:::-;5416:47;;5139:330;;;;;:::o;5474:322::-;5543:6;5596:2;5584:9;5575:7;5571:23;5567:32;5564:52;;;5612:1;5609;5602:12;5564:52;5652:9;5639:23;5685:18;5677:6;5674:30;5671:50;;;5717:1;5714;5707:12;5671:50;5740;5782:7;5773:6;5762:9;5758:22;5740:50;:::i;5801:543::-;5889:6;5897;5950:2;5938:9;5929:7;5925:23;5921:32;5918:52;;;5966:1;5963;5956:12;5918:52;6006:9;5993:23;6035:18;6076:2;6068:6;6065:14;6062:34;;;6092:1;6089;6082:12;6062:34;6115:50;6157:7;6148:6;6137:9;6133:22;6115:50;:::i;:::-;6105:60;;6218:2;6207:9;6203:18;6190:32;6174:48;;6247:2;6237:8;6234:16;6231:36;;;6263:1;6260;6253:12;6231:36;;6286:52;6330:7;6319:8;6308:9;6304:24;6286:52;:::i;:::-;6276:62;;;5801:543;;;;;:::o;6349:667::-;6444:6;6452;6460;6468;6521:3;6509:9;6500:7;6496:23;6492:33;6489:53;;;6538:1;6535;6528:12;6489:53;6561:29;6580:9;6561:29;:::i;:::-;6551:39;;6609:38;6643:2;6632:9;6628:18;6609:38;:::i;:::-;6599:48;;6694:2;6683:9;6679:18;6666:32;6656:42;;6749:2;6738:9;6734:18;6721:32;6776:18;6768:6;6765:30;6762:50;;;6808:1;6805;6798:12;6762:50;6831:22;;6884:4;6876:13;;6872:27;-1:-1:-1;6862:55:14;;6913:1;6910;6903:12;6862:55;6936:74;7002:7;6997:2;6984:16;6979:2;6975;6971:11;6936:74;:::i;:::-;6926:84;;;6349:667;;;;;;;:::o;7021:260::-;7089:6;7097;7150:2;7138:9;7129:7;7125:23;7121:32;7118:52;;;7166:1;7163;7156:12;7118:52;7189:29;7208:9;7189:29;:::i;:::-;7179:39;;7237:38;7271:2;7260:9;7256:18;7237:38;:::i;:::-;7227:48;;7021:260;;;;;:::o;7509:380::-;7588:1;7584:12;;;;7631;;;7652:61;;7706:4;7698:6;7694:17;7684:27;;7652:61;7759:2;7751:6;7748:14;7728:18;7725:38;7722:161;;;7805:10;7800:3;7796:20;7793:1;7786:31;7840:4;7837:1;7830:15;7868:4;7865:1;7858:15;7722:161;;7509:380;;;:::o;9134:356::-;9336:2;9318:21;;;9355:18;;;9348:30;9414:34;9409:2;9394:18;;9387:62;9481:2;9466:18;;9134:356::o;9900:413::-;10102:2;10084:21;;;10141:2;10121:18;;;10114:30;10180:34;10175:2;10160:18;;10153:62;-1:-1:-1;;;10246:2:14;10231:18;;10224:47;10303:3;10288:19;;9900:413::o;11006:127::-;11067:10;11062:3;11058:20;11055:1;11048:31;11098:4;11095:1;11088:15;11122:4;11119:1;11112:15;11138:125;11178:4;11206:1;11203;11200:8;11197:34;;;11211:18;;:::i;:::-;-1:-1:-1;11248:9:14;;11138:125::o;11268:717::-;11551:25;;;-1:-1:-1;;;;;11612:32:14;;11607:2;11592:18;;11585:60;11632:3;11676:2;11661:18;;11654:31;;;-1:-1:-1;;11708:46:14;;11734:19;;11726:6;11708:46;:::i;:::-;11802:9;11794:6;11790:22;11785:2;11774:9;11770:18;11763:50;11836:33;11862:6;11854;11836:33;:::i;:::-;11822:47;;11918:9;11910:6;11906:22;11900:3;11889:9;11885:19;11878:51;11946:33;11972:6;11964;11946:33;:::i;:::-;11938:41;11268:717;-1:-1:-1;;;;;;;;11268:717:14:o;11990:184::-;12060:6;12113:2;12101:9;12092:7;12088:23;12084:32;12081:52;;;12129:1;12126;12119:12;12081:52;-1:-1:-1;12152:16:14;;11990:184;-1:-1:-1;11990:184:14:o;12539:224::-;12578:3;12606:6;12639:2;12636:1;12632:10;12669:2;12666:1;12662:10;12700:3;12696:2;12692:12;12687:3;12684:21;12681:47;;;12708:18;;:::i;:::-;12744:13;;12539:224;-1:-1:-1;;;;12539:224:14:o;12768:127::-;12829:10;12824:3;12820:20;12817:1;12810:31;12860:4;12857:1;12850:15;12884:4;12881:1;12874:15;12900:276;13031:3;13069:6;13063:13;13085:53;13131:6;13126:3;13119:4;13111:6;13107:17;13085:53;:::i;:::-;13154:16;;;;;12900:276;-1:-1:-1;;12900:276:14:o;13307:973::-;13392:12;;13357:3;;13447:1;13467:18;;;;13520;;;;13547:61;;13601:4;13593:6;13589:17;13579:27;;13547:61;13627:2;13675;13667:6;13664:14;13644:18;13641:38;13638:161;;;13721:10;13716:3;13712:20;13709:1;13702:31;13756:4;13753:1;13746:15;13784:4;13781:1;13774:15;13638:161;13815:18;13842:104;;;;13960:1;13955:319;;;;13808:466;;13842:104;-1:-1:-1;;13875:24:14;;13863:37;;13920:16;;;;-1:-1:-1;13842:104:14;;13955:319;13254:1;13247:14;;;13291:4;13278:18;;14049:1;14063:165;14077:6;14074:1;14071:13;14063:165;;;14155:14;;14142:11;;;14135:35;14198:16;;;;14092:10;;14063:165;;;14067:3;;14257:6;14252:3;14248:16;14241:23;;13808:466;;;;;;;13307:973;;;;:::o;14285:1705::-;14797:3;14835:6;14829:13;14851:53;14897:6;14892:3;14885:4;14877:6;14873:17;14851:53;:::i;:::-;14967:13;;14926:16;;;;14989:57;14967:13;14926:16;15023:4;15011:17;;14989:57;:::i;:::-;15065:55;15110:8;15103:5;15099:20;15091:6;15065:55;:::i;:::-;15055:65;;;15151:6;15145:13;15167:54;15212:8;15208:2;15201:4;15193:6;15189:17;15167:54;:::i;:::-;15285:13;;15243:17;;;15307:57;15285:13;15243:17;15341:4;15329:17;;15307:57;:::i;:::-;15431:13;;15386:20;;;15453:57;15431:13;15386:20;15487:4;15475:17;;15453:57;:::i;:::-;15577:13;;15532:20;;;15599:57;15577:13;15532:20;15633:4;15621:17;;15599:57;:::i;:::-;15723:13;;15678:20;;;15745:57;15723:13;15678:20;15779:4;15767:17;;15745:57;:::i;:::-;15869:13;;15824:20;;;15891:57;15869:13;15824:20;15925:4;15913:17;;15891:57;:::i;:::-;15964:20;;14285:1705;-1:-1:-1;;;;;;;;;;;14285:1705:14:o;15995:1001::-;16371:3;16409:6;16403:13;16425:53;16471:6;16466:3;16459:4;16451:6;16447:17;16425:53;:::i;:::-;16541:13;;16500:16;;;;16563:57;16541:13;16500:16;16597:4;16585:17;;16563:57;:::i;:::-;-1:-1:-1;;;16642:20:14;;16671:18;;;16714:13;;16736:65;16714:13;16788:1;16777:13;;16770:4;16758:17;;16736:65;:::i;:::-;16865:13;;16820:20;;;16887:62;16865:13;16936:1;16928:10;;16921:4;16909:17;;16887:62;:::i;:::-;16969:17;16988:1;16965:25;;15995:1001;-1:-1:-1;;;;;;15995:1001:14:o;17001:982::-;17430:3;17468:6;17462:13;17484:53;17530:6;17525:3;17518:4;17510:6;17506:17;17484:53;:::i;:::-;17600:13;;17559:16;;;;17622:57;17600:13;17559:16;17656:4;17644:17;;17622:57;:::i;:::-;-1:-1:-1;;;17701:20:14;;17752:17;;;17794:13;;17701:20;;17740:3;17816:65;17794:13;17868:1;17857:13;;17850:4;17838:17;;17816:65;:::i;:::-;17944:1;17900:20;;17936:10;;;17929:22;17975:1;17967:10;;17001:982;-1:-1:-1;;;;;17001:982:14:o;17988:633::-;18268:3;18306:6;18300:13;18322:53;18368:6;18363:3;18356:4;18348:6;18344:17;18322:53;:::i;:::-;18438:13;;18397:16;;;;18460:57;18438:13;18397:16;18494:4;18482:17;;18460:57;:::i;:::-;-1:-1:-1;;;18539:20:14;;18568:18;;;18613:1;18602:13;;17988:633;-1:-1:-1;;;;17988:633:14:o;18626:::-;18906:3;18944:6;18938:13;18960:53;19006:6;19001:3;18994:4;18986:6;18982:17;18960:53;:::i;:::-;19076:13;;19035:16;;;;19098:57;19076:13;19035:16;19132:4;19120:17;;19098:57;:::i;:::-;-1:-1:-1;;;19177:20:14;;19206:18;;;19251:1;19240:13;;18626:633;-1:-1:-1;;;;18626:633:14:o;19264:135::-;19303:3;-1:-1:-1;;19324:17:14;;19321:43;;;19344:18;;:::i;:::-;-1:-1:-1;19391:1:14;19380:13;;19264:135::o;20575:759::-;20911:25;;;-1:-1:-1;;;;;20972:32:14;;20967:2;20952:18;;20945:60;20992:3;21036:2;21021:18;;21014:31;;;-1:-1:-1;;21068:46:14;;21094:19;;21086:6;21068:46;:::i;:::-;21145:9;21137:6;21133:22;21191:2;21186;21175:9;21171:18;21164:30;21218:1;21210:6;21203:17;21265:2;21261;21257:11;21251:3;21240:9;21236:19;21229:40;;21286:42;21324:2;21316:6;21312:15;21304:6;21286:42;:::i;:::-;21278:50;20575:759;-1:-1:-1;;;;;;;20575:759:14:o;21755:376::-;21931:3;21959:38;21993:3;21985:6;21959:38;:::i;:::-;22026:6;22020:13;22042:52;22087:6;22083:2;22076:4;22068:6;22064:17;22042:52;:::i;23726:398::-;23928:2;23910:21;;;23967:2;23947:18;;;23940:30;24006:34;24001:2;23986:18;;23979:62;-1:-1:-1;;;24072:2:14;24057:18;;24050:32;24114:3;24099:19;;23726:398::o;24129:399::-;24331:2;24313:21;;;24370:2;24350:18;;;24343:30;24409:34;24404:2;24389:18;;24382:62;-1:-1:-1;;;24475:2:14;24460:18;;24453:33;24518:3;24503:19;;24129:399::o;26464:168::-;26504:7;26570:1;26566;26562:6;26558:14;26555:1;26552:21;26547:1;26540:9;26533:17;26529:45;26526:71;;;26577:18;;:::i;:::-;-1:-1:-1;26617:9:14;;26464:168::o;26637:127::-;26698:10;26693:3;26689:20;26686:1;26679:31;26729:4;26726:1;26719:15;26753:4;26750:1;26743:15;26769:120;26809:1;26835;26825:35;;26840:18;;:::i;:::-;-1:-1:-1;26874:9:14;;26769:120::o;26894:422::-;26983:1;27026:5;26983:1;27040:270;27061:7;27051:8;27048:21;27040:270;;;27120:4;27116:1;27112:6;27108:17;27102:4;27099:27;27096:53;;;27129:18;;:::i;:::-;27179:7;27169:8;27165:22;27162:55;;;27199:16;;;;27162:55;27278:22;;;;27238:15;;;;27040:270;;;27044:3;26894:422;;;;;:::o;27321:806::-;27370:5;27400:8;27390:80;;-1:-1:-1;27441:1:14;27455:5;;27390:80;27489:4;27479:76;;-1:-1:-1;27526:1:14;27540:5;;27479:76;27571:4;27589:1;27584:59;;;;27657:1;27652:130;;;;27564:218;;27584:59;27614:1;27605:10;;27628:5;;;27652:130;27689:3;27679:8;27676:17;27673:43;;;27696:18;;:::i;:::-;-1:-1:-1;;27752:1:14;27738:16;;27767:5;;27564:218;;27866:2;27856:8;27853:16;27847:3;27841:4;27838:13;27834:36;27828:2;27818:8;27815:16;27810:2;27804:4;27801:12;27797:35;27794:77;27791:159;;;-1:-1:-1;27903:19:14;;;27935:5;;27791:159;27982:34;28007:8;28001:4;27982:34;:::i;:::-;28052:6;28048:1;28044:6;28040:19;28031:7;28028:32;28025:58;;;28063:18;;:::i;:::-;28101:20;;27321:806;-1:-1:-1;;;27321:806:14:o;28132:131::-;28192:5;28221:36;28248:8;28242:4;28221:36;:::i;28268:165::-;28306:1;28340:4;28337:1;28333:12;28364:3;28354:37;;28371:18;;:::i;:::-;28423:3;28416:4;28413:1;28409:12;28405:22;28400:27;;;28268:165;;;;:::o;28438:238::-;28476:7;28516:4;28513:1;28509:12;28548:4;28545:1;28541:12;28608:3;28602:4;28598:14;28593:3;28590:23;28583:3;28576:11;28569:19;28565:49;28562:75;;;28617:18;;:::i;28681:195::-;28719:4;28756;28753:1;28749:12;28788:4;28785:1;28781:12;28813:3;28808;28805:12;28802:38;;;28820:18;;:::i;:::-;28857:13;;;28681:195;-1:-1:-1;;;28681:195:14:o;28881:128::-;28921:3;28952:1;28948:6;28945:1;28942:13;28939:39;;;28958:18;;:::i;:::-;-1:-1:-1;28994:9:14;;28881:128::o;29014:112::-;29046:1;29072;29062:35;;29077:18;;:::i;:::-;-1:-1:-1;29111:9:14;;29014:112::o;29131:410::-;29333:2;29315:21;;;29372:2;29352:18;;;29345:30;29411:34;29406:2;29391:18;;29384:62;-1:-1:-1;;;29477:2:14;29462:18;;29455:44;29531:3;29516:19;;29131:410::o;29546:407::-;29748:2;29730:21;;;29787:2;29767:18;;;29760:30;29826:34;29821:2;29806:18;;29799:62;-1:-1:-1;;;29892:2:14;29877:18;;29870:41;29943:3;29928:19;;29546:407::o;31027:414::-;31229:2;31211:21;;;31268:2;31248:18;;;31241:30;31307:34;31302:2;31287:18;;31280:62;-1:-1:-1;;;31373:2:14;31358:18;;31351:48;31431:3;31416:19;;31027:414::o;32670:204::-;32708:3;32744:4;32741:1;32737:12;32776:4;32773:1;32769:12;32811:3;32805:4;32801:14;32796:3;32793:23;32790:49;;;32819:18;;:::i;:::-;32855:13;;32670:204;-1:-1:-1;;;32670:204:14:o;32879:489::-;-1:-1:-1;;;;;33148:15:14;;;33130:34;;33200:15;;33195:2;33180:18;;33173:43;33247:2;33232:18;;33225:34;;;33295:3;33290:2;33275:18;;33268:31;;;33073:4;;33316:46;;33342:19;;33334:6;33316:46;:::i;:::-;33308:54;32879:489;-1:-1:-1;;;;;;32879:489:14:o;33373:249::-;33442:6;33495:2;33483:9;33474:7;33470:23;33466:32;33463:52;;;33511:1;33508;33501:12;33463:52;33543:9;33537:16;33562:30;33586:5;33562:30;:::i
Swarm Source
ipfs://9b79625ff45d365417bee60c8a0f64750c8c5b2567b43edaf22ba72f8223b62f
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.