Overview
ETH Balance
0.0001 ETH
Eth Value
$0.32 (@ $3,244.80/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
Loading...
Loading
Contract Name:
Kryptonomic
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-14 */ // SPDX-License-Identifier:MIT pragma solidity ^0.8.13; /** * @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); } /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } /** * @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 (_addressToUint256(owner) == 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 (_addressToUint256(to) == 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 (_addressToUint256(to) == 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(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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) } } } /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } /** * @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; } } /** * @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); } } contract Kryptonomic is ERC721A, ERC721AQueryable, Ownable { uint256 public price = 0.0001 ether; uint256 public transactionMaximum = 100; uint256 public maximumSupply = 500; string public baseURI_; bool public saleActive; constructor() ERC721A("Kryptonomic K", "Kryptonomic") {} event PriceChange(uint256 indexed amount); event SaleStateChange(bool saleState); error InsufficientFunds(); error TooMany(); error MaxSupply(); error SaleNotActive(); function setPrice(uint256 price_) public onlyOwner { price = price_; emit PriceChange(price); } function switchSaleState() public onlyOwner { saleActive = !saleActive; emit SaleStateChange(saleActive); } function setTokenURI(string memory uri) public onlyOwner { baseURI_ = uri; } function mint(uint256 amount) public payable { if (msg.value != price * amount) revert InsufficientFunds(); if (amount > transactionMaximum) revert TooMany(); if (amount + totalSupply() > maximumSupply) revert MaxSupply(); if(!saleActive) revert SaleNotActive(); _safeMint(msg.sender, amount); } function freeMint(uint256 amount) public onlyOwner { if (amount > transactionMaximum) revert TooMany(); if (amount + totalSupply() > maximumSupply) revert MaxSupply(); if(!saleActive) revert SaleNotActive(); _safeMint(msg.sender, amount); } function withdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } function _baseURI() internal override view virtual returns (string memory) { return baseURI_; } }
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":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MaxSupply","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SaleNotActive","type":"error"},{"inputs":[],"name":"TooMany","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":"uint256","name":"amount","type":"uint256"}],"name":"PriceChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"saleState","type":"bool"}],"name":"SaleStateChange","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":[],"name":"baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maximumSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":"switchSaleState","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionMaximum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052655af3107a40006009556064600a556101f4600b553480156200002657600080fd5b506040518060400160405280600d81526020017f4b727970746f6e6f6d6963204b000000000000000000000000000000000000008152506040518060400160405280600b81526020017f4b727970746f6e6f6d69630000000000000000000000000000000000000000008152508160029080519060200190620000ab929190620001d6565b508060039080519060200190620000c4929190620001d6565b50620000d56200010360201b60201c565b6000819055505050620000fd620000f16200010860201b60201c565b6200011060201b60201c565b620002ea565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e490620002b5565b90600052602060002090601f01602090048101928262000208576000855562000254565b82601f106200022357805160ff191683800117855562000254565b8280016001018555821562000254579182015b828111156200025357825182559160200191906001019062000236565b5b50905062000263919062000267565b5090565b5b808211156200028257600081600090555060010162000268565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b61370180620002fa6000396000f3fe6080604052600436106101e35760003560e01c80638462151c11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146106f7578063efc4f1dc14610734578063f259a29e1461074b578063f2fde38b14610776576101e3565b8063b88d4fde1461062b578063c23dc68f14610654578063c87b56dd14610691578063e0df5b6f146106ce576101e3565b806399a2557a116100d157806399a2557a1461057e578063a035b1fe146105bb578063a0712d68146105e6578063a22cb46514610602576101e3565b80638462151c146104c25780638da5cb5b146104ff57806391b7f5ed1461052a57806395d89b4114610553576101e3565b806342842e0e1161017a57806370a082311161014957806370a082311461041a578063715018a6146104575780637681cd831461046e5780637c928fe914610499576101e3565b806342842e0e1461034c5780635bbb2177146103755780636352211e146103b257806368428a1b146103ef576101e3565b8063095ea7b3116101b6578063095ea7b3146102b857806318160ddd146102e157806323b872dd1461030c5780633ccfd60b14610335576101e3565b806301ffc9a7146101e85780630480e58b1461022557806306fdde0314610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906128e6565b61079f565b60405161021c919061292e565b60405180910390f35b34801561023157600080fd5b5061023a610831565b6040516102479190612962565b60405180910390f35b34801561025c57600080fd5b50610265610837565b6040516102729190612a16565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612a64565b6108c9565b6040516102af9190612ad2565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612b19565b610945565b005b3480156102ed57600080fd5b506102f6610aeb565b6040516103039190612962565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612b59565b610b02565b005b34801561034157600080fd5b5061034a610b12565b005b34801561035857600080fd5b50610373600480360381019061036e9190612b59565b610bd7565b005b34801561038157600080fd5b5061039c60048036038101906103979190612cf4565b610bf7565b6040516103a99190612e6f565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612a64565b610cb8565b6040516103e69190612ad2565b60405180910390f35b3480156103fb57600080fd5b50610404610cca565b604051610411919061292e565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612e91565b610cdd565b60405161044e9190612962565b60405180910390f35b34801561046357600080fd5b5061046c610d71565b005b34801561047a57600080fd5b50610483610df9565b6040516104909190612962565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612a64565b610dff565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612e91565b610f58565b6040516104f69190612f7c565b60405180910390f35b34801561050b57600080fd5b5061051461109b565b6040516105219190612ad2565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190612a64565b6110c5565b005b34801561055f57600080fd5b5061056861117a565b6040516105759190612a16565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612f9e565b61120c565b6040516105b29190612f7c565b60405180910390f35b3480156105c757600080fd5b506105d0611418565b6040516105dd9190612962565b60405180910390f35b61060060048036038101906105fb9190612a64565b61141e565b005b34801561060e57600080fd5b506106296004803603810190610624919061301d565b611541565b005b34801561063757600080fd5b50610652600480360381019061064d9190613112565b6116b8565b005b34801561066057600080fd5b5061067b60048036038101906106769190612a64565b61172b565b60405161068891906131d7565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612a64565b611795565b6040516106c59190612a16565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613293565b611833565b005b34801561070357600080fd5b5061071e600480360381019061071991906132dc565b6118c9565b60405161072b919061292e565b60405180910390f35b34801561074057600080fd5b5061074961195d565b005b34801561075757600080fd5b50610760611a4b565b60405161076d9190612a16565b60405180910390f35b34801561078257600080fd5b5061079d60048036038101906107989190612e91565b611ad9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b6060600280546108469061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546108729061334b565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b60006108d482611bd0565b61090a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095082611c2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d6611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614610a3957610a02816109fd611cfb565b6118c9565b610a38576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610af5611d03565b6001546000540303905090565b610b0d838383611d08565b505050565b610b1a6120cd565b73ffffffffffffffffffffffffffffffffffffffff16610b3861109b565b73ffffffffffffffffffffffffffffffffffffffff1614610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906133c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610bd4573d6000803e3d6000fd5b50565b610bf2838383604051806020016040528060008152506116b8565b505050565b606060008251905060008167ffffffffffffffff811115610c1b57610c1a612bb1565b5b604051908082528060200260200182016040528015610c5457816020015b610c41612794565b815260200190600190039081610c395790505b50905060005b828114610cad57610c84858281518110610c7757610c766133e8565b5b602002602001015161172b565b828281518110610c9757610c966133e8565b5b6020026020010181905250806001019050610c5a565b508092505050919050565b6000610cc382611c2f565b9050919050565b600d60009054906101000a900460ff1681565b600080610ce9836120d5565b03610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d796120cd565b73ffffffffffffffffffffffffffffffffffffffff16610d9761109b565b73ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de4906133c8565b60405180910390fd5b610df760006120df565b565b600a5481565b610e076120cd565b73ffffffffffffffffffffffffffffffffffffffff16610e2561109b565b73ffffffffffffffffffffffffffffffffffffffff1614610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e72906133c8565b60405180910390fd5b600a54811115610eb7576040517fd65ac61e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b54610ec2610aeb565b82610ecd9190613446565b1115610f05576040517fb36c128400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60009054906101000a900460ff16610f4b576040517fb7b2409700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5533826121a5565b50565b60606000806000610f6885610cdd565b905060008167ffffffffffffffff811115610f8657610f85612bb1565b5b604051908082528060200260200182016040528015610fb45781602001602082028036833780820191505090505b509050610fbf612794565b6000610fc9611d03565b90505b83861461108d57610fdc816121c3565b9150816040015161108257600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461102757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110815780838780600101985081518110611074576110736133e8565b5b6020026020010181815250505b5b806001019050610fcc565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110cd6120cd565b73ffffffffffffffffffffffffffffffffffffffff166110eb61109b565b73ffffffffffffffffffffffffffffffffffffffff1614611141576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611138906133c8565b60405180910390fd5b806009819055506009547ff347ee99503bf19c028bd6b18f3c676e82a9bb5b2bb5225aebe0fd62fd6a0d1960405160405180910390a250565b6060600380546111899061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546111b59061334b565b80156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b5050505050905090565b6060818310611247576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806112526121ee565b905061125c611d03565b85101561126e5761126b611d03565b94505b8084111561127a578093505b600061128587610cdd565b9050848610156112a85760008686039050818110156112a2578091505b506112ad565b600090505b60008167ffffffffffffffff8111156112c9576112c8612bb1565b5b6040519080825280602002602001820160405280156112f75781602001602082028036833780820191505090505b5090506000820361130e5780945050505050611411565b60006113198861172b565b90506000816040015161132e57816000015190505b60008990505b8881141580156113445750848714155b1561140357611352816121c3565b925082604001516113f857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461139d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113f757808488806001019950815181106113ea576113e96133e8565b5b6020026020010181815250505b5b806001019050611334565b508583528296505050505050505b9392505050565b60095481565b8060095461142c919061349c565b3414611464576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a548111156114a0576040517fd65ac61e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546114ab610aeb565b826114b69190613446565b11156114ee576040517fb36c128400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60009054906101000a900460ff16611534576040517fb7b2409700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61153e33826121a5565b50565b611549611cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ad576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115ba611cfb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611667611cfb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ac919061292e565b60405180910390a35050565b6116c3848484611d08565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611725576116ee848484846121f7565b611724576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611733612794565b61173b612794565b611743611d03565b83108061175757506117536121ee565b8310155b156117655780915050611790565b61176e836121c3565b90508060400151156117835780915050611790565b61178c83612347565b9150505b919050565b60606117a082611bd0565b6117d6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117e0612367565b90506000815103611800576040518060200160405280600081525061182b565b8061180a846123f9565b60405160200161181b929190613532565b6040516020818303038152906040525b915050919050565b61183b6120cd565b73ffffffffffffffffffffffffffffffffffffffff1661185961109b565b73ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906133c8565b60405180910390fd5b80600c90805190602001906118c59291906127d7565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119656120cd565b73ffffffffffffffffffffffffffffffffffffffff1661198361109b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d0906133c8565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff0219169083151502179055507fcb01a83ed3bf63b2cb3676905d1c98debc05cc4f85a6d40ea441b3d0656fd0b7600d60009054906101000a900460ff16604051611a41919061292e565b60405180910390a1565b600c8054611a589061334b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a849061334b565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505081565b611ae16120cd565b73ffffffffffffffffffffffffffffffffffffffff16611aff61109b565b73ffffffffffffffffffffffffffffffffffffffff1614611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906133c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906135c8565b60405180910390fd5b611bcd816120df565b50565b600081611bdb611d03565b11158015611bea575060005482105b8015611c28575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c3e611d03565b11611cc457600054811015611cc35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cc1575b60008103611cb7576004600083600190039350838152602001908152602001600020549050611c8d565b8092505050611cf6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611d1382611c2f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611dd3611cfb565b73ffffffffffffffffffffffffffffffffffffffff161480611e025750611e0186611dfc611cfb565b6118c9565b5b80611e3f5750611e10611cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611e78576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e83866120d5565b03611eba576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ec78686866001612453565b6000611ed2836120d5565b14611f0e576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fd5876120d5565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361205d576000600185019050600060046000838152602001908152602001600020540361205b57600054811461205a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120c58686866001612459565b505050505050565b600033905090565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121bf82826040518060200160405280600081525061245f565b5050565b6121cb612794565b6121e760046000848152602001908152602001600020546126ee565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261221d611cfb565b8786866040518563ffffffff1660e01b815260040161223f949392919061363d565b6020604051808303816000875af192505050801561227b57506040513d601f19601f82011682018060405250810190612278919061369e565b60015b6122f4573d80600081146122ab576040519150601f19603f3d011682016040523d82523d6000602084013e6122b0565b606091505b5060008151036122ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61234f612794565b61236061235b83611c2f565b6126ee565b9050919050565b6060600c80546123769061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546123a29061334b565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561243f57600183039250600a81066030018353600a8104905061241f565b508181036020830392508083525050919050565b50505050565b50505050565b6000805490506000612470856120d5565b036124a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036124e1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ee6000858386612453565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16125536001851461278a565b901b60a042901b612563866120d5565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612667575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261760008784806001019550876121f7565b61264d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125a857826000541461266257600080fd5b6126d2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612668575b8160008190555050506126e86000858386612459565b50505050565b6126f6612794565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546127e39061334b565b90600052602060002090601f016020900481019282612805576000855561284c565b82601f1061281e57805160ff191683800117855561284c565b8280016001018555821561284c579182015b8281111561284b578251825591602001919060010190612830565b5b509050612859919061285d565b5090565b5b8082111561287657600081600090555060010161285e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128c38161288e565b81146128ce57600080fd5b50565b6000813590506128e0816128ba565b92915050565b6000602082840312156128fc576128fb612884565b5b600061290a848285016128d1565b91505092915050565b60008115159050919050565b61292881612913565b82525050565b6000602082019050612943600083018461291f565b92915050565b6000819050919050565b61295c81612949565b82525050565b60006020820190506129776000830184612953565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129b757808201518184015260208101905061299c565b838111156129c6576000848401525b50505050565b6000601f19601f8301169050919050565b60006129e88261297d565b6129f28185612988565b9350612a02818560208601612999565b612a0b816129cc565b840191505092915050565b60006020820190508181036000830152612a3081846129dd565b905092915050565b612a4181612949565b8114612a4c57600080fd5b50565b600081359050612a5e81612a38565b92915050565b600060208284031215612a7a57612a79612884565b5b6000612a8884828501612a4f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b82525050565b6000602082019050612ae76000830184612ac3565b92915050565b612af681612ab1565b8114612b0157600080fd5b50565b600081359050612b1381612aed565b92915050565b60008060408385031215612b3057612b2f612884565b5b6000612b3e85828601612b04565b9250506020612b4f85828601612a4f565b9150509250929050565b600080600060608486031215612b7257612b71612884565b5b6000612b8086828701612b04565b9350506020612b9186828701612b04565b9250506040612ba286828701612a4f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612be9826129cc565b810181811067ffffffffffffffff82111715612c0857612c07612bb1565b5b80604052505050565b6000612c1b61287a565b9050612c278282612be0565b919050565b600067ffffffffffffffff821115612c4757612c46612bb1565b5b602082029050602081019050919050565b600080fd5b6000612c70612c6b84612c2c565b612c11565b90508083825260208201905060208402830185811115612c9357612c92612c58565b5b835b81811015612cbc5780612ca88882612a4f565b845260208401935050602081019050612c95565b5050509392505050565b600082601f830112612cdb57612cda612bac565b5b8135612ceb848260208601612c5d565b91505092915050565b600060208284031215612d0a57612d09612884565b5b600082013567ffffffffffffffff811115612d2857612d27612889565b5b612d3484828501612cc6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d7281612ab1565b82525050565b600067ffffffffffffffff82169050919050565b612d9581612d78565b82525050565b612da481612913565b82525050565b606082016000820151612dc06000850182612d69565b506020820151612dd36020850182612d8c565b506040820151612de66040850182612d9b565b50505050565b6000612df88383612daa565b60608301905092915050565b6000602082019050919050565b6000612e1c82612d3d565b612e268185612d48565b9350612e3183612d59565b8060005b83811015612e62578151612e498882612dec565b9750612e5483612e04565b925050600181019050612e35565b5085935050505092915050565b60006020820190508181036000830152612e898184612e11565b905092915050565b600060208284031215612ea757612ea6612884565b5b6000612eb584828501612b04565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ef381612949565b82525050565b6000612f058383612eea565b60208301905092915050565b6000602082019050919050565b6000612f2982612ebe565b612f338185612ec9565b9350612f3e83612eda565b8060005b83811015612f6f578151612f568882612ef9565b9750612f6183612f11565b925050600181019050612f42565b5085935050505092915050565b60006020820190508181036000830152612f968184612f1e565b905092915050565b600080600060608486031215612fb757612fb6612884565b5b6000612fc586828701612b04565b9350506020612fd686828701612a4f565b9250506040612fe786828701612a4f565b9150509250925092565b612ffa81612913565b811461300557600080fd5b50565b60008135905061301781612ff1565b92915050565b6000806040838503121561303457613033612884565b5b600061304285828601612b04565b925050602061305385828601613008565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561307d5761307c612bb1565b5b613086826129cc565b9050602081019050919050565b82818337600083830152505050565b60006130b56130b084613062565b612c11565b9050828152602081018484840111156130d1576130d061305d565b5b6130dc848285613093565b509392505050565b600082601f8301126130f9576130f8612bac565b5b81356131098482602086016130a2565b91505092915050565b6000806000806080858703121561312c5761312b612884565b5b600061313a87828801612b04565b945050602061314b87828801612b04565b935050604061315c87828801612a4f565b925050606085013567ffffffffffffffff81111561317d5761317c612889565b5b613189878288016130e4565b91505092959194509250565b6060820160008201516131ab6000850182612d69565b5060208201516131be6020850182612d8c565b5060408201516131d16040850182612d9b565b50505050565b60006060820190506131ec6000830184613195565b92915050565b600067ffffffffffffffff82111561320d5761320c612bb1565b5b613216826129cc565b9050602081019050919050565b6000613236613231846131f2565b612c11565b9050828152602081018484840111156132525761325161305d565b5b61325d848285613093565b509392505050565b600082601f83011261327a57613279612bac565b5b813561328a848260208601613223565b91505092915050565b6000602082840312156132a9576132a8612884565b5b600082013567ffffffffffffffff8111156132c7576132c6612889565b5b6132d384828501613265565b91505092915050565b600080604083850312156132f3576132f2612884565b5b600061330185828601612b04565b925050602061331285828601612b04565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061336357607f821691505b6020821081036133765761337561331c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133b2602083612988565b91506133bd8261337c565b602082019050919050565b600060208201905081810360008301526133e1816133a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061345182612949565b915061345c83612949565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561349157613490613417565b5b828201905092915050565b60006134a782612949565b91506134b283612949565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134eb576134ea613417565b5b828202905092915050565b600081905092915050565b600061350c8261297d565b61351681856134f6565b9350613526818560208601612999565b80840191505092915050565b600061353e8285613501565b915061354a8284613501565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135b2602683612988565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061360f826135e8565b61361981856135f3565b9350613629818560208601612999565b613632816129cc565b840191505092915050565b60006080820190506136526000830187612ac3565b61365f6020830186612ac3565b61366c6040830185612953565b818103606083015261367e8184613604565b905095945050505050565b600081519050613698816128ba565b92915050565b6000602082840312156136b4576136b3612884565b5b60006136c284828501613689565b9150509291505056fea2646970667358221220db057b2f0fca554a08894961582ead6a33f224ef6ebe0cee5045145eaa29b94b64736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80638462151c11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146106f7578063efc4f1dc14610734578063f259a29e1461074b578063f2fde38b14610776576101e3565b8063b88d4fde1461062b578063c23dc68f14610654578063c87b56dd14610691578063e0df5b6f146106ce576101e3565b806399a2557a116100d157806399a2557a1461057e578063a035b1fe146105bb578063a0712d68146105e6578063a22cb46514610602576101e3565b80638462151c146104c25780638da5cb5b146104ff57806391b7f5ed1461052a57806395d89b4114610553576101e3565b806342842e0e1161017a57806370a082311161014957806370a082311461041a578063715018a6146104575780637681cd831461046e5780637c928fe914610499576101e3565b806342842e0e1461034c5780635bbb2177146103755780636352211e146103b257806368428a1b146103ef576101e3565b8063095ea7b3116101b6578063095ea7b3146102b857806318160ddd146102e157806323b872dd1461030c5780633ccfd60b14610335576101e3565b806301ffc9a7146101e85780630480e58b1461022557806306fdde0314610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906128e6565b61079f565b60405161021c919061292e565b60405180910390f35b34801561023157600080fd5b5061023a610831565b6040516102479190612962565b60405180910390f35b34801561025c57600080fd5b50610265610837565b6040516102729190612a16565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612a64565b6108c9565b6040516102af9190612ad2565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612b19565b610945565b005b3480156102ed57600080fd5b506102f6610aeb565b6040516103039190612962565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612b59565b610b02565b005b34801561034157600080fd5b5061034a610b12565b005b34801561035857600080fd5b50610373600480360381019061036e9190612b59565b610bd7565b005b34801561038157600080fd5b5061039c60048036038101906103979190612cf4565b610bf7565b6040516103a99190612e6f565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612a64565b610cb8565b6040516103e69190612ad2565b60405180910390f35b3480156103fb57600080fd5b50610404610cca565b604051610411919061292e565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612e91565b610cdd565b60405161044e9190612962565b60405180910390f35b34801561046357600080fd5b5061046c610d71565b005b34801561047a57600080fd5b50610483610df9565b6040516104909190612962565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612a64565b610dff565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612e91565b610f58565b6040516104f69190612f7c565b60405180910390f35b34801561050b57600080fd5b5061051461109b565b6040516105219190612ad2565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190612a64565b6110c5565b005b34801561055f57600080fd5b5061056861117a565b6040516105759190612a16565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612f9e565b61120c565b6040516105b29190612f7c565b60405180910390f35b3480156105c757600080fd5b506105d0611418565b6040516105dd9190612962565b60405180910390f35b61060060048036038101906105fb9190612a64565b61141e565b005b34801561060e57600080fd5b506106296004803603810190610624919061301d565b611541565b005b34801561063757600080fd5b50610652600480360381019061064d9190613112565b6116b8565b005b34801561066057600080fd5b5061067b60048036038101906106769190612a64565b61172b565b60405161068891906131d7565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612a64565b611795565b6040516106c59190612a16565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613293565b611833565b005b34801561070357600080fd5b5061071e600480360381019061071991906132dc565b6118c9565b60405161072b919061292e565b60405180910390f35b34801561074057600080fd5b5061074961195d565b005b34801561075757600080fd5b50610760611a4b565b60405161076d9190612a16565b60405180910390f35b34801561078257600080fd5b5061079d60048036038101906107989190612e91565b611ad9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b6060600280546108469061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546108729061334b565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b60006108d482611bd0565b61090a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095082611c2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d6611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614610a3957610a02816109fd611cfb565b6118c9565b610a38576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610af5611d03565b6001546000540303905090565b610b0d838383611d08565b505050565b610b1a6120cd565b73ffffffffffffffffffffffffffffffffffffffff16610b3861109b565b73ffffffffffffffffffffffffffffffffffffffff1614610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906133c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610bd4573d6000803e3d6000fd5b50565b610bf2838383604051806020016040528060008152506116b8565b505050565b606060008251905060008167ffffffffffffffff811115610c1b57610c1a612bb1565b5b604051908082528060200260200182016040528015610c5457816020015b610c41612794565b815260200190600190039081610c395790505b50905060005b828114610cad57610c84858281518110610c7757610c766133e8565b5b602002602001015161172b565b828281518110610c9757610c966133e8565b5b6020026020010181905250806001019050610c5a565b508092505050919050565b6000610cc382611c2f565b9050919050565b600d60009054906101000a900460ff1681565b600080610ce9836120d5565b03610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d796120cd565b73ffffffffffffffffffffffffffffffffffffffff16610d9761109b565b73ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de4906133c8565b60405180910390fd5b610df760006120df565b565b600a5481565b610e076120cd565b73ffffffffffffffffffffffffffffffffffffffff16610e2561109b565b73ffffffffffffffffffffffffffffffffffffffff1614610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e72906133c8565b60405180910390fd5b600a54811115610eb7576040517fd65ac61e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b54610ec2610aeb565b82610ecd9190613446565b1115610f05576040517fb36c128400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60009054906101000a900460ff16610f4b576040517fb7b2409700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5533826121a5565b50565b60606000806000610f6885610cdd565b905060008167ffffffffffffffff811115610f8657610f85612bb1565b5b604051908082528060200260200182016040528015610fb45781602001602082028036833780820191505090505b509050610fbf612794565b6000610fc9611d03565b90505b83861461108d57610fdc816121c3565b9150816040015161108257600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461102757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110815780838780600101985081518110611074576110736133e8565b5b6020026020010181815250505b5b806001019050610fcc565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110cd6120cd565b73ffffffffffffffffffffffffffffffffffffffff166110eb61109b565b73ffffffffffffffffffffffffffffffffffffffff1614611141576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611138906133c8565b60405180910390fd5b806009819055506009547ff347ee99503bf19c028bd6b18f3c676e82a9bb5b2bb5225aebe0fd62fd6a0d1960405160405180910390a250565b6060600380546111899061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546111b59061334b565b80156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b5050505050905090565b6060818310611247576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806112526121ee565b905061125c611d03565b85101561126e5761126b611d03565b94505b8084111561127a578093505b600061128587610cdd565b9050848610156112a85760008686039050818110156112a2578091505b506112ad565b600090505b60008167ffffffffffffffff8111156112c9576112c8612bb1565b5b6040519080825280602002602001820160405280156112f75781602001602082028036833780820191505090505b5090506000820361130e5780945050505050611411565b60006113198861172b565b90506000816040015161132e57816000015190505b60008990505b8881141580156113445750848714155b1561140357611352816121c3565b925082604001516113f857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461139d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113f757808488806001019950815181106113ea576113e96133e8565b5b6020026020010181815250505b5b806001019050611334565b508583528296505050505050505b9392505050565b60095481565b8060095461142c919061349c565b3414611464576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a548111156114a0576040517fd65ac61e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546114ab610aeb565b826114b69190613446565b11156114ee576040517fb36c128400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60009054906101000a900460ff16611534576040517fb7b2409700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61153e33826121a5565b50565b611549611cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ad576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115ba611cfb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611667611cfb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ac919061292e565b60405180910390a35050565b6116c3848484611d08565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611725576116ee848484846121f7565b611724576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611733612794565b61173b612794565b611743611d03565b83108061175757506117536121ee565b8310155b156117655780915050611790565b61176e836121c3565b90508060400151156117835780915050611790565b61178c83612347565b9150505b919050565b60606117a082611bd0565b6117d6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117e0612367565b90506000815103611800576040518060200160405280600081525061182b565b8061180a846123f9565b60405160200161181b929190613532565b6040516020818303038152906040525b915050919050565b61183b6120cd565b73ffffffffffffffffffffffffffffffffffffffff1661185961109b565b73ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906133c8565b60405180910390fd5b80600c90805190602001906118c59291906127d7565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119656120cd565b73ffffffffffffffffffffffffffffffffffffffff1661198361109b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d0906133c8565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff0219169083151502179055507fcb01a83ed3bf63b2cb3676905d1c98debc05cc4f85a6d40ea441b3d0656fd0b7600d60009054906101000a900460ff16604051611a41919061292e565b60405180910390a1565b600c8054611a589061334b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a849061334b565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505081565b611ae16120cd565b73ffffffffffffffffffffffffffffffffffffffff16611aff61109b565b73ffffffffffffffffffffffffffffffffffffffff1614611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906133c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906135c8565b60405180910390fd5b611bcd816120df565b50565b600081611bdb611d03565b11158015611bea575060005482105b8015611c28575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c3e611d03565b11611cc457600054811015611cc35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cc1575b60008103611cb7576004600083600190039350838152602001908152602001600020549050611c8d565b8092505050611cf6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611d1382611c2f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611dd3611cfb565b73ffffffffffffffffffffffffffffffffffffffff161480611e025750611e0186611dfc611cfb565b6118c9565b5b80611e3f5750611e10611cfb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611e78576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e83866120d5565b03611eba576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ec78686866001612453565b6000611ed2836120d5565b14611f0e576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fd5876120d5565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361205d576000600185019050600060046000838152602001908152602001600020540361205b57600054811461205a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120c58686866001612459565b505050505050565b600033905090565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121bf82826040518060200160405280600081525061245f565b5050565b6121cb612794565b6121e760046000848152602001908152602001600020546126ee565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261221d611cfb565b8786866040518563ffffffff1660e01b815260040161223f949392919061363d565b6020604051808303816000875af192505050801561227b57506040513d601f19601f82011682018060405250810190612278919061369e565b60015b6122f4573d80600081146122ab576040519150601f19603f3d011682016040523d82523d6000602084013e6122b0565b606091505b5060008151036122ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61234f612794565b61236061235b83611c2f565b6126ee565b9050919050565b6060600c80546123769061334b565b80601f01602080910402602001604051908101604052809291908181526020018280546123a29061334b565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561243f57600183039250600a81066030018353600a8104905061241f565b508181036020830392508083525050919050565b50505050565b50505050565b6000805490506000612470856120d5565b036124a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036124e1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ee6000858386612453565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16125536001851461278a565b901b60a042901b612563866120d5565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612667575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261760008784806001019550876121f7565b61264d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125a857826000541461266257600080fd5b6126d2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612668575b8160008190555050506126e86000858386612459565b50505050565b6126f6612794565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546127e39061334b565b90600052602060002090601f016020900481019282612805576000855561284c565b82601f1061281e57805160ff191683800117855561284c565b8280016001018555821561284c579182015b8281111561284b578251825591602001919060010190612830565b5b509050612859919061285d565b5090565b5b8082111561287657600081600090555060010161285e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128c38161288e565b81146128ce57600080fd5b50565b6000813590506128e0816128ba565b92915050565b6000602082840312156128fc576128fb612884565b5b600061290a848285016128d1565b91505092915050565b60008115159050919050565b61292881612913565b82525050565b6000602082019050612943600083018461291f565b92915050565b6000819050919050565b61295c81612949565b82525050565b60006020820190506129776000830184612953565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129b757808201518184015260208101905061299c565b838111156129c6576000848401525b50505050565b6000601f19601f8301169050919050565b60006129e88261297d565b6129f28185612988565b9350612a02818560208601612999565b612a0b816129cc565b840191505092915050565b60006020820190508181036000830152612a3081846129dd565b905092915050565b612a4181612949565b8114612a4c57600080fd5b50565b600081359050612a5e81612a38565b92915050565b600060208284031215612a7a57612a79612884565b5b6000612a8884828501612a4f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b82525050565b6000602082019050612ae76000830184612ac3565b92915050565b612af681612ab1565b8114612b0157600080fd5b50565b600081359050612b1381612aed565b92915050565b60008060408385031215612b3057612b2f612884565b5b6000612b3e85828601612b04565b9250506020612b4f85828601612a4f565b9150509250929050565b600080600060608486031215612b7257612b71612884565b5b6000612b8086828701612b04565b9350506020612b9186828701612b04565b9250506040612ba286828701612a4f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612be9826129cc565b810181811067ffffffffffffffff82111715612c0857612c07612bb1565b5b80604052505050565b6000612c1b61287a565b9050612c278282612be0565b919050565b600067ffffffffffffffff821115612c4757612c46612bb1565b5b602082029050602081019050919050565b600080fd5b6000612c70612c6b84612c2c565b612c11565b90508083825260208201905060208402830185811115612c9357612c92612c58565b5b835b81811015612cbc5780612ca88882612a4f565b845260208401935050602081019050612c95565b5050509392505050565b600082601f830112612cdb57612cda612bac565b5b8135612ceb848260208601612c5d565b91505092915050565b600060208284031215612d0a57612d09612884565b5b600082013567ffffffffffffffff811115612d2857612d27612889565b5b612d3484828501612cc6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d7281612ab1565b82525050565b600067ffffffffffffffff82169050919050565b612d9581612d78565b82525050565b612da481612913565b82525050565b606082016000820151612dc06000850182612d69565b506020820151612dd36020850182612d8c565b506040820151612de66040850182612d9b565b50505050565b6000612df88383612daa565b60608301905092915050565b6000602082019050919050565b6000612e1c82612d3d565b612e268185612d48565b9350612e3183612d59565b8060005b83811015612e62578151612e498882612dec565b9750612e5483612e04565b925050600181019050612e35565b5085935050505092915050565b60006020820190508181036000830152612e898184612e11565b905092915050565b600060208284031215612ea757612ea6612884565b5b6000612eb584828501612b04565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ef381612949565b82525050565b6000612f058383612eea565b60208301905092915050565b6000602082019050919050565b6000612f2982612ebe565b612f338185612ec9565b9350612f3e83612eda565b8060005b83811015612f6f578151612f568882612ef9565b9750612f6183612f11565b925050600181019050612f42565b5085935050505092915050565b60006020820190508181036000830152612f968184612f1e565b905092915050565b600080600060608486031215612fb757612fb6612884565b5b6000612fc586828701612b04565b9350506020612fd686828701612a4f565b9250506040612fe786828701612a4f565b9150509250925092565b612ffa81612913565b811461300557600080fd5b50565b60008135905061301781612ff1565b92915050565b6000806040838503121561303457613033612884565b5b600061304285828601612b04565b925050602061305385828601613008565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561307d5761307c612bb1565b5b613086826129cc565b9050602081019050919050565b82818337600083830152505050565b60006130b56130b084613062565b612c11565b9050828152602081018484840111156130d1576130d061305d565b5b6130dc848285613093565b509392505050565b600082601f8301126130f9576130f8612bac565b5b81356131098482602086016130a2565b91505092915050565b6000806000806080858703121561312c5761312b612884565b5b600061313a87828801612b04565b945050602061314b87828801612b04565b935050604061315c87828801612a4f565b925050606085013567ffffffffffffffff81111561317d5761317c612889565b5b613189878288016130e4565b91505092959194509250565b6060820160008201516131ab6000850182612d69565b5060208201516131be6020850182612d8c565b5060408201516131d16040850182612d9b565b50505050565b60006060820190506131ec6000830184613195565b92915050565b600067ffffffffffffffff82111561320d5761320c612bb1565b5b613216826129cc565b9050602081019050919050565b6000613236613231846131f2565b612c11565b9050828152602081018484840111156132525761325161305d565b5b61325d848285613093565b509392505050565b600082601f83011261327a57613279612bac565b5b813561328a848260208601613223565b91505092915050565b6000602082840312156132a9576132a8612884565b5b600082013567ffffffffffffffff8111156132c7576132c6612889565b5b6132d384828501613265565b91505092915050565b600080604083850312156132f3576132f2612884565b5b600061330185828601612b04565b925050602061331285828601612b04565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061336357607f821691505b6020821081036133765761337561331c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133b2602083612988565b91506133bd8261337c565b602082019050919050565b600060208201905081810360008301526133e1816133a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061345182612949565b915061345c83612949565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561349157613490613417565b5b828201905092915050565b60006134a782612949565b91506134b283612949565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134eb576134ea613417565b5b828202905092915050565b600081905092915050565b600061350c8261297d565b61351681856134f6565b9350613526818560208601612999565b80840191505092915050565b600061353e8285613501565b915061354a8284613501565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135b2602683612988565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061360f826135e8565b61361981856135f3565b9350613629818560208601612999565b613632816129cc565b840191505092915050565b60006080820190506136526000830187612ac3565b61365f6020830186612ac3565b61366c6040830185612953565b818103606083015261367e8184613604565b905095945050505050565b600081519050613698816128ba565b92915050565b6000602082840312156136b4576136b3612884565b5b60006136c284828501613689565b9150509291505056fea2646970667358221220db057b2f0fca554a08894961582ead6a33f224ef6ebe0cee5045145eaa29b94b64736f6c634300080e0033
Deployed Bytecode Sourcemap
49916:1778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15139:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50072:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20162:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22230:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21690:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14193:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23116:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51463:107;;;;;;;;;;;;;:::i;:::-;;23357:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42064:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19951:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50146:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15818:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49099:103;;;;;;;;;;;;;:::i;:::-;;50026:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51172:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45876:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48448:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50443:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20331:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42922:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49984:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50817:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22506:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23613:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41485:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20506:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50719:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22885:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50571:140;;;;;;;;;;;;;:::i;:::-;;50115:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49357:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15139:615;15224:4;15539:10;15524:25;;:11;:25;;;;:102;;;;15616:10;15601:25;;:11;:25;;;;15524:102;:179;;;;15693:10;15678:25;;:11;:25;;;;15524:179;15504:199;;15139:615;;;:::o;50072:34::-;;;;:::o;20162:100::-;20216:13;20249:5;20242:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20162:100;:::o;22230:204::-;22298:7;22323:16;22331:7;22323;:16::i;:::-;22318:64;;22348:34;;;;;;;;;;;;;;22318:64;22402:15;:24;22418:7;22402:24;;;;;;;;;;;;;;;;;;;;;22395:31;;22230:204;;;:::o;21690:474::-;21763:13;21795:27;21814:7;21795:18;:27::i;:::-;21763:61;;21845:5;21839:11;;:2;:11;;;21835:48;;21859:24;;;;;;;;;;;;;;21835:48;21923:5;21900:28;;:19;:17;:19::i;:::-;:28;;;21896:175;;21948:44;21965:5;21972:19;:17;:19::i;:::-;21948:16;:44::i;:::-;21943:128;;22020:35;;;;;;;;;;;;;;21943:128;21896:175;22110:2;22083:15;:24;22099:7;22083:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22148:7;22144:2;22128:28;;22137:5;22128:28;;;;;;;;;;;;21752:412;21690:474;;:::o;14193:315::-;14246:7;14474:15;:13;:15::i;:::-;14459:12;;14443:13;;:28;:46;14436:53;;14193:315;:::o;23116:170::-;23250:28;23260:4;23266:2;23270:7;23250:9;:28::i;:::-;23116:170;;;:::o;51463:107::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51519:10:::1;51511:28;;:51;51540:21;51511:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51463:107::o:0;23357:185::-;23495:39;23512:4;23518:2;23522:7;23495:39;;;;;;;;;;;;:16;:39::i;:::-;23357:185;;;:::o;42064:468::-;42153:23;42214:22;42239:8;:15;42214:40;;42269:34;42327:14;42306:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42269:73;;42362:9;42357:125;42378:14;42373:1;:19;42357:125;;42434:32;42454:8;42463:1;42454:11;;;;;;;;:::i;:::-;;;;;;;;42434:19;:32::i;:::-;42418:10;42429:1;42418:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;42394:3;;;;;42357:125;;;;42503:10;42496:17;;;;42064:468;;;:::o;19951:144::-;20015:7;20058:27;20077:7;20058:18;:27::i;:::-;20035:52;;19951:144;;;:::o;50146:22::-;;;;;;;;;;;;;:::o;15818:234::-;15882:7;15934:1;15906:24;15924:5;15906:17;:24::i;:::-;:29;15902:70;;15944:28;;;;;;;;;;;;;;15902:70;11163:13;15990:18;:25;16009:5;15990:25;;;;;;;;;;;;;;;;:54;15983:61;;15818:234;;;:::o;49099:103::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49164:30:::1;49191:1;49164:18;:30::i;:::-;49099:103::o:0;50026:39::-;;;;:::o;51172:283::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51247:18:::1;;51238:6;:27;51234:49;;;51274:9;;;;;;;;;;;;;;51234:49;51323:13;;51307;:11;:13::i;:::-;51298:6;:22;;;;:::i;:::-;:38;51294:62;;;51345:11;;;;;;;;;;;;;;51294:62;51371:10;;;;;;;;;;;51367:38;;51390:15;;;;;;;;;;;;;;51367:38;51418:29;51428:10;51440:6;51418:9;:29::i;:::-;51172:283:::0;:::o;45876:892::-;45946:16;46000:19;46034:25;46074:22;46099:16;46109:5;46099:9;:16::i;:::-;46074:41;;46130:25;46172:14;46158:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46130:57;;46202:31;;:::i;:::-;46253:9;46265:15;:13;:15::i;:::-;46253:27;;46248:472;46297:14;46282:11;:29;46248:472;;46349:15;46362:1;46349:12;:15::i;:::-;46337:27;;46387:9;:16;;;46428:8;46383:73;46504:1;46478:28;;:9;:14;;;:28;;;46474:111;;46551:9;:14;;;46531:34;;46474:111;46628:5;46607:26;;:17;:26;;;46603:102;;46684:1;46658:8;46667:13;;;;;;46658:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;46603:102;46248:472;46313:3;;;;;46248:472;;;;46741:8;46734:15;;;;;;;45876:892;;;:::o;48448:87::-;48494:7;48521:6;;;;;;;;;;;48514:13;;48448:87;:::o;50443:120::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50513:6:::1;50505:5;:14;;;;50549:5;;50537:18;;;;;;;;;;50443:120:::0;:::o;20331:104::-;20387:13;20420:7;20413:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20331:104;:::o;42922:2505::-;43057:16;43124:4;43115:5;:13;43111:45;;43137:19;;;;;;;;;;;;;;43111:45;43171:19;43205:17;43225:14;:12;:14::i;:::-;43205:34;;43325:15;:13;:15::i;:::-;43317:5;:23;43313:87;;;43369:15;:13;:15::i;:::-;43361:23;;43313:87;43476:9;43469:4;:16;43465:73;;;43513:9;43506:16;;43465:73;43552:25;43580:16;43590:5;43580:9;:16::i;:::-;43552:44;;43774:4;43766:5;:12;43762:278;;;43799:19;43828:5;43821:4;:12;43799:34;;43870:17;43856:11;:31;43852:111;;;43932:11;43912:31;;43852:111;43780:198;43762:278;;;44023:1;44003:21;;43762:278;44054:25;44096:17;44082:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44054:60;;44154:1;44133:17;:22;44129:78;;44183:8;44176:15;;;;;;;;44129:78;44351:31;44385:26;44405:5;44385:19;:26::i;:::-;44351:60;;44426:25;44671:9;:16;;;44666:92;;44728:9;:14;;;44708:34;;44666:92;44777:9;44789:5;44777:17;;44772:478;44801:4;44796:1;:9;;:45;;;;;44824:17;44809:11;:32;;44796:45;44772:478;;;44879:15;44892:1;44879:12;:15::i;:::-;44867:27;;44917:9;:16;;;44958:8;44913:73;45034:1;45008:28;;:9;:14;;;:28;;;45004:111;;45081:9;:14;;;45061:34;;45004:111;45158:5;45137:26;;:17;:26;;;45133:102;;45214:1;45188:8;45197:13;;;;;;45188:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;45133:102;44772:478;44843:3;;;;;44772:478;;;;45352:11;45342:8;45335:29;45400:8;45393:15;;;;;;;;42922:2505;;;;;;:::o;49984:35::-;;;;:::o;50817:347::-;50898:6;50890:5;;:14;;;;:::i;:::-;50877:9;:27;50873:59;;50913:19;;;;;;;;;;;;;;50873:59;50956:18;;50947:6;:27;50943:49;;;50983:9;;;;;;;;;;;;;;50943:49;51032:13;;51016;:11;:13::i;:::-;51007:6;:22;;;;:::i;:::-;:38;51003:62;;;51054:11;;;;;;;;;;;;;;51003:62;51080:10;;;;;;;;;;;51076:38;;51099:15;;;;;;;;;;;;;;51076:38;51127:29;51137:10;51149:6;51127:9;:29::i;:::-;50817:347;:::o;22506:308::-;22617:19;:17;:19::i;:::-;22605:31;;:8;:31;;;22601:61;;22645:17;;;;;;;;;;;;;;22601:61;22727:8;22675:18;:39;22694:19;:17;:19::i;:::-;22675:39;;;;;;;;;;;;;;;:49;22715:8;22675:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22787:8;22751:55;;22766:19;:17;:19::i;:::-;22751:55;;;22797:8;22751:55;;;;;;:::i;:::-;;;;;;;;22506:308;;:::o;23613:396::-;23780:28;23790:4;23796:2;23800:7;23780:9;:28::i;:::-;23841:1;23823:2;:14;;;:19;23819:183;;23862:56;23893:4;23899:2;23903:7;23912:5;23862:30;:56::i;:::-;23857:145;;23946:40;;;;;;;;;;;;;;23857:145;23819:183;23613:396;;;;:::o;41485:420::-;41561:21;;:::i;:::-;41595:31;;:::i;:::-;41651:15;:13;:15::i;:::-;41641:7;:25;:54;;;;41681:14;:12;:14::i;:::-;41670:7;:25;;41641:54;41637:103;;;41719:9;41712:16;;;;;41637:103;41762:21;41775:7;41762:12;:21::i;:::-;41750:33;;41798:9;:16;;;41794:65;;;41838:9;41831:16;;;;;41794:65;41876:21;41889:7;41876:12;:21::i;:::-;41869:28;;;41485:420;;;;:::o;20506:318::-;20579:13;20610:16;20618:7;20610;:16::i;:::-;20605:59;;20635:29;;;;;;;;;;;;;;20605:59;20677:21;20701:10;:8;:10::i;:::-;20677:34;;20754:1;20735:7;20729:21;:26;:87;;;;;;;;;;;;;;;;;20782:7;20791:18;20801:7;20791:9;:18::i;:::-;20765:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20729:87;20722:94;;;20506:318;;;:::o;50719:90::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50798:3:::1;50787:8;:14;;;;;;;;;;;;:::i;:::-;;50719:90:::0;:::o;22885:164::-;22982:4;23006:18;:25;23025:5;23006:25;;;;;;;;;;;;;;;:35;23032:8;23006:35;;;;;;;;;;;;;;;;;;;;;;;;;22999:42;;22885:164;;;;:::o;50571:140::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50640:10:::1;;;;;;;;;;;50639:11;50626:10;;:24;;;;;;;;;;;;;;;;;;50676:27;50692:10;;;;;;;;;;;50676:27;;;;;;:::i;:::-;;;;;;;;50571:140::o:0;50115:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49357:201::-;48679:12;:10;:12::i;:::-;48668:23;;:7;:5;:7::i;:::-;:23;;;48660:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49466:1:::1;49446:22;;:8;:22;;::::0;49438:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49522:28;49541:8;49522:18;:28::i;:::-;49357:201:::0;:::o;24264:273::-;24321:4;24377:7;24358:15;:13;:15::i;:::-;:26;;:66;;;;;24411:13;;24401:7;:23;24358:66;:152;;;;;24509:1;11933:8;24462:17;:26;24480:7;24462:26;;;;;;;;;;;;:43;:48;24358:152;24338:172;;24264:273;;;:::o;17466:1129::-;17533:7;17553:12;17568:7;17553:22;;17636:4;17617:15;:13;:15::i;:::-;:23;17613:915;;17670:13;;17663:4;:20;17659:869;;;17708:14;17725:17;:23;17743:4;17725:23;;;;;;;;;;;;17708:40;;17841:1;11933:8;17814:6;:23;:28;17810:699;;18333:113;18350:1;18340:6;:11;18333:113;;18393:17;:25;18411:6;;;;;;;18393:25;;;;;;;;;;;;18384:34;;18333:113;;;18479:6;18472:13;;;;;;17810:699;17685:843;17659:869;17613:915;18556:31;;;;;;;;;;;;;;17466:1129;;;;:::o;38531:105::-;38591:7;38618:10;38611:17;;38531:105;:::o;13717:92::-;13773:7;13717:92;:::o;29523:2654::-;29638:27;29668;29687:7;29668:18;:27::i;:::-;29638:57;;29753:4;29712:45;;29728:19;29712:45;;;29708:86;;29766:28;;;;;;;;;;;;;;29708:86;29807:23;29833:15;:24;29849:7;29833:24;;;;;;;;;;;;;;;;;;;;;29807:50;;29870:22;29919:4;29896:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;29940:43;29957:4;29963:19;:17;:19::i;:::-;29940:16;:43::i;:::-;29896:87;:142;;;;30019:19;:17;:19::i;:::-;30000:38;;:15;:38;;;29896:142;29870:169;;30057:17;30052:66;;30083:35;;;;;;;;;;;;;;30052:66;30158:1;30133:21;30151:2;30133:17;:21::i;:::-;:26;30129:62;;30168:23;;;;;;;;;;;;;;30129:62;30204:43;30226:4;30232:2;30236:7;30245:1;30204:21;:43::i;:::-;30355:1;30317:34;30335:15;30317:17;:34::i;:::-;:39;30313:103;;30380:15;:24;30396:7;30380:24;;;;;;;;;;;;30373:31;;;;;;;;;;;30313:103;30783:18;:24;30802:4;30783:24;;;;;;;;;;;;;;;;30781:26;;;;;;;;;;;;30852:18;:22;30871:2;30852:22;;;;;;;;;;;;;;;;30850:24;;;;;;;;;;;12211:8;11817:3;31233:15;:41;;31191:21;31209:2;31191:17;:21::i;:::-;:84;:128;31145:17;:26;31163:7;31145:26;;;;;;;;;;;:174;;;;31489:1;12211:8;31439:19;:46;:51;31435:626;;31511:19;31543:1;31533:7;:11;31511:33;;31700:1;31666:17;:30;31684:11;31666:30;;;;;;;;;;;;:35;31662:384;;31804:13;;31789:11;:28;31785:242;;31984:19;31951:17;:30;31969:11;31951:30;;;;;;;;;;;:52;;;;31785:242;31662:384;31492:569;31435:626;32108:7;32104:2;32089:27;;32098:4;32089:27;;;;;;;;;;;;32127:42;32148:4;32154:2;32158:7;32167:1;32127:20;:42::i;:::-;29627:2550;;;29523:2654;;;:::o;47315:98::-;47368:7;47395:10;47388:17;;47315:98;:::o;21251:148::-;21315:14;21376:5;21366:15;;21251:148;;;:::o;49718:191::-;49792:16;49811:6;;;;;;;;;;;49792:25;;49837:8;49828:6;;:17;;;;;;;;;;;;;;;;;;49892:8;49861:40;;49882:8;49861:40;;;;;;;;;;;;49781:128;49718:191;:::o;24621:104::-;24690:27;24700:2;24704:8;24690:27;;;;;;;;;;;;:9;:27::i;:::-;24621:104;;:::o;19075:153::-;19135:21;;:::i;:::-;19176:44;19195:17;:24;19213:5;19195:24;;;;;;;;;;;;19176:18;:44::i;:::-;19169:51;;19075:153;;;:::o;13888:95::-;13935:7;13962:13;;13955:20;;13888:95;:::o;36000:716::-;36163:4;36209:2;36184:45;;;36230:19;:17;:19::i;:::-;36251:4;36257:7;36266:5;36184:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36180:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36484:1;36467:6;:13;:18;36463:235;;36513:40;;;;;;;;;;;;;;36463:235;36656:6;36650:13;36641:6;36637:2;36633:15;36626:38;36180:529;36353:54;;;36343:64;;;:6;:64;;;;36336:71;;;36000:716;;;;;;:::o;19731:158::-;19793:21;;:::i;:::-;19834:47;19853:27;19872:7;19853:18;:27::i;:::-;19834:18;:47::i;:::-;19827:54;;19731:158;;;:::o;51578:109::-;51638:13;51671:8;51664:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51578:109;:::o;38742:1943::-;38799:17;39218:3;39211:4;39205:11;39201:21;39194:28;;39309:3;39303:4;39296:17;39415:3;39871:5;40001:1;39996:3;39992:11;39985:18;;40138:2;40132:4;40128:13;40124:2;40120:22;40115:3;40107:36;40179:2;40173:4;40169:13;40161:21;;39763:680;40198:4;39763:680;;;40372:1;40367:3;40363:11;40356:18;;40423:2;40417:4;40413:13;40409:2;40405:22;40400:3;40392:36;40293:2;40287:4;40283:13;40275:21;;39763:680;;;39767:430;40482:3;40477;40473:13;40597:2;40592:3;40588:12;40581:19;;40660:6;40655:3;40648:19;38838:1840;;38742:1943;;;:::o;37364:159::-;;;;;:::o;38182:158::-;;;;;:::o;25098:2246::-;25221:20;25244:13;;25221:36;;25297:1;25272:21;25290:2;25272:17;:21::i;:::-;:26;25268:58;;25307:19;;;;;;;;;;;;;;25268:58;25353:1;25341:8;:13;25337:44;;25363:18;;;;;;;;;;;;;;25337:44;25394:61;25424:1;25428:2;25432:12;25446:8;25394:21;:61::i;:::-;25998:1;11300:2;25969:1;:25;;25968:31;25956:8;:44;25930:18;:22;25949:2;25930:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;12076:3;26399:29;26426:1;26414:8;:13;26399:14;:29::i;:::-;:56;;11817:3;26336:15;:41;;26294:21;26312:2;26294:17;:21::i;:::-;:84;:162;26243:17;:31;26261:12;26243:31;;;;;;;;;;;:213;;;;26473:20;26496:12;26473:35;;26523:11;26552:8;26537:12;:23;26523:37;;26599:1;26581:2;:14;;;:19;26577:635;;26621:313;26677:12;26673:2;26652:38;;26669:1;26652:38;;;;;;;;;;;;26718:69;26757:1;26761:2;26765:14;;;;;;26781:5;26718:30;:69::i;:::-;26713:174;;26823:40;;;;;;;;;;;;;;26713:174;26929:3;26914:12;:18;26621:313;;27015:12;26998:13;;:29;26994:43;;27029:8;;;26994:43;26577:635;;;27078:119;27134:14;;;;;;27130:2;27109:40;;27126:1;27109:40;;;;;;;;;;;;27192:3;27177:12;:18;27078:119;;26577:635;27242:12;27226:13;:28;;;;25707:1559;;27276:60;27305:1;27309:2;27313:12;27327:8;27276:20;:60::i;:::-;25210:2134;25098:2246;;;:::o;18689:295::-;18755:31;;:::i;:::-;18832:6;18799:9;:14;;:41;;;;;;;;;;;11817:3;18885:6;:32;;18851:9;:24;;:67;;;;;;;;;;;18975:1;11933:8;18948:6;:23;:28;;18929:9;:16;;:47;;;;;;;;;;;18689:295;;;:::o;21486:142::-;21544:14;21605:5;21595:15;;21486:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:180;6086:77;6083:1;6076:88;6183:4;6180:1;6173:15;6207:4;6204:1;6197:15;6224:281;6307:27;6329:4;6307:27;:::i;:::-;6299:6;6295:40;6437:6;6425:10;6422:22;6401:18;6389:10;6386:34;6383:62;6380:88;;;6448:18;;:::i;:::-;6380:88;6488:10;6484:2;6477:22;6267:238;6224:281;;:::o;6511:129::-;6545:6;6572:20;;:::i;:::-;6562:30;;6601:33;6629:4;6621:6;6601:33;:::i;:::-;6511:129;;;:::o;6646:311::-;6723:4;6813:18;6805:6;6802:30;6799:56;;;6835:18;;:::i;:::-;6799:56;6885:4;6877:6;6873:17;6865:25;;6945:4;6939;6935:15;6927:23;;6646:311;;;:::o;6963:117::-;7072:1;7069;7062:12;7103:710;7199:5;7224:81;7240:64;7297:6;7240:64;:::i;:::-;7224:81;:::i;:::-;7215:90;;7325:5;7354:6;7347:5;7340:21;7388:4;7381:5;7377:16;7370:23;;7441:4;7433:6;7429:17;7421:6;7417:30;7470:3;7462:6;7459:15;7456:122;;;7489:79;;:::i;:::-;7456:122;7604:6;7587:220;7621:6;7616:3;7613:15;7587:220;;;7696:3;7725:37;7758:3;7746:10;7725:37;:::i;:::-;7720:3;7713:50;7792:4;7787:3;7783:14;7776:21;;7663:144;7647:4;7642:3;7638:14;7631:21;;7587:220;;;7591:21;7205:608;;7103:710;;;;;:::o;7836:370::-;7907:5;7956:3;7949:4;7941:6;7937:17;7933:27;7923:122;;7964:79;;:::i;:::-;7923:122;8081:6;8068:20;8106:94;8196:3;8188:6;8181:4;8173:6;8169:17;8106:94;:::i;:::-;8097:103;;7913:293;7836:370;;;;:::o;8212:539::-;8296:6;8345:2;8333:9;8324:7;8320:23;8316:32;8313:119;;;8351:79;;:::i;:::-;8313:119;8499:1;8488:9;8484:17;8471:31;8529:18;8521:6;8518:30;8515:117;;;8551:79;;:::i;:::-;8515:117;8656:78;8726:7;8717:6;8706:9;8702:22;8656:78;:::i;:::-;8646:88;;8442:302;8212:539;;;;:::o;8757:144::-;8854:6;8888:5;8882:12;8872:22;;8757:144;;;:::o;8907:214::-;9036:11;9070:6;9065:3;9058:19;9110:4;9105:3;9101:14;9086:29;;8907:214;;;;:::o;9127:162::-;9224:4;9247:3;9239:11;;9277:4;9272:3;9268:14;9260:22;;9127:162;;;:::o;9295:108::-;9372:24;9390:5;9372:24;:::i;:::-;9367:3;9360:37;9295:108;;:::o;9409:101::-;9445:7;9485:18;9478:5;9474:30;9463:41;;9409:101;;;:::o;9516:105::-;9591:23;9608:5;9591:23;:::i;:::-;9586:3;9579:36;9516:105;;:::o;9627:99::-;9698:21;9713:5;9698:21;:::i;:::-;9693:3;9686:34;9627:99;;:::o;9804:685::-;9951:4;9946:3;9942:14;10038:4;10031:5;10027:16;10021:23;10057:63;10114:4;10109:3;10105:14;10091:12;10057:63;:::i;:::-;9966:164;10222:4;10215:5;10211:16;10205:23;10241:61;10296:4;10291:3;10287:14;10273:12;10241:61;:::i;:::-;10140:172;10396:4;10389:5;10385:16;10379:23;10415:57;10466:4;10461:3;10457:14;10443:12;10415:57;:::i;:::-;10322:160;9920:569;9804:685;;:::o;10495:299::-;10624:10;10645:106;10747:3;10739:6;10645:106;:::i;:::-;10783:4;10778:3;10774:14;10760:28;;10495:299;;;;:::o;10800:143::-;10900:4;10932;10927:3;10923:14;10915:22;;10800:143;;;:::o;11025:972::-;11204:3;11233:84;11311:5;11233:84;:::i;:::-;11333:116;11442:6;11437:3;11333:116;:::i;:::-;11326:123;;11473:86;11553:5;11473:86;:::i;:::-;11582:7;11613:1;11598:374;11623:6;11620:1;11617:13;11598:374;;;11699:6;11693:13;11726:123;11845:3;11830:13;11726:123;:::i;:::-;11719:130;;11872:90;11955:6;11872:90;:::i;:::-;11862:100;;11658:314;11645:1;11642;11638:9;11633:14;;11598:374;;;11602:14;11988:3;11981:10;;11209:788;;;11025:972;;;;:::o;12003:493::-;12206:4;12244:2;12233:9;12229:18;12221:26;;12293:9;12287:4;12283:20;12279:1;12268:9;12264:17;12257:47;12321:168;12484:4;12475:6;12321:168;:::i;:::-;12313:176;;12003:493;;;;:::o;12502:329::-;12561:6;12610:2;12598:9;12589:7;12585:23;12581:32;12578:119;;;12616:79;;:::i;:::-;12578:119;12736:1;12761:53;12806:7;12797:6;12786:9;12782:22;12761:53;:::i;:::-;12751:63;;12707:117;12502:329;;;;:::o;12837:114::-;12904:6;12938:5;12932:12;12922:22;;12837:114;;;:::o;12957:184::-;13056:11;13090:6;13085:3;13078:19;13130:4;13125:3;13121:14;13106:29;;12957:184;;;;:::o;13147:132::-;13214:4;13237:3;13229:11;;13267:4;13262:3;13258:14;13250:22;;13147:132;;;:::o;13285:108::-;13362:24;13380:5;13362:24;:::i;:::-;13357:3;13350:37;13285:108;;:::o;13399:179::-;13468:10;13489:46;13531:3;13523:6;13489:46;:::i;:::-;13567:4;13562:3;13558:14;13544:28;;13399:179;;;;:::o;13584:113::-;13654:4;13686;13681:3;13677:14;13669:22;;13584:113;;;:::o;13733:732::-;13852:3;13881:54;13929:5;13881:54;:::i;:::-;13951:86;14030:6;14025:3;13951:86;:::i;:::-;13944:93;;14061:56;14111:5;14061:56;:::i;:::-;14140:7;14171:1;14156:284;14181:6;14178:1;14175:13;14156:284;;;14257:6;14251:13;14284:63;14343:3;14328:13;14284:63;:::i;:::-;14277:70;;14370:60;14423:6;14370:60;:::i;:::-;14360:70;;14216:224;14203:1;14200;14196:9;14191:14;;14156:284;;;14160:14;14456:3;14449:10;;13857:608;;;13733:732;;;;:::o;14471:373::-;14614:4;14652:2;14641:9;14637:18;14629:26;;14701:9;14695:4;14691:20;14687:1;14676:9;14672:17;14665:47;14729:108;14832:4;14823:6;14729:108;:::i;:::-;14721:116;;14471:373;;;;:::o;14850:619::-;14927:6;14935;14943;14992:2;14980:9;14971:7;14967:23;14963:32;14960:119;;;14998:79;;:::i;:::-;14960:119;15118:1;15143:53;15188:7;15179:6;15168:9;15164:22;15143:53;:::i;:::-;15133:63;;15089:117;15245:2;15271:53;15316:7;15307:6;15296:9;15292:22;15271:53;:::i;:::-;15261:63;;15216:118;15373:2;15399:53;15444:7;15435:6;15424:9;15420:22;15399:53;:::i;:::-;15389:63;;15344:118;14850:619;;;;;:::o;15475:116::-;15545:21;15560:5;15545:21;:::i;:::-;15538:5;15535:32;15525:60;;15581:1;15578;15571:12;15525:60;15475:116;:::o;15597:133::-;15640:5;15678:6;15665:20;15656:29;;15694:30;15718:5;15694:30;:::i;:::-;15597:133;;;;:::o;15736:468::-;15801:6;15809;15858:2;15846:9;15837:7;15833:23;15829:32;15826:119;;;15864:79;;:::i;:::-;15826:119;15984:1;16009:53;16054:7;16045:6;16034:9;16030:22;16009:53;:::i;:::-;15999:63;;15955:117;16111:2;16137:50;16179:7;16170:6;16159:9;16155:22;16137:50;:::i;:::-;16127:60;;16082:115;15736:468;;;;;:::o;16210:117::-;16319:1;16316;16309:12;16333:307;16394:4;16484:18;16476:6;16473:30;16470:56;;;16506:18;;:::i;:::-;16470:56;16544:29;16566:6;16544:29;:::i;:::-;16536:37;;16628:4;16622;16618:15;16610:23;;16333:307;;;:::o;16646:154::-;16730:6;16725:3;16720;16707:30;16792:1;16783:6;16778:3;16774:16;16767:27;16646:154;;;:::o;16806:410::-;16883:5;16908:65;16924:48;16965:6;16924:48;:::i;:::-;16908:65;:::i;:::-;16899:74;;16996:6;16989:5;16982:21;17034:4;17027:5;17023:16;17072:3;17063:6;17058:3;17054:16;17051:25;17048:112;;;17079:79;;:::i;:::-;17048:112;17169:41;17203:6;17198:3;17193;17169:41;:::i;:::-;16889:327;16806:410;;;;;:::o;17235:338::-;17290:5;17339:3;17332:4;17324:6;17320:17;17316:27;17306:122;;17347:79;;:::i;:::-;17306:122;17464:6;17451:20;17489:78;17563:3;17555:6;17548:4;17540:6;17536:17;17489:78;:::i;:::-;17480:87;;17296:277;17235:338;;;;:::o;17579:943::-;17674:6;17682;17690;17698;17747:3;17735:9;17726:7;17722:23;17718:33;17715:120;;;17754:79;;:::i;:::-;17715:120;17874:1;17899:53;17944:7;17935:6;17924:9;17920:22;17899:53;:::i;:::-;17889:63;;17845:117;18001:2;18027:53;18072:7;18063:6;18052:9;18048:22;18027:53;:::i;:::-;18017:63;;17972:118;18129:2;18155:53;18200:7;18191:6;18180:9;18176:22;18155:53;:::i;:::-;18145:63;;18100:118;18285:2;18274:9;18270:18;18257:32;18316:18;18308:6;18305:30;18302:117;;;18338:79;;:::i;:::-;18302:117;18443:62;18497:7;18488:6;18477:9;18473:22;18443:62;:::i;:::-;18433:72;;18228:287;17579:943;;;;;;;:::o;18600:695::-;18757:4;18752:3;18748:14;18844:4;18837:5;18833:16;18827:23;18863:63;18920:4;18915:3;18911:14;18897:12;18863:63;:::i;:::-;18772:164;19028:4;19021:5;19017:16;19011:23;19047:61;19102:4;19097:3;19093:14;19079:12;19047:61;:::i;:::-;18946:172;19202:4;19195:5;19191:16;19185:23;19221:57;19272:4;19267:3;19263:14;19249:12;19221:57;:::i;:::-;19128:160;18726:569;18600:695;;:::o;19301:342::-;19454:4;19492:2;19481:9;19477:18;19469:26;;19505:131;19633:1;19622:9;19618:17;19609:6;19505:131;:::i;:::-;19301:342;;;;:::o;19649:308::-;19711:4;19801:18;19793:6;19790:30;19787:56;;;19823:18;;:::i;:::-;19787:56;19861:29;19883:6;19861:29;:::i;:::-;19853:37;;19945:4;19939;19935:15;19927:23;;19649:308;;;:::o;19963:412::-;20041:5;20066:66;20082:49;20124:6;20082:49;:::i;:::-;20066:66;:::i;:::-;20057:75;;20155:6;20148:5;20141:21;20193:4;20186:5;20182:16;20231:3;20222:6;20217:3;20213:16;20210:25;20207:112;;;20238:79;;:::i;:::-;20207:112;20328:41;20362:6;20357:3;20352;20328:41;:::i;:::-;20047:328;19963:412;;;;;:::o;20395:340::-;20451:5;20500:3;20493:4;20485:6;20481:17;20477:27;20467:122;;20508:79;;:::i;:::-;20467:122;20625:6;20612:20;20650:79;20725:3;20717:6;20710:4;20702:6;20698:17;20650:79;:::i;:::-;20641:88;;20457:278;20395:340;;;;:::o;20741:509::-;20810:6;20859:2;20847:9;20838:7;20834:23;20830:32;20827:119;;;20865:79;;:::i;:::-;20827:119;21013:1;21002:9;20998:17;20985:31;21043:18;21035:6;21032:30;21029:117;;;21065:79;;:::i;:::-;21029:117;21170:63;21225:7;21216:6;21205:9;21201:22;21170:63;:::i;:::-;21160:73;;20956:287;20741:509;;;;:::o;21256:474::-;21324:6;21332;21381:2;21369:9;21360:7;21356:23;21352:32;21349:119;;;21387:79;;:::i;:::-;21349:119;21507:1;21532:53;21577:7;21568:6;21557:9;21553:22;21532:53;:::i;:::-;21522:63;;21478:117;21634:2;21660:53;21705:7;21696:6;21685:9;21681:22;21660:53;:::i;:::-;21650:63;;21605:118;21256:474;;;;;:::o;21736:180::-;21784:77;21781:1;21774:88;21881:4;21878:1;21871:15;21905:4;21902:1;21895:15;21922:320;21966:6;22003:1;21997:4;21993:12;21983:22;;22050:1;22044:4;22040:12;22071:18;22061:81;;22127:4;22119:6;22115:17;22105:27;;22061:81;22189:2;22181:6;22178:14;22158:18;22155:38;22152:84;;22208:18;;:::i;:::-;22152:84;21973:269;21922:320;;;:::o;22248:182::-;22388:34;22384:1;22376:6;22372:14;22365:58;22248:182;:::o;22436:366::-;22578:3;22599:67;22663:2;22658:3;22599:67;:::i;:::-;22592:74;;22675:93;22764:3;22675:93;:::i;:::-;22793:2;22788:3;22784:12;22777:19;;22436:366;;;:::o;22808:419::-;22974:4;23012:2;23001:9;22997:18;22989:26;;23061:9;23055:4;23051:20;23047:1;23036:9;23032:17;23025:47;23089:131;23215:4;23089:131;:::i;:::-;23081:139;;22808:419;;;:::o;23233:180::-;23281:77;23278:1;23271:88;23378:4;23375:1;23368:15;23402:4;23399:1;23392:15;23419:180;23467:77;23464:1;23457:88;23564:4;23561:1;23554:15;23588:4;23585:1;23578:15;23605:305;23645:3;23664:20;23682:1;23664:20;:::i;:::-;23659:25;;23698:20;23716:1;23698:20;:::i;:::-;23693:25;;23852:1;23784:66;23780:74;23777:1;23774:81;23771:107;;;23858:18;;:::i;:::-;23771:107;23902:1;23899;23895:9;23888:16;;23605:305;;;;:::o;23916:348::-;23956:7;23979:20;23997:1;23979:20;:::i;:::-;23974:25;;24013:20;24031:1;24013:20;:::i;:::-;24008:25;;24201:1;24133:66;24129:74;24126:1;24123:81;24118:1;24111:9;24104:17;24100:105;24097:131;;;24208:18;;:::i;:::-;24097:131;24256:1;24253;24249:9;24238:20;;23916:348;;;;:::o;24270:148::-;24372:11;24409:3;24394:18;;24270:148;;;;:::o;24424:377::-;24530:3;24558:39;24591:5;24558:39;:::i;:::-;24613:89;24695:6;24690:3;24613:89;:::i;:::-;24606:96;;24711:52;24756:6;24751:3;24744:4;24737:5;24733:16;24711:52;:::i;:::-;24788:6;24783:3;24779:16;24772:23;;24534:267;24424:377;;;;:::o;24807:435::-;24987:3;25009:95;25100:3;25091:6;25009:95;:::i;:::-;25002:102;;25121:95;25212:3;25203:6;25121:95;:::i;:::-;25114:102;;25233:3;25226:10;;24807:435;;;;;:::o;25248:225::-;25388:34;25384:1;25376:6;25372:14;25365:58;25457:8;25452:2;25444:6;25440:15;25433:33;25248:225;:::o;25479:366::-;25621:3;25642:67;25706:2;25701:3;25642:67;:::i;:::-;25635:74;;25718:93;25807:3;25718:93;:::i;:::-;25836:2;25831:3;25827:12;25820:19;;25479:366;;;:::o;25851:419::-;26017:4;26055:2;26044:9;26040:18;26032:26;;26104:9;26098:4;26094:20;26090:1;26079:9;26075:17;26068:47;26132:131;26258:4;26132:131;:::i;:::-;26124:139;;25851:419;;;:::o;26276:98::-;26327:6;26361:5;26355:12;26345:22;;26276:98;;;:::o;26380:168::-;26463:11;26497:6;26492:3;26485:19;26537:4;26532:3;26528:14;26513:29;;26380:168;;;;:::o;26554:360::-;26640:3;26668:38;26700:5;26668:38;:::i;:::-;26722:70;26785:6;26780:3;26722:70;:::i;:::-;26715:77;;26801:52;26846:6;26841:3;26834:4;26827:5;26823:16;26801:52;:::i;:::-;26878:29;26900:6;26878:29;:::i;:::-;26873:3;26869:39;26862:46;;26644:270;26554:360;;;;:::o;26920:640::-;27115:4;27153:3;27142:9;27138:19;27130:27;;27167:71;27235:1;27224:9;27220:17;27211:6;27167:71;:::i;:::-;27248:72;27316:2;27305:9;27301:18;27292:6;27248:72;:::i;:::-;27330;27398:2;27387:9;27383:18;27374:6;27330:72;:::i;:::-;27449:9;27443:4;27439:20;27434:2;27423:9;27419:18;27412:48;27477:76;27548:4;27539:6;27477:76;:::i;:::-;27469:84;;26920:640;;;;;;;:::o;27566:141::-;27622:5;27653:6;27647:13;27638:22;;27669:32;27695:5;27669:32;:::i;:::-;27566:141;;;;:::o;27713:349::-;27782:6;27831:2;27819:9;27810:7;27806:23;27802:32;27799:119;;;27837:79;;:::i;:::-;27799:119;27957:1;27982:63;28037:7;28028:6;28017:9;28013:22;27982:63;:::i;:::-;27972:73;;27928:127;27713:349;;;;:::o
Swarm Source
ipfs://db057b2f0fca554a08894961582ead6a33f224ef6ebe0cee5045145eaa29b94b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,243.61 | 0.0001 | $0.324361 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.