Overview
TokenID
4543
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OgreWorld
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-05 */ // SPDX-License-Identifier: MIT // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); 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; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // 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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // 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 `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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, _toString(tokenId))) : ''; } /** * @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 Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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 virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(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 returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; 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 > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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 quantity) internal { uint256 startTokenId = _currentIndex; 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 > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * 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`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ 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. * And also called after one token has been burned. * * 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` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/ogreworld.sol pragma solidity >=0.8.0 <0.9.0; contract OgreWorld is ERC721A, Ownable { using Strings for uint256; enum ContractMintState { PAUSED, PUBLIC } ContractMintState public contractState = ContractMintState.PAUSED; string public uriPrefix = ""; string public hiddenMetadataUri = "ipfs://QmQGKRwEJ5oq2C7d79xqEE17D16VAUWwYRhZAKhqos1tx3/hidden.json"; uint256 public maxSupply = 5000; uint256 public maxMintAmountPerTx = 2; uint256 public maxMintAmount = 2; mapping(address => uint256) private _mintAllowance; constructor() ERC721A("Ogreworldwtf Official", "OGREWRLD") {} // OVERRIDES function _startTokenId() internal view virtual override returns (uint256) { return 1; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } modifier mintCompliance(uint256 _mintAmount) { require( _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount" ); require( totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded" ); _; } // MINTING FUNCTIONS function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(contractState == ContractMintState.PUBLIC, "Public mint is disabled"); require(_mintAllowance[msg.sender] + _mintAmount <= maxMintAmount); _safeMint(msg.sender, _mintAmount); _mintAllowance[msg.sender] = _mintAllowance[msg.sender] + _mintAmount; } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded"); _safeMint(_receiver, _mintAmount); } function batchMint(uint256 _mintAmount, address[] memory _receiver) public onlyOwner { for (uint256 i = 0; i < _receiver.length; i++) { _safeMint(_receiver[i], _mintAmount); } } function numberMinted(address _minter) public view returns (uint256) { return _numberMinted(_minter); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, _tokenId.toString(), ".json" ) ) : hiddenMetadataUri; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownerTokens = new uint256[](ownerTokenCount); uint256 ownerTokenIdx = 0; for ( uint256 tokenIdx = _startTokenId(); tokenIdx <= totalSupply(); tokenIdx++ ) { if (ownerOf(tokenIdx) == _owner) { ownerTokens[ownerTokenIdx] = tokenIdx; ownerTokenIdx++; } } return ownerTokens; } function setState(ContractMintState _contractState) public onlyOwner { contractState = _contractState; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner { maxMintAmount = _maxMintAmount; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { require(_maxSupply < maxSupply, "Cannot increase the supply"); maxSupply = _maxSupply; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function remainingPublicMints(address userAddress) public view returns (uint256) { return maxMintAmount - _mintAllowance[userAddress]; } // WITHDRAW function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address[]","name":"_receiver","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractState","outputs":[{"internalType":"enum OgreWorld.ContractMintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"remainingPublicMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OgreWorld.ContractMintState","name":"_contractState","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600860146101000a81548160ff021916908360018111156200002d576200002c62000343565b5b02179055506040518060200160405280600081525060099080519060200190620000599291906200025d565b5060405180608001604052806041815260200162003fab60419139600a90805190602001906200008b9291906200025d565b50611388600b556002600c556002600d55348015620000a957600080fd5b506040518060400160405280601581526020017f4f677265776f726c64777466204f6666696369616c00000000000000000000008152506040518060400160405280600881526020017f4f47524557524c4400000000000000000000000000000000000000000000000081525081600290805190602001906200012e9291906200025d565b508060039080519060200190620001479291906200025d565b50620001586200018660201b60201c565b600081905550505062000180620001746200018f60201b60201c565b6200019760201b60201c565b620003a1565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026b906200030d565b90600052602060002090601f0160209004810192826200028f5760008555620002db565b82601f10620002aa57805160ff1916838001178555620002db565b82800160010185558215620002db579182015b82811115620002da578251825591602001919060010190620002bd565b5b509050620002ea9190620002ee565b5090565b5b8082111562000309576000816000905550600101620002ef565b5090565b600060028204905060018216806200032657607f821691505b602082108114156200033d576200033c62000372565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613bfa80620003b16000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610778578063dc33e681146107a3578063e985e9c5146107e0578063efbd73f41461081d578063f2fde38b146108465761020f565b8063a45ba8e7146106be578063b071401b146106e9578063b88d4fde14610712578063c87b56dd1461073b5761020f565b80638da5cb5b116100e75780638da5cb5b146105f857806394354fd01461062357806395d89b411461064e578063a0712d6814610679578063a22cb465146106955761020f565b806370a0823114610550578063715018a61461058d5780637ec4a659146105a457806385209ee0146105cd5761020f565b80633379b27b1161019b5780634fdd43cb1161016a5780634fdd43cb1461046d57806356de96db1461049657806362b99ad4146104bf5780636352211e146104ea5780636f8b44b0146105275761020f565b80633379b27b146103c75780633ccfd60b146103f057806342842e0e14610407578063438b6300146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806318160ddd1461030b578063239c70ae1461033657806323b872dd14610361578063277e52a31461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063088a4ed0146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e64565b61086f565b6040516102489190613369565b60405180910390f35b34801561025d57600080fd5b50610266610901565b604051610273919061339f565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f34565b610993565b6040516102b091906132e0565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612f34565b610a0f565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612e24565b610a95565b005b34801561031757600080fd5b50610320610c3c565b60405161032d91906134a1565b60405180910390f35b34801561034257600080fd5b5061034b610c53565b60405161035891906134a1565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612d0e565b610c59565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612ca1565b610c69565b6040516103be91906134a1565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190612fa1565b610cbf565b005b3480156103fc57600080fd5b50610405610d83565b005b34801561041357600080fd5b5061042e60048036038101906104299190612d0e565b610e7f565b005b34801561043c57600080fd5b5061045760048036038101906104529190612ca1565b610e9f565b6040516104649190613347565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612eeb565b610fa1565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ebe565b611037565b005b3480156104cb57600080fd5b506104d46110e0565b6040516104e1919061339f565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612f34565b61116e565b60405161051e91906132e0565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190612f34565b611180565b005b34801561055c57600080fd5b5061057760048036038101906105729190612ca1565b61124a565b60405161058491906134a1565b60405180910390f35b34801561059957600080fd5b506105a2611303565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612eeb565b61138b565b005b3480156105d957600080fd5b506105e2611421565b6040516105ef9190613384565b60405180910390f35b34801561060457600080fd5b5061060d611434565b60405161061a91906132e0565b60405180910390f35b34801561062f57600080fd5b5061063861145e565b60405161064591906134a1565b60405180910390f35b34801561065a57600080fd5b50610663611464565b604051610670919061339f565b60405180910390f35b610693600480360381019061068e9190612f34565b6114f6565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190612de4565b611709565b005b3480156106ca57600080fd5b506106d3611881565b6040516106e0919061339f565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190612f34565b61190f565b005b34801561071e57600080fd5b5061073960048036038101906107349190612d61565b611995565b005b34801561074757600080fd5b50610762600480360381019061075d9190612f34565b611a08565b60405161076f919061339f565b60405180910390f35b34801561078457600080fd5b5061078d611b2a565b60405161079a91906134a1565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190612ca1565b611b30565b6040516107d791906134a1565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190612cce565b611b42565b6040516108149190613369565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612f61565b611bd6565b005b34801561085257600080fd5b5061086d60048036038101906108689190612ca1565b611cb7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109109061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061378c565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e82611daf565b6109d4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a17611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610a35611434565b73ffffffffffffffffffffffffffffffffffffffff1614610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8290613401565b60405180910390fd5b80600d8190555050565b6000610aa082611e16565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b08576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b27611ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610b8a57610b5381610b4e611ee4565b611b42565b610b89576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c46611eec565b6001546000540303905090565b600d5481565b610c64838383611ef5565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54610cb8919061367d565b9050919050565b610cc7611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610ce5611434565b73ffffffffffffffffffffffffffffffffffffffff1614610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613401565b60405180910390fd5b60005b8151811015610d7e57610d6b828281518110610d5d57610d5c613925565b5b60200260200101518461229f565b8080610d76906137ef565b915050610d3e565b505050565b610d8b611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610da9611434565b73ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613401565b60405180910390fd5b6000610e09611434565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2c906132cb565b60006040518083038185875af1925050503d8060008114610e69576040519150601f19603f3d011682016040523d82523d6000602084013e610e6e565b606091505b5050905080610e7c57600080fd5b50565b610e9a83838360405180602001604052806000815250611995565b505050565b60606000610eac8361124a565b905060008167ffffffffffffffff811115610eca57610ec9613954565b5b604051908082528060200260200182016040528015610ef85781602001602082028036833780820191505090505b509050600080610f06611eec565b90505b610f11610c3c565b8111610f95578573ffffffffffffffffffffffffffffffffffffffff16610f378261116e565b73ffffffffffffffffffffffffffffffffffffffff161415610f825780838381518110610f6757610f66613925565b5b6020026020010181815250508180610f7e906137ef565b9250505b8080610f8d906137ef565b915050610f09565b50819350505050919050565b610fa9611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610fc7611434565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490613401565b60405180910390fd5b80600a9080519060200190611033929190612a02565b5050565b61103f611e0e565b73ffffffffffffffffffffffffffffffffffffffff1661105d611434565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90613401565b60405180910390fd5b80600860146101000a81548160ff021916908360018111156110d8576110d76138c7565b5b021790555050565b600980546110ed9061378c565b80601f01602080910402602001604051908101604052809291908181526020018280546111199061378c565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b505050505081565b600061117982611e16565b9050919050565b611188611e0e565b73ffffffffffffffffffffffffffffffffffffffff166111a6611434565b73ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613401565b60405180910390fd5b600b548110611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790613421565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61130b611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611329611434565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690613401565b60405180910390fd5b61138960006122bd565b565b611393611e0e565b73ffffffffffffffffffffffffffffffffffffffff166113b1611434565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613401565b60405180910390fd5b806009908051906020019061141d929190612a02565b5050565b600860149054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b6060600380546114739061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461149f9061378c565b80156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050505050905090565b806000811180156115095750600c548111155b611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90613461565b60405180910390fd5b600b5481611554610c3c565b61155e91906135f6565b111561159f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611596906133c1565b60405180910390fd5b6001808111156115b2576115b16138c7565b5b600860149054906101000a900460ff1660018111156115d4576115d36138c7565b5b14611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b90613481565b60405180910390fd5b600d5482600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461166291906135f6565b111561166d57600080fd5b611677338361229f565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116c291906135f6565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b611711611ee4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611776576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611783611ee4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611830611ee4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118759190613369565b60405180910390a35050565b600a805461188e9061378c565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061378c565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b505050505081565b611917611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611935611434565b73ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290613401565b60405180910390fd5b80600c8190555050565b6119a0848484611ef5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a02576119cb84848484612383565b611a01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a1382611daf565b611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613441565b60405180910390fd5b6000611a5c6124e3565b90506000815111611af757600a8054611a749061378c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa09061378c565b8015611aed5780601f10611ac257610100808354040283529160200191611aed565b820191906000526020600020905b815481529060010190602001808311611ad057829003601f168201915b5050505050611b22565b80611b0184612575565b604051602001611b1292919061329c565b6040516020818303038152906040525b915050919050565b600b5481565b6000611b3b826126d6565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bde611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611bfc611434565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613401565b60405180910390fd5b600b5482611c5e610c3c565b611c6891906135f6565b1115611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca0906133c1565b60405180910390fd5b611cb3818361229f565b5050565b611cbf611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611cdd611434565b73ffffffffffffffffffffffffffffffffffffffff1614611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90613401565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a906133e1565b60405180910390fd5b611dac816122bd565b50565b600081611dba611eec565b11158015611dc9575060005482105b8015611e07575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008082905080611e25611eec565b11611ead57600054811015611eac5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611eaa575b6000811415611ea0576004600083600190039350838152602001908152602001600020549050611e75565b8092505050611edf565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611f0082611e16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f88611ee4565b73ffffffffffffffffffffffffffffffffffffffff161480611fb75750611fb685611fb1611ee4565b611b42565b5b80611ffc5750611fc5611ee4565b73ffffffffffffffffffffffffffffffffffffffff16611fe484610993565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612035576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561209c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a9858585600161272d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6121a686612733565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561223057600060018401905060006004600083815260200190815260200160002054141561222e57600054811461222d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612298858585600161273d565b5050505050565b6122b9828260405180602001604052806000815250612743565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a9611ee4565b8786866040518563ffffffff1660e01b81526004016123cb94939291906132fb565b602060405180830381600087803b1580156123e557600080fd5b505af192505050801561241657506040513d601f19601f820116820180604052508101906124139190612e91565b60015b612490573d8060008114612446576040519150601f19603f3d011682016040523d82523d6000602084013e61244b565b606091505b50600081511415612488576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546124f29061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461251e9061378c565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050505050905090565b606060008214156125bd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d1565b600082905060005b600082146125ef5780806125d8906137ef565b915050600a826125e8919061364c565b91506125c5565b60008167ffffffffffffffff81111561260b5761260a613954565b5b6040519080825280601f01601f19166020018201604052801561263d5781602001600182028036833780820191505090505b5090505b600085146126ca57600182612656919061367d565b9150600a856126659190613838565b603061267191906135f6565b60f81b81838151811061268757612686613925565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126c3919061364c565b9450612641565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127f8600085838661272d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161285d600185146129f8565b901b60a042901b61286d86612733565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612971575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129216000878480600101955087612383565b612957576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128b257826000541461296c57600080fd5b6129dc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612972575b8160008190555050506129f2600085838661273d565b50505050565b6000819050919050565b828054612a0e9061378c565b90600052602060002090601f016020900481019282612a305760008555612a77565b82601f10612a4957805160ff1916838001178555612a77565b82800160010185558215612a77579182015b82811115612a76578251825591602001919060010190612a5b565b5b509050612a849190612a88565b5090565b5b80821115612aa1576000816000905550600101612a89565b5090565b6000612ab8612ab3846134e1565b6134bc565b90508083825260208201905082856020860282011115612adb57612ada613988565b5b60005b85811015612b0b5781612af18882612b99565b845260208401935060208301925050600181019050612ade565b5050509392505050565b6000612b28612b238461350d565b6134bc565b905082815260208101848484011115612b4457612b4361398d565b5b612b4f84828561374a565b509392505050565b6000612b6a612b658461353e565b6134bc565b905082815260208101848484011115612b8657612b8561398d565b5b612b9184828561374a565b509392505050565b600081359050612ba881613b58565b92915050565b600082601f830112612bc357612bc2613983565b5b8135612bd3848260208601612aa5565b91505092915050565b600081359050612beb81613b6f565b92915050565b600081359050612c0081613b86565b92915050565b600081519050612c1581613b86565b92915050565b600082601f830112612c3057612c2f613983565b5b8135612c40848260208601612b15565b91505092915050565b600081359050612c5881613b9d565b92915050565b600082601f830112612c7357612c72613983565b5b8135612c83848260208601612b57565b91505092915050565b600081359050612c9b81613bad565b92915050565b600060208284031215612cb757612cb6613997565b5b6000612cc584828501612b99565b91505092915050565b60008060408385031215612ce557612ce4613997565b5b6000612cf385828601612b99565b9250506020612d0485828601612b99565b9150509250929050565b600080600060608486031215612d2757612d26613997565b5b6000612d3586828701612b99565b9350506020612d4686828701612b99565b9250506040612d5786828701612c8c565b9150509250925092565b60008060008060808587031215612d7b57612d7a613997565b5b6000612d8987828801612b99565b9450506020612d9a87828801612b99565b9350506040612dab87828801612c8c565b925050606085013567ffffffffffffffff811115612dcc57612dcb613992565b5b612dd887828801612c1b565b91505092959194509250565b60008060408385031215612dfb57612dfa613997565b5b6000612e0985828601612b99565b9250506020612e1a85828601612bdc565b9150509250929050565b60008060408385031215612e3b57612e3a613997565b5b6000612e4985828601612b99565b9250506020612e5a85828601612c8c565b9150509250929050565b600060208284031215612e7a57612e79613997565b5b6000612e8884828501612bf1565b91505092915050565b600060208284031215612ea757612ea6613997565b5b6000612eb584828501612c06565b91505092915050565b600060208284031215612ed457612ed3613997565b5b6000612ee284828501612c49565b91505092915050565b600060208284031215612f0157612f00613997565b5b600082013567ffffffffffffffff811115612f1f57612f1e613992565b5b612f2b84828501612c5e565b91505092915050565b600060208284031215612f4a57612f49613997565b5b6000612f5884828501612c8c565b91505092915050565b60008060408385031215612f7857612f77613997565b5b6000612f8685828601612c8c565b9250506020612f9785828601612b99565b9150509250929050565b60008060408385031215612fb857612fb7613997565b5b6000612fc685828601612c8c565b925050602083013567ffffffffffffffff811115612fe757612fe6613992565b5b612ff385828601612bae565b9150509250929050565b6000613009838361327e565b60208301905092915050565b61301e816136b1565b82525050565b600061302f8261357f565b61303981856135ad565b93506130448361356f565b8060005b8381101561307557815161305c8882612ffd565b9750613067836135a0565b925050600181019050613048565b5085935050505092915050565b61308b816136c3565b82525050565b600061309c8261358a565b6130a681856135be565b93506130b6818560208601613759565b6130bf8161399c565b840191505092915050565b6130d381613738565b82525050565b60006130e482613595565b6130ee81856135da565b93506130fe818560208601613759565b6131078161399c565b840191505092915050565b600061311d82613595565b61312781856135eb565b9350613137818560208601613759565b80840191505092915050565b60006131506013836135da565b915061315b826139ad565b602082019050919050565b60006131736026836135da565b915061317e826139d6565b604082019050919050565b60006131966005836135eb565b91506131a182613a25565b600582019050919050565b60006131b96020836135da565b91506131c482613a4e565b602082019050919050565b60006131dc601a836135da565b91506131e782613a77565b602082019050919050565b60006131ff602f836135da565b915061320a82613aa0565b604082019050919050565b60006132226000836135cf565b915061322d82613aef565b600082019050919050565b60006132456013836135da565b915061325082613af2565b602082019050919050565b60006132686017836135da565b915061327382613b1b565b602082019050919050565b6132878161372e565b82525050565b6132968161372e565b82525050565b60006132a88285613112565b91506132b48284613112565b91506132bf82613189565b91508190509392505050565b60006132d682613215565b9150819050919050565b60006020820190506132f56000830184613015565b92915050565b60006080820190506133106000830187613015565b61331d6020830186613015565b61332a604083018561328d565b818103606083015261333c8184613091565b905095945050505050565b600060208201905081810360008301526133618184613024565b905092915050565b600060208201905061337e6000830184613082565b92915050565b600060208201905061339960008301846130ca565b92915050565b600060208201905081810360008301526133b981846130d9565b905092915050565b600060208201905081810360008301526133da81613143565b9050919050565b600060208201905081810360008301526133fa81613166565b9050919050565b6000602082019050818103600083015261341a816131ac565b9050919050565b6000602082019050818103600083015261343a816131cf565b9050919050565b6000602082019050818103600083015261345a816131f2565b9050919050565b6000602082019050818103600083015261347a81613238565b9050919050565b6000602082019050818103600083015261349a8161325b565b9050919050565b60006020820190506134b6600083018461328d565b92915050565b60006134c66134d7565b90506134d282826137be565b919050565b6000604051905090565b600067ffffffffffffffff8211156134fc576134fb613954565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561352857613527613954565b5b6135318261399c565b9050602081019050919050565b600067ffffffffffffffff82111561355957613558613954565b5b6135628261399c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136018261372e565b915061360c8361372e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561364157613640613869565b5b828201905092915050565b60006136578261372e565b91506136628361372e565b92508261367257613671613898565b5b828204905092915050565b60006136888261372e565b91506136938361372e565b9250828210156136a6576136a5613869565b5b828203905092915050565b60006136bc8261370e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061370982613b44565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613743826136fb565b9050919050565b82818337600083830152505050565b60005b8381101561377757808201518184015260208101905061375c565b83811115613786576000848401525b50505050565b600060028204905060018216806137a457607f821691505b602082108114156137b8576137b76138f6565b5b50919050565b6137c78261399c565b810181811067ffffffffffffffff821117156137e6576137e5613954565b5b80604052505050565b60006137fa8261372e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561382d5761382c613869565b5b600182019050919050565b60006138438261372e565b915061384e8361372e565b92508261385e5761385d613898565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f7420696e6372656173652074686520737570706c79000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f5075626c6963206d696e742069732064697361626c6564000000000000000000600082015250565b60028110613b5557613b546138c7565b5b50565b613b61816136b1565b8114613b6c57600080fd5b50565b613b78816136c3565b8114613b8357600080fd5b50565b613b8f816136cf565b8114613b9a57600080fd5b50565b60028110613baa57600080fd5b50565b613bb68161372e565b8114613bc157600080fd5b5056fea2646970667358221220bce2b1b0d79ee930128d17e968825ea495011f0a11d5c502cff5cb77e06a701564736f6c63430008070033697066733a2f2f516d51474b5277454a356f7132433764373978714545313744313656415557775952685a414b68716f73317478332f68696464656e2e6a736f6e
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806370a0823111610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610778578063dc33e681146107a3578063e985e9c5146107e0578063efbd73f41461081d578063f2fde38b146108465761020f565b8063a45ba8e7146106be578063b071401b146106e9578063b88d4fde14610712578063c87b56dd1461073b5761020f565b80638da5cb5b116100e75780638da5cb5b146105f857806394354fd01461062357806395d89b411461064e578063a0712d6814610679578063a22cb465146106955761020f565b806370a0823114610550578063715018a61461058d5780637ec4a659146105a457806385209ee0146105cd5761020f565b80633379b27b1161019b5780634fdd43cb1161016a5780634fdd43cb1461046d57806356de96db1461049657806362b99ad4146104bf5780636352211e146104ea5780636f8b44b0146105275761020f565b80633379b27b146103c75780633ccfd60b146103f057806342842e0e14610407578063438b6300146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806318160ddd1461030b578063239c70ae1461033657806323b872dd14610361578063277e52a31461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063088a4ed0146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e64565b61086f565b6040516102489190613369565b60405180910390f35b34801561025d57600080fd5b50610266610901565b604051610273919061339f565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f34565b610993565b6040516102b091906132e0565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612f34565b610a0f565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612e24565b610a95565b005b34801561031757600080fd5b50610320610c3c565b60405161032d91906134a1565b60405180910390f35b34801561034257600080fd5b5061034b610c53565b60405161035891906134a1565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612d0e565b610c59565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612ca1565b610c69565b6040516103be91906134a1565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190612fa1565b610cbf565b005b3480156103fc57600080fd5b50610405610d83565b005b34801561041357600080fd5b5061042e60048036038101906104299190612d0e565b610e7f565b005b34801561043c57600080fd5b5061045760048036038101906104529190612ca1565b610e9f565b6040516104649190613347565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612eeb565b610fa1565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ebe565b611037565b005b3480156104cb57600080fd5b506104d46110e0565b6040516104e1919061339f565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612f34565b61116e565b60405161051e91906132e0565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190612f34565b611180565b005b34801561055c57600080fd5b5061057760048036038101906105729190612ca1565b61124a565b60405161058491906134a1565b60405180910390f35b34801561059957600080fd5b506105a2611303565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612eeb565b61138b565b005b3480156105d957600080fd5b506105e2611421565b6040516105ef9190613384565b60405180910390f35b34801561060457600080fd5b5061060d611434565b60405161061a91906132e0565b60405180910390f35b34801561062f57600080fd5b5061063861145e565b60405161064591906134a1565b60405180910390f35b34801561065a57600080fd5b50610663611464565b604051610670919061339f565b60405180910390f35b610693600480360381019061068e9190612f34565b6114f6565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190612de4565b611709565b005b3480156106ca57600080fd5b506106d3611881565b6040516106e0919061339f565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190612f34565b61190f565b005b34801561071e57600080fd5b5061073960048036038101906107349190612d61565b611995565b005b34801561074757600080fd5b50610762600480360381019061075d9190612f34565b611a08565b60405161076f919061339f565b60405180910390f35b34801561078457600080fd5b5061078d611b2a565b60405161079a91906134a1565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190612ca1565b611b30565b6040516107d791906134a1565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190612cce565b611b42565b6040516108149190613369565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612f61565b611bd6565b005b34801561085257600080fd5b5061086d60048036038101906108689190612ca1565b611cb7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109109061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061378c565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e82611daf565b6109d4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a17611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610a35611434565b73ffffffffffffffffffffffffffffffffffffffff1614610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8290613401565b60405180910390fd5b80600d8190555050565b6000610aa082611e16565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b08576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b27611ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610b8a57610b5381610b4e611ee4565b611b42565b610b89576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c46611eec565b6001546000540303905090565b600d5481565b610c64838383611ef5565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54610cb8919061367d565b9050919050565b610cc7611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610ce5611434565b73ffffffffffffffffffffffffffffffffffffffff1614610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290613401565b60405180910390fd5b60005b8151811015610d7e57610d6b828281518110610d5d57610d5c613925565b5b60200260200101518461229f565b8080610d76906137ef565b915050610d3e565b505050565b610d8b611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610da9611434565b73ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613401565b60405180910390fd5b6000610e09611434565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e2c906132cb565b60006040518083038185875af1925050503d8060008114610e69576040519150601f19603f3d011682016040523d82523d6000602084013e610e6e565b606091505b5050905080610e7c57600080fd5b50565b610e9a83838360405180602001604052806000815250611995565b505050565b60606000610eac8361124a565b905060008167ffffffffffffffff811115610eca57610ec9613954565b5b604051908082528060200260200182016040528015610ef85781602001602082028036833780820191505090505b509050600080610f06611eec565b90505b610f11610c3c565b8111610f95578573ffffffffffffffffffffffffffffffffffffffff16610f378261116e565b73ffffffffffffffffffffffffffffffffffffffff161415610f825780838381518110610f6757610f66613925565b5b6020026020010181815250508180610f7e906137ef565b9250505b8080610f8d906137ef565b915050610f09565b50819350505050919050565b610fa9611e0e565b73ffffffffffffffffffffffffffffffffffffffff16610fc7611434565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490613401565b60405180910390fd5b80600a9080519060200190611033929190612a02565b5050565b61103f611e0e565b73ffffffffffffffffffffffffffffffffffffffff1661105d611434565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90613401565b60405180910390fd5b80600860146101000a81548160ff021916908360018111156110d8576110d76138c7565b5b021790555050565b600980546110ed9061378c565b80601f01602080910402602001604051908101604052809291908181526020018280546111199061378c565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b505050505081565b600061117982611e16565b9050919050565b611188611e0e565b73ffffffffffffffffffffffffffffffffffffffff166111a6611434565b73ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613401565b60405180910390fd5b600b548110611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790613421565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61130b611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611329611434565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690613401565b60405180910390fd5b61138960006122bd565b565b611393611e0e565b73ffffffffffffffffffffffffffffffffffffffff166113b1611434565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613401565b60405180910390fd5b806009908051906020019061141d929190612a02565b5050565b600860149054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b6060600380546114739061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461149f9061378c565b80156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050505050905090565b806000811180156115095750600c548111155b611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90613461565b60405180910390fd5b600b5481611554610c3c565b61155e91906135f6565b111561159f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611596906133c1565b60405180910390fd5b6001808111156115b2576115b16138c7565b5b600860149054906101000a900460ff1660018111156115d4576115d36138c7565b5b14611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b90613481565b60405180910390fd5b600d5482600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461166291906135f6565b111561166d57600080fd5b611677338361229f565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116c291906135f6565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b611711611ee4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611776576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611783611ee4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611830611ee4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118759190613369565b60405180910390a35050565b600a805461188e9061378c565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061378c565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b505050505081565b611917611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611935611434565b73ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290613401565b60405180910390fd5b80600c8190555050565b6119a0848484611ef5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a02576119cb84848484612383565b611a01576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a1382611daf565b611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613441565b60405180910390fd5b6000611a5c6124e3565b90506000815111611af757600a8054611a749061378c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa09061378c565b8015611aed5780601f10611ac257610100808354040283529160200191611aed565b820191906000526020600020905b815481529060010190602001808311611ad057829003601f168201915b5050505050611b22565b80611b0184612575565b604051602001611b1292919061329c565b6040516020818303038152906040525b915050919050565b600b5481565b6000611b3b826126d6565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bde611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611bfc611434565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613401565b60405180910390fd5b600b5482611c5e610c3c565b611c6891906135f6565b1115611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca0906133c1565b60405180910390fd5b611cb3818361229f565b5050565b611cbf611e0e565b73ffffffffffffffffffffffffffffffffffffffff16611cdd611434565b73ffffffffffffffffffffffffffffffffffffffff1614611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90613401565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a906133e1565b60405180910390fd5b611dac816122bd565b50565b600081611dba611eec565b11158015611dc9575060005482105b8015611e07575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008082905080611e25611eec565b11611ead57600054811015611eac5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611eaa575b6000811415611ea0576004600083600190039350838152602001908152602001600020549050611e75565b8092505050611edf565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611f0082611e16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f88611ee4565b73ffffffffffffffffffffffffffffffffffffffff161480611fb75750611fb685611fb1611ee4565b611b42565b5b80611ffc5750611fc5611ee4565b73ffffffffffffffffffffffffffffffffffffffff16611fe484610993565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612035576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561209c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a9858585600161272d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6121a686612733565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561223057600060018401905060006004600083815260200190815260200160002054141561222e57600054811461222d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612298858585600161273d565b5050505050565b6122b9828260405180602001604052806000815250612743565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a9611ee4565b8786866040518563ffffffff1660e01b81526004016123cb94939291906132fb565b602060405180830381600087803b1580156123e557600080fd5b505af192505050801561241657506040513d601f19601f820116820180604052508101906124139190612e91565b60015b612490573d8060008114612446576040519150601f19603f3d011682016040523d82523d6000602084013e61244b565b606091505b50600081511415612488576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546124f29061378c565b80601f016020809104026020016040519081016040528092919081815260200182805461251e9061378c565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050505050905090565b606060008214156125bd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d1565b600082905060005b600082146125ef5780806125d8906137ef565b915050600a826125e8919061364c565b91506125c5565b60008167ffffffffffffffff81111561260b5761260a613954565b5b6040519080825280601f01601f19166020018201604052801561263d5781602001600182028036833780820191505090505b5090505b600085146126ca57600182612656919061367d565b9150600a856126659190613838565b603061267191906135f6565b60f81b81838151811061268757612686613925565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126c3919061364c565b9450612641565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127f8600085838661272d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161285d600185146129f8565b901b60a042901b61286d86612733565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612971575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129216000878480600101955087612383565b612957576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128b257826000541461296c57600080fd5b6129dc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612972575b8160008190555050506129f2600085838661273d565b50505050565b6000819050919050565b828054612a0e9061378c565b90600052602060002090601f016020900481019282612a305760008555612a77565b82601f10612a4957805160ff1916838001178555612a77565b82800160010185558215612a77579182015b82811115612a76578251825591602001919060010190612a5b565b5b509050612a849190612a88565b5090565b5b80821115612aa1576000816000905550600101612a89565b5090565b6000612ab8612ab3846134e1565b6134bc565b90508083825260208201905082856020860282011115612adb57612ada613988565b5b60005b85811015612b0b5781612af18882612b99565b845260208401935060208301925050600181019050612ade565b5050509392505050565b6000612b28612b238461350d565b6134bc565b905082815260208101848484011115612b4457612b4361398d565b5b612b4f84828561374a565b509392505050565b6000612b6a612b658461353e565b6134bc565b905082815260208101848484011115612b8657612b8561398d565b5b612b9184828561374a565b509392505050565b600081359050612ba881613b58565b92915050565b600082601f830112612bc357612bc2613983565b5b8135612bd3848260208601612aa5565b91505092915050565b600081359050612beb81613b6f565b92915050565b600081359050612c0081613b86565b92915050565b600081519050612c1581613b86565b92915050565b600082601f830112612c3057612c2f613983565b5b8135612c40848260208601612b15565b91505092915050565b600081359050612c5881613b9d565b92915050565b600082601f830112612c7357612c72613983565b5b8135612c83848260208601612b57565b91505092915050565b600081359050612c9b81613bad565b92915050565b600060208284031215612cb757612cb6613997565b5b6000612cc584828501612b99565b91505092915050565b60008060408385031215612ce557612ce4613997565b5b6000612cf385828601612b99565b9250506020612d0485828601612b99565b9150509250929050565b600080600060608486031215612d2757612d26613997565b5b6000612d3586828701612b99565b9350506020612d4686828701612b99565b9250506040612d5786828701612c8c565b9150509250925092565b60008060008060808587031215612d7b57612d7a613997565b5b6000612d8987828801612b99565b9450506020612d9a87828801612b99565b9350506040612dab87828801612c8c565b925050606085013567ffffffffffffffff811115612dcc57612dcb613992565b5b612dd887828801612c1b565b91505092959194509250565b60008060408385031215612dfb57612dfa613997565b5b6000612e0985828601612b99565b9250506020612e1a85828601612bdc565b9150509250929050565b60008060408385031215612e3b57612e3a613997565b5b6000612e4985828601612b99565b9250506020612e5a85828601612c8c565b9150509250929050565b600060208284031215612e7a57612e79613997565b5b6000612e8884828501612bf1565b91505092915050565b600060208284031215612ea757612ea6613997565b5b6000612eb584828501612c06565b91505092915050565b600060208284031215612ed457612ed3613997565b5b6000612ee284828501612c49565b91505092915050565b600060208284031215612f0157612f00613997565b5b600082013567ffffffffffffffff811115612f1f57612f1e613992565b5b612f2b84828501612c5e565b91505092915050565b600060208284031215612f4a57612f49613997565b5b6000612f5884828501612c8c565b91505092915050565b60008060408385031215612f7857612f77613997565b5b6000612f8685828601612c8c565b9250506020612f9785828601612b99565b9150509250929050565b60008060408385031215612fb857612fb7613997565b5b6000612fc685828601612c8c565b925050602083013567ffffffffffffffff811115612fe757612fe6613992565b5b612ff385828601612bae565b9150509250929050565b6000613009838361327e565b60208301905092915050565b61301e816136b1565b82525050565b600061302f8261357f565b61303981856135ad565b93506130448361356f565b8060005b8381101561307557815161305c8882612ffd565b9750613067836135a0565b925050600181019050613048565b5085935050505092915050565b61308b816136c3565b82525050565b600061309c8261358a565b6130a681856135be565b93506130b6818560208601613759565b6130bf8161399c565b840191505092915050565b6130d381613738565b82525050565b60006130e482613595565b6130ee81856135da565b93506130fe818560208601613759565b6131078161399c565b840191505092915050565b600061311d82613595565b61312781856135eb565b9350613137818560208601613759565b80840191505092915050565b60006131506013836135da565b915061315b826139ad565b602082019050919050565b60006131736026836135da565b915061317e826139d6565b604082019050919050565b60006131966005836135eb565b91506131a182613a25565b600582019050919050565b60006131b96020836135da565b91506131c482613a4e565b602082019050919050565b60006131dc601a836135da565b91506131e782613a77565b602082019050919050565b60006131ff602f836135da565b915061320a82613aa0565b604082019050919050565b60006132226000836135cf565b915061322d82613aef565b600082019050919050565b60006132456013836135da565b915061325082613af2565b602082019050919050565b60006132686017836135da565b915061327382613b1b565b602082019050919050565b6132878161372e565b82525050565b6132968161372e565b82525050565b60006132a88285613112565b91506132b48284613112565b91506132bf82613189565b91508190509392505050565b60006132d682613215565b9150819050919050565b60006020820190506132f56000830184613015565b92915050565b60006080820190506133106000830187613015565b61331d6020830186613015565b61332a604083018561328d565b818103606083015261333c8184613091565b905095945050505050565b600060208201905081810360008301526133618184613024565b905092915050565b600060208201905061337e6000830184613082565b92915050565b600060208201905061339960008301846130ca565b92915050565b600060208201905081810360008301526133b981846130d9565b905092915050565b600060208201905081810360008301526133da81613143565b9050919050565b600060208201905081810360008301526133fa81613166565b9050919050565b6000602082019050818103600083015261341a816131ac565b9050919050565b6000602082019050818103600083015261343a816131cf565b9050919050565b6000602082019050818103600083015261345a816131f2565b9050919050565b6000602082019050818103600083015261347a81613238565b9050919050565b6000602082019050818103600083015261349a8161325b565b9050919050565b60006020820190506134b6600083018461328d565b92915050565b60006134c66134d7565b90506134d282826137be565b919050565b6000604051905090565b600067ffffffffffffffff8211156134fc576134fb613954565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561352857613527613954565b5b6135318261399c565b9050602081019050919050565b600067ffffffffffffffff82111561355957613558613954565b5b6135628261399c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136018261372e565b915061360c8361372e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561364157613640613869565b5b828201905092915050565b60006136578261372e565b91506136628361372e565b92508261367257613671613898565b5b828204905092915050565b60006136888261372e565b91506136938361372e565b9250828210156136a6576136a5613869565b5b828203905092915050565b60006136bc8261370e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061370982613b44565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613743826136fb565b9050919050565b82818337600083830152505050565b60005b8381101561377757808201518184015260208101905061375c565b83811115613786576000848401525b50505050565b600060028204905060018216806137a457607f821691505b602082108114156137b8576137b76138f6565b5b50919050565b6137c78261399c565b810181811067ffffffffffffffff821117156137e6576137e5613954565b5b80604052505050565b60006137fa8261372e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561382d5761382c613869565b5b600182019050919050565b60006138438261372e565b915061384e8361372e565b92508261385e5761385d613898565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f7420696e6372656173652074686520737570706c79000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f5075626c6963206d696e742069732064697361626c6564000000000000000000600082015250565b60028110613b5557613b546138c7565b5b50565b613b61816136b1565b8114613b6c57600080fd5b50565b613b78816136c3565b8114613b8357600080fd5b50565b613b8f816136cf565b8114613b9a57600080fd5b50565b60028110613baa57600080fd5b50565b613bb68161372e565b8114613bc157600080fd5b5056fea2646970667358221220bce2b1b0d79ee930128d17e968825ea495011f0a11d5c502cff5cb77e06a701564736f6c63430008070033
Deployed Bytecode Sourcemap
44002:4765:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13106:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18119:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20187:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47823:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19647:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12160:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44455:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21073:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48433:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45875:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48615:149;;;;;;;;;;;;;:::i;:::-;;21314:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46908:614;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48150:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47530:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44228:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17908:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47970:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13785:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43110:103;;;;;;;;;;;;;:::i;:::-;;48319:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44154:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44411:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18288:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45220:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20463:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44263:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47656:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21570:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46244:656;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44373:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46119:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20842:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45628:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43368:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13106:615;13191:4;13506:10;13491:25;;:11;:25;;;;:102;;;;13583:10;13568:25;;:11;:25;;;;13491:102;:179;;;;13660:10;13645:25;;:11;:25;;;;13491:179;13471:199;;13106:615;;;:::o;18119:100::-;18173:13;18206:5;18199:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18119:100;:::o;20187:204::-;20255:7;20280:16;20288:7;20280;:16::i;:::-;20275:64;;20305:34;;;;;;;;;;;;;;20275:64;20359:15;:24;20375:7;20359:24;;;;;;;;;;;;;;;;;;;;;20352:31;;20187:204;;;:::o;47823:139::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47940:14:::1;47924:13;:30;;;;47823:139:::0;:::o;19647:474::-;19720:13;19752:27;19771:7;19752:18;:27::i;:::-;19720:61;;19802:5;19796:11;;:2;:11;;;19792:48;;;19816:24;;;;;;;;;;;;;;19792:48;19880:5;19857:28;;:19;:17;:19::i;:::-;:28;;;19853:175;;19905:44;19922:5;19929:19;:17;:19::i;:::-;19905:16;:44::i;:::-;19900:128;;19977:35;;;;;;;;;;;;;;19900:128;19853:175;20067:2;20040:15;:24;20056:7;20040:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20105:7;20101:2;20085:28;;20094:5;20085:28;;;;;;;;;;;;19709:412;19647:474;;:::o;12160:315::-;12213:7;12441:15;:13;:15::i;:::-;12426:12;;12410:13;;:28;:46;12403:53;;12160:315;:::o;44455:32::-;;;;:::o;21073:170::-;21207:28;21217:4;21223:2;21227:7;21207:9;:28::i;:::-;21073:170;;;:::o;48433:155::-;48505:7;48553:14;:27;48568:11;48553:27;;;;;;;;;;;;;;;;48537:13;;:43;;;;:::i;:::-;48530:50;;48433:155;;;:::o;45875:236::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45999:9:::1;45994:110;46018:9;:16;46014:1;:20;45994:110;;;46056:36;46066:9;46076:1;46066:12;;;;;;;;:::i;:::-;;;;;;;;46080:11;46056:9;:36::i;:::-;46036:3;;;;;:::i;:::-;;;;45994:110;;;;45875:236:::0;;:::o;48615:149::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48666:7:::1;48687;:5;:7::i;:::-;48679:21;;48708;48679:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48665:69;;;48753:2;48745:11;;;::::0;::::1;;48652:112;48615:149::o:0;21314:185::-;21452:39;21469:4;21475:2;21479:7;21452:39;;;;;;;;;;;;:16;:39::i;:::-;21314:185;;;:::o;46908:614::-;46995:16;47029:23;47055:17;47065:6;47055:9;:17::i;:::-;47029:43;;47083:28;47128:15;47114:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47083:61;;47155:21;47210:16;47229:15;:13;:15::i;:::-;47210:34;;47191:295;47271:13;:11;:13::i;:::-;47259:8;:25;47191:295;;47361:6;47340:27;;:17;47348:8;47340:7;:17::i;:::-;:27;;;47336:139;;;47417:8;47388:11;47400:13;47388:26;;;;;;;;:::i;:::-;;;;;;;:37;;;;;47444:15;;;;;:::i;:::-;;;;47336:139;47299:10;;;;;:::i;:::-;;;;47191:295;;;;47503:11;47496:18;;;;;46908:614;;;:::o;48150:161::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48285:18:::1;48265:17;:38;;;;;;;;;;;;:::i;:::-;;48150:161:::0;:::o;47530:118::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47626:14:::1;47610:13;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;47530:118:::0;:::o;44228:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17908:144::-;17972:7;18015:27;18034:7;18015:18;:27::i;:::-;17992:52;;17908:144;;;:::o;47970:172::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48061:9:::1;;48048:10;:22;48040:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48124:10;48112:9;:22;;;;47970:172:::0;:::o;13785:224::-;13849:7;13890:1;13873:19;;:5;:19;;;13869:60;;;13901:28;;;;;;;;;;;;;;13869:60;9124:13;13947:18;:25;13966:5;13947:25;;;;;;;;;;;;;;;;:54;13940:61;;13785:224;;;:::o;43110:103::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43175:30:::1;43202:1;43175:18;:30::i;:::-;43110:103::o:0;48319:106::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48407:10:::1;48395:9;:22;;;;;;;;;;;;:::i;:::-;;48319:106:::0;:::o;44154:65::-;;;;;;;;;;;;;:::o;42459:87::-;42505:7;42532:6;;;;;;;;;;;42525:13;;42459:87;:::o;44411:37::-;;;;:::o;18288:104::-;18344:13;18377:7;18370:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18288:104;:::o;45220:398::-;45285:11;44961:1;44947:11;:15;:52;;;;;44981:18;;44966:11;:33;;44947:52;44925:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;45110:9;;45095:11;45079:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;45057:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;45334:24:::1;45317:41:::0;::::1;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:41;;;;;;;;:::i;:::-;;;45309:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45449:13;;45434:11;45405:14;:26;45420:10;45405:26;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:57;;45397:66;;;::::0;::::1;;45486:34;45496:10;45508:11;45486:9;:34::i;:::-;45589:11;45560:14;:26;45575:10;45560:26;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;45531:14;:26;45546:10;45531:26;;;;;;;;;;;;;;;:69;;;;45220:398:::0;;:::o;20463:308::-;20574:19;:17;:19::i;:::-;20562:31;;:8;:31;;;20558:61;;;20602:17;;;;;;;;;;;;;;20558:61;20684:8;20632:18;:39;20651:19;:17;:19::i;:::-;20632:39;;;;;;;;;;;;;;;:49;20672:8;20632:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20744:8;20708:55;;20723:19;:17;:19::i;:::-;20708:55;;;20754:8;20708:55;;;;;;:::i;:::-;;;;;;;;20463:308;;:::o;44263:101::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47656:159::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47788:19:::1;47767:18;:40;;;;47656:159:::0;:::o;21570:396::-;21737:28;21747:4;21753:2;21757:7;21737:9;:28::i;:::-;21798:1;21780:2;:14;;;:19;21776:183;;21819:56;21850:4;21856:2;21860:7;21869:5;21819:30;:56::i;:::-;21814:145;;21903:40;;;;;;;;;;;;;;21814:145;21776:183;21570:396;;;;:::o;46244:656::-;46363:13;46416:17;46424:8;46416:7;:17::i;:::-;46394:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;46521:28;46552:10;:8;:10::i;:::-;46521:41;;46626:1;46601:14;46595:28;:32;:297;;46875:17;46595:297;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46719:14;46760:19;:8;:17;:19::i;:::-;46676:160;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46595:297;46575:317;;;46244:656;;;:::o;44373:31::-;;;;:::o;46119:117::-;46179:7;46206:22;46220:7;46206:13;:22::i;:::-;46199:29;;46119:117;;;:::o;20842:164::-;20939:4;20963:18;:25;20982:5;20963:25;;;;;;;;;;;;;;;:35;20989:8;20963:35;;;;;;;;;;;;;;;;;;;;;;;;;20956:42;;20842:164;;;;:::o;45628:239::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45782:9:::1;;45767:11;45751:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;45743:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45826:33;45836:9;45847:11;45826:9;:33::i;:::-;45628:239:::0;;:::o;43368:201::-;42690:12;:10;:12::i;:::-;42679:23;;:7;:5;:7::i;:::-;:23;;;42671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43477:1:::1;43457:22;;:8;:22;;;;43449:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43533:28;43552:8;43533:18;:28::i;:::-;43368:201:::0;:::o;22221:273::-;22278:4;22334:7;22315:15;:13;:15::i;:::-;:26;;:66;;;;;22368:13;;22358:7;:23;22315:66;:152;;;;;22466:1;9894:8;22419:17;:26;22437:7;22419:26;;;;;;;;;;;;:43;:48;22315:152;22295:172;;22221:273;;;:::o;41183:98::-;41236:7;41263:10;41256:17;;41183:98;:::o;15423:1129::-;15490:7;15510:12;15525:7;15510:22;;15593:4;15574:15;:13;:15::i;:::-;:23;15570:915;;15627:13;;15620:4;:20;15616:869;;;15665:14;15682:17;:23;15700:4;15682:23;;;;;;;;;;;;15665:40;;15798:1;9894:8;15771:6;:23;:28;15767:699;;;16290:113;16307:1;16297:6;:11;16290:113;;;16350:17;:25;16368:6;;;;;;;16350:25;;;;;;;;;;;;16341:34;;16290:113;;;16436:6;16429:13;;;;;;15767:699;15642:843;15616:869;15570:915;16513:31;;;;;;;;;;;;;;15423:1129;;;;:::o;36203:105::-;36263:7;36290:10;36283:17;;36203:105;:::o;44642:101::-;44707:7;44734:1;44727:8;;44642:101;:::o;27460:2515::-;27575:27;27605;27624:7;27605:18;:27::i;:::-;27575:57;;27690:4;27649:45;;27665:19;27649:45;;;27645:86;;27703:28;;;;;;;;;;;;;;27645:86;27744:22;27793:4;27770:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27814:43;27831:4;27837:19;:17;:19::i;:::-;27814:16;:43::i;:::-;27770:87;:147;;;;27898:19;:17;:19::i;:::-;27874:43;;:20;27886:7;27874:11;:20::i;:::-;:43;;;27770:147;27744:174;;27936:17;27931:66;;27962:35;;;;;;;;;;;;;;27931:66;28026:1;28012:16;;:2;:16;;;28008:52;;;28037:23;;;;;;;;;;;;;;28008:52;28073:43;28095:4;28101:2;28105:7;28114:1;28073:21;:43::i;:::-;28189:15;:24;28205:7;28189:24;;;;;;;;;;;;28182:31;;;;;;;;;;;28581:18;:24;28600:4;28581:24;;;;;;;;;;;;;;;;28579:26;;;;;;;;;;;;28650:18;:22;28669:2;28650:22;;;;;;;;;;;;;;;;28648:24;;;;;;;;;;;10176:8;9778:3;29031:15;:41;;28989:21;29007:2;28989:17;:21::i;:::-;:84;:128;28943:17;:26;28961:7;28943:26;;;;;;;;;;;:174;;;;29287:1;10176:8;29237:19;:46;:51;29233:626;;;29309:19;29341:1;29331:7;:11;29309:33;;29498:1;29464:17;:30;29482:11;29464:30;;;;;;;;;;;;:35;29460:384;;;29602:13;;29587:11;:28;29583:242;;29782:19;29749:17;:30;29767:11;29749:30;;;;;;;;;;;:52;;;;29583:242;29460:384;29290:569;29233:626;29906:7;29902:2;29887:27;;29896:4;29887:27;;;;;;;;;;;;29925:42;29946:4;29952:2;29956:7;29965:1;29925:20;:42::i;:::-;27564:2411;;27460:2515;;;:::o;22578:104::-;22647:27;22657:2;22661:8;22647:27;;;;;;;;;;;;:9;:27::i;:::-;22578:104;;:::o;43729:191::-;43803:16;43822:6;;;;;;;;;;;43803:25;;43848:8;43839:6;;:17;;;;;;;;;;;;;;;;;;43903:8;43872:40;;43893:8;43872:40;;;;;;;;;;;;43792:128;43729:191;:::o;33672:716::-;33835:4;33881:2;33856:45;;;33902:19;:17;:19::i;:::-;33923:4;33929:7;33938:5;33856:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33852:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34156:1;34139:6;:13;:18;34135:235;;;34185:40;;;;;;;;;;;;;;34135:235;34328:6;34322:13;34313:6;34309:2;34305:15;34298:38;33852:529;34025:54;;;34015:64;;;:6;:64;;;;34008:71;;;33672:716;;;;;;:::o;44751:110::-;44811:13;44844:9;44837:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44751:110;:::o;38745:723::-;38801:13;39031:1;39022:5;:10;39018:53;;;39049:10;;;;;;;;;;;;;;;;;;;;;39018:53;39081:12;39096:5;39081:20;;39112:14;39137:78;39152:1;39144:4;:9;39137:78;;39170:8;;;;;:::i;:::-;;;;39201:2;39193:10;;;;;:::i;:::-;;;39137:78;;;39225:19;39257:6;39247:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39225:39;;39275:154;39291:1;39282:5;:10;39275:154;;39319:1;39309:11;;;;;:::i;:::-;;;39386:2;39378:5;:10;;;;:::i;:::-;39365:2;:24;;;;:::i;:::-;39352:39;;39335:6;39342;39335:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39415:2;39406:11;;;;;:::i;:::-;;;39275:154;;;39453:6;39439:21;;;;;38745:723;;;;:::o;14091:176::-;14152:7;9124:13;9261:2;14180:18;:25;14199:5;14180:25;;;;;;;;;;;;;;;;:49;;14179:80;14172:87;;14091:176;;;:::o;35036:159::-;;;;;:::o;19208:148::-;19272:14;19333:5;19323:15;;19208:148;;;:::o;35854:158::-;;;;;:::o;23055:2236::-;23178:20;23201:13;;23178:36;;23243:1;23229:16;;:2;:16;;;23225:48;;;23254:19;;;;;;;;;;;;;;23225:48;23300:1;23288:8;:13;23284:44;;;23310:18;;;;;;;;;;;;;;23284:44;23341:61;23371:1;23375:2;23379:12;23393:8;23341:21;:61::i;:::-;23945:1;9261:2;23916:1;:25;;23915:31;23903:8;:44;23877:18;:22;23896:2;23877:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10041:3;24346:29;24373:1;24361:8;:13;24346:14;:29::i;:::-;:56;;9778:3;24283:15;:41;;24241:21;24259:2;24241:17;:21::i;:::-;:84;:162;24190:17;:31;24208:12;24190:31;;;;;;;;;;;:213;;;;24420:20;24443:12;24420:35;;24470:11;24499:8;24484:12;:23;24470:37;;24546:1;24528:2;:14;;;:19;24524:635;;24568:313;24624:12;24620:2;24599:38;;24616:1;24599:38;;;;;;;;;;;;24665:69;24704:1;24708:2;24712:14;;;;;;24728:5;24665:30;:69::i;:::-;24660:174;;24770:40;;;;;;;;;;;;;;24660:174;24876:3;24861:12;:18;24568:313;;24962:12;24945:13;;:29;24941:43;;24976:8;;;24941:43;24524:635;;;25025:119;25081:14;;;;;;25077:2;25056:40;;25073:1;25056:40;;;;;;;;;;;;25139:3;25124:12;:18;25025:119;;24524:635;25189:12;25173:13;:28;;;;23654:1559;;25223:60;25252:1;25256:2;25260:12;25274:8;25223:20;:60::i;:::-;23167:2124;23055:2236;;;:::o;19443:142::-;19501:14;19562:5;19552:15;;19443:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2910:183::-;2978:5;3016:6;3003:20;2994:29;;3032:55;3081:5;3032:55;:::i;:::-;2910:183;;;;:::o;3113:340::-;3169:5;3218:3;3211:4;3203:6;3199:17;3195:27;3185:122;;3226:79;;:::i;:::-;3185:122;3343:6;3330:20;3368:79;3443:3;3435:6;3428:4;3420:6;3416:17;3368:79;:::i;:::-;3359:88;;3175:278;3113:340;;;;:::o;3459:139::-;3505:5;3543:6;3530:20;3521:29;;3559:33;3586:5;3559:33;:::i;:::-;3459:139;;;;:::o;3604:329::-;3663:6;3712:2;3700:9;3691:7;3687:23;3683:32;3680:119;;;3718:79;;:::i;:::-;3680:119;3838:1;3863:53;3908:7;3899:6;3888:9;3884:22;3863:53;:::i;:::-;3853:63;;3809:117;3604:329;;;;:::o;3939:474::-;4007:6;4015;4064:2;4052:9;4043:7;4039:23;4035:32;4032:119;;;4070:79;;:::i;:::-;4032:119;4190:1;4215:53;4260:7;4251:6;4240:9;4236:22;4215:53;:::i;:::-;4205:63;;4161:117;4317:2;4343:53;4388:7;4379:6;4368:9;4364:22;4343:53;:::i;:::-;4333:63;;4288:118;3939:474;;;;;:::o;4419:619::-;4496:6;4504;4512;4561:2;4549:9;4540:7;4536:23;4532:32;4529:119;;;4567:79;;:::i;:::-;4529:119;4687:1;4712:53;4757:7;4748:6;4737:9;4733:22;4712:53;:::i;:::-;4702:63;;4658:117;4814:2;4840:53;4885:7;4876:6;4865:9;4861:22;4840:53;:::i;:::-;4830:63;;4785:118;4942:2;4968:53;5013:7;5004:6;4993:9;4989:22;4968:53;:::i;:::-;4958:63;;4913:118;4419:619;;;;;:::o;5044:943::-;5139:6;5147;5155;5163;5212:3;5200:9;5191:7;5187:23;5183:33;5180:120;;;5219:79;;:::i;:::-;5180:120;5339:1;5364:53;5409:7;5400:6;5389:9;5385:22;5364:53;:::i;:::-;5354:63;;5310:117;5466:2;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5437:118;5594:2;5620:53;5665:7;5656:6;5645:9;5641:22;5620:53;:::i;:::-;5610:63;;5565:118;5750:2;5739:9;5735:18;5722:32;5781:18;5773:6;5770:30;5767:117;;;5803:79;;:::i;:::-;5767:117;5908:62;5962:7;5953:6;5942:9;5938:22;5908:62;:::i;:::-;5898:72;;5693:287;5044:943;;;;;;;:::o;5993:468::-;6058:6;6066;6115:2;6103:9;6094:7;6090:23;6086:32;6083:119;;;6121:79;;:::i;:::-;6083:119;6241:1;6266:53;6311:7;6302:6;6291:9;6287:22;6266:53;:::i;:::-;6256:63;;6212:117;6368:2;6394:50;6436:7;6427:6;6416:9;6412:22;6394:50;:::i;:::-;6384:60;;6339:115;5993:468;;;;;:::o;6467:474::-;6535:6;6543;6592:2;6580:9;6571:7;6567:23;6563:32;6560:119;;;6598:79;;:::i;:::-;6560:119;6718:1;6743:53;6788:7;6779:6;6768:9;6764:22;6743:53;:::i;:::-;6733:63;;6689:117;6845:2;6871:53;6916:7;6907:6;6896:9;6892:22;6871:53;:::i;:::-;6861:63;;6816:118;6467:474;;;;;:::o;6947:327::-;7005:6;7054:2;7042:9;7033:7;7029:23;7025:32;7022:119;;;7060:79;;:::i;:::-;7022:119;7180:1;7205:52;7249:7;7240:6;7229:9;7225:22;7205:52;:::i;:::-;7195:62;;7151:116;6947:327;;;;:::o;7280:349::-;7349:6;7398:2;7386:9;7377:7;7373:23;7369:32;7366:119;;;7404:79;;:::i;:::-;7366:119;7524:1;7549:63;7604:7;7595:6;7584:9;7580:22;7549:63;:::i;:::-;7539:73;;7495:127;7280:349;;;;:::o;7635:373::-;7716:6;7765:2;7753:9;7744:7;7740:23;7736:32;7733:119;;;7771:79;;:::i;:::-;7733:119;7891:1;7916:75;7983:7;7974:6;7963:9;7959:22;7916:75;:::i;:::-;7906:85;;7862:139;7635:373;;;;:::o;8014:509::-;8083:6;8132:2;8120:9;8111:7;8107:23;8103:32;8100:119;;;8138:79;;:::i;:::-;8100:119;8286:1;8275:9;8271:17;8258:31;8316:18;8308:6;8305:30;8302:117;;;8338:79;;:::i;:::-;8302:117;8443:63;8498:7;8489:6;8478:9;8474:22;8443:63;:::i;:::-;8433:73;;8229:287;8014:509;;;;:::o;8529:329::-;8588:6;8637:2;8625:9;8616:7;8612:23;8608:32;8605:119;;;8643:79;;:::i;:::-;8605:119;8763:1;8788:53;8833:7;8824:6;8813:9;8809:22;8788:53;:::i;:::-;8778:63;;8734:117;8529:329;;;;:::o;8864:474::-;8932:6;8940;8989:2;8977:9;8968:7;8964:23;8960:32;8957:119;;;8995:79;;:::i;:::-;8957:119;9115:1;9140:53;9185:7;9176:6;9165:9;9161:22;9140:53;:::i;:::-;9130:63;;9086:117;9242:2;9268:53;9313:7;9304:6;9293:9;9289:22;9268:53;:::i;:::-;9258:63;;9213:118;8864:474;;;;;:::o;9344:684::-;9437:6;9445;9494:2;9482:9;9473:7;9469:23;9465:32;9462:119;;;9500:79;;:::i;:::-;9462:119;9620:1;9645:53;9690:7;9681:6;9670:9;9666:22;9645:53;:::i;:::-;9635:63;;9591:117;9775:2;9764:9;9760:18;9747:32;9806:18;9798:6;9795:30;9792:117;;;9828:79;;:::i;:::-;9792:117;9933:78;10003:7;9994:6;9983:9;9979:22;9933:78;:::i;:::-;9923:88;;9718:303;9344:684;;;;;:::o;10034:179::-;10103:10;10124:46;10166:3;10158:6;10124:46;:::i;:::-;10202:4;10197:3;10193:14;10179:28;;10034:179;;;;:::o;10219:118::-;10306:24;10324:5;10306:24;:::i;:::-;10301:3;10294:37;10219:118;;:::o;10373:732::-;10492:3;10521:54;10569:5;10521:54;:::i;:::-;10591:86;10670:6;10665:3;10591:86;:::i;:::-;10584:93;;10701:56;10751:5;10701:56;:::i;:::-;10780:7;10811:1;10796:284;10821:6;10818:1;10815:13;10796:284;;;10897:6;10891:13;10924:63;10983:3;10968:13;10924:63;:::i;:::-;10917:70;;11010:60;11063:6;11010:60;:::i;:::-;11000:70;;10856:224;10843:1;10840;10836:9;10831:14;;10796:284;;;10800:14;11096:3;11089:10;;10497:608;;;10373:732;;;;:::o;11111:109::-;11192:21;11207:5;11192:21;:::i;:::-;11187:3;11180:34;11111:109;;:::o;11226:360::-;11312:3;11340:38;11372:5;11340:38;:::i;:::-;11394:70;11457:6;11452:3;11394:70;:::i;:::-;11387:77;;11473:52;11518:6;11513:3;11506:4;11499:5;11495:16;11473:52;:::i;:::-;11550:29;11572:6;11550:29;:::i;:::-;11545:3;11541:39;11534:46;;11316:270;11226:360;;;;:::o;11592:171::-;11699:57;11750:5;11699:57;:::i;:::-;11694:3;11687:70;11592:171;;:::o;11769:364::-;11857:3;11885:39;11918:5;11885:39;:::i;:::-;11940:71;12004:6;11999:3;11940:71;:::i;:::-;11933:78;;12020:52;12065:6;12060:3;12053:4;12046:5;12042:16;12020:52;:::i;:::-;12097:29;12119:6;12097:29;:::i;:::-;12092:3;12088:39;12081:46;;11861:272;11769:364;;;;:::o;12139:377::-;12245:3;12273:39;12306:5;12273:39;:::i;:::-;12328:89;12410:6;12405:3;12328:89;:::i;:::-;12321:96;;12426:52;12471:6;12466:3;12459:4;12452:5;12448:16;12426:52;:::i;:::-;12503:6;12498:3;12494:16;12487:23;;12249:267;12139:377;;;;:::o;12522:366::-;12664:3;12685:67;12749:2;12744:3;12685:67;:::i;:::-;12678:74;;12761:93;12850:3;12761:93;:::i;:::-;12879:2;12874:3;12870:12;12863:19;;12522:366;;;:::o;12894:::-;13036:3;13057:67;13121:2;13116:3;13057:67;:::i;:::-;13050:74;;13133:93;13222:3;13133:93;:::i;:::-;13251:2;13246:3;13242:12;13235:19;;12894:366;;;:::o;13266:400::-;13426:3;13447:84;13529:1;13524:3;13447:84;:::i;:::-;13440:91;;13540:93;13629:3;13540:93;:::i;:::-;13658:1;13653:3;13649:11;13642:18;;13266:400;;;:::o;13672:366::-;13814:3;13835:67;13899:2;13894:3;13835:67;:::i;:::-;13828:74;;13911:93;14000:3;13911:93;:::i;:::-;14029:2;14024:3;14020:12;14013:19;;13672:366;;;:::o;14044:::-;14186:3;14207:67;14271:2;14266:3;14207:67;:::i;:::-;14200:74;;14283:93;14372:3;14283:93;:::i;:::-;14401:2;14396:3;14392:12;14385:19;;14044:366;;;:::o;14416:::-;14558:3;14579:67;14643:2;14638:3;14579:67;:::i;:::-;14572:74;;14655:93;14744:3;14655:93;:::i;:::-;14773:2;14768:3;14764:12;14757:19;;14416:366;;;:::o;14788:398::-;14947:3;14968:83;15049:1;15044:3;14968:83;:::i;:::-;14961:90;;15060:93;15149:3;15060:93;:::i;:::-;15178:1;15173:3;15169:11;15162:18;;14788:398;;;:::o;15192:366::-;15334:3;15355:67;15419:2;15414:3;15355:67;:::i;:::-;15348:74;;15431:93;15520:3;15431:93;:::i;:::-;15549:2;15544:3;15540:12;15533:19;;15192:366;;;:::o;15564:::-;15706:3;15727:67;15791:2;15786:3;15727:67;:::i;:::-;15720:74;;15803:93;15892:3;15803:93;:::i;:::-;15921:2;15916:3;15912:12;15905:19;;15564:366;;;:::o;15936:108::-;16013:24;16031:5;16013:24;:::i;:::-;16008:3;16001:37;15936:108;;:::o;16050:118::-;16137:24;16155:5;16137:24;:::i;:::-;16132:3;16125:37;16050:118;;:::o;16174:701::-;16455:3;16477:95;16568:3;16559:6;16477:95;:::i;:::-;16470:102;;16589:95;16680:3;16671:6;16589:95;:::i;:::-;16582:102;;16701:148;16845:3;16701:148;:::i;:::-;16694:155;;16866:3;16859:10;;16174:701;;;;;:::o;16881:379::-;17065:3;17087:147;17230:3;17087:147;:::i;:::-;17080:154;;17251:3;17244:10;;16881:379;;;:::o;17266:222::-;17359:4;17397:2;17386:9;17382:18;17374:26;;17410:71;17478:1;17467:9;17463:17;17454:6;17410:71;:::i;:::-;17266:222;;;;:::o;17494:640::-;17689:4;17727:3;17716:9;17712:19;17704:27;;17741:71;17809:1;17798:9;17794:17;17785:6;17741:71;:::i;:::-;17822:72;17890:2;17879:9;17875:18;17866:6;17822:72;:::i;:::-;17904;17972:2;17961:9;17957:18;17948:6;17904:72;:::i;:::-;18023:9;18017:4;18013:20;18008:2;17997:9;17993:18;17986:48;18051:76;18122:4;18113:6;18051:76;:::i;:::-;18043:84;;17494:640;;;;;;;:::o;18140:373::-;18283:4;18321:2;18310:9;18306:18;18298:26;;18370:9;18364:4;18360:20;18356:1;18345:9;18341:17;18334:47;18398:108;18501:4;18492:6;18398:108;:::i;:::-;18390:116;;18140:373;;;;:::o;18519:210::-;18606:4;18644:2;18633:9;18629:18;18621:26;;18657:65;18719:1;18708:9;18704:17;18695:6;18657:65;:::i;:::-;18519:210;;;;:::o;18735:262::-;18848:4;18886:2;18875:9;18871:18;18863:26;;18899:91;18987:1;18976:9;18972:17;18963:6;18899:91;:::i;:::-;18735:262;;;;:::o;19003:313::-;19116:4;19154:2;19143:9;19139:18;19131:26;;19203:9;19197:4;19193:20;19189:1;19178:9;19174:17;19167:47;19231:78;19304:4;19295:6;19231:78;:::i;:::-;19223:86;;19003:313;;;;:::o;19322:419::-;19488:4;19526:2;19515:9;19511:18;19503:26;;19575:9;19569:4;19565:20;19561:1;19550:9;19546:17;19539:47;19603:131;19729:4;19603:131;:::i;:::-;19595:139;;19322:419;;;:::o;19747:::-;19913:4;19951:2;19940:9;19936:18;19928:26;;20000:9;19994:4;19990:20;19986:1;19975:9;19971:17;19964:47;20028:131;20154:4;20028:131;:::i;:::-;20020:139;;19747:419;;;:::o;20172:::-;20338:4;20376:2;20365:9;20361:18;20353:26;;20425:9;20419:4;20415:20;20411:1;20400:9;20396:17;20389:47;20453:131;20579:4;20453:131;:::i;:::-;20445:139;;20172:419;;;:::o;20597:::-;20763:4;20801:2;20790:9;20786:18;20778:26;;20850:9;20844:4;20840:20;20836:1;20825:9;20821:17;20814:47;20878:131;21004:4;20878:131;:::i;:::-;20870:139;;20597:419;;;:::o;21022:::-;21188:4;21226:2;21215:9;21211:18;21203:26;;21275:9;21269:4;21265:20;21261:1;21250:9;21246:17;21239:47;21303:131;21429:4;21303:131;:::i;:::-;21295:139;;21022:419;;;:::o;21447:::-;21613:4;21651:2;21640:9;21636:18;21628:26;;21700:9;21694:4;21690:20;21686:1;21675:9;21671:17;21664:47;21728:131;21854:4;21728:131;:::i;:::-;21720:139;;21447:419;;;:::o;21872:::-;22038:4;22076:2;22065:9;22061:18;22053:26;;22125:9;22119:4;22115:20;22111:1;22100:9;22096:17;22089:47;22153:131;22279:4;22153:131;:::i;:::-;22145:139;;21872:419;;;:::o;22297:222::-;22390:4;22428:2;22417:9;22413:18;22405:26;;22441:71;22509:1;22498:9;22494:17;22485:6;22441:71;:::i;:::-;22297:222;;;;:::o;22525:129::-;22559:6;22586:20;;:::i;:::-;22576:30;;22615:33;22643:4;22635:6;22615:33;:::i;:::-;22525:129;;;:::o;22660:75::-;22693:6;22726:2;22720:9;22710:19;;22660:75;:::o;22741:311::-;22818:4;22908:18;22900:6;22897:30;22894:56;;;22930:18;;:::i;:::-;22894:56;22980:4;22972:6;22968:17;22960:25;;23040:4;23034;23030:15;23022:23;;22741:311;;;:::o;23058:307::-;23119:4;23209:18;23201:6;23198:30;23195:56;;;23231:18;;:::i;:::-;23195:56;23269:29;23291:6;23269:29;:::i;:::-;23261:37;;23353:4;23347;23343:15;23335:23;;23058:307;;;:::o;23371:308::-;23433:4;23523:18;23515:6;23512:30;23509:56;;;23545:18;;:::i;:::-;23509:56;23583:29;23605:6;23583:29;:::i;:::-;23575:37;;23667:4;23661;23657:15;23649:23;;23371:308;;;:::o;23685:132::-;23752:4;23775:3;23767:11;;23805:4;23800:3;23796:14;23788:22;;23685:132;;;:::o;23823:114::-;23890:6;23924:5;23918:12;23908:22;;23823:114;;;:::o;23943:98::-;23994:6;24028:5;24022:12;24012:22;;23943:98;;;:::o;24047:99::-;24099:6;24133:5;24127:12;24117:22;;24047:99;;;:::o;24152:113::-;24222:4;24254;24249:3;24245:14;24237:22;;24152:113;;;:::o;24271:184::-;24370:11;24404:6;24399:3;24392:19;24444:4;24439:3;24435:14;24420:29;;24271:184;;;;:::o;24461:168::-;24544:11;24578:6;24573:3;24566:19;24618:4;24613:3;24609:14;24594:29;;24461:168;;;;:::o;24635:147::-;24736:11;24773:3;24758:18;;24635:147;;;;:::o;24788:169::-;24872:11;24906:6;24901:3;24894:19;24946:4;24941:3;24937:14;24922:29;;24788:169;;;;:::o;24963:148::-;25065:11;25102:3;25087:18;;24963:148;;;;:::o;25117:305::-;25157:3;25176:20;25194:1;25176:20;:::i;:::-;25171:25;;25210:20;25228:1;25210:20;:::i;:::-;25205:25;;25364:1;25296:66;25292:74;25289:1;25286:81;25283:107;;;25370:18;;:::i;:::-;25283:107;25414:1;25411;25407:9;25400:16;;25117:305;;;;:::o;25428:185::-;25468:1;25485:20;25503:1;25485:20;:::i;:::-;25480:25;;25519:20;25537:1;25519:20;:::i;:::-;25514:25;;25558:1;25548:35;;25563:18;;:::i;:::-;25548:35;25605:1;25602;25598:9;25593:14;;25428:185;;;;:::o;25619:191::-;25659:4;25679:20;25697:1;25679:20;:::i;:::-;25674:25;;25713:20;25731:1;25713:20;:::i;:::-;25708:25;;25752:1;25749;25746:8;25743:34;;;25757:18;;:::i;:::-;25743:34;25802:1;25799;25795:9;25787:17;;25619:191;;;;:::o;25816:96::-;25853:7;25882:24;25900:5;25882:24;:::i;:::-;25871:35;;25816:96;;;:::o;25918:90::-;25952:7;25995:5;25988:13;25981:21;25970:32;;25918:90;;;:::o;26014:149::-;26050:7;26090:66;26083:5;26079:78;26068:89;;26014:149;;;:::o;26169:155::-;26228:7;26257:5;26246:16;;26263:55;26312:5;26263:55;:::i;:::-;26169:155;;;:::o;26330:126::-;26367:7;26407:42;26400:5;26396:54;26385:65;;26330:126;;;:::o;26462:77::-;26499:7;26528:5;26517:16;;26462:77;;;:::o;26545:155::-;26615:9;26648:46;26688:5;26648:46;:::i;:::-;26635:59;;26545:155;;;:::o;26706:154::-;26790:6;26785:3;26780;26767:30;26852:1;26843:6;26838:3;26834:16;26827:27;26706:154;;;:::o;26866:307::-;26934:1;26944:113;26958:6;26955:1;26952:13;26944:113;;;27043:1;27038:3;27034:11;27028:18;27024:1;27019:3;27015:11;27008:39;26980:2;26977:1;26973:10;26968:15;;26944:113;;;27075:6;27072:1;27069:13;27066:101;;;27155:1;27146:6;27141:3;27137:16;27130:27;27066:101;26915:258;26866:307;;;:::o;27179:320::-;27223:6;27260:1;27254:4;27250:12;27240:22;;27307:1;27301:4;27297:12;27328:18;27318:81;;27384:4;27376:6;27372:17;27362:27;;27318:81;27446:2;27438:6;27435:14;27415:18;27412:38;27409:84;;;27465:18;;:::i;:::-;27409:84;27230:269;27179:320;;;:::o;27505:281::-;27588:27;27610:4;27588:27;:::i;:::-;27580:6;27576:40;27718:6;27706:10;27703:22;27682:18;27670:10;27667:34;27664:62;27661:88;;;27729:18;;:::i;:::-;27661:88;27769:10;27765:2;27758:22;27548:238;27505:281;;:::o;27792:233::-;27831:3;27854:24;27872:5;27854:24;:::i;:::-;27845:33;;27900:66;27893:5;27890:77;27887:103;;;27970:18;;:::i;:::-;27887:103;28017:1;28010:5;28006:13;27999:20;;27792:233;;;:::o;28031:176::-;28063:1;28080:20;28098:1;28080:20;:::i;:::-;28075:25;;28114:20;28132:1;28114:20;:::i;:::-;28109:25;;28153:1;28143:35;;28158:18;;:::i;:::-;28143:35;28199:1;28196;28192:9;28187:14;;28031:176;;;;:::o;28213:180::-;28261:77;28258:1;28251:88;28358:4;28355:1;28348:15;28382:4;28379:1;28372:15;28399:180;28447:77;28444:1;28437:88;28544:4;28541:1;28534:15;28568:4;28565:1;28558:15;28585:180;28633:77;28630:1;28623:88;28730:4;28727:1;28720:15;28754:4;28751:1;28744:15;28771:180;28819:77;28816:1;28809:88;28916:4;28913:1;28906:15;28940:4;28937:1;28930:15;28957:180;29005:77;29002:1;28995:88;29102:4;29099:1;29092:15;29126:4;29123:1;29116:15;29143:180;29191:77;29188:1;29181:88;29288:4;29285:1;29278:15;29312:4;29309:1;29302:15;29329:117;29438:1;29435;29428:12;29452:117;29561:1;29558;29551:12;29575:117;29684:1;29681;29674:12;29698:117;29807:1;29804;29797:12;29821:117;29930:1;29927;29920:12;29944:102;29985:6;30036:2;30032:7;30027:2;30020:5;30016:14;30012:28;30002:38;;29944:102;;;:::o;30052:169::-;30192:21;30188:1;30180:6;30176:14;30169:45;30052:169;:::o;30227:225::-;30367:34;30363:1;30355:6;30351:14;30344:58;30436:8;30431:2;30423:6;30419:15;30412:33;30227:225;:::o;30458:155::-;30598:7;30594:1;30586:6;30582:14;30575:31;30458:155;:::o;30619:182::-;30759:34;30755:1;30747:6;30743:14;30736:58;30619:182;:::o;30807:176::-;30947:28;30943:1;30935:6;30931:14;30924:52;30807:176;:::o;30989:234::-;31129:34;31125:1;31117:6;31113:14;31106:58;31198:17;31193:2;31185:6;31181:15;31174:42;30989:234;:::o;31229:114::-;;:::o;31349:169::-;31489:21;31485:1;31477:6;31473:14;31466:45;31349:169;:::o;31524:173::-;31664:25;31660:1;31652:6;31648:14;31641:49;31524:173;:::o;31703:127::-;31798:1;31791:5;31788:12;31778:46;;31804:18;;:::i;:::-;31778:46;31703:127;:::o;31836:122::-;31909:24;31927:5;31909:24;:::i;:::-;31902:5;31899:35;31889:63;;31948:1;31945;31938:12;31889:63;31836:122;:::o;31964:116::-;32034:21;32049:5;32034:21;:::i;:::-;32027:5;32024:32;32014:60;;32070:1;32067;32060:12;32014:60;31964:116;:::o;32086:120::-;32158:23;32175:5;32158:23;:::i;:::-;32151:5;32148:34;32138:62;;32196:1;32193;32186:12;32138:62;32086:120;:::o;32212:121::-;32307:1;32300:5;32297:12;32287:40;;32323:1;32320;32313:12;32287:40;32212:121;:::o;32339:122::-;32412:24;32430:5;32412:24;:::i;:::-;32405:5;32402:35;32392:63;;32451:1;32448;32441:12;32392:63;32339:122;:::o
Swarm Source
ipfs://bce2b1b0d79ee930128d17e968825ea495011f0a11d5c502cff5cb77e06a7015
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.