Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 232 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 19749530 | 216 days ago | IN | 0 ETH | 0.00051573 | ||||
Set Approval For... | 19301727 | 279 days ago | IN | 0 ETH | 0.00054792 | ||||
Set Approval For... | 18895661 | 336 days ago | IN | 0 ETH | 0.0007253 | ||||
Set Approval For... | 18800538 | 349 days ago | IN | 0 ETH | 0.00113762 | ||||
Set Approval For... | 18800513 | 349 days ago | IN | 0 ETH | 0.00119792 | ||||
Set Approval For... | 18800512 | 349 days ago | IN | 0 ETH | 0.0011404 | ||||
Set Approval For... | 18780983 | 352 days ago | IN | 0 ETH | 0.00226034 | ||||
Set Approval For... | 18591565 | 378 days ago | IN | 0 ETH | 0.00147827 | ||||
Toggle Project I... | 18058431 | 453 days ago | IN | 0 ETH | 0.00041504 | ||||
Update Project P... | 18055983 | 453 days ago | IN | 0 ETH | 0.00033841 | ||||
Update Project P... | 18050987 | 454 days ago | IN | 0 ETH | 0.00029064 | ||||
Set Approval For... | 17525235 | 528 days ago | IN | 0 ETH | 0.00062287 | ||||
Toggle Project I... | 17443164 | 539 days ago | IN | 0 ETH | 0.00073572 | ||||
Toggle Project I... | 17443163 | 539 days ago | IN | 0 ETH | 0.00074484 | ||||
Toggle Project I... | 17443131 | 539 days ago | IN | 0 ETH | 0.00076674 | ||||
Toggle Project I... | 17443129 | 539 days ago | IN | 0 ETH | 0.0007787 | ||||
Update Project A... | 17161375 | 579 days ago | IN | 0 ETH | 0.00239712 | ||||
Toggle Project I... | 17137479 | 582 days ago | IN | 0 ETH | 0.00106166 | ||||
Toggle Project I... | 17137478 | 582 days ago | IN | 0 ETH | 0.0010918 | ||||
Update Project D... | 17137452 | 582 days ago | IN | 0 ETH | 0.00785036 | ||||
Update Project D... | 17137446 | 582 days ago | IN | 0 ETH | 0.01078158 | ||||
Update Project B... | 17137445 | 582 days ago | IN | 0 ETH | 0.00358278 | ||||
Update Project M... | 17137441 | 582 days ago | IN | 0 ETH | 0.00113108 | ||||
Update Project N... | 17137440 | 582 days ago | IN | 0 ETH | 0.00121631 | ||||
Update Project M... | 17137438 | 582 days ago | IN | 0 ETH | 0.00131707 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NtentArtX
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-28 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File contracts/libs/IERC165.sol // File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.8.9; /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * Implementers can declare support of contract interfaces, which can then be * queried by others (`ERC165Checker`). * * For an implementation, see `ERC165`. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/libs/ERC165.sol // File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.8.9; /** * @dev Implementation of the `IERC165` interface. * * Contracts may inherit from this and call `_registerInterface` to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See `IERC165.supportsInterface`. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See `IERC165.supportsInterface`. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File contracts/libs/IERC721.sol // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.9; /** * @dev Required interface of an ERC721 compliant contract. */ abstract contract IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view virtual returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view virtual returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either `approve` or `setApproveForAll`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either `approve` or `setApproveForAll`. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual; function approve(address to, uint256 tokenId) public virtual; function getApproved(uint256 tokenId) public view virtual returns (address operator); function setApprovalForAll(address operator, bool _approved) public virtual; function isApprovedForAll(address owner, address operator) public view virtual returns (bool); function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ abstract contract IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external virtual view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external virtual view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external virtual view returns (uint256); } // File contracts/libs/Address.sol // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.8.9; /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } pragma solidity ^0.8.9; library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function concatenate(string memory a, string memory b) internal pure returns (string memory) { return string(abi.encodePacked(a, b)); } /** * @dev converts string to integer */ function str2int(string memory numString) internal pure returns (uint256) { uint256 val = 0; bytes memory stringBytes = bytes(numString); for (uint256 i; i < stringBytes.length; i++) { uint256 exp = stringBytes.length - i; bytes1 ival = stringBytes[i]; uint8 uval = uint8(ival); uint256 jval = uval - uint256(0x30); val += (uint256(jval) * (10**(exp - 1))); } return val; } /** * @dev get substring of string */ function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } /** * @dev gets string length */ function stringLength(string memory str) internal pure returns (uint256 length) { uint256 i = 0; bytes memory string_rep = bytes(str); while (i < string_rep.length) { if (string_rep[i] >> 7 == 0) i += 1; else if (string_rep[i] >> 5 == bytes1(uint8(0x6))) i += 2; else if (string_rep[i] >> 4 == bytes1(uint8(0xE))) i += 3; else if (string_rep[i] >> 3 == bytes1(uint8(0x1E))) i += 4; //For safety else i += 1; length++; } } /** * @dev reverses string */ function reverse(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); assert(_baseBytes.length > 0); string memory _tempValue = new string(_baseBytes.length); bytes memory _newValue = bytes(_tempValue); for (uint256 i = 0; i < _baseBytes.length; i++) { _newValue[_baseBytes.length - i - 1] = _baseBytes[i]; } return string(_newValue); } } pragma solidity ^0.8.9; library Ints { 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); } } // File contracts/libs/IERC721Receiver.sol // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.9; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ abstract contract IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) public virtual returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata { /** * @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); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error UnableDetermineTokenOwner(); error UnableGetTokenOwnerByIndex(); error URIQueryForNonexistentToken(); error BurnedQueryForZeroAddress(); pragma solidity ^0.8.9; abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Ints for uint256; struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } uint256 internal currentIndex; uint256[] internal burnedTokens; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex - burnedTokens.length; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC165).interfaceId; } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken(); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } } } } revert UnableDetermineTokenOwner(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev Added by @dotjiwa to track burned tokens. */ function isBurned(uint256 tokenId) public view returns (bool) { return _ownerships[tokenId].burned; } function getBurnedTokens() public view returns (uint256[] memory) { return burnedTokens; } /** * @dev Brought over from ERC721 by @dotjiwa. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < currentIndex; } function _safeMint( address to, uint256 startTokenId, uint256 quantity ) internal { _safeMint(to, startTokenId, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 startTokenId, uint256 quantity, bytes memory _data ) internal { _mint(to, startTokenId, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 startTokenId, uint256 quantity, bytes memory _data, bool safe ) internal { if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if ( safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } currentIndex = currentIndex + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); //update balance of owner _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; //store burned token id which will update total supply burnedTokens.push(tokenId); unchecked { // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); //also catches burned tokens if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer(); else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.9; interface NtentTokenUri { function tokenUri(uint256 _tokenId) external view returns (string memory); } interface NtentTransfer { function onTransfer( address _from, address _to, uint256 _tokenId, uint256 _quantity ) external view returns (string memory); } contract NtentArtX is ERC721A { using Ints for uint256; using Strings for string; event Mint( uint256 indexed _startTokenId, uint256 indexed _endTokenId, uint256 indexed _projectId ); event TokenBurned(address indexed _tokenOwner, uint256 indexed _tokenId); struct Project { string name; string artist; string description; string website; string license; address purchaseContract; address dataContract; address tokenUriContract; address transferContract; bool acceptsMintPass; uint256 mintPassProjectId; bool dynamic; string projectBaseURI; string projectBaseIpfsURI; uint256 invocations; uint256 maxInvocations; string scriptJSON; mapping(uint256 => string) scripts; uint256 scriptCount; string ipfsHash; bool useHashString; bool useIpfs; bool active; bool locked; bool paused; } uint256 constant ONE_MILLION = 1_000_000; mapping(uint256 => Project) projects; //All financial functions are stripped from struct for visibility mapping(uint256 => address) public projectIdToArtistAddress; mapping(uint256 => uint256) public projectIdToPricePerTokenInWei; address public ntentAddress; uint256 public ntentPercentage = 10; mapping(uint256 => string) public staticIpfsImageLink; address public admin; mapping(address => bool) public isRainbowlisted; mapping(address => bool) public isMintRainbowlisted; uint256 public nextProjectId = 3; uint256 public startProjectId = 3; uint256 private _royaltyBps; address payable private _royaltyRecipient; bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6; bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584; mapping(address => bool) proxyToApproved; modifier onlyValidTokenId(uint256 _tokenId) { require(_exists(_tokenId), "Token ID not exists"); _; } modifier onlyUnlocked(uint256 _projectId) { require(!projects[_projectId].locked, "Only if unlocked"); _; } modifier onlyArtist(uint256 _projectId) { require( msg.sender == projectIdToArtistAddress[_projectId], "Only artist" ); _; } modifier onlyAdmin() { require(msg.sender == admin, "Only admin"); _; } modifier onlyRainbowlisted() { require(isRainbowlisted[msg.sender], "Only Rainbowlisted"); _; } modifier onlyArtistOrRainbowlisted(uint256 _projectId) { require( isRainbowlisted[msg.sender] || msg.sender == projectIdToArtistAddress[_projectId], "Only artist or Rainbowlisted" ); _; } constructor(string memory _tokenName, string memory _tokenSymbol) ERC721A(_tokenName, _tokenSymbol) { admin = msg.sender; isRainbowlisted[msg.sender] = true; ntentAddress = msg.sender; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { return interfaceId == type(IERC721).interfaceId || ERC721A.supportsInterface(interfaceId) || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE; } function _exists(uint256 tokenId) internal view override returns (bool) { uint256 projectId = tokenIdToProjectId(tokenId); return (tokenId < ((projectId * ONE_MILLION) + projects[projectId].invocations)) && (tokenId >= (projectId * ONE_MILLION) && !isBurned(tokenId)); } function mint( address _to, uint256 _projectId, uint256 quantity, address _by ) external returns (uint256 _tokenId) { require( isMintRainbowlisted[msg.sender], "Must mint from Rainbowlisted minter" ); require( projects[_projectId].invocations + quantity <= projects[_projectId].maxInvocations, "Exceeds max invocations" ); require( projects[_projectId].active || _by == projectIdToArtistAddress[_projectId], "Proj must exist and be active" ); require( !projects[_projectId].paused || _by == projectIdToArtistAddress[_projectId], "Purchases are paused" ); uint256 tokenId = _mintTokens(_to, _projectId, quantity); return tokenId; } function _mintTokens( address _to, uint256 _projectId, uint256 quantity ) internal returns (uint256 _tokenId) { uint256 nextStartTokenId = (_projectId * ONE_MILLION) + projects[_projectId].invocations; projects[_projectId].invocations = projects[_projectId].invocations + quantity; _safeMint(_to, nextStartTokenId, quantity); emit Mint(nextStartTokenId, nextStartTokenId + quantity, _projectId); return nextStartTokenId; } function burn(address ownerAddress, uint256 tokenId) external returns (uint256 _tokenId) { require( isMintRainbowlisted[msg.sender], "Must burn from Rainbowlisted minter" ); _burn(tokenId); emit TokenBurned(ownerAddress, tokenId); return tokenId; } function updateNtentAddress(address _ntentAddress) public onlyAdmin { ntentAddress = _ntentAddress; } function updateNtentPercentage(uint256 _ntentPercentage) public onlyAdmin { require(_ntentPercentage <= 50, "Max of 50%"); ntentPercentage = _ntentPercentage; } function addRainbowlisted(address _address) public onlyAdmin { isRainbowlisted[_address] = true; } function removeRainbowlisted(address _address) public onlyAdmin { isRainbowlisted[_address] = false; } function addMintRainbowlisted(address _address) public onlyAdmin { isMintRainbowlisted[_address] = true; } function removeMintRainbowlisted(address _address) public onlyAdmin { isMintRainbowlisted[_address] = false; } function getPricePerTokenInWei(uint256 _projectId) public view returns (uint256 price) { return projectIdToPricePerTokenInWei[_projectId]; } function toggleProjectIsLocked(uint256 _projectId) public onlyRainbowlisted onlyUnlocked(_projectId) { projects[_projectId].locked = true; } function toggleProjectIsActive(uint256 _projectId) public onlyRainbowlisted { projects[_projectId].active = !projects[_projectId].active; } function updateProjectArtistAddress( uint256 _projectId, address _artistAddress ) public onlyArtistOrRainbowlisted(_projectId) { projectIdToArtistAddress[_projectId] = _artistAddress; } function toggleProjectIsPaused(uint256 _projectId) public onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].paused = !projects[_projectId].paused; } function addProject( string memory _projectName, address _artistAddress, uint256 _pricePerTokenInWei, address _purchaseContract, bool _acceptsMintPass, uint256 _mintPassProjectId, bool _dynamic ) public onlyRainbowlisted { uint256 projectId = nextProjectId; projectIdToArtistAddress[projectId] = _artistAddress; projects[projectId].name = _projectName; projects[projectId].purchaseContract = _purchaseContract; projects[projectId].acceptsMintPass = _acceptsMintPass; projects[projectId].mintPassProjectId = _mintPassProjectId; projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei; projects[projectId].paused = true; projects[projectId].dynamic = _dynamic; projects[projectId].maxInvocations = ONE_MILLION; if (!_dynamic) { projects[projectId].useHashString = false; } else { projects[projectId].useHashString = true; } nextProjectId = nextProjectId + 1; } function updateProjectPricePerTokenInWei( uint256 _projectId, uint256 _pricePerTokenInWei ) public onlyArtist(_projectId) { projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei; } function updateProjectName(uint256 _projectId, string memory _projectName) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].name = _projectName; } function updateProjectArtistName( uint256 _projectId, string memory _projectArtistName ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].artist = _projectArtistName; } function updateProjectPurchaseContractInfo( uint256 _projectId, address _projectPurchaseContract, bool _acceptsMintPass, uint256 _mintPassProjectId ) public onlyUnlocked(_projectId) onlyRainbowlisted { projects[_projectId].purchaseContract = _projectPurchaseContract; projects[_projectId].acceptsMintPass = _acceptsMintPass; projects[_projectId].mintPassProjectId = _mintPassProjectId; } function updateProjectDataContractInfo( uint256 _projectId, address _projectDataContract ) public onlyUnlocked(_projectId) onlyRainbowlisted { projects[_projectId].dataContract = _projectDataContract; } function updateTransferContractInfo( uint256 _projectId, address _projectTransferContract ) public onlyUnlocked(_projectId) onlyRainbowlisted { projects[_projectId].transferContract = _projectTransferContract; } function updateProjectTokenUriContractInfo( uint256 _projectId, address _projectTokenUriContract ) public onlyUnlocked(_projectId) onlyRainbowlisted { projects[_projectId].tokenUriContract = _projectTokenUriContract; } function updateProjectDescription( uint256 _projectId, string memory _projectDescription ) public onlyArtist(_projectId) { projects[_projectId].description = _projectDescription; } function updateProjectWebsite( uint256 _projectId, string memory _projectWebsite ) public onlyArtist(_projectId) { projects[_projectId].website = _projectWebsite; } function updateProjectLicense( uint256 _projectId, string memory _projectLicense ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].license = _projectLicense; } function updateProjectMaxInvocations( uint256 _projectId, uint256 _maxInvocations ) public onlyArtist(_projectId) { require( (!projects[_projectId].locked || _maxInvocations < projects[_projectId].maxInvocations), "Only if unlocked" ); require( _maxInvocations > projects[_projectId].invocations, "Max invocations exceeds current" ); require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1000000"); projects[_projectId].maxInvocations = _maxInvocations; } function toggleProjectUseHashString(uint256 _projectId) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { require( projects[_projectId].invocations == 0, "Cannot modify after token is minted." ); projects[_projectId].useHashString = !projects[_projectId] .useHashString; } function addProjectScript(uint256 _projectId, string memory _script) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].scripts[ projects[_projectId].scriptCount ] = _script; projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1; } function updateProjectScript( uint256 _projectId, uint256 _scriptId, string memory _script ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { require( _scriptId < projects[_projectId].scriptCount, "scriptId out of range" ); projects[_projectId].scripts[_scriptId] = _script; } function removeProjectLastScript(uint256 _projectId) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { require( projects[_projectId].scriptCount > 0, "there are no scripts to remove" ); delete projects[_projectId].scripts[ projects[_projectId].scriptCount - 1 ]; projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1; } function updateProjectScriptJSON( uint256 _projectId, string memory _projectScriptJSON ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].scriptJSON = _projectScriptJSON; } function updateProjectIpfsHash(uint256 _projectId, string memory _ipfsHash) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { projects[_projectId].ipfsHash = _ipfsHash; } function updateProjectBaseURI(uint256 _projectId, string memory _newBaseURI) public onlyArtist(_projectId) { projects[_projectId].projectBaseURI = _newBaseURI; } function updateProjectBaseIpfsURI( uint256 _projectId, string memory _projectBaseIpfsURI ) public onlyArtist(_projectId) { projects[_projectId].projectBaseIpfsURI = _projectBaseIpfsURI; } function toggleProjectUseIpfsForStatic(uint256 _projectId) public onlyArtistOrRainbowlisted(_projectId) { require( !projects[_projectId].dynamic, "can only set static IPFS hash for static projects" ); projects[_projectId].useIpfs = !projects[_projectId].useIpfs; } function toggleProjectIsDynamic(uint256 _projectId) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) { require( projects[_projectId].invocations == 0, "Can not switch after a token is minted." ); if (projects[_projectId].dynamic) { projects[_projectId].useHashString = false; } else { projects[_projectId].useHashString = true; } projects[_projectId].dynamic = !projects[_projectId].dynamic; } function overrideTokenDynamicImageWithIpfsLink( uint256 _tokenId, string memory _ipfsHash ) public onlyArtistOrRainbowlisted(tokenIdToProjectId(_tokenId)) { staticIpfsImageLink[_tokenId] = _ipfsHash; } function clearTokenIpfsImageUri(uint256 _tokenId) public onlyArtistOrRainbowlisted(tokenIdToProjectId(_tokenId)) { delete staticIpfsImageLink[tokenIdToProjectId(_tokenId)]; } function projectDetails(uint256 _projectId) public view returns ( string memory projectName, string memory artist, string memory description, string memory website, string memory license, bool dynamic ) { projectName = projects[_projectId].name; artist = projects[_projectId].artist; description = projects[_projectId].description; website = projects[_projectId].website; license = projects[_projectId].license; dynamic = projects[_projectId].dynamic; } function projectTokenInfo(uint256 _projectId) public view returns ( address artistAddress, uint256 pricePerTokenInWei, uint256 invocations, uint256 maxInvocations, bool active, address purchaseContract, address dataContract, address tokenUriContract, address transferContract, bool acceptsMintPass, uint256 mintPassProjectId ) { artistAddress = projectIdToArtistAddress[_projectId]; pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId]; invocations = projects[_projectId].invocations; maxInvocations = projects[_projectId].maxInvocations; active = projects[_projectId].active; purchaseContract = projects[_projectId].purchaseContract; dataContract = projects[_projectId].dataContract; tokenUriContract = projects[_projectId].tokenUriContract; transferContract = projects[_projectId].transferContract; acceptsMintPass = projects[_projectId].acceptsMintPass; mintPassProjectId = projects[_projectId].mintPassProjectId; } function projectBurnedTokens(uint256 _projectId) public view returns (uint256[] memory) { uint256 burnedIndex; uint256 burnedTokenId; uint256 projectBurnedCount = projectBurnedTokensCount(_projectId); uint256[] memory burnedTokenIds = new uint256[](projectBurnedCount); uint256 burnedTokenLength = burnedTokens.length; for (uint256 i; i < burnedTokenLength; i++) { burnedTokenId = burnedTokens[i]; if (tokenIdToProjectId(burnedTokenId) == _projectId) { burnedTokenIds[burnedIndex] = burnedTokenId; } } return burnedTokenIds; } function projectScriptInfo(uint256 _projectId) public view returns ( string memory scriptJSON, uint256 scriptCount, bool useHashString, string memory ipfsHash, bool locked, bool paused ) { scriptJSON = projects[_projectId].scriptJSON; scriptCount = projects[_projectId].scriptCount; useHashString = projects[_projectId].useHashString; ipfsHash = projects[_projectId].ipfsHash; locked = projects[_projectId].locked; paused = projects[_projectId].paused; } function projectScriptByIndex(uint256 _projectId, uint256 _index) public view returns (string memory) { return projects[_projectId].scripts[_index]; } function projectURIInfo(uint256 _projectId) public view returns ( string memory projectBaseURI, string memory projectBaseIpfsURI, bool useIpfs ) { projectBaseURI = projects[_projectId].projectBaseURI; projectBaseIpfsURI = projects[_projectId].projectBaseIpfsURI; useIpfs = projects[_projectId].useIpfs; } function transferFrom( address _from, address _to, uint256 _tokenId ) public override { _transfer(_from, _to, _tokenId); } function _beforeTokenTransfers( address _from, address _to, uint256 _tokenId, uint256 _quantity ) internal view override { //check if custom transfer contract, if so, send call. if ( projects[tokenIdToProjectId(_tokenId)].transferContract != address(0) ) { NtentTransfer ntentTransfer = NtentTransfer( projects[tokenIdToProjectId(_tokenId)].transferContract ); ntentTransfer.onTransfer(_from, _to, _tokenId, _quantity); } } function bulkTransfer( address[] calldata _addressList, uint256[] calldata _tokenList ) public onlyAdmin { uint256 addressLength = _addressList.length; uint256 tokenLength = _tokenList.length; require(addressLength > 0, "Address quantity must greater than zero"); require( addressLength == tokenLength, "Token quantity must equal address quantity" ); for (uint256 i; i < addressLength; i++) { address _toAddress = _addressList[i]; uint256 _tokenId = _tokenList[i]; safeTransferFrom(msg.sender, _toAddress, _tokenId); } } function projectShowAllTokens(uint256 _projectId) public view returns (uint256[] memory) { return projectIdToTokenIds(_projectId); } function projectIdToTokenIds(uint256 _projectId) public view returns (uint256[] memory) { uint256 tId; uint256 tokenId; uint256 projTokenLength = projects[_projectId].invocations; uint256 projectBurnedCount = projectBurnedTokensCount(_projectId); uint256[] memory projectTokens = new uint256[]( projTokenLength - projectBurnedCount ); for (uint256 i; i < projTokenLength; i++) { tokenId = (_projectId * ONE_MILLION) + i; if (isBurned(tokenId) == false) { projectTokens[tId] = tokenId; tId++; } } return projectTokens; } function projectBurnedTokensCount(uint256 _projectId) public view returns (uint256) { uint256 tokenId; uint256 count; uint256 burnedTokenLength = burnedTokens.length; for (uint256 i; i < burnedTokenLength; i++) { tokenId = burnedTokens[i]; if (tokenIdToProjectId(tokenId) == _projectId) { count++; } } return count; } //example input : 1000004 function tokenIdToProjectId(uint256 _tokenId) public pure returns (uint256) { //convert to string and reverse string memory reversed = _tokenId.toString().reverse(); //chop off reversed project id from end, reverse back string memory strProjectId = reversed .substring(6, reversed.stringLength()) .reverse(); return strProjectId.str2int(); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256 ownerBalance = balanceOf(owner); uint256 foundCount; address currOwnershipAddr; uint256[] memory ownerTokenIds = new uint256[](ownerBalance); // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i = startProjectId; i < nextProjectId; i++) { uint256[] memory projectTokens = projectIdToTokenIds(i); for (uint256 ii; ii < projectTokens.length; ii++) { uint256 tokenId = projectTokens[ii]; TokenOwnership memory ownership = _ownerships[tokenId]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { ownerTokenIds[foundCount] = tokenId; foundCount++; } if (foundCount == ownerBalance) { return ownerTokenIds; } } } } revert UnableGetTokenOwnerByIndex(); } function tokenURI(uint256 _tokenId) public view override onlyValidTokenId(_tokenId) returns (string memory) { //check if custom tokenUri contract, if so, use that. if ( projects[tokenIdToProjectId(_tokenId)].tokenUriContract != address(0) ) { NtentTokenUri ntentTokenUri = NtentTokenUri( projects[tokenIdToProjectId(_tokenId)].tokenUriContract ); //if returned tokenUri is not empty, else continue string memory tUri = ntentTokenUri.tokenUri(_tokenId); if(bytes(tUri).length > 0) return tUri; } //check if tokenId has a specified image link if (bytes(staticIpfsImageLink[_tokenId]).length > 0) { return projects[tokenIdToProjectId(_tokenId)] .projectBaseIpfsURI .concatenate(staticIpfsImageLink[_tokenId]); } //check if the project has a single overall token Uri (mintpass, etc) if ( !projects[tokenIdToProjectId(_tokenId)].dynamic && projects[tokenIdToProjectId(_tokenId)].useIpfs ) { return projects[tokenIdToProjectId(_tokenId)] .projectBaseIpfsURI .concatenate( projects[tokenIdToProjectId(_tokenId)].ipfsHash ); } return projects[tokenIdToProjectId(_tokenId)].projectBaseURI.concatenate( _tokenId.toString() ); } /** * Royalties */ function updateRoyalties(address payable recipient, uint256 bps) external onlyRainbowlisted { _royaltyRecipient = recipient; _royaltyBps = bps; } function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps) { if (_royaltyRecipient != address(0x0)) { recipients = new address payable[](1); recipients[0] = _royaltyRecipient; bps = new uint256[](1); bps[0] = _royaltyBps; } return (recipients, bps); } function getFeeRecipients(uint256) external view returns (address payable[] memory recipients) { if (_royaltyRecipient != address(0x0)) { recipients = new address payable[](1); recipients[0] = _royaltyRecipient; } return recipients; } function getFeeBps(uint256) external view returns (uint256[] memory bps) { if (_royaltyRecipient != address(0x0)) { bps = new uint256[](1); bps[0] = _royaltyBps; } return bps; } function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) { return (_royaltyRecipient, (value * _royaltyBps) / 10000); } /** * Proxy */ function flipProxyState(address proxyAddress) public onlyRainbowlisted{ proxyToApproved[proxyAddress] = !proxyToApproved[proxyAddress]; } //proxy registration function isApprovedForAll(address _owner, address _operator) public view override returns (bool){ if(proxyToApproved[_operator]) return true; return super.isApprovedForAll(_owner, _operator); } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i = startProjectId; i < nextProjectId; i++) { uint256[] memory projectTokens = projectIdToTokenIds(i); for (uint256 ii; ii < projectTokens.length; ii++) { uint256 tokenId = projectTokens[ii]; TokenOwnership memory ownership = _ownerships[tokenId]; if (!ownership.burned) { if (tokenIdsIdx == index) { return tokenId; } tokenIdsIdx++; } } } } revert UnableGetTokenOwnerByIndex(); } function tokenOfOwnerByIndex(address owner, uint256 index) public override view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return tokensOfOwner(owner)[index]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"inputs":[],"name":"UnableGetTokenOwnerByIndex","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_startTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_endTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"TokenBurned","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":"address","name":"_address","type":"address"}],"name":"addMintRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"address","name":"_artistAddress","type":"address"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"},{"internalType":"address","name":"_purchaseContract","type":"address"},{"internalType":"bool","name":"_acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"_mintPassProjectId","type":"uint256"},{"internalType":"bool","name":"_dynamic","type":"bool"}],"name":"addProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"addProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint256[]","name":"_tokenList","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"clearTokenIpfsImageUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"getPricePerTokenInWei","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMintRainbowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRainbowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_by","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ntentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ntentPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"overrideTokenDynamicImageWithIpfsLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectBurnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectBurnedTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectDetails","outputs":[{"internalType":"string","name":"projectName","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"string","name":"license","type":"string"},{"internalType":"bool","name":"dynamic","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectIdToArtistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectIdToPricePerTokenInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectIdToTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"projectScriptByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectScriptInfo","outputs":[{"internalType":"string","name":"scriptJSON","type":"string"},{"internalType":"uint256","name":"scriptCount","type":"uint256"},{"internalType":"bool","name":"useHashString","type":"bool"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectShowAllTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectTokenInfo","outputs":[{"internalType":"address","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"invocations","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"purchaseContract","type":"address"},{"internalType":"address","name":"dataContract","type":"address"},{"internalType":"address","name":"tokenUriContract","type":"address"},{"internalType":"address","name":"transferContract","type":"address"},{"internalType":"bool","name":"acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"mintPassProjectId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectURIInfo","outputs":[{"internalType":"string","name":"projectBaseURI","type":"string"},{"internalType":"string","name":"projectBaseIpfsURI","type":"string"},{"internalType":"bool","name":"useIpfs","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeMintRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"removeProjectLastScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"staticIpfsImageLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsDynamic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseHashString","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseIpfsForStatic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenIdToProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ntentAddress","type":"address"}],"name":"updateNtentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ntentPercentage","type":"uint256"}],"name":"updateNtentPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_artistAddress","type":"address"}],"name":"updateProjectArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectArtistName","type":"string"}],"name":"updateProjectArtistName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectBaseIpfsURI","type":"string"}],"name":"updateProjectBaseIpfsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectDataContract","type":"address"}],"name":"updateProjectDataContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectDescription","type":"string"}],"name":"updateProjectDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"updateProjectIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectLicense","type":"string"}],"name":"updateProjectLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"updateProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectName","type":"string"}],"name":"updateProjectName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updateProjectPricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectPurchaseContract","type":"address"},{"internalType":"bool","name":"_acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"_mintPassProjectId","type":"uint256"}],"name":"updateProjectPurchaseContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_scriptId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"updateProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectScriptJSON","type":"string"}],"name":"updateProjectScriptJSON","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectTokenUriContract","type":"address"}],"name":"updateProjectTokenUriContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectWebsite","type":"string"}],"name":"updateProjectWebsite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectTransferContract","type":"address"}],"name":"updateTransferContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a600d55600360125560036013553480156200002057600080fd5b50604051620061aa380380620061aa8339810160408190526200004391620002c0565b8181620000576301ffc9a760e01b620000c9565b81516200006c9060039060208501906200014d565b508051620000829060049060208401906200014d565b5050600f8054336001600160a01b031991821681179092556000828152601060205260409020805460ff19166001179055600c805490911690911790555062000367915050565b6001600160e01b03198082161415620001285760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b8280546200015b906200032a565b90600052602060002090601f0160209004810192826200017f5760008555620001ca565b82601f106200019a57805160ff1916838001178555620001ca565b82800160010185558215620001ca579182015b82811115620001ca578251825591602001919060010190620001ad565b50620001d8929150620001dc565b5090565b5b80821115620001d85760008155600101620001dd565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021b57600080fd5b81516001600160401b0380821115620002385762000238620001f3565b604051601f8301601f19908116603f01168101908282118183101715620002635762000263620001f3565b816040528381526020925086838588010111156200028057600080fd5b600091505b83821015620002a4578582018301518183018401529082019062000285565b83821115620002b65760008385830101525b9695505050505050565b60008060408385031215620002d457600080fd5b82516001600160401b0380821115620002ec57600080fd5b620002fa8683870162000209565b935060208501519150808211156200031157600080fd5b50620003208582860162000209565b9150509250929050565b600181811c908216806200033f57607f821691505b602082108114156200036157634e487b7160e01b600052602260045260246000fd5b50919050565b615e3380620003776000396000f3fe608060405234801561001057600080fd5b50600436106104d15760003560e01c806370a8a0ad1161028d578063b7b04fae11610161578063c87b56dd116100de578063e935b7b1116100a2578063f73c814b1161007c578063f73c814b14610c90578063f74bfe8e14610ca3578063f851a44014610cb657600080fd5b8063e935b7b114610c54578063e985e9c514610c5d578063f70c0f0414610c7057600080fd5b8063c87b56dd14610bde578063d03c390c14610bf1578063db2ff86114610c04578063db44fe0714610c17578063dce5d85814610c4157600080fd5b8063bcd4f24411610125578063bcd4f24414610b8a578063bee04f9c14610b9d578063c26aff0f14610bb0578063c3f4f54f14610bc3578063c6d7323114610bcb57600080fd5b8063b7b04fae14610b10578063b88d4fde14610b23578063b9c4d9fb14610b36578063bb3bafd614610b56578063bc6e639d14610b7757600080fd5b806395d89b411161020a578063a3b2cca6116101ce578063acad0124116101a8578063acad012414610ad7578063b1656ba314610aea578063b6550e8f14610afd57600080fd5b8063a3b2cca614610a88578063a47d29cb14610a9b578063a784d5c114610ac457600080fd5b806395d89b4114610a3457806397dc86cf14610a3c5780639dc29fac14610a4f578063a11ec70a14610a62578063a22cb46514610a7557600080fd5b80638ba8f14d116102515780638ba8f14d146108da5780638c2c3622146108ed5780638c3c9cdd146109e95780638dd91a56146109fc57806393961c6614610a2157600080fd5b806370a8a0ad1461085e578063742ff77a14610871578063810051d714610891578063826fc391146108b45780638462151c146108c757600080fd5b8063360d223a116103c45780634ae9a7381161034157806369bfd5d6116103055780636c2f5acd116102df5780636c2f5acd146108255780636c31d4e91461083857806370a082311461084b57600080fd5b806369bfd5d6146107ec57806369d14faf146107ff5780636bd5d5911461081257600080fd5b80634ae9a7381461078d5780634f6ccce7146107a05780635c088dcc146107b35780636352211e146107c6578063672b17e9146107d957600080fd5b80633f383cb8116103885780633f383cb81461071c5780633fef6c2a1461072f57806342842e0e1461074257806343fa7f44146107555780634aa6d4171461076857600080fd5b8063360d223a146106c757806337859963146106da5780633839bf99146106ed5780633bdbd5c4146106f65780633e48e8481461070957600080fd5b80631b689c0b11610452578063261eb4e511610416578063261eb4e51461063a578063279018221461064d5780632a55205a146106605780632d9c0205146106925780632f745c59146106b457600080fd5b80631b689c0b146105d55780632002f713146105e857806321c0da791461060b57806323b872dd1461061457806325b75d681461062757600080fd5b80630d170673116104995780630d170673146105665780630ebd4c7f14610579578063153a1f3e1461059957806318160ddd146105ac5780631afe39f8146105c257600080fd5b806301ffc9a7146104d657806306fdde03146104fe578063081812fc14610513578063095ea7b31461053e5780630b8f4d2d14610553575b600080fd5b6104e96104e43660046152f2565b610cc9565b60405190151581526020015b60405180910390f35b610506610d7b565b6040516104f59190615367565b61052661052136600461537a565b610e0d565b6040516001600160a01b0390911681526020016104f5565b61055161054c3660046153a8565b610e51565b005b6105516105613660046153d4565b610edf565b6105516105743660046154bc565b610f4f565b61058c61058736600461537a565b611020565b6040516104f5919061553d565b6105516105a7366004615594565b61107c565b6105b4611200565b6040519081526020016104f5565b6105516105d036600461560f565b611217565b6105b46105e336600461537a565b611393565b6104e96105f63660046153d4565b60106020526000908152604090205460ff1681565b6105b4600d5481565b6105516106223660046156a5565b6113d7565b6105516106353660046154bc565b6113e2565b61050661064836600461537a565b6114b2565b61055161065b36600461537a565b61154c565b61067361066e3660046156e6565b6115ee565b604080516001600160a01b0390931683526020830191909152016104f5565b6106a56106a036600461537a565b611629565b6040516104f593929190615708565b6105b46106c23660046153a8565b61178d565b6105516106d53660046153d4565b611824565b6105516106e83660046154bc565b61188d565b6105b460135481565b61055161070436600461537a565b61190e565b6105516107173660046154bc565b611aa2565b61055161072a3660046153d4565b611b1d565b61055161073d3660046154bc565b611b85565b6105516107503660046156a5565b611c55565b6105516107633660046153d4565b611c70565b61077b61077636600461537a565b611cdb565b6040516104f596959493929190615740565b600c54610526906001600160a01b031681565b6105b46107ae36600461537a565b611e70565b6105516107c136600461537a565b611f5a565b6105266107d436600461537a565b612073565b6105516107e736600461578e565b612085565b61058c6107fa36600461537a565b61216e565b61055161080d3660046157d4565b612243565b6105516108203660046154bc565b6122e2565b6105516108333660046153a8565b61235d565b6105516108463660046157d4565b6123d7565b6105b46108593660046153d4565b612498565b61055161086c36600461537a565b6124e6565b6105b461087f36600461537a565b6000908152600b602052604090205490565b6104e961089f3660046153d4565b60116020526000908152604090205460ff1681565b6105516108c23660046156e6565b612570565b61058c6108d53660046153d4565b6126e3565b6105516108e836600461537a565b61284b565b6109806108fb36600461537a565b6000908152600a6020908152604080832054600b83528184205460099384905291909320600d810154600e8201546013830154600584015460068501546007860154600887015496909801546001600160a01b03998a169a9799959894976201000090940460ff90811697938716969283169583169492841693600160a01b90041691565b604080516001600160a01b039c8d168152602081019b909b528a01989098526060890196909652931515608088015291871660a0870152861660c0860152851660e0850152909316610100830152911515610120820152610140810191909152610160016104f5565b6105066109f73660046156e6565b6128ff565b610a0f610a0a36600461537a565b6129b0565b6040516104f596959493929190615804565b610551610a2f3660046154bc565b612cfb565b610506612d91565b610551610a4a3660046156e6565b612da0565b6105b4610a5d3660046153a8565b612e09565b610551610a7036600461537a565b612eb9565b610551610a8336600461587b565b612f5c565b610551610a963660046154bc565b612ff2565b610526610aa936600461537a565b600a602052600090815260409020546001600160a01b031681565b610551610ad23660046157d4565b61306d565b610551610ae53660046154bc565b61312e565b610551610af83660046158b0565b613240565b61058c610b0b36600461537a565b61337d565b610551610b1e3660046154bc565b61347c565b610551610b313660046158ff565b61354c565b610b49610b4436600461537a565b613580565b6040516104f591906159b7565b610b69610b6436600461537a565b6135f9565b6040516104f59291906159ca565b6105b4610b8536600461537a565b6136ad565b610551610b983660046153d4565b61371b565b61058c610bab36600461537a565b613783565b610551610bbe3660046157d4565b61378e565b61058c61384f565b610551610bd93660046154bc565b6138a6565b610506610bec36600461537a565b613976565b610551610bff36600461537a565b613cf9565b610551610c1236600461537a565b613d7b565b6104e9610c2536600461537a565b600090815260056020526040902054600160e01b900460ff1690565b610551610c4f36600461537a565b613efb565b6105b460125481565b6104e9610c6b3660046159f8565b614036565b6105b4610c7e36600461537a565b600b6020526000908152604090205481565b610551610c9e3660046153d4565b614090565b6105b4610cb1366004615a26565b61410d565b600f54610526906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610cee5750610cee8261431a565b80610d0957506001600160e01b03198216635b5e139f60e01b145b80610d2457506001600160e01b0319821663780e9d6360e01b145b80610d3f57506001600160e01b03198216635d9dd7eb60e11b145b80610d5a57506001600160e01b0319821663152a902d60e11b145b80610d7557506001600160e01b03198216632dde656160e21b145b92915050565b606060038054610d8a90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054610db690615a70565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b5050505050905090565b6000610e188261436b565b610e35576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e5c82612073565b9050806001600160a01b0316836001600160a01b03161415610e915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610eb15750610eaf8133614036565b155b15610ecf576040516367d9dca160e11b815260040160405180910390fd5b610eda8383836143e2565b505050565b600f546001600160a01b03163314610f2b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b60448201526064015b60405180910390fd5b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b60008281526009602052604090206013015482906301000000900460ff1615610f8a5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680610fc057506000818152600a60205260409020546001600160a01b031633145b610ffa5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992860190615206565b5050505050565b6015546060906001600160a01b0316156110775760408051600180825281830190925290602080830190803683370190505090506014548160008151811061106a5761106a615acf565b6020026020010181815250505b919050565b600f546001600160a01b031633146110c35760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b8281816111225760405162461bcd60e51b815260206004820152602760248201527f41646472657373207175616e74697479206d7573742067726561746572207468604482015266616e207a65726f60c81b6064820152608401610f22565b8082146111845760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e207175616e74697479206d75737420657175616c2061646472657360448201526973207175616e7469747960b01b6064820152608401610f22565b60005b828110156111f75760008787838181106111a3576111a3615acf565b90506020020160208101906111b891906153d4565b905060008686848181106111ce576111ce615acf565b9050602002013590506111e2338383611c55565b505080806111ef90615afb565b915050611187565b50505050505050565b60025460015460009161121291615b16565b905090565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6012546000818152600a6020908152604080832080546001600160a01b0319166001600160a01b038c161790556009825290912089516112ad928b0190615206565b5060008181526009602081815260408084206005810180546001600160a01b0319166001600160a01b038c1617905560088101805460ff60a01b1916600160a01b8b151502179055808401889055600b835293208990555260138101805464010000000064ff0000000019909116179055600a8101805460ff1916841515179055620f4240600e909101558161135b576000818152600960205260409020601301805460ff19169055611378565b6000818152600960205260409020601301805460ff191660011790555b601254611386906001615b2d565b6012555050505050505050565b6000806113a76113a28461443e565b61453b565b905060006113c46113a260066113bc8561461c565b859190614759565b90506113cf81614825565b949350505050565b610eda8383836148c9565b60008281526009602052604090206013015482906301000000900460ff161561141d5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061145357506000818152600a60205260409020546001600160a01b031633145b61148d5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600490920191860190615206565b600e60205260009081526040902080546114cb90615a70565b80601f01602080910402602001604051908101604052809291908181526020018280546114f790615a70565b80156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b505050505081565b61155581611393565b3360009081526010602052604090205460ff168061158957506000818152600a60205260409020546001600160a01b031633145b6115c35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600e60006115d084611393565b815260200190815260200160002060006115ea919061528a565b5050565b60155460145460009182916001600160a01b0390911690612710906116139086615b45565b61161d9190615b7a565b915091505b9250929050565b6000818152600960205260408120600b0180546060928392909161164c90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461167890615a70565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050506000878152600960205260409020600c018054939650926116eb92509050615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461171790615a70565b80156117645780601f1061173957610100808354040283529160200191611764565b820191906000526020600020905b81548152906001019060200180831161174757829003601f168201915b505050600096875250506009602052604090942060130154929461010090930460ff1692915050565b600061179883612498565b82106117fa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f22565b611803836126e3565b828151811061181457611814615acf565b6020026020010151905092915050565b600f546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146118e35760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600390920191850190615206565b50505050565b60008181526009602052604090206013015481906301000000900460ff16156119495760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff168061197f57506000818152600a60205260409020546001600160a01b031633145b6119b95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d015415611a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f7420737769746368206166746572206120746f6b656e2069732060448201526636b4b73a32b21760c91b6064820152608401610f22565b6000838152600960205260409020600a015460ff1615611a60576000838152600960205260409020601301805460ff19169055611a7d565b6000838152600960205260409020601301805460ff191660011790555b50506000908152600960205260409020600a01805460ff19811660ff90911615179055565b6000828152600a602052604090205482906001600160a01b03163314611af85760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600b90920191850190615206565b600f546001600160a01b03163314611b645760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60008281526009602052604090206013015482906301000000900460ff1615611bc05760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680611bf657506000818152600a60205260409020546001600160a01b031633145b611c305760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992601290920191860190615206565b610eda8383836040518060200160405280600081525061354c565b600f546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b6060600080606060008060096000888152602001908152602001600020600f018054611d0690615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3290615a70565b8015611d7f5780601f10611d5457610100808354040283529160200191611d7f565b820191906000526020600020905b815481529060010190602001808311611d6257829003601f168201915b50505060008a81526009602052604090206011810154601382015460129092018054959b5090995060ff909116975092611dbb92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611de790615a70565b8015611e345780601f10611e0957610100808354040283529160200191611e34565b820191906000526020600020905b815481529060010190602001808311611e1757829003601f168201915b5050506000998a5250506009602052604090972060130154959794969395939460ff630100000086048116956401000000009004169350915050565b60135460009081905b601254811015611f40576000611e8e8261337d565b905060005b8151811015611f36576000828281518110611eb057611eb0615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b0381168252600160a01b81046001600160401b031694820194909452600160e01b90930460ff161515908301819052909250611f2c5787861415611f2557509695505050505050565b6001909501945b5050600101611e93565b5050600101611e79565b50604051637339954760e01b815260040160405180910390fd5b33600090815260106020526040902054819060ff1680611f9057506000818152600a60205260409020546001600160a01b031633145b611fca5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000828152600960205260409020600a015460ff16156120465760405162461bcd60e51b815260206004820152603160248201527f63616e206f6e6c7920736574207374617469632049504653206861736820666f60448201527072207374617469632070726f6a6563747360781b6064820152608401610f22565b506000908152600960205260409020601301805461ff001981166101009182900460ff1615909102179055565b600061207e82614aeb565b5192915050565b60008481526009602052604090206013015484906301000000900460ff16156120c05760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166121145760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009384526009602081905260409094206005810180546001600160a01b039095166001600160a01b031990951694909417909355600883018054921515600160a01b0260ff60a01b1990931692909217909155910155565b6060600080600061217e856136ad565b90506000816001600160401b0381111561219a5761219a6153f1565b6040519080825280602002602001820160405280156121c3578160200160208202803683370190505b5060025490915060005b8181101561223757600281815481106121e8576121e8615acf565b90600052602060002001549450876121ff86611393565b1415612225578483878151811061221857612218615acf565b6020026020010181815250505b8061222f81615afb565b9150506121cd565b50909695505050505050565b33600090815260106020526040902054829060ff168061227957506000818152600a60205260409020546001600160a01b031633145b6122b35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146123385760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600c90920191850190615206565b3360009081526010602052604090205460ff166123b15760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b601580546001600160a01b0319166001600160a01b039390931692909217909155601455565b60008281526009602052604090206013015482906301000000900460ff16156124125760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166124665760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060080180546001600160a01b0319166001600160a01b03909216919091179055565b60006001600160a01b0382166124c1576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b600f546001600160a01b0316331461252d5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b603281111561256b5760405162461bcd60e51b815260206004820152600a6024820152694d6178206f662035302560b01b6044820152606401610f22565b600d55565b6000828152600a602052604090205482906001600160a01b031633146125c65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960205260409020601301546301000000900460ff1615806125fe57506000838152600960205260409020600e015482105b61261a5760405162461bcd60e51b8152600401610f2290615aa5565b6000838152600960205260409020600d0154821161267a5760405162461bcd60e51b815260206004820152601f60248201527f4d617820696e766f636174696f6e7320657863656564732063757272656e74006044820152606401610f22565b620f42408211156126cd5760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420657863656564203130303030303000000000000000000000006044820152606401610f22565b50600091825260096020526040909120600e0155565b606060006126f083612498565b90506000806000836001600160401b0381111561270f5761270f6153f1565b604051908082528060200260200182016040528015612738578160200160208202803683370190505b506013549091505b601254811015611f405760006127558261337d565b905060005b815181101561284157600082828151811061277757612777615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b038116808352600160a01b82046001600160401b031695830195909552600160e01b900460ff1615159181019190915290925090156127e157805196505b8a6001600160a01b0316876001600160a01b03161415612820578186898151811061280e5761280e615acf565b60209081029190910101526001909701965b888814156128375750939998505050505050505050565b505060010161275a565b5050600101612740565b3360009081526010602052604090205460ff1661289f5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b60008181526009602052604090206013015481906301000000900460ff16156128da5760405162461bcd60e51b8152600401610f2290615aa5565b506000908152600960205260409020601301805463ff00000019166301000000179055565b6000828152600960209081526040808320848452601001909152902080546060919061292a90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461295690615a70565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b5050505050905092915050565b606080606080606060006009600088815260200190815260200160002060000180546129db90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0790615a70565b8015612a545780601f10612a2957610100808354040283529160200191612a54565b820191906000526020600020905b815481529060010190602001808311612a3757829003601f168201915b50505060008a8152600960205260409020600101805493995092612a7a92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa690615a70565b8015612af35780601f10612ac857610100808354040283529160200191612af3565b820191906000526020600020905b815481529060010190602001808311612ad657829003601f168201915b50505060008a8152600960205260409020600201805493985092612b1992509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4590615a70565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b50505060008a8152600960205260409020600301805493975092612bb892509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612be490615a70565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b50505060008a8152600960205260409020600401805493965092612c5792509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8390615a70565b8015612cd05780601f10612ca557610100808354040283529160200191612cd0565b820191906000526020600020905b815481529060010190602001808311612cb357829003601f168201915b5050506000998a52505060096020526040909720600a0154959794969395929460ff90931692915050565b612d0482611393565b3360009081526010602052604090205460ff1680612d3857506000818152600a60205260409020546001600160a01b031633145b612d725760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600e60209081526040909120835161190892850190615206565b606060048054610d8a90615a70565b6000828152600a602052604090205482906001600160a01b03163314612df65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b506000918252600b602052604090912055565b3360009081526011602052604081205460ff16612e745760405162461bcd60e51b815260206004820152602360248201527f4d757374206275726e2066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b612e7d82614ba8565b60405182906001600160a01b038516907f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa290600090a350919050565b33600090815260106020526040902054819060ff1680612eef57506000818152600a60205260409020546001600160a01b031633145b612f295760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000908152600960205260409020601301805464ff000000001981166401000000009182900460ff1615909102179055565b6001600160a01b038216331415612f865760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600a602052604090205482906001600160a01b031633146130485760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600290920191850190615206565b60008281526009602052604090206013015482906301000000900460ff16156130a85760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166130fc5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060060180546001600160a01b0319166001600160a01b03909216919091179055565b60008281526009602052604090206013015482906301000000900460ff16156131695760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061319f57506000818152600a60205260409020546001600160a01b031633145b6131d95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040808320601181015484526010018252909120845161320792860190615206565b50600084815260096020526040902060110154613225906001615b2d565b60009485526009602052604090942060110193909355505050565b60008381526009602052604090206013015483906301000000900460ff161561327b5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054849060ff16806132b157506000818152600a60205260409020546001600160a01b031633145b6132eb5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600085815260096020526040902060110154841061334b5760405162461bcd60e51b815260206004820152601560248201527f7363726970744964206f7574206f662072616e676500000000000000000000006044820152606401610f22565b60008581526009602090815260408083208784526010018252909120845161337592860190615206565b505050505050565b6000818152600960205260408120600d01546060919081908161339f866136ad565b905060006133ad8284615b16565b6001600160401b038111156133c4576133c46153f1565b6040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50905060005b838110156134715780613409620f42408a615b45565b6134139190615b2d565b600081815260056020526040902054909550600160e01b900460ff1661345f578482878151811061344657613446615acf565b60209081029190910101528561345b81615afb565b9650505b8061346981615afb565b9150506133f3565b509695505050505050565b60008281526009602052604090206013015482906301000000900460ff16156134b75760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff16806134ed57506000818152600a60205260409020546001600160a01b031633145b6135275760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600190920191860190615206565b6135578484846148c9565b61356384848484614da4565b611908576040516368d2bf6b60e11b815260040160405180910390fd5b6015546060906001600160a01b031615611077576040805160018082528183019092529060208083019080368337505060155482519293506001600160a01b0316918391506000906135d4576135d4615acf565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60155460609081906001600160a01b0316156136a8576040805160018082528183019092529060208083019080368337505060155482519294506001600160a01b03169184915060009061364f5761364f615acf565b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506014548160008151811061369b5761369b615acf565b6020026020010181815250505b915091565b60025460009081908190815b8181101561371157600281815481106136d4576136d4615acf565b90600052602060002001549350856136eb85611393565b14156136ff57826136fb81615afb565b9350505b8061370981615afb565b9150506136b9565b5090949350505050565b600f546001600160a01b031633146137625760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6060610d758261337d565b60008281526009602052604090206013015482906301000000900460ff16156137c95760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff1661381d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b60606002805480602002602001604051908101604052809291908181526020018280548015610e0357602002820191906000526020600020905b815481526020019060010190808311613889575050505050905090565b60008281526009602052604090206013015482906301000000900460ff16156138e15760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061391757506000818152600a60205260409020546001600160a01b031633145b6139515760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600f90920191860190615206565b6060816139828161436b565b6139ce5760405162461bcd60e51b815260206004820152601360248201527f546f6b656e204944206e6f7420657869737473000000000000000000000000006044820152606401610f22565b60006009816139dc86611393565b81526020810191909152604001600020600701546001600160a01b031614613abb57600060096000613a0d86611393565b8152602081019190915260409081016000908120600701549151631675f45560e01b8152600481018790526001600160a01b039092169250908290631675f4559060240160006040518083038186803b158015613a6957600080fd5b505afa158015613a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa59190810190615b8e565b805190915015613ab8579250613cf39050565b50505b6000838152600e602052604081208054613ad490615a70565b90501115613c34576000838152600e602052604090208054613c2d9190613afa90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613b2690615a70565b8015613b735780601f10613b4857610100808354040283529160200191613b73565b820191906000526020600020905b815481529060010190602001808311613b5657829003601f168201915b505050505060096000613b8587611393565b8152602001908152602001600020600c018054613ba190615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615a70565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b5050505050614eaf90919063ffffffff16565b9150613cf3565b60096000613c4185611393565b81526020810191909152604001600020600a015460ff16158015613c8a575060096000613c6d85611393565b8152602081019190915260400160002060130154610100900460ff165b15613cbb57613c2d60096000613c9f86611393565b81526020019081526020016000206012018054613afa90615a70565b613cf0613cc78461443e565b60096000613cd487611393565b8152602001908152602001600020600b018054613ba190615a70565b91505b50919050565b3360009081526010602052604090205460ff16613d4d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6000908152600960205260409020601301805462ff0000198116620100009182900460ff1615909102179055565b60008181526009602052604090206013015481906301000000900460ff1615613db65760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613dec57506000818152600a60205260409020546001600160a01b031633145b613e265760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600083815260096020526040902060110154613e845760405162461bcd60e51b815260206004820152601e60248201527f746865726520617265206e6f207363726970747320746f2072656d6f766500006044820152606401610f22565b6000838152600960205260408120601181015460109091019190613eaa90600190615b16565b81526020019081526020016000206000613ec4919061528a565b600083815260096020526040902060110154613ee1906001615b2d565b600093845260096020526040909320601101929092555050565b60008181526009602052604090206013015481906301000000900460ff1615613f365760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613f6c57506000818152600a60205260409020546001600160a01b031633145b613fa65760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d0154156140115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d6f6469667920616674657220746f6b656e206973206d696e6044820152633a32b21760e11b6064820152608401610f22565b50506000908152600960205260409020601301805460ff19811660ff90911615179055565b6001600160a01b03811660009081526016602052604081205460ff161561405f57506001610d75565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff165b9392505050565b3360009081526010602052604090205460ff166140e45760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6001600160a01b03166000908152601660205260409020805460ff19811660ff90911615179055565b3360009081526011602052604081205460ff166141785760405162461bcd60e51b815260206004820152602360248201527f4d757374206d696e742066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b6000848152600960205260409020600e810154600d9091015461419c908590615b2d565b11156141ea5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d617820696e766f636174696f6e730000000000000000006044820152606401610f22565b60008481526009602052604090206013015462010000900460ff168061422957506000848152600a60205260409020546001600160a01b038381169116145b6142755760405162461bcd60e51b815260206004820152601d60248201527f50726f6a206d75737420657869737420616e64206265206163746976650000006044820152606401610f22565b600084815260096020526040902060130154640100000000900460ff1615806142b757506000848152600a60205260409020546001600160a01b038381169116145b6143035760405162461bcd60e51b815260206004820152601460248201527f50757263686173657320617265207061757365640000000000000000000000006044820152606401610f22565b6000614310868686614edb565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061434b57506001600160e01b03198216635b5e139f60e01b145b80610d7557506001600160e01b031982166301ffc9a760e01b1492915050565b60008061437783611393565b6000818152600960205260409020600d0154909150614399620f424083615b45565b6143a39190615b2d565b83108015613cf057506143b9620f424082615b45565b8310158015613cf057505050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060816144625750506040805180820190915260018152600360fc1b602082015290565b8160005b811561448c578061447681615afb565b91506144859050600a83615b7a565b9150614466565b6000816001600160401b038111156144a6576144a66153f1565b6040519080825280601f01601f1916602001820160405280156144d0576020820181803683370190505b5090505b84156113cf576144e5600183615b16565b91506144f2600a86615bfb565b6144fd906030615b2d565b60f81b81838151811061451257614512615acf565b60200101906001600160f81b031916908160001a905350614534600a86615b7a565b94506144d4565b8051606090829061454e5761454e615c0f565b600081516001600160401b03811115614569576145696153f1565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b5090508060005b8351811015614613578381815181106145b5576145b5615acf565b602001015160f81c60f81b8260018387516145d09190615b16565b6145da9190615b16565b815181106145ea576145ea615acf565b60200101906001600160f81b031916908160001a9053508061460b81615afb565b91505061459a565b50949350505050565b600080825b805182101561475257600781838151811061463e5761463e615acf565b01602001516001600160f81b031990811690911c1661466957614662600183615b2d565b9150614740565b8051600360f91b9060059083908590811061468657614686615acf565b01602001516001600160f81b031990811690911c1614156146ac57614662600283615b2d565b8051600760f91b906004908390859081106146c9576146c9615acf565b01602001516001600160f81b031990811690911c1614156146ef57614662600383615b2d565b8051600f60f91b9060039083908590811061470c5761470c615acf565b01602001516001600160f81b031990811690911c16141561473257614662600483615b2d565b61473d600183615b2d565b91505b8261474a81615afb565b935050614621565b5050919050565b60608360006147688585615b16565b6001600160401b0381111561477f5761477f6153f1565b6040519080825280601f01601f1916602001820160405280156147a9576020820181803683370190505b509050845b8481101561481b578281815181106147c8576147c8615acf565b01602001516001600160f81b031916826147e28884615b16565b815181106147f2576147f2615acf565b60200101906001600160f81b031916908160001a9053508061481381615afb565b9150506147ae565b5095945050505050565b60008082815b81518110156148c05760008183516148439190615b16565b9050600083838151811061485957614859615acf565b01602001516001600160f81b03198116915060f81c600061487b603083615b16565b9050614888600185615b16565b61489390600a615d09565b61489d9082615b45565b6148a79088615b2d565b96505050505080806148b890615afb565b91505061482b565b50909392505050565b60006148d482614aeb565b80519091506000906001600160a01b0316336001600160a01b0316148061490b57503361490084610e0d565b6001600160a01b0316145b8061491d5750815161491d9033614036565b90508061493d57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146149725760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661499957604051633a954ecd60e21b815260040160405180910390fd5b6149a68585856001614f81565b6149b660008484600001516143e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116614aa457614a588161436b565b15614aa457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611019565b6040805160608101825260008082526020820181905291810191909152614b118261436b565b614b2e57604051636f96cda160e11b815260040160405180910390fd5b815b600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290614b9e5780516001600160a01b031615614b9e579392505050565b5060001901614b30565b6000614bb382614aeb565b9050614bc781600001516000846001614f81565b614bd760008383600001516143e2565b80516001600160a01b03166000908152600660205260408120805460019290614c0a9084906001600160401b0316615d15565b82546101009290920a6001600160401b0381810219909316918316021790915582516001600160a01b031660009081526006602052604090208054600193509091601091614c61918591600160801b900416615d3d565b82546001600160401b039182166101009390930a9283029282021916919091179091558251600085815260056020526040808220805460ff60e01b1942909616600160a01b026001600160e01b03199091166001600160a01b03958616171794909416600160e01b179093556002805460018181019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0187905586018082529290205491925016614d6457614d188161436b565b15614d6457815160008281526005602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15614ea757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614de8903390899088908890600401615d68565b602060405180830381600087803b158015614e0257600080fd5b505af1925050508015614e32575060408051601f3d908101601f19168201909252614e2f91810190615d9a565b60015b614e8d573d808015614e60576040519150601f19603f3d011682016040523d82523d6000602084013e614e65565b606091505b508051614e85576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b5060016113cf565b60608282604051602001614ec4929190615db7565b604051602081830303815290604052905092915050565b6000828152600960205260408120600d01548190614efc620f424086615b45565b614f069190615b2d565b6000858152600960205260409020600d0154909150614f26908490615b2d565b6000858152600960205260409020600d0155614f4385828561506c565b83614f4e8483615b2d565b60405183907f070aa035fe0a09f0d9305bdc2d7a5d93cd4733db3b1ff869b4a7033c9501909a90600090a4949350505050565b6000600981614f8f85611393565b81526020810191909152604001600020600801546001600160a01b03161461190857600060096000614fc085611393565b8152602081019190915260409081016000206008015490516348e3eb8d60e11b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052909116915081906391c7d71a9060840160006040518083038186803b15801561503057600080fd5b505afa158015615044573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133759190810190615b8e565b610eda838383604051806020016040528060008152506119088484848460016001600160a01b0385166150b157604051622e076360e81b815260040160405180910390fd5b826150cf5760405163b562e8dd60e01b815260040160405180910390fd5b6150dc6000868686614f81565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558884526005909252822080546001600160e01b031916909317600160a01b42909216919091021790915584905b848110156151f75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48280156151cd57506151cb6000888487614da4565b155b156151eb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101615176565b50506001805484019055611019565b82805461521290615a70565b90600052602060002090601f016020900481019282615234576000855561527a565b82601f1061524d57805160ff191683800117855561527a565b8280016001018555821561527a579182015b8281111561527a57825182559160200191906001019061525f565b506152869291506152c7565b5090565b50805461529690615a70565b6000825580601f106152a6575050565b601f0160209004906000526020600020908101906152c491906152c7565b50565b5b8082111561528657600081556001016152c8565b6001600160e01b0319811681146152c457600080fd5b60006020828403121561530457600080fd5b8135614089816152dc565b60005b8381101561532a578181015183820152602001615312565b838111156119085750506000910152565b6000815180845261535381602086016020860161530f565b601f01601f19169290920160200192915050565b602081526000614089602083018461533b565b60006020828403121561538c57600080fd5b5035919050565b6001600160a01b03811681146152c457600080fd5b600080604083850312156153bb57600080fd5b82356153c681615393565b946020939093013593505050565b6000602082840312156153e657600080fd5b813561408981615393565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561542f5761542f6153f1565b604052919050565b60006001600160401b03821115615450576154506153f1565b50601f01601f191660200190565b600061547161546c84615437565b615407565b905082815283838301111561548557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126154ad57600080fd5b6140898383356020850161545e565b600080604083850312156154cf57600080fd5b8235915060208301356001600160401b038111156154ec57600080fd5b6154f88582860161549c565b9150509250929050565b600081518084526020808501945080840160005b8381101561553257815187529582019590820190600101615516565b509495945050505050565b6020815260006140896020830184615502565b60008083601f84011261556257600080fd5b5081356001600160401b0381111561557957600080fd5b6020830191508360208260051b850101111561162257600080fd5b600080600080604085870312156155aa57600080fd5b84356001600160401b03808211156155c157600080fd5b6155cd88838901615550565b909650945060208701359150808211156155e657600080fd5b506155f387828801615550565b95989497509550505050565b8035801515811461107757600080fd5b600080600080600080600060e0888a03121561562a57600080fd5b87356001600160401b0381111561564057600080fd5b61564c8a828b0161549c565b975050602088013561565d81615393565b955060408801359450606088013561567481615393565b9350615682608089016155ff565b925060a0880135915061569760c089016155ff565b905092959891949750929550565b6000806000606084860312156156ba57600080fd5b83356156c581615393565b925060208401356156d581615393565b929592945050506040919091013590565b600080604083850312156156f957600080fd5b50508035926020909101359150565b60608152600061571b606083018661533b565b828103602084015261572d818661533b565b9150508215156040830152949350505050565b60c08152600061575360c083018961533b565b87602084015286151560408401528281036060840152615773818761533b565b9415156080840152505090151560a090910152949350505050565b600080600080608085870312156157a457600080fd5b8435935060208501356157b681615393565b92506157c4604086016155ff565b9396929550929360600135925050565b600080604083850312156157e757600080fd5b8235915060208301356157f981615393565b809150509250929050565b60c08152600061581760c083018961533b565b8281036020840152615829818961533b565b9050828103604084015261583d818861533b565b90508281036060840152615851818761533b565b90508281036080840152615865818661533b565b91505082151560a0830152979650505050505050565b6000806040838503121561588e57600080fd5b823561589981615393565b91506158a7602084016155ff565b90509250929050565b6000806000606084860312156158c557600080fd5b833592506020840135915060408401356001600160401b038111156158e957600080fd5b6158f58682870161549c565b9150509250925092565b6000806000806080858703121561591557600080fd5b843561592081615393565b9350602085013561593081615393565b92506040850135915060608501356001600160401b0381111561595257600080fd5b8501601f8101871361596357600080fd5b6159728782356020840161545e565b91505092959194509250565b600081518084526020808501945080840160005b838110156155325781516001600160a01b031687529582019590820190600101615992565b602081526000614089602083018461597e565b6040815260006159dd604083018561597e565b82810360208401526159ef8185615502565b95945050505050565b60008060408385031215615a0b57600080fd5b8235615a1681615393565b915060208301356157f981615393565b60008060008060808587031215615a3c57600080fd5b8435615a4781615393565b935060208501359250604085013591506060850135615a6581615393565b939692955090935050565b600181811c90821680615a8457607f821691505b60208210811415613cf357634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615b0f57615b0f615ae5565b5060010190565b600082821015615b2857615b28615ae5565b500390565b60008219821115615b4057615b40615ae5565b500190565b6000816000190483118215151615615b5f57615b5f615ae5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8957615b89615b64565b500490565b600060208284031215615ba057600080fd5b81516001600160401b03811115615bb657600080fd5b8201601f81018413615bc757600080fd5b8051615bd561546c82615437565b818152856020838501011115615bea57600080fd5b6159ef82602083016020860161530f565b600082615c0a57615c0a615b64565b500690565b634e487b7160e01b600052600160045260246000fd5b600181815b80851115615c60578160001904821115615c4657615c46615ae5565b80851615615c5357918102915b93841c9390800290615c2a565b509250929050565b600082615c7757506001610d75565b81615c8457506000610d75565b8160018114615c9a5760028114615ca457615cc0565b6001915050610d75565b60ff841115615cb557615cb5615ae5565b50506001821b610d75565b5060208310610133831016604e8410600b8410161715615ce3575081810a610d75565b615ced8383615c25565b8060001904821115615d0157615d01615ae5565b029392505050565b60006140898383615c68565b60006001600160401b0383811690831681811015615d3557615d35615ae5565b039392505050565b60006001600160401b03808316818516808303821115615d5f57615d5f615ae5565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614310608083018461533b565b600060208284031215615dac57600080fd5b8151614089816152dc565b60008351615dc981846020880161530f565b835190830190615d5f81836020880161530f56fe4f6e6c7920617274697374206f72205261696e626f776c697374656400000000a2646970667358221220ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000096e74656e742e617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e54454e54580000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104d15760003560e01c806370a8a0ad1161028d578063b7b04fae11610161578063c87b56dd116100de578063e935b7b1116100a2578063f73c814b1161007c578063f73c814b14610c90578063f74bfe8e14610ca3578063f851a44014610cb657600080fd5b8063e935b7b114610c54578063e985e9c514610c5d578063f70c0f0414610c7057600080fd5b8063c87b56dd14610bde578063d03c390c14610bf1578063db2ff86114610c04578063db44fe0714610c17578063dce5d85814610c4157600080fd5b8063bcd4f24411610125578063bcd4f24414610b8a578063bee04f9c14610b9d578063c26aff0f14610bb0578063c3f4f54f14610bc3578063c6d7323114610bcb57600080fd5b8063b7b04fae14610b10578063b88d4fde14610b23578063b9c4d9fb14610b36578063bb3bafd614610b56578063bc6e639d14610b7757600080fd5b806395d89b411161020a578063a3b2cca6116101ce578063acad0124116101a8578063acad012414610ad7578063b1656ba314610aea578063b6550e8f14610afd57600080fd5b8063a3b2cca614610a88578063a47d29cb14610a9b578063a784d5c114610ac457600080fd5b806395d89b4114610a3457806397dc86cf14610a3c5780639dc29fac14610a4f578063a11ec70a14610a62578063a22cb46514610a7557600080fd5b80638ba8f14d116102515780638ba8f14d146108da5780638c2c3622146108ed5780638c3c9cdd146109e95780638dd91a56146109fc57806393961c6614610a2157600080fd5b806370a8a0ad1461085e578063742ff77a14610871578063810051d714610891578063826fc391146108b45780638462151c146108c757600080fd5b8063360d223a116103c45780634ae9a7381161034157806369bfd5d6116103055780636c2f5acd116102df5780636c2f5acd146108255780636c31d4e91461083857806370a082311461084b57600080fd5b806369bfd5d6146107ec57806369d14faf146107ff5780636bd5d5911461081257600080fd5b80634ae9a7381461078d5780634f6ccce7146107a05780635c088dcc146107b35780636352211e146107c6578063672b17e9146107d957600080fd5b80633f383cb8116103885780633f383cb81461071c5780633fef6c2a1461072f57806342842e0e1461074257806343fa7f44146107555780634aa6d4171461076857600080fd5b8063360d223a146106c757806337859963146106da5780633839bf99146106ed5780633bdbd5c4146106f65780633e48e8481461070957600080fd5b80631b689c0b11610452578063261eb4e511610416578063261eb4e51461063a578063279018221461064d5780632a55205a146106605780632d9c0205146106925780632f745c59146106b457600080fd5b80631b689c0b146105d55780632002f713146105e857806321c0da791461060b57806323b872dd1461061457806325b75d681461062757600080fd5b80630d170673116104995780630d170673146105665780630ebd4c7f14610579578063153a1f3e1461059957806318160ddd146105ac5780631afe39f8146105c257600080fd5b806301ffc9a7146104d657806306fdde03146104fe578063081812fc14610513578063095ea7b31461053e5780630b8f4d2d14610553575b600080fd5b6104e96104e43660046152f2565b610cc9565b60405190151581526020015b60405180910390f35b610506610d7b565b6040516104f59190615367565b61052661052136600461537a565b610e0d565b6040516001600160a01b0390911681526020016104f5565b61055161054c3660046153a8565b610e51565b005b6105516105613660046153d4565b610edf565b6105516105743660046154bc565b610f4f565b61058c61058736600461537a565b611020565b6040516104f5919061553d565b6105516105a7366004615594565b61107c565b6105b4611200565b6040519081526020016104f5565b6105516105d036600461560f565b611217565b6105b46105e336600461537a565b611393565b6104e96105f63660046153d4565b60106020526000908152604090205460ff1681565b6105b4600d5481565b6105516106223660046156a5565b6113d7565b6105516106353660046154bc565b6113e2565b61050661064836600461537a565b6114b2565b61055161065b36600461537a565b61154c565b61067361066e3660046156e6565b6115ee565b604080516001600160a01b0390931683526020830191909152016104f5565b6106a56106a036600461537a565b611629565b6040516104f593929190615708565b6105b46106c23660046153a8565b61178d565b6105516106d53660046153d4565b611824565b6105516106e83660046154bc565b61188d565b6105b460135481565b61055161070436600461537a565b61190e565b6105516107173660046154bc565b611aa2565b61055161072a3660046153d4565b611b1d565b61055161073d3660046154bc565b611b85565b6105516107503660046156a5565b611c55565b6105516107633660046153d4565b611c70565b61077b61077636600461537a565b611cdb565b6040516104f596959493929190615740565b600c54610526906001600160a01b031681565b6105b46107ae36600461537a565b611e70565b6105516107c136600461537a565b611f5a565b6105266107d436600461537a565b612073565b6105516107e736600461578e565b612085565b61058c6107fa36600461537a565b61216e565b61055161080d3660046157d4565b612243565b6105516108203660046154bc565b6122e2565b6105516108333660046153a8565b61235d565b6105516108463660046157d4565b6123d7565b6105b46108593660046153d4565b612498565b61055161086c36600461537a565b6124e6565b6105b461087f36600461537a565b6000908152600b602052604090205490565b6104e961089f3660046153d4565b60116020526000908152604090205460ff1681565b6105516108c23660046156e6565b612570565b61058c6108d53660046153d4565b6126e3565b6105516108e836600461537a565b61284b565b6109806108fb36600461537a565b6000908152600a6020908152604080832054600b83528184205460099384905291909320600d810154600e8201546013830154600584015460068501546007860154600887015496909801546001600160a01b03998a169a9799959894976201000090940460ff90811697938716969283169583169492841693600160a01b90041691565b604080516001600160a01b039c8d168152602081019b909b528a01989098526060890196909652931515608088015291871660a0870152861660c0860152851660e0850152909316610100830152911515610120820152610140810191909152610160016104f5565b6105066109f73660046156e6565b6128ff565b610a0f610a0a36600461537a565b6129b0565b6040516104f596959493929190615804565b610551610a2f3660046154bc565b612cfb565b610506612d91565b610551610a4a3660046156e6565b612da0565b6105b4610a5d3660046153a8565b612e09565b610551610a7036600461537a565b612eb9565b610551610a8336600461587b565b612f5c565b610551610a963660046154bc565b612ff2565b610526610aa936600461537a565b600a602052600090815260409020546001600160a01b031681565b610551610ad23660046157d4565b61306d565b610551610ae53660046154bc565b61312e565b610551610af83660046158b0565b613240565b61058c610b0b36600461537a565b61337d565b610551610b1e3660046154bc565b61347c565b610551610b313660046158ff565b61354c565b610b49610b4436600461537a565b613580565b6040516104f591906159b7565b610b69610b6436600461537a565b6135f9565b6040516104f59291906159ca565b6105b4610b8536600461537a565b6136ad565b610551610b983660046153d4565b61371b565b61058c610bab36600461537a565b613783565b610551610bbe3660046157d4565b61378e565b61058c61384f565b610551610bd93660046154bc565b6138a6565b610506610bec36600461537a565b613976565b610551610bff36600461537a565b613cf9565b610551610c1236600461537a565b613d7b565b6104e9610c2536600461537a565b600090815260056020526040902054600160e01b900460ff1690565b610551610c4f36600461537a565b613efb565b6105b460125481565b6104e9610c6b3660046159f8565b614036565b6105b4610c7e36600461537a565b600b6020526000908152604090205481565b610551610c9e3660046153d4565b614090565b6105b4610cb1366004615a26565b61410d565b600f54610526906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610cee5750610cee8261431a565b80610d0957506001600160e01b03198216635b5e139f60e01b145b80610d2457506001600160e01b0319821663780e9d6360e01b145b80610d3f57506001600160e01b03198216635d9dd7eb60e11b145b80610d5a57506001600160e01b0319821663152a902d60e11b145b80610d7557506001600160e01b03198216632dde656160e21b145b92915050565b606060038054610d8a90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054610db690615a70565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b5050505050905090565b6000610e188261436b565b610e35576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e5c82612073565b9050806001600160a01b0316836001600160a01b03161415610e915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610eb15750610eaf8133614036565b155b15610ecf576040516367d9dca160e11b815260040160405180910390fd5b610eda8383836143e2565b505050565b600f546001600160a01b03163314610f2b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b60448201526064015b60405180910390fd5b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b60008281526009602052604090206013015482906301000000900460ff1615610f8a5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680610fc057506000818152600a60205260409020546001600160a01b031633145b610ffa5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992860190615206565b5050505050565b6015546060906001600160a01b0316156110775760408051600180825281830190925290602080830190803683370190505090506014548160008151811061106a5761106a615acf565b6020026020010181815250505b919050565b600f546001600160a01b031633146110c35760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b8281816111225760405162461bcd60e51b815260206004820152602760248201527f41646472657373207175616e74697479206d7573742067726561746572207468604482015266616e207a65726f60c81b6064820152608401610f22565b8082146111845760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e207175616e74697479206d75737420657175616c2061646472657360448201526973207175616e7469747960b01b6064820152608401610f22565b60005b828110156111f75760008787838181106111a3576111a3615acf565b90506020020160208101906111b891906153d4565b905060008686848181106111ce576111ce615acf565b9050602002013590506111e2338383611c55565b505080806111ef90615afb565b915050611187565b50505050505050565b60025460015460009161121291615b16565b905090565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6012546000818152600a6020908152604080832080546001600160a01b0319166001600160a01b038c161790556009825290912089516112ad928b0190615206565b5060008181526009602081815260408084206005810180546001600160a01b0319166001600160a01b038c1617905560088101805460ff60a01b1916600160a01b8b151502179055808401889055600b835293208990555260138101805464010000000064ff0000000019909116179055600a8101805460ff1916841515179055620f4240600e909101558161135b576000818152600960205260409020601301805460ff19169055611378565b6000818152600960205260409020601301805460ff191660011790555b601254611386906001615b2d565b6012555050505050505050565b6000806113a76113a28461443e565b61453b565b905060006113c46113a260066113bc8561461c565b859190614759565b90506113cf81614825565b949350505050565b610eda8383836148c9565b60008281526009602052604090206013015482906301000000900460ff161561141d5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061145357506000818152600a60205260409020546001600160a01b031633145b61148d5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600490920191860190615206565b600e60205260009081526040902080546114cb90615a70565b80601f01602080910402602001604051908101604052809291908181526020018280546114f790615a70565b80156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b505050505081565b61155581611393565b3360009081526010602052604090205460ff168061158957506000818152600a60205260409020546001600160a01b031633145b6115c35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600e60006115d084611393565b815260200190815260200160002060006115ea919061528a565b5050565b60155460145460009182916001600160a01b0390911690612710906116139086615b45565b61161d9190615b7a565b915091505b9250929050565b6000818152600960205260408120600b0180546060928392909161164c90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461167890615a70565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050506000878152600960205260409020600c018054939650926116eb92509050615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461171790615a70565b80156117645780601f1061173957610100808354040283529160200191611764565b820191906000526020600020905b81548152906001019060200180831161174757829003601f168201915b505050600096875250506009602052604090942060130154929461010090930460ff1692915050565b600061179883612498565b82106117fa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f22565b611803836126e3565b828151811061181457611814615acf565b6020026020010151905092915050565b600f546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146118e35760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600390920191850190615206565b50505050565b60008181526009602052604090206013015481906301000000900460ff16156119495760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff168061197f57506000818152600a60205260409020546001600160a01b031633145b6119b95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d015415611a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f7420737769746368206166746572206120746f6b656e2069732060448201526636b4b73a32b21760c91b6064820152608401610f22565b6000838152600960205260409020600a015460ff1615611a60576000838152600960205260409020601301805460ff19169055611a7d565b6000838152600960205260409020601301805460ff191660011790555b50506000908152600960205260409020600a01805460ff19811660ff90911615179055565b6000828152600a602052604090205482906001600160a01b03163314611af85760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600b90920191850190615206565b600f546001600160a01b03163314611b645760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60008281526009602052604090206013015482906301000000900460ff1615611bc05760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680611bf657506000818152600a60205260409020546001600160a01b031633145b611c305760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992601290920191860190615206565b610eda8383836040518060200160405280600081525061354c565b600f546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b6060600080606060008060096000888152602001908152602001600020600f018054611d0690615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3290615a70565b8015611d7f5780601f10611d5457610100808354040283529160200191611d7f565b820191906000526020600020905b815481529060010190602001808311611d6257829003601f168201915b50505060008a81526009602052604090206011810154601382015460129092018054959b5090995060ff909116975092611dbb92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611de790615a70565b8015611e345780601f10611e0957610100808354040283529160200191611e34565b820191906000526020600020905b815481529060010190602001808311611e1757829003601f168201915b5050506000998a5250506009602052604090972060130154959794969395939460ff630100000086048116956401000000009004169350915050565b60135460009081905b601254811015611f40576000611e8e8261337d565b905060005b8151811015611f36576000828281518110611eb057611eb0615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b0381168252600160a01b81046001600160401b031694820194909452600160e01b90930460ff161515908301819052909250611f2c5787861415611f2557509695505050505050565b6001909501945b5050600101611e93565b5050600101611e79565b50604051637339954760e01b815260040160405180910390fd5b33600090815260106020526040902054819060ff1680611f9057506000818152600a60205260409020546001600160a01b031633145b611fca5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000828152600960205260409020600a015460ff16156120465760405162461bcd60e51b815260206004820152603160248201527f63616e206f6e6c7920736574207374617469632049504653206861736820666f60448201527072207374617469632070726f6a6563747360781b6064820152608401610f22565b506000908152600960205260409020601301805461ff001981166101009182900460ff1615909102179055565b600061207e82614aeb565b5192915050565b60008481526009602052604090206013015484906301000000900460ff16156120c05760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166121145760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009384526009602081905260409094206005810180546001600160a01b039095166001600160a01b031990951694909417909355600883018054921515600160a01b0260ff60a01b1990931692909217909155910155565b6060600080600061217e856136ad565b90506000816001600160401b0381111561219a5761219a6153f1565b6040519080825280602002602001820160405280156121c3578160200160208202803683370190505b5060025490915060005b8181101561223757600281815481106121e8576121e8615acf565b90600052602060002001549450876121ff86611393565b1415612225578483878151811061221857612218615acf565b6020026020010181815250505b8061222f81615afb565b9150506121cd565b50909695505050505050565b33600090815260106020526040902054829060ff168061227957506000818152600a60205260409020546001600160a01b031633145b6122b35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146123385760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600c90920191850190615206565b3360009081526010602052604090205460ff166123b15760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b601580546001600160a01b0319166001600160a01b039390931692909217909155601455565b60008281526009602052604090206013015482906301000000900460ff16156124125760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166124665760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060080180546001600160a01b0319166001600160a01b03909216919091179055565b60006001600160a01b0382166124c1576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b600f546001600160a01b0316331461252d5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b603281111561256b5760405162461bcd60e51b815260206004820152600a6024820152694d6178206f662035302560b01b6044820152606401610f22565b600d55565b6000828152600a602052604090205482906001600160a01b031633146125c65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960205260409020601301546301000000900460ff1615806125fe57506000838152600960205260409020600e015482105b61261a5760405162461bcd60e51b8152600401610f2290615aa5565b6000838152600960205260409020600d0154821161267a5760405162461bcd60e51b815260206004820152601f60248201527f4d617820696e766f636174696f6e7320657863656564732063757272656e74006044820152606401610f22565b620f42408211156126cd5760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420657863656564203130303030303000000000000000000000006044820152606401610f22565b50600091825260096020526040909120600e0155565b606060006126f083612498565b90506000806000836001600160401b0381111561270f5761270f6153f1565b604051908082528060200260200182016040528015612738578160200160208202803683370190505b506013549091505b601254811015611f405760006127558261337d565b905060005b815181101561284157600082828151811061277757612777615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b038116808352600160a01b82046001600160401b031695830195909552600160e01b900460ff1615159181019190915290925090156127e157805196505b8a6001600160a01b0316876001600160a01b03161415612820578186898151811061280e5761280e615acf565b60209081029190910101526001909701965b888814156128375750939998505050505050505050565b505060010161275a565b5050600101612740565b3360009081526010602052604090205460ff1661289f5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b60008181526009602052604090206013015481906301000000900460ff16156128da5760405162461bcd60e51b8152600401610f2290615aa5565b506000908152600960205260409020601301805463ff00000019166301000000179055565b6000828152600960209081526040808320848452601001909152902080546060919061292a90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461295690615a70565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b5050505050905092915050565b606080606080606060006009600088815260200190815260200160002060000180546129db90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0790615a70565b8015612a545780601f10612a2957610100808354040283529160200191612a54565b820191906000526020600020905b815481529060010190602001808311612a3757829003601f168201915b50505060008a8152600960205260409020600101805493995092612a7a92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa690615a70565b8015612af35780601f10612ac857610100808354040283529160200191612af3565b820191906000526020600020905b815481529060010190602001808311612ad657829003601f168201915b50505060008a8152600960205260409020600201805493985092612b1992509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4590615a70565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b50505060008a8152600960205260409020600301805493975092612bb892509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612be490615a70565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b50505060008a8152600960205260409020600401805493965092612c5792509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8390615a70565b8015612cd05780601f10612ca557610100808354040283529160200191612cd0565b820191906000526020600020905b815481529060010190602001808311612cb357829003601f168201915b5050506000998a52505060096020526040909720600a0154959794969395929460ff90931692915050565b612d0482611393565b3360009081526010602052604090205460ff1680612d3857506000818152600a60205260409020546001600160a01b031633145b612d725760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600e60209081526040909120835161190892850190615206565b606060048054610d8a90615a70565b6000828152600a602052604090205482906001600160a01b03163314612df65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b506000918252600b602052604090912055565b3360009081526011602052604081205460ff16612e745760405162461bcd60e51b815260206004820152602360248201527f4d757374206275726e2066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b612e7d82614ba8565b60405182906001600160a01b038516907f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa290600090a350919050565b33600090815260106020526040902054819060ff1680612eef57506000818152600a60205260409020546001600160a01b031633145b612f295760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000908152600960205260409020601301805464ff000000001981166401000000009182900460ff1615909102179055565b6001600160a01b038216331415612f865760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600a602052604090205482906001600160a01b031633146130485760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600290920191850190615206565b60008281526009602052604090206013015482906301000000900460ff16156130a85760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166130fc5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060060180546001600160a01b0319166001600160a01b03909216919091179055565b60008281526009602052604090206013015482906301000000900460ff16156131695760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061319f57506000818152600a60205260409020546001600160a01b031633145b6131d95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040808320601181015484526010018252909120845161320792860190615206565b50600084815260096020526040902060110154613225906001615b2d565b60009485526009602052604090942060110193909355505050565b60008381526009602052604090206013015483906301000000900460ff161561327b5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054849060ff16806132b157506000818152600a60205260409020546001600160a01b031633145b6132eb5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600085815260096020526040902060110154841061334b5760405162461bcd60e51b815260206004820152601560248201527f7363726970744964206f7574206f662072616e676500000000000000000000006044820152606401610f22565b60008581526009602090815260408083208784526010018252909120845161337592860190615206565b505050505050565b6000818152600960205260408120600d01546060919081908161339f866136ad565b905060006133ad8284615b16565b6001600160401b038111156133c4576133c46153f1565b6040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50905060005b838110156134715780613409620f42408a615b45565b6134139190615b2d565b600081815260056020526040902054909550600160e01b900460ff1661345f578482878151811061344657613446615acf565b60209081029190910101528561345b81615afb565b9650505b8061346981615afb565b9150506133f3565b509695505050505050565b60008281526009602052604090206013015482906301000000900460ff16156134b75760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff16806134ed57506000818152600a60205260409020546001600160a01b031633145b6135275760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600190920191860190615206565b6135578484846148c9565b61356384848484614da4565b611908576040516368d2bf6b60e11b815260040160405180910390fd5b6015546060906001600160a01b031615611077576040805160018082528183019092529060208083019080368337505060155482519293506001600160a01b0316918391506000906135d4576135d4615acf565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60155460609081906001600160a01b0316156136a8576040805160018082528183019092529060208083019080368337505060155482519294506001600160a01b03169184915060009061364f5761364f615acf565b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506014548160008151811061369b5761369b615acf565b6020026020010181815250505b915091565b60025460009081908190815b8181101561371157600281815481106136d4576136d4615acf565b90600052602060002001549350856136eb85611393565b14156136ff57826136fb81615afb565b9350505b8061370981615afb565b9150506136b9565b5090949350505050565b600f546001600160a01b031633146137625760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6060610d758261337d565b60008281526009602052604090206013015482906301000000900460ff16156137c95760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff1661381d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b60606002805480602002602001604051908101604052809291908181526020018280548015610e0357602002820191906000526020600020905b815481526020019060010190808311613889575050505050905090565b60008281526009602052604090206013015482906301000000900460ff16156138e15760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061391757506000818152600a60205260409020546001600160a01b031633145b6139515760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600f90920191860190615206565b6060816139828161436b565b6139ce5760405162461bcd60e51b815260206004820152601360248201527f546f6b656e204944206e6f7420657869737473000000000000000000000000006044820152606401610f22565b60006009816139dc86611393565b81526020810191909152604001600020600701546001600160a01b031614613abb57600060096000613a0d86611393565b8152602081019190915260409081016000908120600701549151631675f45560e01b8152600481018790526001600160a01b039092169250908290631675f4559060240160006040518083038186803b158015613a6957600080fd5b505afa158015613a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa59190810190615b8e565b805190915015613ab8579250613cf39050565b50505b6000838152600e602052604081208054613ad490615a70565b90501115613c34576000838152600e602052604090208054613c2d9190613afa90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613b2690615a70565b8015613b735780601f10613b4857610100808354040283529160200191613b73565b820191906000526020600020905b815481529060010190602001808311613b5657829003601f168201915b505050505060096000613b8587611393565b8152602001908152602001600020600c018054613ba190615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615a70565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b5050505050614eaf90919063ffffffff16565b9150613cf3565b60096000613c4185611393565b81526020810191909152604001600020600a015460ff16158015613c8a575060096000613c6d85611393565b8152602081019190915260400160002060130154610100900460ff165b15613cbb57613c2d60096000613c9f86611393565b81526020019081526020016000206012018054613afa90615a70565b613cf0613cc78461443e565b60096000613cd487611393565b8152602001908152602001600020600b018054613ba190615a70565b91505b50919050565b3360009081526010602052604090205460ff16613d4d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6000908152600960205260409020601301805462ff0000198116620100009182900460ff1615909102179055565b60008181526009602052604090206013015481906301000000900460ff1615613db65760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613dec57506000818152600a60205260409020546001600160a01b031633145b613e265760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600083815260096020526040902060110154613e845760405162461bcd60e51b815260206004820152601e60248201527f746865726520617265206e6f207363726970747320746f2072656d6f766500006044820152606401610f22565b6000838152600960205260408120601181015460109091019190613eaa90600190615b16565b81526020019081526020016000206000613ec4919061528a565b600083815260096020526040902060110154613ee1906001615b2d565b600093845260096020526040909320601101929092555050565b60008181526009602052604090206013015481906301000000900460ff1615613f365760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613f6c57506000818152600a60205260409020546001600160a01b031633145b613fa65760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d0154156140115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d6f6469667920616674657220746f6b656e206973206d696e6044820152633a32b21760e11b6064820152608401610f22565b50506000908152600960205260409020601301805460ff19811660ff90911615179055565b6001600160a01b03811660009081526016602052604081205460ff161561405f57506001610d75565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff165b9392505050565b3360009081526010602052604090205460ff166140e45760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6001600160a01b03166000908152601660205260409020805460ff19811660ff90911615179055565b3360009081526011602052604081205460ff166141785760405162461bcd60e51b815260206004820152602360248201527f4d757374206d696e742066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b6000848152600960205260409020600e810154600d9091015461419c908590615b2d565b11156141ea5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d617820696e766f636174696f6e730000000000000000006044820152606401610f22565b60008481526009602052604090206013015462010000900460ff168061422957506000848152600a60205260409020546001600160a01b038381169116145b6142755760405162461bcd60e51b815260206004820152601d60248201527f50726f6a206d75737420657869737420616e64206265206163746976650000006044820152606401610f22565b600084815260096020526040902060130154640100000000900460ff1615806142b757506000848152600a60205260409020546001600160a01b038381169116145b6143035760405162461bcd60e51b815260206004820152601460248201527f50757263686173657320617265207061757365640000000000000000000000006044820152606401610f22565b6000614310868686614edb565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061434b57506001600160e01b03198216635b5e139f60e01b145b80610d7557506001600160e01b031982166301ffc9a760e01b1492915050565b60008061437783611393565b6000818152600960205260409020600d0154909150614399620f424083615b45565b6143a39190615b2d565b83108015613cf057506143b9620f424082615b45565b8310158015613cf057505050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060816144625750506040805180820190915260018152600360fc1b602082015290565b8160005b811561448c578061447681615afb565b91506144859050600a83615b7a565b9150614466565b6000816001600160401b038111156144a6576144a66153f1565b6040519080825280601f01601f1916602001820160405280156144d0576020820181803683370190505b5090505b84156113cf576144e5600183615b16565b91506144f2600a86615bfb565b6144fd906030615b2d565b60f81b81838151811061451257614512615acf565b60200101906001600160f81b031916908160001a905350614534600a86615b7a565b94506144d4565b8051606090829061454e5761454e615c0f565b600081516001600160401b03811115614569576145696153f1565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b5090508060005b8351811015614613578381815181106145b5576145b5615acf565b602001015160f81c60f81b8260018387516145d09190615b16565b6145da9190615b16565b815181106145ea576145ea615acf565b60200101906001600160f81b031916908160001a9053508061460b81615afb565b91505061459a565b50949350505050565b600080825b805182101561475257600781838151811061463e5761463e615acf565b01602001516001600160f81b031990811690911c1661466957614662600183615b2d565b9150614740565b8051600360f91b9060059083908590811061468657614686615acf565b01602001516001600160f81b031990811690911c1614156146ac57614662600283615b2d565b8051600760f91b906004908390859081106146c9576146c9615acf565b01602001516001600160f81b031990811690911c1614156146ef57614662600383615b2d565b8051600f60f91b9060039083908590811061470c5761470c615acf565b01602001516001600160f81b031990811690911c16141561473257614662600483615b2d565b61473d600183615b2d565b91505b8261474a81615afb565b935050614621565b5050919050565b60608360006147688585615b16565b6001600160401b0381111561477f5761477f6153f1565b6040519080825280601f01601f1916602001820160405280156147a9576020820181803683370190505b509050845b8481101561481b578281815181106147c8576147c8615acf565b01602001516001600160f81b031916826147e28884615b16565b815181106147f2576147f2615acf565b60200101906001600160f81b031916908160001a9053508061481381615afb565b9150506147ae565b5095945050505050565b60008082815b81518110156148c05760008183516148439190615b16565b9050600083838151811061485957614859615acf565b01602001516001600160f81b03198116915060f81c600061487b603083615b16565b9050614888600185615b16565b61489390600a615d09565b61489d9082615b45565b6148a79088615b2d565b96505050505080806148b890615afb565b91505061482b565b50909392505050565b60006148d482614aeb565b80519091506000906001600160a01b0316336001600160a01b0316148061490b57503361490084610e0d565b6001600160a01b0316145b8061491d5750815161491d9033614036565b90508061493d57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146149725760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661499957604051633a954ecd60e21b815260040160405180910390fd5b6149a68585856001614f81565b6149b660008484600001516143e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116614aa457614a588161436b565b15614aa457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611019565b6040805160608101825260008082526020820181905291810191909152614b118261436b565b614b2e57604051636f96cda160e11b815260040160405180910390fd5b815b600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290614b9e5780516001600160a01b031615614b9e579392505050565b5060001901614b30565b6000614bb382614aeb565b9050614bc781600001516000846001614f81565b614bd760008383600001516143e2565b80516001600160a01b03166000908152600660205260408120805460019290614c0a9084906001600160401b0316615d15565b82546101009290920a6001600160401b0381810219909316918316021790915582516001600160a01b031660009081526006602052604090208054600193509091601091614c61918591600160801b900416615d3d565b82546001600160401b039182166101009390930a9283029282021916919091179091558251600085815260056020526040808220805460ff60e01b1942909616600160a01b026001600160e01b03199091166001600160a01b03958616171794909416600160e01b179093556002805460018181019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0187905586018082529290205491925016614d6457614d188161436b565b15614d6457815160008281526005602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15614ea757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614de8903390899088908890600401615d68565b602060405180830381600087803b158015614e0257600080fd5b505af1925050508015614e32575060408051601f3d908101601f19168201909252614e2f91810190615d9a565b60015b614e8d573d808015614e60576040519150601f19603f3d011682016040523d82523d6000602084013e614e65565b606091505b508051614e85576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b5060016113cf565b60608282604051602001614ec4929190615db7565b604051602081830303815290604052905092915050565b6000828152600960205260408120600d01548190614efc620f424086615b45565b614f069190615b2d565b6000858152600960205260409020600d0154909150614f26908490615b2d565b6000858152600960205260409020600d0155614f4385828561506c565b83614f4e8483615b2d565b60405183907f070aa035fe0a09f0d9305bdc2d7a5d93cd4733db3b1ff869b4a7033c9501909a90600090a4949350505050565b6000600981614f8f85611393565b81526020810191909152604001600020600801546001600160a01b03161461190857600060096000614fc085611393565b8152602081019190915260409081016000206008015490516348e3eb8d60e11b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052909116915081906391c7d71a9060840160006040518083038186803b15801561503057600080fd5b505afa158015615044573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133759190810190615b8e565b610eda838383604051806020016040528060008152506119088484848460016001600160a01b0385166150b157604051622e076360e81b815260040160405180910390fd5b826150cf5760405163b562e8dd60e01b815260040160405180910390fd5b6150dc6000868686614f81565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558884526005909252822080546001600160e01b031916909317600160a01b42909216919091021790915584905b848110156151f75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48280156151cd57506151cb6000888487614da4565b155b156151eb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101615176565b50506001805484019055611019565b82805461521290615a70565b90600052602060002090601f016020900481019282615234576000855561527a565b82601f1061524d57805160ff191683800117855561527a565b8280016001018555821561527a579182015b8281111561527a57825182559160200191906001019061525f565b506152869291506152c7565b5090565b50805461529690615a70565b6000825580601f106152a6575050565b601f0160209004906000526020600020908101906152c491906152c7565b50565b5b8082111561528657600081556001016152c8565b6001600160e01b0319811681146152c457600080fd5b60006020828403121561530457600080fd5b8135614089816152dc565b60005b8381101561532a578181015183820152602001615312565b838111156119085750506000910152565b6000815180845261535381602086016020860161530f565b601f01601f19169290920160200192915050565b602081526000614089602083018461533b565b60006020828403121561538c57600080fd5b5035919050565b6001600160a01b03811681146152c457600080fd5b600080604083850312156153bb57600080fd5b82356153c681615393565b946020939093013593505050565b6000602082840312156153e657600080fd5b813561408981615393565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561542f5761542f6153f1565b604052919050565b60006001600160401b03821115615450576154506153f1565b50601f01601f191660200190565b600061547161546c84615437565b615407565b905082815283838301111561548557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126154ad57600080fd5b6140898383356020850161545e565b600080604083850312156154cf57600080fd5b8235915060208301356001600160401b038111156154ec57600080fd5b6154f88582860161549c565b9150509250929050565b600081518084526020808501945080840160005b8381101561553257815187529582019590820190600101615516565b509495945050505050565b6020815260006140896020830184615502565b60008083601f84011261556257600080fd5b5081356001600160401b0381111561557957600080fd5b6020830191508360208260051b850101111561162257600080fd5b600080600080604085870312156155aa57600080fd5b84356001600160401b03808211156155c157600080fd5b6155cd88838901615550565b909650945060208701359150808211156155e657600080fd5b506155f387828801615550565b95989497509550505050565b8035801515811461107757600080fd5b600080600080600080600060e0888a03121561562a57600080fd5b87356001600160401b0381111561564057600080fd5b61564c8a828b0161549c565b975050602088013561565d81615393565b955060408801359450606088013561567481615393565b9350615682608089016155ff565b925060a0880135915061569760c089016155ff565b905092959891949750929550565b6000806000606084860312156156ba57600080fd5b83356156c581615393565b925060208401356156d581615393565b929592945050506040919091013590565b600080604083850312156156f957600080fd5b50508035926020909101359150565b60608152600061571b606083018661533b565b828103602084015261572d818661533b565b9150508215156040830152949350505050565b60c08152600061575360c083018961533b565b87602084015286151560408401528281036060840152615773818761533b565b9415156080840152505090151560a090910152949350505050565b600080600080608085870312156157a457600080fd5b8435935060208501356157b681615393565b92506157c4604086016155ff565b9396929550929360600135925050565b600080604083850312156157e757600080fd5b8235915060208301356157f981615393565b809150509250929050565b60c08152600061581760c083018961533b565b8281036020840152615829818961533b565b9050828103604084015261583d818861533b565b90508281036060840152615851818761533b565b90508281036080840152615865818661533b565b91505082151560a0830152979650505050505050565b6000806040838503121561588e57600080fd5b823561589981615393565b91506158a7602084016155ff565b90509250929050565b6000806000606084860312156158c557600080fd5b833592506020840135915060408401356001600160401b038111156158e957600080fd5b6158f58682870161549c565b9150509250925092565b6000806000806080858703121561591557600080fd5b843561592081615393565b9350602085013561593081615393565b92506040850135915060608501356001600160401b0381111561595257600080fd5b8501601f8101871361596357600080fd5b6159728782356020840161545e565b91505092959194509250565b600081518084526020808501945080840160005b838110156155325781516001600160a01b031687529582019590820190600101615992565b602081526000614089602083018461597e565b6040815260006159dd604083018561597e565b82810360208401526159ef8185615502565b95945050505050565b60008060408385031215615a0b57600080fd5b8235615a1681615393565b915060208301356157f981615393565b60008060008060808587031215615a3c57600080fd5b8435615a4781615393565b935060208501359250604085013591506060850135615a6581615393565b939692955090935050565b600181811c90821680615a8457607f821691505b60208210811415613cf357634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615b0f57615b0f615ae5565b5060010190565b600082821015615b2857615b28615ae5565b500390565b60008219821115615b4057615b40615ae5565b500190565b6000816000190483118215151615615b5f57615b5f615ae5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8957615b89615b64565b500490565b600060208284031215615ba057600080fd5b81516001600160401b03811115615bb657600080fd5b8201601f81018413615bc757600080fd5b8051615bd561546c82615437565b818152856020838501011115615bea57600080fd5b6159ef82602083016020860161530f565b600082615c0a57615c0a615b64565b500690565b634e487b7160e01b600052600160045260246000fd5b600181815b80851115615c60578160001904821115615c4657615c46615ae5565b80851615615c5357918102915b93841c9390800290615c2a565b509250929050565b600082615c7757506001610d75565b81615c8457506000610d75565b8160018114615c9a5760028114615ca457615cc0565b6001915050610d75565b60ff841115615cb557615cb5615ae5565b50506001821b610d75565b5060208310610133831016604e8410600b8410161715615ce3575081810a610d75565b615ced8383615c25565b8060001904821115615d0157615d01615ae5565b029392505050565b60006140898383615c68565b60006001600160401b0383811690831681811015615d3557615d35615ae5565b039392505050565b60006001600160401b03808316818516808303821115615d5f57615d5f615ae5565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614310608083018461533b565b600060208284031215615dac57600080fd5b8151614089816152dc565b60008351615dc981846020880161530f565b835190830190615d5f81836020880161530f56fe4f6e6c7920617274697374206f72205261696e626f776c697374656400000000a2646970667358221220ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000096e74656e742e617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e54454e54580000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): ntent.art
Arg [1] : _tokenSymbol (string): NTENTX
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 6e74656e742e6172740000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4e54454e54580000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
31895:29889:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35200:609;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35200:609:0;;;;;;;;18176:100;;;:::i;:::-;;;;;;;:::i;19763:245::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;19763:245:0;1528:226:1;19339:358:0;;;;;;:::i;:::-;;:::i;:::-;;38587:120;;;;;;:::i;:::-;;:::i;41186:236::-;;;;;;:::i;:::-;;:::i;59408:235::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52816:678::-;;;;;;:::i;:::-;;:::i;15044:122::-;;;:::i;:::-;;;6061:25:1;;;6049:2;6034:18;15044:122:0;5915:177:1;39853:1090:0;;;;;;:::i;:::-;;:::i;54924:451::-;;;;;;:::i;:::-;;:::i;33445:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33312:35;;;;;;52045:168;;;;;;:::i;:::-;;:::i;43355:241::-;;;;;;:::i;:::-;;:::i;33356:53::-;;;;;;:::i;:::-;;:::i;47994:211::-;;;;;;:::i;:::-;;:::i;59651:194::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8047:55:1;;;8029:74;;8134:2;8119:18;;8112:34;;;;8002:18;59651:194:0;7855:297:1;51621:416:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;61539:242::-;;;;;;:::i;:::-;;:::i;38029:115::-;;;;;;:::i;:::-;;:::i;43146:201::-;;;;;;:::i;:::-;;:::i;33598:33::-;;;;;;47183:557;;;;;;:::i;:::-;;:::i;46392:198::-;;;;;;:::i;:::-;;:::i;38715:124::-;;;;;;:::i;:::-;;:::i;46146:238::-;;;;;;:::i;:::-;;:::i;20975:185::-;;;;;;:::i;:::-;;:::i;38343:112::-;;;;;;:::i;:::-;;:::i;50777:632::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;33278:27::-;;;;;-1:-1:-1;;;;;33278:27:0;;;60582:949;;;;;;:::i;:::-;;:::i;46830:345::-;;;;;;:::i;:::-;;:::i;17170:124::-;;;;;;:::i;:::-;;:::i;41687:460::-;;;;;;:::i;:::-;;:::i;50076:693::-;;;;;;:::i;:::-;;:::i;39419:222::-;;;;;;:::i;:::-;;:::i;46598:224::-;;;;;;:::i;:::-;;:::i;58448:191::-;;;;;;:::i;:::-;;:::i;42402:248::-;;;;;;:::i;:::-;;:::i;15661:206::-;;;;;;:::i;:::-;;:::i;38152:183::-;;;;;;:::i;:::-;;:::i;38847:186::-;;;;;;:::i;:::-;38946:13;38984:41;;;:29;:41;;;;;;;38847:186;33499:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43604:607;;;;;;:::i;:::-;;:::i;55383:1341::-;;;;;;:::i;:::-;;:::i;39041:186::-;;;;;;:::i;:::-;;:::i;48852:1216::-;;;;;;:::i;:::-;48960:21;49390:36;;;:24;:36;;;;;;;;;49458:29;:41;;;;;;49524:8;:20;;;;;;;;:32;;;;49584:35;;;;49639:27;;;;49696:37;;;;49759:33;;;;49822:37;;;;49889;;;;50022:38;;;;;-1:-1:-1;;;;;49390:36:0;;;;49458:41;;49524:32;;49584:35;;49639:27;;;;;;;;;49696:37;;;;49759:33;;;;49822:37;;;49889;;;;-1:-1:-1;;;49955:36:0;;;;48852:1216;;;;;-1:-1:-1;;;;;10932:15:1;;;10914:34;;10979:2;10964:18;;10957:34;;;;11007:18;;11000:34;;;;11065:2;11050:18;;11043:34;;;;11121:14;;11114:22;11108:3;11093:19;;11086:51;11174:15;;;11168:3;11153:19;;11146:44;11227:15;;11221:3;11206:19;;11199:44;11280:15;;11274:3;11259:19;;11252:44;11333:15;;;11327:3;11312:19;;11305:44;11393:14;;11386:22;11380:3;11365:19;;11358:51;11440:3;11425:19;;11418:36;;;;10840:3;10825:19;48852:1216:0;10437:1023:1;51417:196:0;;;;;;:::i;:::-;;:::i;48213:631::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;47748:238::-;;;;;;:::i;:::-;;:::i;18345:104::-;;;:::i;40951:227::-;;;;;;:::i;:::-;;:::i;37674:347::-;;;;;;:::i;:::-;;:::i;39649:196::-;;;;;;:::i;:::-;;:::i;20080:302::-;;;;;;:::i;:::-;;:::i;42921:217::-;;;;;;:::i;:::-;;:::i;33139:59::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33139:59:0;;;42155:239;;;;;;:::i;:::-;;:::i;44624:368::-;;;;;;:::i;:::-;;:::i;45000:389::-;;;;;;:::i;:::-;;:::i;53688:725::-;;;;;;:::i;:::-;;:::i;41430:249::-;;;;;;:::i;:::-;;:::i;21231:321::-;;;;;;:::i;:::-;;:::i;59076:324::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58647:421::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;54421:464::-;;;;;;:::i;:::-;;:::i;38463:116::-;;;;;;:::i;:::-;;:::i;53502:178::-;;;;;;:::i;:::-;;:::i;42658:255::-;;;;;;:::i;:::-;;:::i;17498:104::-;;;:::i;45885:253::-;;;;;;:::i;:::-;;:::i;56732:1670::-;;;;;;:::i;:::-;;:::i;39235:176::-;;;;;;:::i;:::-;;:::i;45397:480::-;;;;;;:::i;:::-;;:::i;17375:115::-;;;;;;:::i;:::-;17431:4;17455:20;;;:11;:20;;;;;:27;-1:-1:-1;;;17455:27:0;;;;;17375:115;44219:397;;;;;;:::i;:::-;;:::i;33559:32::-;;;;;;60073:216;;;;;;:::i;:::-;;:::i;33205:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;59888:151;;;;;;:::i;:::-;;:::i;36182:925::-;;;;;;:::i;:::-;;:::i;33418:20::-;;;;;-1:-1:-1;;;;;33418:20:0;;;35200:609;35339:4;-1:-1:-1;;;;;;35381:40:0;;-1:-1:-1;;;35381:40:0;;:95;;;35438:38;35464:11;35438:25;:38::i;:::-;35381:160;;;-1:-1:-1;;;;;;;35493:48:0;;-1:-1:-1;;;35493:48:0;35381:160;:227;;;-1:-1:-1;;;;;;;35558:50:0;;-1:-1:-1;;;35558:50:0;35381:227;:294;;;-1:-1:-1;;;;;;;35625:50:0;;-1:-1:-1;;;35625:50:0;35381:294;:357;;;-1:-1:-1;;;;;;;35692:46:0;;-1:-1:-1;;;35692:46:0;35381:357;:420;;;-1:-1:-1;;;;;;;35755:46:0;;-1:-1:-1;;;35755:46:0;35381:420;35361:440;35200:609;-1:-1:-1;;35200:609:0:o;18176:100::-;18230:13;18263:5;18256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18176:100;:::o;19763:245::-;19867:7;19897:16;19905:7;19897;:16::i;:::-;19892:64;;19922:34;;-1:-1:-1;;;19922:34:0;;;;;;;;;;;19892:64;-1:-1:-1;19976:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19976:24:0;;19763:245::o;19339:358::-;19412:13;19428:24;19444:7;19428:15;:24::i;:::-;19412:40;;19473:5;-1:-1:-1;;;;;19467:11:0;:2;-1:-1:-1;;;;;19467:11:0;;19463:48;;;19487:24;;-1:-1:-1;;;19487:24:0;;;;;;;;;;;19463:48;175:10;-1:-1:-1;;;;;19528:21:0;;;;;;:63;;-1:-1:-1;19554:37:0;19571:5;175:10;60073:216;:::i;19554:37::-;19553:38;19528:63;19524:124;;;19613:35;;-1:-1:-1;;;19613:35:0;;;;;;;;;;;19524:124;19661:28;19670:2;19674:7;19683:5;19661:8;:28::i;:::-;19401:296;19339:358;;:::o;38587:120::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;;;;;;;;;-1:-1:-1;;;;;38663:29:0::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;38663:36:0::1;38695:4;38663:36;::::0;;38587:120::o;41186:236::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;41346:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;41374:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:40;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;34255:1:::1;41186:236:::0;;;:::o;59408:235::-;59496:17;;59459:20;;-1:-1:-1;;;;;59496:17:0;:33;59492:123;;59552:16;;;59566:1;59552:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59552:16:0;59546:22;;59592:11;;59583:3;59587:1;59583:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;59492:123;59408:235;;;:::o;52816:678::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;52979:12;53031:10;53067:17;53059:69:::1;;;::::0;-1:-1:-1;;;53059:69:0;;17974:2:1;53059:69:0::1;::::0;::::1;17956:21:1::0;18013:2;17993:18;;;17986:30;18052:34;18032:18;;;18025:62;-1:-1:-1;;;18103:18:1;;;18096:37;18150:19;;53059:69:0::1;17772:403:1::0;53059:69:0::1;53178:11;53161:13;:28;53139:120;;;::::0;-1:-1:-1;;;53139:120:0;;18382:2:1;53139:120:0::1;::::0;::::1;18364:21:1::0;18421:2;18401:18;;;18394:30;18460:34;18440:18;;;18433:62;-1:-1:-1;;;18511:18:1;;;18504:40;18561:19;;53139:120:0::1;18180:406:1::0;53139:120:0::1;53277:9;53272:215;53292:13;53288:1;:17;53272:215;;;53327:18;53348:12;;53361:1;53348:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53327:36;;53378:16;53397:10;;53408:1;53397:13;;;;;;;:::i;:::-;;;;;;;53378:32;;53425:50;53442:10;53454;53466:8;53425:16;:50::i;:::-;53312:175;;53307:3;;;;;:::i;:::-;;;;53272:215;;;;52944:550;;52816:678:::0;;;;:::o;15044:122::-;15139:12;:19;15124:12;;15097:7;;15124:34;;;:::i;:::-;15117:41;;15044:122;:::o;39853:1090::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;40173:13:::1;::::0;40153:17:::1;40197:35:::0;;;:24:::1;:35;::::0;;;;;;;:52;;-1:-1:-1;;;;;;40197:52:0::1;-1:-1:-1::0;;;;;40197:52:0;::::1;;::::0;;40260:8:::1;:19:::0;;;;;:39;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40310:19:0::1;::::0;;;:8:::1;:19;::::0;;;;;;;:36:::1;::::0;::::1;:56:::0;;-1:-1:-1;;;;;;40310:56:0::1;-1:-1:-1::0;;;;;40310:56:0;::::1;;::::0;;40377:35:::1;::::0;::::1;:54:::0;;-1:-1:-1;;;;40377:54:0::1;-1:-1:-1::0;;;40377:54:0;::::1;;;;::::0;;40442:37;;::::1;:58:::0;;;40511:29:::1;:40:::0;;;;:62;;;40584:19;:26:::1;::::0;::::1;:33:::0;;;-1:-1:-1;;40584:33:0;;::::1;;::::0;;40628:27:::1;::::0;::::1;:38:::0;;-1:-1:-1;;40628:38:0::1;::::0;::::1;;;::::0;;33007:9:::1;40677:34;::::0;;::::1;:48:::0;40628:38;40736:156:::1;;40802:5;40766:19:::0;;;:8:::1;:19;::::0;;;;:33:::1;;:41:::0;;-1:-1:-1;;40766:41:0::1;::::0;;40736:156:::1;;;40840:19;::::0;;;:8:::1;:19;::::0;;;;:33:::1;;:40:::0;;-1:-1:-1;;40840:40:0::1;40876:4;40840:40;::::0;;40736:156:::1;40918:13;::::0;:17:::1;::::0;40934:1:::1;40918:17;:::i;:::-;40902:13;:33:::0;-1:-1:-1;;;;;;;;39853:1090:0:o;54924:451::-;55018:7;55084:22;55109:29;:19;:8;:17;:19::i;:::-;:27;:29::i;:::-;55084:54;;55212:26;55241:84;:60;55274:1;55277:23;:8;:21;:23::i;:::-;55241:8;;:60;:32;:60::i;:84::-;55212:113;;55345:22;:12;:20;:22::i;:::-;55338:29;54924:451;-1:-1:-1;;;;54924:451:0:o;52045:168::-;52174:31;52184:5;52191:3;52196:8;52174:9;:31::i;43355:241::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;43519:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;43542:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:46;;::::2;::::0;:28:::2;::::0;;::::2;::::0;:46;::::2;::::0;::::2;:::i;33356:53::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47994:211::-;48095:28;48114:8;48095:18;:28::i;:::-;34794:10;34778:27;;;;:15;:27;;;;;;;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;48148:19:::1;:49;48168:28;48187:8;48168:18;:28::i;:::-;48148:49;;;;;;;;;;;;48141:56;;;;:::i;:::-;47994:211:::0;;:::o;59651:194::-;59788:17;;59816:11;;59746:7;;;;-1:-1:-1;;;;;59788:17:0;;;;59831:5;;59808:19;;:5;:19;:::i;:::-;59807:29;;;;:::i;:::-;59780:57;;;;59651:194;;;;;;:::o;51621:416::-;51817:12;51874:20;;;:8;:20;;;;;:35;;51857:52;;51727:28;;;;51817:12;;51857:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51941:20:0;;;;:8;:20;;;;;:39;;51920:60;;51857:52;;-1:-1:-1;51941:39:0;51920:60;;-1:-1:-1;51920:60:0;-1:-1:-1;51920:60:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52001:20:0;;;;-1:-1:-1;;52001:8:0;:20;;;;;;:28;;;51621:416;;52001:28;;;;;;;51621:416;-1:-1:-1;;51621:416:0:o;61539:242::-;61628:7;61664:16;61674:5;61664:9;:16::i;:::-;61656:5;:24;61648:80;;;;-1:-1:-1;;;61648:80:0;;20105:2:1;61648:80:0;;;20087:21:1;20144:2;20124:18;;;20117:30;20183:34;20163:18;;;20156:62;-1:-1:-1;;;20234:18:1;;;20227:41;20285:19;;61648:80:0;19903:407:1;61648:80:0;61746:20;61760:5;61746:13;:20::i;:::-;61767:5;61746:27;;;;;;;;:::i;:::-;;;;;;;61739:34;;61539:242;;;;:::o;38029:115::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;38108:12:::1;:28:::0;;-1:-1:-1;;;;;;38108:28:0::1;-1:-1:-1::0;;;;;38108:28:0;;;::::1;::::0;;;::::1;::::0;;38029:115::o;43146:201::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43293:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:46;;::::1;::::0;:28:::1;::::0;;::::1;::::0;:46;::::1;::::0;::::1;:::i;:::-;;43146:201:::0;;;:::o;47183:557::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;47320:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;47370:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:37;47348:126:::2;;;::::0;-1:-1:-1;;;47348:126:0;;20857:2:1;47348:126:0::2;::::0;::::2;20839:21:1::0;20896:2;20876:18;;;20869:30;20935:34;20915:18;;;20908:62;-1:-1:-1;;;20986:18:1;;;20979:37;21033:19;;47348:126:0::2;20655:403:1::0;47348:126:0::2;47489:20;::::0;;;:8:::2;:20;::::0;;;;:28:::2;;::::0;::::2;;47485:177;;;47571:5;47534:20:::0;;;:8:::2;:20;::::0;;;;:34:::2;;:42:::0;;-1:-1:-1;;47534:42:0::2;::::0;;47485:177:::2;;;47609:20;::::0;;;:8:::2;:20;::::0;;;;:34:::2;;:41:::0;;-1:-1:-1;;47609:41:0::2;47646:4;47609:41;::::0;;47485:177:::2;-1:-1:-1::0;;47704:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:28:::2;;::::0;;-1:-1:-1;;47672:60:0;::::2;47704:28;::::0;;::::2;47703:29;47672:60;::::0;;47183:557::o;46392:198::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;46533:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:49;;::::1;::::0;:35:::1;::::0;;::::1;::::0;:49;::::1;::::0;::::1;:::i;38715:124::-:0;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38794:29:0::1;38826:5;38794:29:::0;;;:19:::1;:29;::::0;;;;:37;;-1:-1:-1;;38794:37:0::1;::::0;;38715:124::o;46146:238::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;46307:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;46335:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:41;;::::2;::::0;:29:::2;::::0;;::::2;::::0;:41;::::2;::::0;::::2;:::i;20975:185::-:0;21113:39;21130:4;21136:2;21140:7;21113:39;;;;;;;;;;;;:16;:39::i;38343:112::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38415:25:0::1;;::::0;;;:15:::1;:25;::::0;;;;:32;;-1:-1:-1;;38415:32:0::1;38443:4;38415:32;::::0;;38343:112::o;50777:632::-;50886:24;50925:19;50959:18;50992:22;51029:11;51055;51107:8;:20;51116:10;51107:20;;;;;;;;;;;:31;;51094:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51163:20:0;;;;:8;:20;;;;;:32;;;;51222:34;;;;51278:29;;;;51267:40;;51094:44;;-1:-1:-1;51163:32:0;;-1:-1:-1;51222:34:0;;;;;-1:-1:-1;51278:29:0;51267:40;;-1:-1:-1;51267:40:0;-1:-1:-1;51267:40:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51327:20:0;;;;-1:-1:-1;;51327:8:0;:20;;;;;;:27;;;50777:632;;;;;;51267:40;;51327:27;;;;;;;51374;;;;;-1:-1:-1;50777:632:0;-1:-1:-1;;50777:632:0:o;60582:949::-;60874:14;;60649:7;;;;60857:608;60894:13;;60890:1;:17;60857:608;;;60933:30;60966:22;60986:1;60966:19;:22::i;:::-;60933:55;;61014:10;61009:441;61031:13;:20;61026:2;:25;61009:441;;;61082:15;61100:13;61114:2;61100:17;;;;;;;;:::i;:::-;;;;;;;;;;;;61142:31;61176:20;;;:11;:20;;;;;;;61142:54;;;;;;;;;-1:-1:-1;;;;;61142:54:0;;;;-1:-1:-1;;;61142:54:0;;-1:-1:-1;;;;;61142:54:0;;;;;;;;-1:-1:-1;;;61142:54:0;;;;;;;;;;;;;61100:17;;-1:-1:-1;61219:212:0;;61288:5;61273:11;:20;61269:99;;;-1:-1:-1;61333:7:0;60582:949;-1:-1:-1;;;;;;60582:949:0:o;61269:99::-;61394:13;;;;;61219:212;-1:-1:-1;;61053:4:0;;61009:441;;;-1:-1:-1;;60909:3:0;;60857:608;;;;61495:28;;-1:-1:-1;;;61495:28:0;;;;;;;;;;;46830:345;34794:10;34778:27;;;;:15;:27;;;;;;46940:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;46991:20:::1;::::0;;;:8:::1;:20;::::0;;;;:28:::1;;::::0;::::1;;46990:29;46968:128;;;::::0;-1:-1:-1;;;46968:128:0;;21265:2:1;46968:128:0::1;::::0;::::1;21247:21:1::0;21304:2;21284:18;;;21277:30;21343:34;21323:18;;;21316:62;-1:-1:-1;;;21394:18:1;;;21387:47;21451:19;;46968:128:0::1;21063:413:1::0;46968:128:0::1;-1:-1:-1::0;47139:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:28:::1;;::::0;;-1:-1:-1;;47107:60:0;::::1;47139:28;::::0;;;::::1;;;47138:29;47107:60:::0;;::::1;;::::0;;46830:345::o;17170:124::-;17234:7;17261:20;17273:7;17261:11;:20::i;:::-;:25;;17170:124;-1:-1:-1;;17170:124:0:o;41687:460::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;41939:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;;;:37:::2;::::0;::::2;:64:::0;;-1:-1:-1;;;;;41939:64:0;;::::2;-1:-1:-1::0;;;;;;41939:64:0;;::::2;::::0;;;::::2;::::0;;;42014:36:::2;::::0;::::2;:55:::0;;;::::2;;-1:-1:-1::0;;;42014:55:0::2;-1:-1:-1::0;;;;42014:55:0;;::::2;::::0;;;::::2;::::0;;;42080:38;::::2;:59:::0;41687:460::o;50076:693::-;50173:16;50207:19;50237:21;50269:26;50298:36;50323:10;50298:24;:36::i;:::-;50269:65;;50345:31;50393:18;-1:-1:-1;;;;;50379:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50379:33:0;-1:-1:-1;50453:12:0;:19;50345:67;;-1:-1:-1;50425:25:0;50483:247;50503:17;50499:1;:21;50483:247;;;50558:12;50571:1;50558:15;;;;;;;;:::i;:::-;;;;;;;;;50542:31;;50629:10;50592:33;50611:13;50592:18;:33::i;:::-;:47;50588:131;;;50690:13;50660:14;50675:11;50660:27;;;;;;;;:::i;:::-;;;;;;:43;;;;;50588:131;50522:3;;;;:::i;:::-;;;;50483:247;;;-1:-1:-1;50747:14:0;;50076:693;-1:-1:-1;;;;;;50076:693:0:o;39419:222::-;34794:10;34778:27;;;;:15;:27;;;;;;39557:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;-1:-1:-1;39580:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;:53;;-1:-1:-1;;;;;;39580:53:0::1;-1:-1:-1::0;;;;;39580:53:0;;::::1;::::0;;;::::1;::::0;;39419:222::o;46598:224::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;46753:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:61;;::::1;::::0;:39:::1;::::0;;::::1;::::0;:61;::::1;::::0;::::1;:::i;58448:191::-:0;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;58574:17:::1;:29:::0;;-1:-1:-1;;;;;;58574:29:0::1;-1:-1:-1::0;;;;;58574:29:0;;;::::1;::::0;;;::::1;::::0;;;58614:11:::1;:17:::0;58448:191::o;42402:248::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42578:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:37:::2;;:64:::0;;-1:-1:-1;;;;;;42578:64:0::2;-1:-1:-1::0;;;;;42578:64:0;;::::2;::::0;;;::::2;::::0;;42402:248::o;15661:206::-;15725:7;-1:-1:-1;;;;;15749:19:0;;15745:60;;15777:28;;-1:-1:-1;;;15777:28:0;;;;;;;;;;;15745:60;-1:-1:-1;;;;;;15831:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;15831:27:0;;15661:206::o;38152:183::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;38265:2:::1;38245:16;:22;;38237:45;;;::::0;-1:-1:-1;;;38237:45:0;;21683:2:1;38237:45:0::1;::::0;::::1;21665:21:1::0;21722:2;21702:18;;;21695:30;-1:-1:-1;;;21741:18:1;;;21734:40;21791:18;;38237:45:0::1;21481:334:1::0;38237:45:0::1;38293:15;:34:::0;38152:183::o;43604:607::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43776:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;;::::1;;;43775:28;::::0;:102:::1;;-1:-1:-1::0;43842:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:35:::1;;::::0;43824:53;::::1;43775:102;43752:170;;;;-1:-1:-1::0;;;43752:170:0::1;;;;;;;:::i;:::-;43973:20;::::0;;;:8:::1;:20;::::0;;;;:32:::1;;::::0;43955:50;::::1;43933:131;;;::::0;-1:-1:-1;;;43933:131:0;;22022:2:1;43933:131:0::1;::::0;::::1;22004:21:1::0;22061:2;22041:18;;;22034:30;22100:33;22080:18;;;22073:61;22151:18;;43933:131:0::1;21820:355:1::0;43933:131:0::1;33007:9;44083:15;:30;;44075:64;;;::::0;-1:-1:-1;;;44075:64:0;;22382:2:1;44075:64:0::1;::::0;::::1;22364:21:1::0;22421:2;22401:18;;;22394:30;22460:23;22440:18;;;22433:51;22501:18;;44075:64:0::1;22180:345:1::0;44075:64:0::1;-1:-1:-1::0;44150:20:0::1;::::0;;;:8:::1;:20;::::0;;;;;:35:::1;;:53:::0;43604:607::o;55383:1341::-;55469:16;55503:20;55526:16;55536:5;55526:9;:16::i;:::-;55503:39;;55553:18;55582:25;55620:30;55667:12;-1:-1:-1;;;;;55653:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55653:27:0;-1:-1:-1;55856:14:0;;55620:60;;-1:-1:-1;55839:819:0;55876:13;;55872:1;:17;55839:819;;;55915:30;55948:22;55968:1;55948:19;:22::i;:::-;55915:55;;55996:10;55991:652;56013:13;:20;56008:2;:25;55991:652;;;56064:15;56082:13;56096:2;56082:17;;;;;;;;:::i;:::-;;;;;;;;;;;;56124:31;56158:20;;;:11;:20;;;;;;;56124:54;;;;;;;;;-1:-1:-1;;;;;56124:54:0;;;;;-1:-1:-1;;;56124:54:0;;-1:-1:-1;;;;;56124:54:0;;;;;;;;-1:-1:-1;;;56124:54:0;;;;;;;;;;;;;56082:17;;-1:-1:-1;56124:54:0;56205:28;56201:119;;56282:14;;;-1:-1:-1;56201:119:0;56367:5;-1:-1:-1;;;;;56346:26:0;:17;-1:-1:-1;;;;;56346:26:0;;56342:157;;;56429:7;56401:13;56415:10;56401:25;;;;;;;;:::i;:::-;;;;;;;;;;:35;56463:12;;;;;56342:157;56539:12;56525:10;:26;56521:103;;;-1:-1:-1;56587:13:0;;55383:1341;-1:-1:-1;;;;;;;;;55383:1341:0:o;56521:103::-;-1:-1:-1;;56035:4:0;;55991:652;;;-1:-1:-1;;55891:3:0;;55839:819;;39041:186;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;34196:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;:20;;:27;;::::1;;;34195:28;34187:57;;;;-1:-1:-1::0;;;34187:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;39185:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:27:::2;;:34:::0;;-1:-1:-1;;39185:34:0::2;::::0;::::2;::::0;;39041:186::o;51417:196::-;51569:20;;;;:8;:20;;;;;;;;:36;;;:28;;:36;;;;;51562:43;;51531:13;;51569:36;51562:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51417:196;;;;:::o;48213:631::-;48319:25;48359:20;48394:25;48434:21;48470;48506:12;48560:8;:20;48569:10;48560:20;;;;;;;;;;;:25;;48546:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48605:20:0;;;;:8;:20;;;;;:27;;48596:36;;48546:39;;-1:-1:-1;48605:27:0;48596:36;;-1:-1:-1;48596:36:0;-1:-1:-1;48596:36:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48657:20:0;;;;:8;:20;;;;;:32;;48643:46;;48596:36;;-1:-1:-1;48657:32:0;48643:46;;-1:-1:-1;48643:46:0;-1:-1:-1;48643:46:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48710:20:0;;;;:8;:20;;;;;:28;;48700:38;;48643:46;;-1:-1:-1;48710:28:0;48700:38;;-1:-1:-1;48700:38:0;-1:-1:-1;48700:38:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48759:20:0;;;;:8;:20;;;;;:28;;48749:38;;48700;;-1:-1:-1;48759:28:0;48749:38;;-1:-1:-1;48749:38:0;-1:-1:-1;48749:38:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48808:20:0;;;;-1:-1:-1;;48808:8:0;:20;;;;;;:28;;;48213:631;;;;;;;;48808:28;;;;;48213:631;-1:-1:-1;;48213:631:0:o;47748:238::-;47896:28;47915:8;47896:18;:28::i;:::-;34794:10;34778:27;;;;:15;:27;;;;;;;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;47937:29:::1;::::0;;;:19:::1;:29;::::0;;;;;;;:41;;::::1;::::0;;::::1;::::0;::::1;:::i;18345:104::-:0;18401:13;18434:7;18427:14;;;;;:::i;40951:227::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;-1:-1:-1;41107:41:0::1;::::0;;;:29:::1;:41;::::0;;;;;:63;40951:227::o;37674:347::-;37839:10;37763:16;37819:31;;;:19;:31;;;;;;;;37797:116;;;;-1:-1:-1;;;37797:116:0;;22732:2:1;37797:116:0;;;22714:21:1;22771:2;22751:18;;;22744:30;22810:34;22790:18;;;22783:62;-1:-1:-1;;;22861:18:1;;;22854:33;22904:19;;37797:116:0;22530:399:1;37797:116:0;37924:14;37930:7;37924:5;:14::i;:::-;37954:34;;37980:7;;-1:-1:-1;;;;;37954:34:0;;;;;;;;-1:-1:-1;38006:7:0;37674:347;-1:-1:-1;37674:347:0:o;39649:196::-;34794:10;34778:27;;;;:15;:27;;;;;;39751:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;-1:-1:-1;39810:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;-1:-1:-1;;39779:58:0;::::1;39810:27:::0;;;;::::1;;;39809:28;39779:58:::0;;::::1;;::::0;;39649:196::o;20080:302::-;-1:-1:-1;;;;;20194:24:0;;175:10;20194:24;20190:54;;;20227:17;;-1:-1:-1;;;20227:17:0;;;;;;;;;;;20190:54;175:10;20257:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20257:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;20257:53:0;;;;;;;;;;20326:48;;540:41:1;;;20257:42:0;;175:10;20326:48;;513:18:1;20326:48:0;;;;;;;20080:302;;:::o;42921:217::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43076:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:54;;::::1;::::0;:32:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;42155:239::-:0;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42330:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:33:::2;;:56:::0;;-1:-1:-1;;;;;;42330:56:0::2;-1:-1:-1::0;;;;;42330:56:0;;::::2;::::0;;;::::2;::::0;;42155:239::o;44624:368::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;44778:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;44806:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;44849:32:::2;::::0;::::2;::::0;44806:86;;:28:::2;;:86:::0;;;;;:96;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;44948:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:36:::2;::::0;44983:1:::2;44948:36;:::i;:::-;44913:20;::::0;;;:8:::2;:20;::::0;;;;;:32:::2;;:71:::0;;;;-1:-1:-1;;;44624:368:0:o;45000:389::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;45183:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;45240:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;45228:44;::::2;45206:115;;;::::0;-1:-1:-1;;;45206:115:0;;23136:2:1;45206:115:0::2;::::0;::::2;23118:21:1::0;23175:2;23155:18;;;23148:30;23214:23;23194:18;;;23187:51;23255:18;;45206:115:0::2;22934:345:1::0;45206:115:0::2;45332:20;::::0;;;:8:::2;:20;::::0;;;;;;;:39;;;:28:::2;;:39:::0;;;;;:49;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;34255:1:::1;45000:389:::0;;;;:::o;53688:725::-;53819:11;53893:20;;;:8;:20;;;;;:32;;;53785:16;;53819:11;;;;53965:36;53902:10;53965:24;:36::i;:::-;53936:65;-1:-1:-1;54012:30:0;54073:36;53936:65;54073:15;:36;:::i;:::-;-1:-1:-1;;;;;54045:75:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54045:75:0;;54012:108;;54138:9;54133:242;54153:15;54149:1;:19;54133:242;;;54229:1;54201:24;33007:9;54201:10;:24;:::i;:::-;54200:30;;;;:::i;:::-;17431:4;17455:20;;;:11;:20;;;;;:27;54190:40;;-1:-1:-1;;;;17455:27:0;;;;54245:119;;54317:7;54296:13;54310:3;54296:18;;;;;;;;:::i;:::-;;;;;;;;;;:28;54343:5;;;;:::i;:::-;;;;54245:119;54170:3;;;;:::i;:::-;;;;54133:242;;;-1:-1:-1;54392:13:0;53688:725;-1:-1:-1;;;;;;53688:725:0:o;41430:249::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;41600:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;41623:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:48;;::::2;::::0;:27:::2;::::0;;::::2;::::0;:48;::::2;::::0;::::2;:::i;21231:321::-:0;21390:28;21400:4;21406:2;21410:7;21390:9;:28::i;:::-;21434:48;21457:4;21463:2;21467:7;21476:5;21434:22;:48::i;:::-;21429:115;;21504:40;;-1:-1:-1;;;21504:40:0;;;;;;;;;;;59076:324;59218:17;;59161:35;;-1:-1:-1;;;;;59218:17:0;:33;59214:151;;59281:24;;;59303:1;59281:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59336:17:0;;59320:13;;;;-1:-1:-1;;;;;;59336:17:0;;59320:13;;-1:-1:-1;59336:17:0;;59320:13;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;59320:33:0;;;-1:-1:-1;;;;;59320:33:0;;;;;59076:324;;;:::o;58647:421::-;58807:17;;58728:35;;;;-1:-1:-1;;;;;58807:17:0;:33;58803:223;;58870:24;;;58892:1;58870:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58925:17:0;;58909:13;;;;-1:-1:-1;;;;;;58925:17:0;;58909:13;;-1:-1:-1;58925:17:0;;58909:13;;;;:::i;:::-;-1:-1:-1;;;;;58909:33:0;;;;:13;;;;;;;;;;:33;58963:16;;;58977:1;58963:16;;;;;;;;;;;;;;58909:13;58963:16;;;;;-1:-1:-1;58963:16:0;58957:22;;59003:11;;58994:3;58998:1;58994:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;58803:223;58647:421;;;:::o;54421:464::-;54626:12;:19;54523:7;;;;;;;54656:199;54676:17;54672:1;:21;54656:199;;;54725:12;54738:1;54725:15;;;;;;;;:::i;:::-;;;;;;;;;54715:25;;54790:10;54759:27;54778:7;54759:18;:27::i;:::-;:41;54755:89;;;54821:7;;;;:::i;:::-;;;;54755:89;54695:3;;;;:::i;:::-;;;;54656:199;;;-1:-1:-1;54872:5:0;;54421:464;-1:-1:-1;;;;54421:464:0:o;38463:116::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38538:25:0::1;38566:5;38538:25:::0;;;:15:::1;:25;::::0;;;;:33;;-1:-1:-1;;38538:33:0::1;::::0;;38463:116::o;53502:178::-;53600:16;53641:31;53661:10;53641:19;:31::i;42658:255::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42841:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:37:::2;;:64:::0;;-1:-1:-1;;;;;;42841:64:0::2;-1:-1:-1::0;;;;;42841:64:0;;::::2;::::0;;;::::2;::::0;;42658:255::o;17498:104::-;17546:16;17582:12;17575:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17498:104;:::o;45885:253::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;46055:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;46078:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:52;;::::2;::::0;:31:::2;::::0;;::::2;::::0;:52;::::2;::::0;::::2;:::i;56732:1670::-:0;56870:13;56842:8;34065:17;34073:8;34065:7;:17::i;:::-;34057:49;;;;-1:-1:-1;;;34057:49:0;;23486:2:1;34057:49:0;;;23468:21:1;23525:2;23505:18;;;23498:30;23564:21;23544:18;;;23537:49;23603:18;;34057:49:0;23284:343:1;34057:49:0;57062:1:::1;56982:8;57062:1:::0;56991:28:::1;57010:8:::0;56991:18:::1;:28::i;:::-;56982:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56982:38:0;:55:::1;;::::0;-1:-1:-1;;;;;56982:55:0::1;:82;56964:473;;57091:27;57153:8;:38;57162:28;57181:8;57162:18;:28::i;:::-;57153:38:::0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;57153:38:0;;;:55:::1;;::::0;57323:32;;-1:-1:-1;;;57323:32:0;;::::1;::::0;::::1;6061:25:1::0;;;-1:-1:-1;;;;;57153:55:0;;::::1;::::0;-1:-1:-1;;57153:55:0;;57323:22:::1;::::0;6034:18:1;;57323:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;57323:32:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;57373:18:::0;;57302:53;;-1:-1:-1;57373:22:0;57370:55:::1;;57421:4:::0;-1:-1:-1;57414:11:0::1;::::0;-1:-1:-1;57414:11:0::1;57370:55;57076:361;;56964:473;57554:1;57514:29:::0;;;:19:::1;:29;::::0;;;;57508:43;;::::1;::::0;::::1;:::i;:::-;;;:47;57504:248;;;57710:29;::::0;;;:19:::1;:29;::::0;;;;57596:144;;::::1;::::0;57710:29;57596:144:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:38;57605:28;57624:8;57605:18;:28::i;:::-;57596:38;;;;;;;;;;;:79;;:113;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:144;;;;:::i;:::-;57572:168;;;;57504:248;57862:8;:38;57871:28;57890:8;57871:18;:28::i;:::-;57862:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57862:38:0;:46:::1;;::::0;::::1;;57861:47;:110:::0;::::1;;;;57925:8;:38;57934:28;57953:8;57934:18;:28::i;:::-;57925:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57925:38:0;:46:::1;;::::0;::::1;::::0;::::1;;;57861:110;57843:401;;;58022:210;58162:8;:38;58171:28;58190:8;58171:18;:28::i;:::-;58162:38;;;;;;;;;;;:47;;58022:210;;;;;:::i;57843:401::-;58276:118;58360:19;:8;:17;:19::i;:::-;58276:8;:38;58285:28;58304:8;58285:18;:28::i;:::-;58276:38;;;;;;;;;;;:53;;:65;;;;;:::i;:118::-;58256:138;;34117:1;56732:1670:::0;;;;:::o;39235:176::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;39376:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;-1:-1:-1;;39345:58:0;::::1;39376:27:::0;;;;::::1;;;39375:28;39345:58:::0;;::::1;;::::0;;39235:176::o;45397:480::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;45535:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;45620:1:::2;45585:20:::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;45563:116:::2;;;::::0;-1:-1:-1;;;45563:116:0;;24475:2:1;45563:116:0::2;::::0;::::2;24457:21:1::0;24514:2;24494:18;;;24487:30;24553:32;24533:18;;;24526:60;24603:18;;45563:116:0::2;24273:354:1::0;45563:116:0::2;45697:20;::::0;;;:8:::2;:20;::::0;;;;45740:32:::2;::::0;::::2;::::0;45697:28:::2;::::0;;::::2;::::0;:20;45740:36:::2;::::0;45775:1:::2;::::0;45740:36:::2;:::i;:::-;45697:90;;;;;;;;;;;;45690:97;;;;:::i;:::-;45833:20;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:36:::2;::::0;45868:1:::2;45833:36;:::i;:::-;45798:20;::::0;;;:8:::2;:20;::::0;;;;;:32:::2;;:71:::0;;;;-1:-1:-1;;45397:480:0:o;44219:397::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;44360:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;44410:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:37;44388:123:::2;;;::::0;-1:-1:-1;;;44388:123:0;;24834:2:1;44388:123:0::2;::::0;::::2;24816:21:1::0;24873:2;24853:18;;;24846:30;24912:34;24892:18;;;24885:62;-1:-1:-1;;;24963:18:1;;;24956:34;25007:19;;44388:123:0::2;24632:400:1::0;44388:123:0::2;-1:-1:-1::0;;44560:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:48:::2;;::::0;;-1:-1:-1;;44522:86:0;::::2;44560:48;::::0;;::::2;44559:49;44522:86;::::0;;44219:397::o;60073:216::-;-1:-1:-1;;;;;60183:26:0;;60164:4;60183:26;;;:15;:26;;;;;;;;60180:42;;;-1:-1:-1;60218:4:0;60211:11;;60180:42;-1:-1:-1;;;;;20624:25:0;;;20595:4;20624:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;60240:41;60233:48;60073:216;-1:-1:-1;;;60073:216:0:o;59888:151::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;-1:-1:-1;;;;;60002:29:0::1;;::::0;;;:15:::1;:29;::::0;;;;;;-1:-1:-1;;59969:62:0;::::1;60002:29;::::0;;::::1;60001:30;59969:62;::::0;;59888:151::o;36182:925::-;36392:10;36321:16;36372:31;;;:19;:31;;;;;;;;36350:116;;;;-1:-1:-1;;;36350:116:0;;25239:2:1;36350:116:0;;;25221:21:1;25278:2;25258:18;;;25251:30;25317:34;25297:18;;;25290:62;-1:-1:-1;;;25368:18:1;;;25361:33;25411:19;;36350:116:0;25037:399:1;36350:116:0;36563:20;;;;:8;:20;;;;;:35;;;;36499:32;;;;;:43;;36534:8;;36499:43;:::i;:::-;:99;;36477:172;;;;-1:-1:-1;;;36477:172:0;;25643:2:1;36477:172:0;;;25625:21:1;25682:2;25662:18;;;25655:30;25721:25;25701:18;;;25694:53;25764:18;;36477:172:0;25441:347:1;36477:172:0;36682:20;;;;:8;:20;;;;;:27;;;;;;;;;:91;;-1:-1:-1;36737:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;36730:43:0;;;36737:36;;36730:43;36682:91;36660:170;;;;-1:-1:-1;;;36660:170:0;;25995:2:1;36660:170:0;;;25977:21:1;26034:2;26014:18;;;26007:30;26073:31;26053:18;;;26046:59;26122:18;;36660:170:0;25793:353:1;36660:170:0;36864:20;;;;:8;:20;;;;;:27;;;;;;;;36863:28;;:92;;-1:-1:-1;36919:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;36912:43:0;;;36919:36;;36912:43;36863:92;36841:162;;;;-1:-1:-1;;;36841:162:0;;26353:2:1;36841:162:0;;;26335:21:1;26392:2;26372:18;;;26365:30;26431:22;26411:18;;;26404:50;26471:18;;36841:162:0;26151:344:1;36841:162:0;37016:15;37034:38;37046:3;37051:10;37063:8;37034:11;:38::i;:::-;37016:56;36182:925;-1:-1:-1;;;;;;36182:925:0:o;15238:359::-;15385:4;-1:-1:-1;;;;;;15427:40:0;;-1:-1:-1;;;15427:40:0;;:105;;-1:-1:-1;;;;;;;15484:48:0;;-1:-1:-1;;;15484:48:0;15427:105;:162;;;-1:-1:-1;;;;;;;15549:40:0;;-1:-1:-1;;;15549:40:0;15407:182;15238:359;-1:-1:-1;;15238:359:0:o;35817:357::-;35883:4;35900:17;35920:27;35939:7;35920:18;:27::i;:::-;36056:19;;;;:8;:19;;;;;:31;;;35900:47;;-1:-1:-1;36008:23:0;33007:9;35900:47;36008:23;:::i;:::-;36007:80;;;;:::i;:::-;35979:7;:109;35978:188;;;;-1:-1:-1;36119:23:0;33007:9;36119;:23;:::i;:::-;36107:7;:36;;:58;;;;-1:-1:-1;;;17431:4:0;17455:20;;;:11;:20;;;;;:27;-1:-1:-1;;;17455:27:0;;;;36147:18;;35817:357::o;28648:196::-;28763:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;28763:29:0;-1:-1:-1;;;;;28763:29:0;;;;;;;;;28808:28;;28763:24;;28808:28;;;;;;;28648:196;;;:::o;10336:723::-;10392:13;10613:10;10609:53;;-1:-1:-1;;10640:10:0;;;;;;;;;;;;-1:-1:-1;;;10640:10:0;;;;;10336:723::o;10609:53::-;10687:5;10672:12;10728:78;10735:9;;10728:78;;10761:8;;;;:::i;:::-;;-1:-1:-1;10784:10:0;;-1:-1:-1;10792:2:0;10784:10;;:::i;:::-;;;10728:78;;;10816:19;10848:6;-1:-1:-1;;;;;10838:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10838:17:0;;10816:39;;10866:154;10873:10;;10866:154;;10900:11;10910:1;10900:11;;:::i;:::-;;-1:-1:-1;10969:10:0;10977:2;10969:5;:10;:::i;:::-;10956:24;;:2;:24;:::i;:::-;10943:39;;10926:6;10933;10926:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10926:56:0;;;;;;;;-1:-1:-1;10997:11:0;11006:2;10997:11;;:::i;:::-;;;10866:154;;9614:503;9789:17;;9702:13;;9765:5;;9782:29;;;;:::i;:::-;9824:24;9862:10;:17;-1:-1:-1;;;;;9851:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9851:29:0;-1:-1:-1;9824:56:0;-1:-1:-1;9824:56:0;9891:22;9946:127;9970:10;:17;9966:1;:21;9946:127;;;10048:10;10059:1;10048:13;;;;;;;;:::i;:::-;;;;;;;;;10009:9;10043:1;10039;10019:10;:17;:21;;;;:::i;:::-;:25;;;;:::i;:::-;10009:36;;;;;;;;:::i;:::-;;;;:52;-1:-1:-1;;;;;10009:52:0;;;;;;;;-1:-1:-1;9989:3:0;;;;:::i;:::-;;;;9946:127;;;-1:-1:-1;10099:9:0;9614:503;-1:-1:-1;;;;9614:503:0:o;8949:610::-;9040:14;;9128:3;9145:407;9156:10;:17;9152:1;:21;9145:407;;;9211:1;9194:10;9205:1;9194:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9194:13:0;;;:18;;;:23;9190:325;;9219:6;9224:1;9219:6;;:::i;:::-;;;9190:325;;;9249:13;;-1:-1:-1;;;9271:18:0;9266:1;;9249:10;;9260:1;;9249:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9249:13:0;;;:18;;;:40;;9245:270;;;9291:6;9296:1;9291:6;;:::i;9245:270::-;9321:13;;-1:-1:-1;;;9343:18:0;9338:1;;9321:10;;9332:1;;9321:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9321:13:0;;;:18;;;:40;;9317:198;;;9363:6;9368:1;9363:6;;:::i;9317:198::-;9393:13;;-1:-1:-1;;;9415:19:0;9410:1;;9393:10;;9404:1;;9393:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9393:13:0;;;:18;;;:41;;9389:126;;;9453:6;9458:1;9453:6;;:::i;9389:126::-;9509:6;9514:1;9509:6;;:::i;:::-;;;9389:126;9532:8;;;;:::i;:::-;;;;9145:407;;;9061:498;;8949:610;;;:::o;8472:419::-;8605:13;8661:3;8631:21;8708;8719:10;8708:8;:21;:::i;:::-;-1:-1:-1;;;;;8698:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8698:32:0;-1:-1:-1;8676:54:0;-1:-1:-1;8758:10:0;8741:111;8774:8;8770:1;:12;8741:111;;;8829:8;8838:1;8829:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;8829:11:0;8804:6;8811:14;8815:10;8811:1;:14;:::i;:::-;8804:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;8804:36:0;;;;;;;;-1:-1:-1;8784:3:0;;;;:::i;:::-;;;;8741:111;;;-1:-1:-1;8876:6:0;8472:419;-1:-1:-1;;;;;8472:419:0:o;7919:490::-;7984:7;;8063:9;7984:7;8084:297;8104:11;:18;8100:1;:22;8084:297;;;8144:11;8179:1;8158:11;:18;:22;;;;:::i;:::-;8144:36;;8195:11;8209;8221:1;8209:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;8209:14:0;;;-1:-1:-1;8209:14:0;;8238:10;8292:20;8307:4;8209:14;8292:20;:::i;:::-;8277:35;-1:-1:-1;8359:7:0;8365:1;8359:3;:7;:::i;:::-;8354:13;;:2;:13;:::i;:::-;8337:31;;8345:4;8337:31;:::i;:::-;8329:40;;;;:::i;:::-;;;8129:252;;;;8124:3;;;;;:::i;:::-;;;;8084:297;;;-1:-1:-1;8398:3:0;;7919:490;-1:-1:-1;;;7919:490:0:o;26512:2018::-;26628:35;26666:20;26678:7;26666:11;:20::i;:::-;26741:18;;26628:58;;-1:-1:-1;26699:22:0;;-1:-1:-1;;;;;26725:34:0;175:10;-1:-1:-1;;;;;26725:34:0;;:87;;;-1:-1:-1;175:10:0;26776:20;26788:7;26776:11;:20::i;:::-;-1:-1:-1;;;;;26776:36:0;;26725:87;:154;;;-1:-1:-1;26846:18:0;;26829:50;;175:10;60073:216;:::i;26829:50::-;26699:181;;26898:17;26893:66;;26924:35;;-1:-1:-1;;;26924:35:0;;;;;;;;;;;26893:66;26996:4;-1:-1:-1;;;;;26974:26:0;:13;:18;;;-1:-1:-1;;;;;26974:26:0;;26970:67;;27009:28;;-1:-1:-1;;;27009:28:0;;;;;;;;;;;26970:67;-1:-1:-1;;;;;27081:16:0;;27077:52;;27106:23;;-1:-1:-1;;;27106:23:0;;;;;;;;;;;27077:52;27142:43;27164:4;27170:2;27174:7;27183:1;27142:21;:43::i;:::-;27250:49;27267:1;27271:7;27280:13;:18;;;27250:8;:49::i;:::-;-1:-1:-1;;;;;27595:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;27595:31:0;;;-1:-1:-1;;;;;27595:31:0;;;-1:-1:-1;;27595:31:0;;;;;;;27641:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;27641:29:0;;;;;;;;;;;27687:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;27732:61:0;;;;-1:-1:-1;;;27777:15:0;27732:61;;;;;;;;;;;28067:11;;;28097:24;;;;;:29;28067:11;;28097:29;28093:321;;28165:20;28173:11;28165:7;:20::i;:::-;28161:238;;;28242:18;;;28210:24;;;:11;:24;;;;;;;;:50;;28325:54;;;;-1:-1:-1;;;;;28283:96:0;-1:-1:-1;;;28283:96:0;-1:-1:-1;;;;;;28283:96:0;;;-1:-1:-1;;;;;28210:50:0;;;28283:96;;;;;;;28161:238;27570:855;28461:7;28457:2;-1:-1:-1;;;;;28442:27:0;28451:4;-1:-1:-1;;;;;28442:27:0;;;;;;;;;;;28480:42;43146:201;16499:609;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;16631:16:0;16639:7;16631;:16::i;:::-;16626:61;;16656:31;;-1:-1:-1;;;16656:31:0;;;;;;;;;;;16626:61;16745:7;16725:318;16792:31;16826:17;;;:11;:17;;;;;;;;;16792:51;;;;;;;;;-1:-1:-1;;;;;16792:51:0;;;;-1:-1:-1;;;16792:51:0;;-1:-1:-1;;;;;16792:51:0;;;;;;;;-1:-1:-1;;;16792:51:0;;;;;;;;;;;;;;16862:166;;16912:14;;-1:-1:-1;;;;;16912:28:0;;16908:101;;16976:9;16499:609;-1:-1:-1;;;16499:609:0:o;16908:101::-;-1:-1:-1;;;16765:6:0;16725:318;;24641:1617;24693:35;24731:20;24743:7;24731:11;:20::i;:::-;24693:58;;24764:65;24786:13;:18;;;24814:1;24818:7;24827:1;24764:21;:65::i;:::-;24894:49;24911:1;24915:7;24924:13;:18;;;24894:8;:49::i;:::-;25004:18;;-1:-1:-1;;;;;24991:32:0;;;;;:12;:32;;;;;:45;;25035:1;;24991:32;:45;;25035:1;;-1:-1:-1;;;;;24991:45:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;24991:45:0;;;;;;;;;;;;;;;25060:18;;-1:-1:-1;;;;;25047:32:0;-1:-1:-1;25047:32:0;;;:12;:32;;;;;:50;;-1:-1:-1;;;25047:32:0;;:45;;:50;;-1:-1:-1;;;;;25047:50:0;;;;:::i;:::-;;;-1:-1:-1;;;;;25047:50:0;;;;;;;;;;;;;;;;;;;;;;;25216:18;;-1:-1:-1;25188:20:0;;;:11;:20;;;;;;:46;;-1:-1:-1;;;;25290:15:0;25245:61;;;-1:-1:-1;;;25245:61:0;-1:-1:-1;;;;;;25245:61:0;;;-1:-1:-1;;;;;25188:46:0;;;25245:61;;25317:34;;;;-1:-1:-1;;;25317:34:0;;;;25428:12;:26;;-1:-1:-1;25428:26:0;;;;;;;;;;;25749:11;;25779:24;;;;;;:29;25749:11;;-1:-1:-1;25779:29:0;25775:321;;25847:20;25855:11;25847:7;:20::i;:::-;25843:238;;;25924:18;;;25892:24;;;:11;:24;;;;;;;;:50;;26007:54;;;;-1:-1:-1;;;;;25965:96:0;-1:-1:-1;;;25965:96:0;-1:-1:-1;;;;;;25965:96:0;;;-1:-1:-1;;;;;25892:50:0;;;25965:96;;;;;;;25843:238;-1:-1:-1;26133:18:0;;26124:49;;26165:7;;26161:1;;-1:-1:-1;;;;;26124:49:0;;;;;;26161:1;;26124:49;47994:211;;:::o;29409:919::-;29564:4;-1:-1:-1;;;;;29585:13:0;;7482:20;7530:8;29581:740;;29638:175;;-1:-1:-1;;;29638:175:0;;-1:-1:-1;;;;;29638:36:0;;;;;:175;;175:10;;29732:4;;29759:7;;29789:5;;29638:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29638:175:0;;;;;;;;-1:-1:-1;;29638:175:0;;;;;;;;;;;;:::i;:::-;;;29617:649;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30000:13:0;;29996:255;;30048:40;;-1:-1:-1;;;30048:40:0;;;;;;;;;;;29996:255;30201:6;30195:13;30186:6;30182:2;30178:15;30171:38;29617:649;-1:-1:-1;;;;;;29877:55:0;-1:-1:-1;;;29877:55:0;;-1:-1:-1;29870:62:0;;29581:740;-1:-1:-1;30305:4:0;30298:11;;7670:181;7775:13;7837:1;7840;7820:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7806:37;;7670:181;;;;:::o;37115:551::-;37239:16;37337:20;;;:8;:20;;;;;:32;;;37239:16;;37296:24;33007:9;37346:10;37296:24;:::i;:::-;37295:74;;;;:::i;:::-;37430:20;;;;:8;:20;;;;;:32;;;37268:101;;-1:-1:-1;37430:56:0;;37478:8;;37430:56;:::i;:::-;37382:20;;;;:8;:20;;;;;:32;;:104;37499:42;37509:3;37514:16;37532:8;37499:9;:42::i;:::-;37611:10;37582:27;37601:8;37582:16;:27;:::i;:::-;37559:63;;37564:16;;37559:63;;;;;37642:16;37115:551;-1:-1:-1;;;;37115:551:0:o;52221:587::-;52556:1;52476:8;52556:1;52485:28;52504:8;52485:18;:28::i;:::-;52476:38;;;;;;;;;;;-1:-1:-1;52476:38:0;:55;;;-1:-1:-1;;;;;52476:55:0;:82;52458:343;;52585:27;52647:8;:38;52656:28;52675:8;52656:18;:28::i;:::-;52647:38;;;;;;;;;;;;;-1:-1:-1;52647:38:0;:55;;;52732:57;;-1:-1:-1;;;52732:57:0;;-1:-1:-1;;;;;30154:15:1;;;52732:57:0;;;30136:34:1;30206:15;;;30186:18;;;30179:43;30238:18;;;30231:34;;;30281:18;;;30274:34;;;52647:55:0;;;;-1:-1:-1;52647:55:0;;52732:24;;30047:19:1;;52732:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52732:57:0;;;;;;;;;;;;:::i;21934:174::-;22059:41;22069:2;22073:12;22087:8;22059:41;;;;;;;;;;;;22625:46;22631:2;22635:12;22649:8;22659:5;22666:4;-1:-1:-1;;;;;23112:16:0;;23108:48;;23137:19;;-1:-1:-1;;;23137:19:0;;;;;;;;;;;23108:48;23171:13;23167:44;;23193:18;;-1:-1:-1;;;23193:18:0;;;;;;;;;;;23167:44;23224:61;23254:1;23258:2;23262:12;23276:8;23224:21;:61::i;:::-;-1:-1:-1;;;;;23563:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;23622:49:0;;-1:-1:-1;;;;;23563:44:0;;;;;;;23622:49;;;;-1:-1:-1;;23563:44:0;;;;;;23622:49;;;;;;;;;;;;;;;;23688:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;23738:66:0;;;;-1:-1:-1;;;23788:15:0;23738:66;;;;;;;;;;;23688:25;;23873:391;23893:8;23889:1;:12;23873:391;;;23932:38;;23957:12;;-1:-1:-1;;;;;23932:38:0;;;23949:1;;23932:38;;23949:1;;23932:38;24015:4;:89;;;;;24045:59;24076:1;24080:2;24084:12;24098:5;24045:22;:59::i;:::-;24044:60;24015:89;23989:225;;;24154:40;;-1:-1:-1;;;24154:40:0;;;;;;;;;;;23989:225;24234:14;;;;;23903:3;23873:391;;;-1:-1:-1;;24295:12:0;;;:23;;24280:38;;24342:60;43146:201;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592: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:1;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:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1: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:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2238:247::-;2297:6;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;2405:9;2392:23;2424:31;2449:5;2424:31;:::i;2490:127::-;2551:10;2546:3;2542:20;2539:1;2532:31;2582:4;2579:1;2572:15;2606:4;2603:1;2596:15;2622:275;2693:2;2687:9;2758:2;2739:13;;-1:-1:-1;;2735:27:1;2723:40;;-1:-1:-1;;;;;2778:34:1;;2814:22;;;2775:62;2772:88;;;2840:18;;:::i;:::-;2876:2;2869:22;2622:275;;-1:-1:-1;2622:275:1:o;2902:187::-;2951:4;-1:-1:-1;;;;;2976:6:1;2973:30;2970:56;;;3006:18;;:::i;:::-;-1:-1:-1;3072:2:1;3051:15;-1:-1:-1;;3047:29:1;3078:4;3043:40;;2902:187::o;3094:338::-;3159:5;3188:53;3204:36;3233:6;3204:36;:::i;:::-;3188:53;:::i;:::-;3179:62;;3264:6;3257:5;3250:21;3304:3;3295:6;3290:3;3286:16;3283:25;3280:45;;;3321:1;3318;3311:12;3280:45;3370:6;3365:3;3358:4;3351:5;3347:16;3334:43;3424:1;3417:4;3408:6;3401:5;3397:18;3393:29;3386:40;3094:338;;;;;:::o;3437:222::-;3480:5;3533:3;3526:4;3518:6;3514:17;3510:27;3500:55;;3551:1;3548;3541:12;3500:55;3573:80;3649:3;3640:6;3627:20;3620:4;3612:6;3608:17;3573:80;:::i;3664:390::-;3742:6;3750;3803:2;3791:9;3782:7;3778:23;3774:32;3771:52;;;3819:1;3816;3809:12;3771:52;3855:9;3842:23;3832:33;;3916:2;3905:9;3901:18;3888:32;-1:-1:-1;;;;;3935:6:1;3932:30;3929:50;;;3975:1;3972;3965:12;3929:50;3998;4040:7;4031:6;4020:9;4016:22;3998:50;:::i;:::-;3988:60;;;3664:390;;;;;:::o;4059:435::-;4112:3;4150:5;4144:12;4177:6;4172:3;4165:19;4203:4;4232:2;4227:3;4223:12;4216:19;;4269:2;4262:5;4258:14;4290:1;4300:169;4314:6;4311:1;4308:13;4300:169;;;4375:13;;4363:26;;4409:12;;;;4444:15;;;;4336:1;4329:9;4300:169;;;-1:-1:-1;4485:3:1;;4059:435;-1:-1:-1;;;;;4059:435:1:o;4499:261::-;4678:2;4667:9;4660:21;4641:4;4698:56;4750:2;4739:9;4735:18;4727:6;4698:56;:::i;4765:367::-;4828:8;4838:6;4892:3;4885:4;4877:6;4873:17;4869:27;4859:55;;4910:1;4907;4900:12;4859:55;-1:-1:-1;4933:20:1;;-1:-1:-1;;;;;4965:30:1;;4962:50;;;5008:1;5005;4998:12;4962:50;5045:4;5037:6;5033:17;5021:29;;5105:3;5098:4;5088:6;5085:1;5081:14;5073:6;5069:27;5065:38;5062:47;5059:67;;;5122:1;5119;5112:12;5137:773;5259:6;5267;5275;5283;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;5392:9;5379:23;-1:-1:-1;;;;;5462:2:1;5454:6;5451:14;5448:34;;;5478:1;5475;5468:12;5448:34;5517:70;5579:7;5570:6;5559:9;5555:22;5517:70;:::i;:::-;5606:8;;-1:-1:-1;5491:96:1;-1:-1:-1;5694:2:1;5679:18;;5666:32;;-1:-1:-1;5710:16:1;;;5707:36;;;5739:1;5736;5729:12;5707:36;;5778:72;5842:7;5831:8;5820:9;5816:24;5778:72;:::i;:::-;5137:773;;;;-1:-1:-1;5869:8:1;-1:-1:-1;;;;5137:773:1:o;6097:160::-;6162:20;;6218:13;;6211:21;6201:32;;6191:60;;6247:1;6244;6237:12;6262:874;6379:6;6387;6395;6403;6411;6419;6427;6480:3;6468:9;6459:7;6455:23;6451:33;6448:53;;;6497:1;6494;6487:12;6448:53;6537:9;6524:23;-1:-1:-1;;;;;6562:6:1;6559:30;6556:50;;;6602:1;6599;6592:12;6556:50;6625;6667:7;6658:6;6647:9;6643:22;6625:50;:::i;:::-;6615:60;;;6725:2;6714:9;6710:18;6697:32;6738:31;6763:5;6738:31;:::i;:::-;6788:5;-1:-1:-1;6840:2:1;6825:18;;6812:32;;-1:-1:-1;6896:2:1;6881:18;;6868:32;6909:33;6868:32;6909:33;:::i;:::-;6961:7;-1:-1:-1;6987:36:1;7018:3;7003:19;;6987:36;:::i;:::-;6977:46;;7070:3;7059:9;7055:19;7042:33;7032:43;;7094:36;7125:3;7114:9;7110:19;7094:36;:::i;:::-;7084:46;;6262:874;;;;;;;;;;:::o;7141:456::-;7218:6;7226;7234;7287:2;7275:9;7266:7;7262:23;7258:32;7255:52;;;7303:1;7300;7293:12;7255:52;7342:9;7329:23;7361:31;7386:5;7361:31;:::i;:::-;7411:5;-1:-1:-1;7468:2:1;7453:18;;7440:32;7481:33;7440:32;7481:33;:::i;:::-;7141:456;;7533:7;;-1:-1:-1;;;7587:2:1;7572:18;;;;7559:32;;7141:456::o;7602:248::-;7670:6;7678;7731:2;7719:9;7710:7;7706:23;7702:32;7699:52;;;7747:1;7744;7737:12;7699:52;-1:-1:-1;;7770:23:1;;;7840:2;7825:18;;;7812:32;;-1:-1:-1;7602:248:1:o;8157:464::-;8376:2;8365:9;8358:21;8339:4;8402:45;8443:2;8432:9;8428:18;8420:6;8402:45;:::i;:::-;8495:9;8487:6;8483:22;8478:2;8467:9;8463:18;8456:50;8523:33;8549:6;8541;8523:33;:::i;:::-;8515:41;;;8606:6;8599:14;8592:22;8587:2;8576:9;8572:18;8565:50;8157:464;;;;;;:::o;8626:701::-;8917:3;8906:9;8899:22;8880:4;8944:46;8985:3;8974:9;8970:19;8962:6;8944:46;:::i;:::-;9026:6;9021:2;9010:9;9006:18;8999:34;9083:6;9076:14;9069:22;9064:2;9053:9;9049:18;9042:50;9140:9;9132:6;9128:22;9123:2;9112:9;9108:18;9101:50;9168:33;9194:6;9186;9168:33;:::i;:::-;9245:14;;9238:22;9232:3;9217:19;;9210:51;-1:-1:-1;;9305:14:1;;9298:22;9292:3;9277:19;;;9270:51;9160:41;8626:701;-1:-1:-1;;;;8626:701:1:o;9332:452::-;9415:6;9423;9431;9439;9492:3;9480:9;9471:7;9467:23;9463:33;9460:53;;;9509:1;9506;9499:12;9460:53;9545:9;9532:23;9522:33;;9605:2;9594:9;9590:18;9577:32;9618:31;9643:5;9618:31;:::i;:::-;9668:5;-1:-1:-1;9692:35:1;9723:2;9708:18;;9692:35;:::i;:::-;9332:452;;;;-1:-1:-1;9682:45:1;;9774:2;9759:18;9746:32;;-1:-1:-1;;9332:452:1:o;9789:315::-;9857:6;9865;9918:2;9906:9;9897:7;9893:23;9889:32;9886:52;;;9934:1;9931;9924:12;9886:52;9970:9;9957:23;9947:33;;10030:2;10019:9;10015:18;10002:32;10043:31;10068:5;10043:31;:::i;:::-;10093:5;10083:15;;;9789:315;;;;;:::o;11465:957::-;11828:3;11817:9;11810:22;11791:4;11855:46;11896:3;11885:9;11881:19;11873:6;11855:46;:::i;:::-;11949:9;11941:6;11937:22;11932:2;11921:9;11917:18;11910:50;11983:33;12009:6;12001;11983:33;:::i;:::-;11969:47;;12064:9;12056:6;12052:22;12047:2;12036:9;12032:18;12025:50;12098:33;12124:6;12116;12098:33;:::i;:::-;12084:47;;12179:9;12171:6;12167:22;12162:2;12151:9;12147:18;12140:50;12213:33;12239:6;12231;12213:33;:::i;:::-;12199:47;;12295:9;12287:6;12283:22;12277:3;12266:9;12262:19;12255:51;12323:33;12349:6;12341;12323:33;:::i;:::-;12315:41;;;12407:6;12400:14;12393:22;12387:3;12376:9;12372:19;12365:51;11465:957;;;;;;;;;:::o;12427:315::-;12492:6;12500;12553:2;12541:9;12532:7;12528:23;12524:32;12521:52;;;12569:1;12566;12559:12;12521:52;12608:9;12595:23;12627:31;12652:5;12627:31;:::i;:::-;12677:5;-1:-1:-1;12701:35:1;12732:2;12717:18;;12701:35;:::i;:::-;12691:45;;12427:315;;;;;:::o;12747:458::-;12834:6;12842;12850;12903:2;12891:9;12882:7;12878:23;12874:32;12871:52;;;12919:1;12916;12909:12;12871:52;12955:9;12942:23;12932:33;;13012:2;13001:9;12997:18;12984:32;12974:42;;13067:2;13056:9;13052:18;13039:32;-1:-1:-1;;;;;13086:6:1;13083:30;13080:50;;;13126:1;13123;13116:12;13080:50;13149;13191:7;13182:6;13171:9;13167:22;13149:50;:::i;:::-;13139:60;;;12747:458;;;;;:::o;13210:795::-;13305:6;13313;13321;13329;13382:3;13370:9;13361:7;13357:23;13353:33;13350:53;;;13399:1;13396;13389:12;13350:53;13438:9;13425:23;13457:31;13482:5;13457:31;:::i;:::-;13507:5;-1:-1:-1;13564:2:1;13549:18;;13536:32;13577:33;13536:32;13577:33;:::i;:::-;13629:7;-1:-1:-1;13683:2:1;13668:18;;13655:32;;-1:-1:-1;13738:2:1;13723:18;;13710:32;-1:-1:-1;;;;;13754:30:1;;13751:50;;;13797:1;13794;13787:12;13751:50;13820:22;;13873:4;13865:13;;13861:27;-1:-1:-1;13851:55:1;;13902:1;13899;13892:12;13851:55;13925:74;13991:7;13986:2;13973:16;13968:2;13964;13960:11;13925:74;:::i;:::-;13915:84;;;13210:795;;;;;;;:::o;14010:492::-;14071:3;14109:5;14103:12;14136:6;14131:3;14124:19;14162:4;14191:2;14186:3;14182:12;14175:19;;14228:2;14221:5;14217:14;14249:1;14259:218;14273:6;14270:1;14267:13;14259:218;;;14338:13;;-1:-1:-1;;;;;14334:62:1;14322:75;;14417:12;;;;14452:15;;;;14295:1;14288:9;14259:218;;14507:285;14702:2;14691:9;14684:21;14665:4;14722:64;14782:2;14771:9;14767:18;14759:6;14722:64;:::i;14797:489::-;15070:2;15059:9;15052:21;15033:4;15096:64;15156:2;15145:9;15141:18;15133:6;15096:64;:::i;:::-;15208:9;15200:6;15196:22;15191:2;15180:9;15176:18;15169:50;15236:44;15273:6;15265;15236:44;:::i;:::-;15228:52;14797:489;-1:-1:-1;;;;;14797:489:1:o;15291:388::-;15359:6;15367;15420:2;15408:9;15399:7;15395:23;15391:32;15388:52;;;15436:1;15433;15426:12;15388:52;15475:9;15462:23;15494:31;15519:5;15494:31;:::i;:::-;15544:5;-1:-1:-1;15601:2:1;15586:18;;15573:32;15614:33;15573:32;15614:33;:::i;15684:525::-;15770:6;15778;15786;15794;15847:3;15835:9;15826:7;15822:23;15818:33;15815:53;;;15864:1;15861;15854:12;15815:53;15903:9;15890:23;15922:31;15947:5;15922:31;:::i;:::-;15972:5;-1:-1:-1;16024:2:1;16009:18;;15996:32;;-1:-1:-1;16075:2:1;16060:18;;16047:32;;-1:-1:-1;16131:2:1;16116:18;;16103:32;16144:33;16103:32;16144:33;:::i;:::-;15684:525;;;;-1:-1:-1;15684:525:1;;-1:-1:-1;;15684:525:1:o;16214:380::-;16293:1;16289:12;;;;16336;;;16357:61;;16411:4;16403:6;16399:17;16389:27;;16357:61;16464:2;16456:6;16453:14;16433:18;16430:38;16427:161;;;16510:10;16505:3;16501:20;16498:1;16491:31;16545:4;16542:1;16535:15;16573:4;16570:1;16563:15;16938:340;17140:2;17122:21;;;17179:2;17159:18;;;17152:30;-1:-1:-1;;;17213:2:1;17198:18;;17191:46;17269:2;17254:18;;16938:340::o;17640:127::-;17701:10;17696:3;17692:20;17689:1;17682:31;17732:4;17729:1;17722:15;17756:4;17753:1;17746:15;18591:127;18652:10;18647:3;18643:20;18640:1;18633:31;18683:4;18680:1;18673:15;18707:4;18704:1;18697:15;18723:135;18762:3;-1:-1:-1;;18783:17:1;;18780:43;;;18803:18;;:::i;:::-;-1:-1:-1;18850:1:1;18839:13;;18723:135::o;18863:125::-;18903:4;18931:1;18928;18925:8;18922:34;;;18936:18;;:::i;:::-;-1:-1:-1;18973:9:1;;18863:125::o;19340:128::-;19380:3;19411:1;19407:6;19404:1;19401:13;19398:39;;;19417:18;;:::i;:::-;-1:-1:-1;19453:9:1;;19340:128::o;19473:168::-;19513:7;19579:1;19575;19571:6;19567:14;19564:1;19561:21;19556:1;19549:9;19542:17;19538:45;19535:71;;;19586:18;;:::i;:::-;-1:-1:-1;19626:9:1;;19473:168::o;19646:127::-;19707:10;19702:3;19698:20;19695:1;19688:31;19738:4;19735:1;19728:15;19762:4;19759:1;19752:15;19778:120;19818:1;19844;19834:35;;19849:18;;:::i;:::-;-1:-1:-1;19883:9:1;;19778:120::o;23632:636::-;23712:6;23765:2;23753:9;23744:7;23740:23;23736:32;23733:52;;;23781:1;23778;23771:12;23733:52;23814:9;23808:16;-1:-1:-1;;;;;23839:6:1;23836:30;23833:50;;;23879:1;23876;23869:12;23833:50;23902:22;;23955:4;23947:13;;23943:27;-1:-1:-1;23933:55:1;;23984:1;23981;23974:12;23933:55;24013:2;24007:9;24038:49;24054:32;24083:2;24054:32;:::i;24038:49::-;24110:2;24103:5;24096:17;24150:7;24145:2;24140;24136;24132:11;24128:20;24125:33;24122:53;;;24171:1;24168;24161:12;24122:53;24184:54;24235:2;24230;24223:5;24219:14;24214:2;24210;24206:11;24184:54;:::i;26500:112::-;26532:1;26558;26548:35;;26563:18;;:::i;:::-;-1:-1:-1;26597:9:1;;26500:112::o;26617:127::-;26678:10;26673:3;26669:20;26666:1;26659:31;26709:4;26706:1;26699:15;26733:4;26730:1;26723:15;26749:422;26838:1;26881:5;26838:1;26895:270;26916:7;26906:8;26903:21;26895:270;;;26975:4;26971:1;26967:6;26963:17;26957:4;26954:27;26951:53;;;26984:18;;:::i;:::-;27034:7;27024:8;27020:22;27017:55;;;27054:16;;;;27017:55;27133:22;;;;27093:15;;;;26895:270;;;26899:3;26749:422;;;;;:::o;27176:806::-;27225:5;27255:8;27245:80;;-1:-1:-1;27296:1:1;27310:5;;27245:80;27344:4;27334:76;;-1:-1:-1;27381:1:1;27395:5;;27334:76;27426:4;27444:1;27439:59;;;;27512:1;27507:130;;;;27419:218;;27439:59;27469:1;27460:10;;27483:5;;;27507:130;27544:3;27534:8;27531:17;27528:43;;;27551:18;;:::i;:::-;-1:-1:-1;;27607:1:1;27593:16;;27622:5;;27419:218;;27721:2;27711:8;27708:16;27702:3;27696:4;27693:13;27689:36;27683:2;27673:8;27670:16;27665:2;27659:4;27656:12;27652:35;27649:77;27646:159;;;-1:-1:-1;27758:19:1;;;27790:5;;27646:159;27837:34;27862:8;27856:4;27837:34;:::i;:::-;27907:6;27903:1;27899:6;27895:19;27886:7;27883:32;27880:58;;;27918:18;;:::i;:::-;27956:20;;27176:806;-1:-1:-1;;;27176:806:1:o;27987:131::-;28047:5;28076:36;28103:8;28097:4;28076:36;:::i;28123:229::-;28162:4;-1:-1:-1;;;;;28259:10:1;;;;28229;;28281:12;;;28278:38;;;28296:18;;:::i;:::-;28333:13;;28123:229;-1:-1:-1;;;28123:229:1:o;28357:236::-;28396:3;-1:-1:-1;;;;;28469:2:1;28466:1;28462:10;28499:2;28496:1;28492:10;28530:3;28526:2;28522:12;28517:3;28514:21;28511:47;;;28538:18;;:::i;:::-;28574:13;;28357:236;-1:-1:-1;;;;28357:236:1:o;28598:512::-;28792:4;-1:-1:-1;;;;;28902:2:1;28894:6;28890:15;28879:9;28872:34;28954:2;28946:6;28942:15;28937:2;28926:9;28922:18;28915:43;;28994:6;28989:2;28978:9;28974:18;28967:34;29037:3;29032:2;29021:9;29017:18;29010:31;29058:46;29099:3;29088:9;29084:19;29076:6;29058:46;:::i;29115:249::-;29184:6;29237:2;29225:9;29216:7;29212:23;29208:32;29205:52;;;29253:1;29250;29243:12;29205:52;29285:9;29279:16;29304:30;29328:5;29304:30;:::i;29369:470::-;29548:3;29586:6;29580:13;29602:53;29648:6;29643:3;29636:4;29628:6;29624:17;29602:53;:::i;:::-;29718:13;;29677:16;;;;29740:57;29718:13;29677:16;29774:4;29762:17;;29740:57;:::i
Swarm Source
ipfs://ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.