Token Energizer
Overview CRC721
Total Supply:
2,389 NRJZ
Holders:
186 addresses
Contract:
Balance
2 NRJZ
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Energizer
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-09-04 */ /** *Submitted for verification at cronoscan.com on 2022-08-23 */ // SPDX-License-Identifier: MIT // File: contracts/ERC721A/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.14; /** * @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(); /** * 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(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); 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; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: contracts/ERC721A/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // 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` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary 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 auxiliary 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; // Cast `aux` with assembly to avoid redundant masking. assembly { 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; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * 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 Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); 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-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 { transferFrom(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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @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 transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // 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)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // 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 Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/ERC721A/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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); } // File: contracts/ERC721A/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.14; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `toskenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ 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; } } } // File: Cronos/CFC/NftBall.sol pragma solidity ^0.8.14; interface IEnergizer{ function mintNrjz(address to, uint _quantity) external; function burnNrjz(address _account, uint _quantity) external returns(bool); } contract Energizer is ERC721AQueryable { address owner; string name_; string symbol_; address public adrBurner; address public adrMinter; string public baseURI = ""; constructor(address _adrMinter, address _adrBurner)ERC721A("Energizer", "NRJZ"){ owner = msg.sender; name_ = "Energizer"; symbol_ = "NRJZ"; adrMinter = _adrMinter; adrBurner = _adrBurner; } function changeOwner(address _owner) public onlyOwner { owner =_owner; } function changeBurner(address _adrBurner) public onlyOwner { adrBurner = _adrBurner; } function changeMinter(address _adrMinter) public virtual onlyOwner { adrMinter = _adrMinter; } function setBaseUri(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } function tokenURI(uint256 tokenId) public view override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return baseURI; } function mintNrjz(address to, uint _quantity) external onlyMinter returns(bool) { _safeMint(to, _quantity); return true; } function burnNrjz(address _account, uint _quantity, uint[] memory listIndex) external onlyBurner returns(bool) { require(ERC721AQueryable(address(this)).balanceOf(_account) >= _quantity, "[ERROR] : You dont have enough Ball in Param!"); for(uint i = 0; i < _quantity; i++) { require(ERC721AQueryable(address(this)).ownerOf(listIndex[i]) == _account, "[ERROR] : This is account dont have this NFT!"); } for(uint i = 0; i < _quantity; i++) { _burn(listIndex[i]); } return true; } modifier onlyOwner { require(msg.sender == owner, "[ERROR] : You are not Owner"); _; } modifier onlyBurner { require(msg.sender == owner || msg.sender == adrBurner, "[ERROR] : You are not approve for Burn"); _; } modifier onlyMinter { require(msg.sender == owner || msg.sender == adrMinter, "[ERROR] : You are not the Minter Address or Owner"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_adrMinter","type":"address"},{"internalType":"address","name":"_adrBurner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"adrBurner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adrMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256[]","name":"listIndex","type":"uint256[]"}],"name":"burnNrjz","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrBurner","type":"address"}],"name":"changeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrMinter","type":"address"}],"name":"changeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","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":"uint24","name":"extraData","type":"uint24"}],"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":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintNrjz","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"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"}]
Contract Creation Code
608060405260405180602001604052806000815250600d90805190602001906200002b92919062000281565b503480156200003957600080fd5b5060405162003c6138038062003c6183398181016040528101906200005f91906200039b565b6040518060400160405280600981526020017f456e657267697a657200000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e524a5a000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e392919062000281565b508060039080519060200190620000fc92919062000281565b506200010d6200027c60201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600981526020017f456e657267697a6572000000000000000000000000000000000000000000000081525060099080519060200190620001a392919062000281565b506040518060400160405280600481526020017f4e524a5a00000000000000000000000000000000000000000000000000000000815250600a9080519060200190620001f192919062000281565b5081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000446565b600090565b8280546200028f9062000411565b90600052602060002090601f016020900481019282620002b35760008555620002ff565b82601f10620002ce57805160ff1916838001178555620002ff565b82800160010185558215620002ff579182015b82811115620002fe578251825591602001919060010190620002e1565b5b5090506200030e919062000312565b5090565b5b808211156200032d57600081600090555060010162000313565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003638262000336565b9050919050565b620003758162000356565b81146200038157600080fd5b50565b60008151905062000395816200036a565b92915050565b60008060408385031215620003b557620003b462000331565b5b6000620003c58582860162000384565b9250506020620003d88582860162000384565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042a57607f821691505b60208210810362000440576200043f620003e2565b5b50919050565b61380b80620004566000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806378dd3aa9116100f9578063a6f9dae111610097578063c23dc68f11610071578063c23dc68f146104f0578063c87b56dd14610520578063e985e9c514610550578063f8bc4f3a14610580576101a9565b8063a6f9dae114610488578063b757baab146104a4578063b88d4fde146104d4576101a9565b806395d89b41116100d357806395d89b411461040257806399a2557a14610420578063a0bcfc7f14610450578063a22cb4651461046c576101a9565b806378dd3aa91461038657806380b022e8146103b65780638462151c146103d2576101a9565b80632c4d4d18116101665780635bbb2177116101405780635bbb2177146102d85780636352211e146103085780636c0360eb1461033857806370a0823114610356576101a9565b80632c4d4d18146102825780633bba35e11461029e57806342842e0e146102bc576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c391906127cb565b61059e565b6040516101d59190612813565b60405180910390f35b6101e6610630565b6040516101f391906128c7565b60405180910390f35b6102166004803603810190610211919061291f565b6106c2565b604051610223919061298d565b60405180910390f35b610246600480360381019061024191906129d4565b61073e565b005b61025061087f565b60405161025d9190612a23565b60405180910390f35b610280600480360381019061027b9190612a3e565b610896565b005b61029c60048036038101906102979190612a91565b610bb8565b005b6102a6610c8c565b6040516102b3919061298d565b60405180910390f35b6102d660048036038101906102d19190612a3e565b610cb2565b005b6102f260048036038101906102ed9190612c06565b610cd2565b6040516102ff9190612db2565b60405180910390f35b610322600480360381019061031d919061291f565b610d93565b60405161032f919061298d565b60405180910390f35b610340610da5565b60405161034d91906128c7565b60405180910390f35b610370600480360381019061036b9190612a91565b610e33565b60405161037d9190612a23565b60405180910390f35b6103a0600480360381019061039b9190612dd4565b610eeb565b6040516103ad9190612813565b60405180910390f35b6103d060048036038101906103cb9190612a91565b6111fe565b005b6103ec60048036038101906103e79190612a91565b6112d2565b6040516103f99190612f01565b60405180910390f35b61040a611415565b60405161041791906128c7565b60405180910390f35b61043a60048036038101906104359190612f23565b6114a7565b6040516104479190612f01565b60405180910390f35b61046a6004803603810190610465919061302b565b6116b3565b005b610486600480360381019061048191906130a0565b61175d565b005b6104a2600480360381019061049d9190612a91565b6118d4565b005b6104be60048036038101906104b991906129d4565b6119a8565b6040516104cb9190612813565b60405180910390f35b6104ee60048036038101906104e99190613181565b611aa6565b005b61050a6004803603810190610505919061291f565b611b19565b6040516105179190613259565b60405180910390f35b61053a6004803603810190610535919061291f565b611b83565b60405161054791906128c7565b60405180910390f35b61056a60048036038101906105659190613274565b611c56565b6040516105779190612813565b60405180910390f35b610588611cea565b604051610595919061298d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106295750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461063f906132e3565b80601f016020809104026020016040519081016040528092919081815260200182805461066b906132e3565b80156106b85780601f1061068d576101008083540402835291602001916106b8565b820191906000526020600020905b81548152906001019060200180831161069b57829003601f168201915b5050505050905090565b60006106cd82611d10565b610703576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074982610d93565b90508073ffffffffffffffffffffffffffffffffffffffff1661076a611d6f565b73ffffffffffffffffffffffffffffffffffffffff16146107cd5761079681610791611d6f565b611c56565b6107cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610889611d77565b6001546000540303905090565b60006108a182611d7c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610908576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061091484611e48565b9150915061092a8187610925611d6f565b611e6a565b6109765761093f8661093a611d6f565b611c56565b610975576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e98686866001611eae565b80156109f457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ac285610a9e888887611eb4565b7c020000000000000000000000000000000000000000000000000000000017611edc565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b485760006001850190506000600460008381526020019081526020016000205403610b46576000548114610b45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bb08686866001611f07565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613360565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ccd83838360405180602001604052806000815250611aa6565b505050565b606060008251905060008167ffffffffffffffff811115610cf657610cf5612ac3565b5b604051908082528060200260200182016040528015610d2f57816020015b610d1c61266d565b815260200190600190039081610d145790505b50905060005b828114610d8857610d5f858281518110610d5257610d51613380565b5b6020026020010151611b19565b828281518110610d7257610d71613380565b5b6020026020010181905250806001019050610d35565b508092505050919050565b6000610d9e82611d7c565b9050919050565b600d8054610db2906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dde906132e3565b8015610e2b5780601f10610e0057610100808354040283529160200191610e2b565b820191906000526020600020905b815481529060010190602001808311610e0e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f965750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90613421565b60405180910390fd5b823073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161100f919061298d565b602060405180830381865afa15801561102c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110509190613456565b1015611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906134f5565b60405180910390fd5b60005b838110156111b0578473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106110e2576110e1613380565b5b60200260200101516040518263ffffffff1660e01b81526004016111069190612a23565b602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611147919061352a565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611194906135c9565b60405180910390fd5b80806111a890613618565b915050611094565b5060005b838110156111f2576111df8382815181106111d2576111d1613380565b5b6020026020010151611f0d565b80806111ea90613618565b9150506111b4565b50600190509392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613360565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008060006112e285610e33565b905060008167ffffffffffffffff811115611300576112ff612ac3565b5b60405190808252806020026020018201604052801561132e5781602001602082028036833780820191505090505b50905061133961266d565b6000611343611d77565b90505b8386146114075761135681611f1b565b915081604001516113fc57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113a157816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036113fb57808387806001019850815181106113ee576113ed613380565b5b6020026020010181815250505b5b806001019050611346565b508195505050505050919050565b606060038054611424906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611450906132e3565b801561149d5780601f106114725761010080835404028352916020019161149d565b820191906000526020600020905b81548152906001019060200180831161148057829003601f168201915b5050505050905090565b60608183106114e2576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806114ed611f46565b90506114f7611d77565b85101561150957611506611d77565b94505b80841115611515578093505b600061152087610e33565b90508486101561154357600086860390508181101561153d578091505b50611548565b600090505b60008167ffffffffffffffff81111561156457611563612ac3565b5b6040519080825280602002602001820160405280156115925781602001602082028036833780820191505090505b509050600082036115a957809450505050506116ac565b60006115b488611b19565b9050600081604001516115c957816000015190505b60008990505b8881141580156115df5750848714155b1561169e576115ed81611f1b565b9250826040015161169357600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461163857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611692578084888060010199508151811061168557611684613380565b5b6020026020010181815250505b5b8060010190506115cf565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613360565b60405180910390fd5b80600d90805190602001906117599291906126bc565b5050565b611765611d6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117d6611d6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611883611d6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c89190612813565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90613360565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a535750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906136d2565b60405180910390fd5b611a9c8383611f4f565b6001905092915050565b611ab1848484610896565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1357611adc84848484611f6d565b611b12576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b2161266d565b611b2961266d565b611b31611d77565b831080611b455750611b41611f46565b8310155b15611b535780915050611b7e565b611b5c83611f1b565b9050806040015115611b715780915050611b7e565b611b7a836120bd565b9150505b919050565b6060611b8e82611d10565b611bc4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d8054611bd1906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd906132e3565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b50505050509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081611d1b611d77565b11158015611d2a575060005482105b8015611d68575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d8b611d77565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e0e575b60008103611e04576004600083600190039350838152602001908152602001600020549050611dda565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ecb8686846120dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611f188160006120e6565b50565b611f2361266d565b611f3f6004600084815260200190815260200160002054612338565b9050919050565b60008054905090565b611f698282604051806020016040528060008152506123ee565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f93611d6f565b8786866040518563ffffffff1660e01b8152600401611fb59493929190613747565b6020604051808303816000875af1925050508015611ff157506040513d601f19601f82011682018060405250810190611fee91906137a8565b60015b61206a573d8060008114612021576040519150601f19603f3d011682016040523d82523d6000602084013e612026565b606091505b506000815103612062576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6120c561266d565b6120d66120d183611d7c565b612338565b9050919050565b60009392505050565b60006120f183611d7c565b9050600081905060008061210486611e48565b91509150841561216d57612120818461211b611d6f565b611e6a565b61216c5761213583612130611d6f565b611c56565b61216b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61217b836000886001611eae565b801561218657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061222e836121eb85600088611eb4565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611edc565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122b457600060018701905060006004600083815260200190815260200160002054036122b25760005481146122b1578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231e836000886001611f07565b600160008154809291906001019190505550505050505050565b61234061266d565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6123f8838361248b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461248657600080549050600083820390505b6124386000868380600101945086611f6d565b61246e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061242557816000541461248357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612531576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61253e6000848385611eae565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125b5836125a66000866000611eb4565b6125af8561265d565b17611edc565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125d9578060008190555050506126586000848385611f07565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b8280546126c8906132e3565b90600052602060002090601f0160209004810192826126ea5760008555612731565b82601f1061270357805160ff1916838001178555612731565b82800160010185558215612731579182015b82811115612730578251825591602001919060010190612715565b5b50905061273e9190612742565b5090565b5b8082111561275b576000816000905550600101612743565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a881612773565b81146127b357600080fd5b50565b6000813590506127c58161279f565b92915050565b6000602082840312156127e1576127e0612769565b5b60006127ef848285016127b6565b91505092915050565b60008115159050919050565b61280d816127f8565b82525050565b60006020820190506128286000830184612804565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561286857808201518184015260208101905061284d565b83811115612877576000848401525b50505050565b6000601f19601f8301169050919050565b60006128998261282e565b6128a38185612839565b93506128b381856020860161284a565b6128bc8161287d565b840191505092915050565b600060208201905081810360008301526128e1818461288e565b905092915050565b6000819050919050565b6128fc816128e9565b811461290757600080fd5b50565b600081359050612919816128f3565b92915050565b60006020828403121561293557612934612769565b5b60006129438482850161290a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129778261294c565b9050919050565b6129878161296c565b82525050565b60006020820190506129a2600083018461297e565b92915050565b6129b18161296c565b81146129bc57600080fd5b50565b6000813590506129ce816129a8565b92915050565b600080604083850312156129eb576129ea612769565b5b60006129f9858286016129bf565b9250506020612a0a8582860161290a565b9150509250929050565b612a1d816128e9565b82525050565b6000602082019050612a386000830184612a14565b92915050565b600080600060608486031215612a5757612a56612769565b5b6000612a65868287016129bf565b9350506020612a76868287016129bf565b9250506040612a878682870161290a565b9150509250925092565b600060208284031215612aa757612aa6612769565b5b6000612ab5848285016129bf565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612afb8261287d565b810181811067ffffffffffffffff82111715612b1a57612b19612ac3565b5b80604052505050565b6000612b2d61275f565b9050612b398282612af2565b919050565b600067ffffffffffffffff821115612b5957612b58612ac3565b5b602082029050602081019050919050565b600080fd5b6000612b82612b7d84612b3e565b612b23565b90508083825260208201905060208402830185811115612ba557612ba4612b6a565b5b835b81811015612bce5780612bba888261290a565b845260208401935050602081019050612ba7565b5050509392505050565b600082601f830112612bed57612bec612abe565b5b8135612bfd848260208601612b6f565b91505092915050565b600060208284031215612c1c57612c1b612769565b5b600082013567ffffffffffffffff811115612c3a57612c3961276e565b5b612c4684828501612bd8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c848161296c565b82525050565b600067ffffffffffffffff82169050919050565b612ca781612c8a565b82525050565b612cb6816127f8565b82525050565b600062ffffff82169050919050565b612cd481612cbc565b82525050565b608082016000820151612cf06000850182612c7b565b506020820151612d036020850182612c9e565b506040820151612d166040850182612cad565b506060820151612d296060850182612ccb565b50505050565b6000612d3b8383612cda565b60808301905092915050565b6000602082019050919050565b6000612d5f82612c4f565b612d698185612c5a565b9350612d7483612c6b565b8060005b83811015612da5578151612d8c8882612d2f565b9750612d9783612d47565b925050600181019050612d78565b5085935050505092915050565b60006020820190508181036000830152612dcc8184612d54565b905092915050565b600080600060608486031215612ded57612dec612769565b5b6000612dfb868287016129bf565b9350506020612e0c8682870161290a565b925050604084013567ffffffffffffffff811115612e2d57612e2c61276e565b5b612e3986828701612bd8565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e78816128e9565b82525050565b6000612e8a8383612e6f565b60208301905092915050565b6000602082019050919050565b6000612eae82612e43565b612eb88185612e4e565b9350612ec383612e5f565b8060005b83811015612ef4578151612edb8882612e7e565b9750612ee683612e96565b925050600181019050612ec7565b5085935050505092915050565b60006020820190508181036000830152612f1b8184612ea3565b905092915050565b600080600060608486031215612f3c57612f3b612769565b5b6000612f4a868287016129bf565b9350506020612f5b8682870161290a565b9250506040612f6c8682870161290a565b9150509250925092565b600080fd5b600067ffffffffffffffff821115612f9657612f95612ac3565b5b612f9f8261287d565b9050602081019050919050565b82818337600083830152505050565b6000612fce612fc984612f7b565b612b23565b905082815260208101848484011115612fea57612fe9612f76565b5b612ff5848285612fac565b509392505050565b600082601f83011261301257613011612abe565b5b8135613022848260208601612fbb565b91505092915050565b60006020828403121561304157613040612769565b5b600082013567ffffffffffffffff81111561305f5761305e61276e565b5b61306b84828501612ffd565b91505092915050565b61307d816127f8565b811461308857600080fd5b50565b60008135905061309a81613074565b92915050565b600080604083850312156130b7576130b6612769565b5b60006130c5858286016129bf565b92505060206130d68582860161308b565b9150509250929050565b600067ffffffffffffffff8211156130fb576130fa612ac3565b5b6131048261287d565b9050602081019050919050565b600061312461311f846130e0565b612b23565b9050828152602081018484840111156131405761313f612f76565b5b61314b848285612fac565b509392505050565b600082601f83011261316857613167612abe565b5b8135613178848260208601613111565b91505092915050565b6000806000806080858703121561319b5761319a612769565b5b60006131a9878288016129bf565b94505060206131ba878288016129bf565b93505060406131cb8782880161290a565b925050606085013567ffffffffffffffff8111156131ec576131eb61276e565b5b6131f887828801613153565b91505092959194509250565b60808201600082015161321a6000850182612c7b565b50602082015161322d6020850182612c9e565b5060408201516132406040850182612cad565b5060608201516132536060850182612ccb565b50505050565b600060808201905061326e6000830184613204565b92915050565b6000806040838503121561328b5761328a612769565b5b6000613299858286016129bf565b92505060206132aa858286016129bf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132fb57607f821691505b60208210810361330e5761330d6132b4565b5b50919050565b7f5b4552524f525d203a20596f7520617265206e6f74204f776e65720000000000600082015250565b600061334a601b83612839565b915061335582613314565b602082019050919050565b600060208201905081810360008301526133798161333d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d203a20596f7520617265206e6f7420617070726f766520666f60008201527f72204275726e0000000000000000000000000000000000000000000000000000602082015250565b600061340b602683612839565b9150613416826133af565b604082019050919050565b6000602082019050818103600083015261343a816133fe565b9050919050565b600081519050613450816128f3565b92915050565b60006020828403121561346c5761346b612769565b5b600061347a84828501613441565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204260008201527f616c6c20696e20506172616d2100000000000000000000000000000000000000602082015250565b60006134df602d83612839565b91506134ea82613483565b604082019050919050565b6000602082019050818103600083015261350e816134d2565b9050919050565b600081519050613524816129a8565b92915050565b6000602082840312156135405761353f612769565b5b600061354e84828501613515565b91505092915050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f6176652074686973204e46542100000000000000000000000000000000000000602082015250565b60006135b3602d83612839565b91506135be82613557565b604082019050919050565b600060208201905081810360008301526135e2816135a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613623826128e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613655576136546135e9565b5b600182019050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865204d696e74657260008201527f2041646472657373206f72204f776e6572000000000000000000000000000000602082015250565b60006136bc603183612839565b91506136c782613660565b604082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613719826136f2565b61372381856136fd565b935061373381856020860161284a565b61373c8161287d565b840191505092915050565b600060808201905061375c600083018761297e565b613769602083018661297e565b6137766040830185612a14565b8181036060830152613788818461370e565b905095945050505050565b6000815190506137a28161279f565b92915050565b6000602082840312156137be576137bd612769565b5b60006137cc84828501613793565b9150509291505056fea2646970667358221220ba65fd3871999fb3b31f439c9385ddb9795a5e5b6de56f1e8ce1753e545e8f8764736f6c634300080e0033000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806378dd3aa9116100f9578063a6f9dae111610097578063c23dc68f11610071578063c23dc68f146104f0578063c87b56dd14610520578063e985e9c514610550578063f8bc4f3a14610580576101a9565b8063a6f9dae114610488578063b757baab146104a4578063b88d4fde146104d4576101a9565b806395d89b41116100d357806395d89b411461040257806399a2557a14610420578063a0bcfc7f14610450578063a22cb4651461046c576101a9565b806378dd3aa91461038657806380b022e8146103b65780638462151c146103d2576101a9565b80632c4d4d18116101665780635bbb2177116101405780635bbb2177146102d85780636352211e146103085780636c0360eb1461033857806370a0823114610356576101a9565b80632c4d4d18146102825780633bba35e11461029e57806342842e0e146102bc576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c391906127cb565b61059e565b6040516101d59190612813565b60405180910390f35b6101e6610630565b6040516101f391906128c7565b60405180910390f35b6102166004803603810190610211919061291f565b6106c2565b604051610223919061298d565b60405180910390f35b610246600480360381019061024191906129d4565b61073e565b005b61025061087f565b60405161025d9190612a23565b60405180910390f35b610280600480360381019061027b9190612a3e565b610896565b005b61029c60048036038101906102979190612a91565b610bb8565b005b6102a6610c8c565b6040516102b3919061298d565b60405180910390f35b6102d660048036038101906102d19190612a3e565b610cb2565b005b6102f260048036038101906102ed9190612c06565b610cd2565b6040516102ff9190612db2565b60405180910390f35b610322600480360381019061031d919061291f565b610d93565b60405161032f919061298d565b60405180910390f35b610340610da5565b60405161034d91906128c7565b60405180910390f35b610370600480360381019061036b9190612a91565b610e33565b60405161037d9190612a23565b60405180910390f35b6103a0600480360381019061039b9190612dd4565b610eeb565b6040516103ad9190612813565b60405180910390f35b6103d060048036038101906103cb9190612a91565b6111fe565b005b6103ec60048036038101906103e79190612a91565b6112d2565b6040516103f99190612f01565b60405180910390f35b61040a611415565b60405161041791906128c7565b60405180910390f35b61043a60048036038101906104359190612f23565b6114a7565b6040516104479190612f01565b60405180910390f35b61046a6004803603810190610465919061302b565b6116b3565b005b610486600480360381019061048191906130a0565b61175d565b005b6104a2600480360381019061049d9190612a91565b6118d4565b005b6104be60048036038101906104b991906129d4565b6119a8565b6040516104cb9190612813565b60405180910390f35b6104ee60048036038101906104e99190613181565b611aa6565b005b61050a6004803603810190610505919061291f565b611b19565b6040516105179190613259565b60405180910390f35b61053a6004803603810190610535919061291f565b611b83565b60405161054791906128c7565b60405180910390f35b61056a60048036038101906105659190613274565b611c56565b6040516105779190612813565b60405180910390f35b610588611cea565b604051610595919061298d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106295750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461063f906132e3565b80601f016020809104026020016040519081016040528092919081815260200182805461066b906132e3565b80156106b85780601f1061068d576101008083540402835291602001916106b8565b820191906000526020600020905b81548152906001019060200180831161069b57829003601f168201915b5050505050905090565b60006106cd82611d10565b610703576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074982610d93565b90508073ffffffffffffffffffffffffffffffffffffffff1661076a611d6f565b73ffffffffffffffffffffffffffffffffffffffff16146107cd5761079681610791611d6f565b611c56565b6107cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610889611d77565b6001546000540303905090565b60006108a182611d7c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610908576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061091484611e48565b9150915061092a8187610925611d6f565b611e6a565b6109765761093f8661093a611d6f565b611c56565b610975576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e98686866001611eae565b80156109f457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ac285610a9e888887611eb4565b7c020000000000000000000000000000000000000000000000000000000017611edc565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b485760006001850190506000600460008381526020019081526020016000205403610b46576000548114610b45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bb08686866001611f07565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613360565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ccd83838360405180602001604052806000815250611aa6565b505050565b606060008251905060008167ffffffffffffffff811115610cf657610cf5612ac3565b5b604051908082528060200260200182016040528015610d2f57816020015b610d1c61266d565b815260200190600190039081610d145790505b50905060005b828114610d8857610d5f858281518110610d5257610d51613380565b5b6020026020010151611b19565b828281518110610d7257610d71613380565b5b6020026020010181905250806001019050610d35565b508092505050919050565b6000610d9e82611d7c565b9050919050565b600d8054610db2906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dde906132e3565b8015610e2b5780601f10610e0057610100808354040283529160200191610e2b565b820191906000526020600020905b815481529060010190602001808311610e0e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f965750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc90613421565b60405180910390fd5b823073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161100f919061298d565b602060405180830381865afa15801561102c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110509190613456565b1015611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906134f5565b60405180910390fd5b60005b838110156111b0578473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106110e2576110e1613380565b5b60200260200101516040518263ffffffff1660e01b81526004016111069190612a23565b602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611147919061352a565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611194906135c9565b60405180910390fd5b80806111a890613618565b915050611094565b5060005b838110156111f2576111df8382815181106111d2576111d1613380565b5b6020026020010151611f0d565b80806111ea90613618565b9150506111b4565b50600190509392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613360565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008060006112e285610e33565b905060008167ffffffffffffffff811115611300576112ff612ac3565b5b60405190808252806020026020018201604052801561132e5781602001602082028036833780820191505090505b50905061133961266d565b6000611343611d77565b90505b8386146114075761135681611f1b565b915081604001516113fc57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113a157816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036113fb57808387806001019850815181106113ee576113ed613380565b5b6020026020010181815250505b5b806001019050611346565b508195505050505050919050565b606060038054611424906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611450906132e3565b801561149d5780601f106114725761010080835404028352916020019161149d565b820191906000526020600020905b81548152906001019060200180831161148057829003601f168201915b5050505050905090565b60608183106114e2576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806114ed611f46565b90506114f7611d77565b85101561150957611506611d77565b94505b80841115611515578093505b600061152087610e33565b90508486101561154357600086860390508181101561153d578091505b50611548565b600090505b60008167ffffffffffffffff81111561156457611563612ac3565b5b6040519080825280602002602001820160405280156115925781602001602082028036833780820191505090505b509050600082036115a957809450505050506116ac565b60006115b488611b19565b9050600081604001516115c957816000015190505b60008990505b8881141580156115df5750848714155b1561169e576115ed81611f1b565b9250826040015161169357600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461163857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611692578084888060010199508151811061168557611684613380565b5b6020026020010181815250505b5b8060010190506115cf565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613360565b60405180910390fd5b80600d90805190602001906117599291906126bc565b5050565b611765611d6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117d6611d6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611883611d6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c89190612813565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90613360565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a535750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906136d2565b60405180910390fd5b611a9c8383611f4f565b6001905092915050565b611ab1848484610896565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1357611adc84848484611f6d565b611b12576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b2161266d565b611b2961266d565b611b31611d77565b831080611b455750611b41611f46565b8310155b15611b535780915050611b7e565b611b5c83611f1b565b9050806040015115611b715780915050611b7e565b611b7a836120bd565b9150505b919050565b6060611b8e82611d10565b611bc4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d8054611bd1906132e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd906132e3565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b50505050509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081611d1b611d77565b11158015611d2a575060005482105b8015611d68575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d8b611d77565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e0e575b60008103611e04576004600083600190039350838152602001908152602001600020549050611dda565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ecb8686846120dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611f188160006120e6565b50565b611f2361266d565b611f3f6004600084815260200190815260200160002054612338565b9050919050565b60008054905090565b611f698282604051806020016040528060008152506123ee565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f93611d6f565b8786866040518563ffffffff1660e01b8152600401611fb59493929190613747565b6020604051808303816000875af1925050508015611ff157506040513d601f19601f82011682018060405250810190611fee91906137a8565b60015b61206a573d8060008114612021576040519150601f19603f3d011682016040523d82523d6000602084013e612026565b606091505b506000815103612062576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6120c561266d565b6120d66120d183611d7c565b612338565b9050919050565b60009392505050565b60006120f183611d7c565b9050600081905060008061210486611e48565b91509150841561216d57612120818461211b611d6f565b611e6a565b61216c5761213583612130611d6f565b611c56565b61216b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61217b836000886001611eae565b801561218657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061222e836121eb85600088611eb4565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611edc565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122b457600060018701905060006004600083815260200190815260200160002054036122b25760005481146122b1578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231e836000886001611f07565b600160008154809291906001019190505550505050505050565b61234061266d565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6123f8838361248b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461248657600080549050600083820390505b6124386000868380600101945086611f6d565b61246e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061242557816000541461248357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612531576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61253e6000848385611eae565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125b5836125a66000866000611eb4565b6125af8561265d565b17611edc565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125d9578060008190555050506126586000848385611f07565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b8280546126c8906132e3565b90600052602060002090601f0160209004810192826126ea5760008555612731565b82601f1061270357805160ff1916838001178555612731565b82800160010185558215612731579182015b82811115612730578251825591602001919060010190612715565b5b50905061273e9190612742565b5090565b5b8082111561275b576000816000905550600101612743565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a881612773565b81146127b357600080fd5b50565b6000813590506127c58161279f565b92915050565b6000602082840312156127e1576127e0612769565b5b60006127ef848285016127b6565b91505092915050565b60008115159050919050565b61280d816127f8565b82525050565b60006020820190506128286000830184612804565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561286857808201518184015260208101905061284d565b83811115612877576000848401525b50505050565b6000601f19601f8301169050919050565b60006128998261282e565b6128a38185612839565b93506128b381856020860161284a565b6128bc8161287d565b840191505092915050565b600060208201905081810360008301526128e1818461288e565b905092915050565b6000819050919050565b6128fc816128e9565b811461290757600080fd5b50565b600081359050612919816128f3565b92915050565b60006020828403121561293557612934612769565b5b60006129438482850161290a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129778261294c565b9050919050565b6129878161296c565b82525050565b60006020820190506129a2600083018461297e565b92915050565b6129b18161296c565b81146129bc57600080fd5b50565b6000813590506129ce816129a8565b92915050565b600080604083850312156129eb576129ea612769565b5b60006129f9858286016129bf565b9250506020612a0a8582860161290a565b9150509250929050565b612a1d816128e9565b82525050565b6000602082019050612a386000830184612a14565b92915050565b600080600060608486031215612a5757612a56612769565b5b6000612a65868287016129bf565b9350506020612a76868287016129bf565b9250506040612a878682870161290a565b9150509250925092565b600060208284031215612aa757612aa6612769565b5b6000612ab5848285016129bf565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612afb8261287d565b810181811067ffffffffffffffff82111715612b1a57612b19612ac3565b5b80604052505050565b6000612b2d61275f565b9050612b398282612af2565b919050565b600067ffffffffffffffff821115612b5957612b58612ac3565b5b602082029050602081019050919050565b600080fd5b6000612b82612b7d84612b3e565b612b23565b90508083825260208201905060208402830185811115612ba557612ba4612b6a565b5b835b81811015612bce5780612bba888261290a565b845260208401935050602081019050612ba7565b5050509392505050565b600082601f830112612bed57612bec612abe565b5b8135612bfd848260208601612b6f565b91505092915050565b600060208284031215612c1c57612c1b612769565b5b600082013567ffffffffffffffff811115612c3a57612c3961276e565b5b612c4684828501612bd8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c848161296c565b82525050565b600067ffffffffffffffff82169050919050565b612ca781612c8a565b82525050565b612cb6816127f8565b82525050565b600062ffffff82169050919050565b612cd481612cbc565b82525050565b608082016000820151612cf06000850182612c7b565b506020820151612d036020850182612c9e565b506040820151612d166040850182612cad565b506060820151612d296060850182612ccb565b50505050565b6000612d3b8383612cda565b60808301905092915050565b6000602082019050919050565b6000612d5f82612c4f565b612d698185612c5a565b9350612d7483612c6b565b8060005b83811015612da5578151612d8c8882612d2f565b9750612d9783612d47565b925050600181019050612d78565b5085935050505092915050565b60006020820190508181036000830152612dcc8184612d54565b905092915050565b600080600060608486031215612ded57612dec612769565b5b6000612dfb868287016129bf565b9350506020612e0c8682870161290a565b925050604084013567ffffffffffffffff811115612e2d57612e2c61276e565b5b612e3986828701612bd8565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e78816128e9565b82525050565b6000612e8a8383612e6f565b60208301905092915050565b6000602082019050919050565b6000612eae82612e43565b612eb88185612e4e565b9350612ec383612e5f565b8060005b83811015612ef4578151612edb8882612e7e565b9750612ee683612e96565b925050600181019050612ec7565b5085935050505092915050565b60006020820190508181036000830152612f1b8184612ea3565b905092915050565b600080600060608486031215612f3c57612f3b612769565b5b6000612f4a868287016129bf565b9350506020612f5b8682870161290a565b9250506040612f6c8682870161290a565b9150509250925092565b600080fd5b600067ffffffffffffffff821115612f9657612f95612ac3565b5b612f9f8261287d565b9050602081019050919050565b82818337600083830152505050565b6000612fce612fc984612f7b565b612b23565b905082815260208101848484011115612fea57612fe9612f76565b5b612ff5848285612fac565b509392505050565b600082601f83011261301257613011612abe565b5b8135613022848260208601612fbb565b91505092915050565b60006020828403121561304157613040612769565b5b600082013567ffffffffffffffff81111561305f5761305e61276e565b5b61306b84828501612ffd565b91505092915050565b61307d816127f8565b811461308857600080fd5b50565b60008135905061309a81613074565b92915050565b600080604083850312156130b7576130b6612769565b5b60006130c5858286016129bf565b92505060206130d68582860161308b565b9150509250929050565b600067ffffffffffffffff8211156130fb576130fa612ac3565b5b6131048261287d565b9050602081019050919050565b600061312461311f846130e0565b612b23565b9050828152602081018484840111156131405761313f612f76565b5b61314b848285612fac565b509392505050565b600082601f83011261316857613167612abe565b5b8135613178848260208601613111565b91505092915050565b6000806000806080858703121561319b5761319a612769565b5b60006131a9878288016129bf565b94505060206131ba878288016129bf565b93505060406131cb8782880161290a565b925050606085013567ffffffffffffffff8111156131ec576131eb61276e565b5b6131f887828801613153565b91505092959194509250565b60808201600082015161321a6000850182612c7b565b50602082015161322d6020850182612c9e565b5060408201516132406040850182612cad565b5060608201516132536060850182612ccb565b50505050565b600060808201905061326e6000830184613204565b92915050565b6000806040838503121561328b5761328a612769565b5b6000613299858286016129bf565b92505060206132aa858286016129bf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132fb57607f821691505b60208210810361330e5761330d6132b4565b5b50919050565b7f5b4552524f525d203a20596f7520617265206e6f74204f776e65720000000000600082015250565b600061334a601b83612839565b915061335582613314565b602082019050919050565b600060208201905081810360008301526133798161333d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d203a20596f7520617265206e6f7420617070726f766520666f60008201527f72204275726e0000000000000000000000000000000000000000000000000000602082015250565b600061340b602683612839565b9150613416826133af565b604082019050919050565b6000602082019050818103600083015261343a816133fe565b9050919050565b600081519050613450816128f3565b92915050565b60006020828403121561346c5761346b612769565b5b600061347a84828501613441565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204260008201527f616c6c20696e20506172616d2100000000000000000000000000000000000000602082015250565b60006134df602d83612839565b91506134ea82613483565b604082019050919050565b6000602082019050818103600083015261350e816134d2565b9050919050565b600081519050613524816129a8565b92915050565b6000602082840312156135405761353f612769565b5b600061354e84828501613515565b91505092915050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f6176652074686973204e46542100000000000000000000000000000000000000602082015250565b60006135b3602d83612839565b91506135be82613557565b604082019050919050565b600060208201905081810360008301526135e2816135a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613623826128e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613655576136546135e9565b5b600182019050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865204d696e74657260008201527f2041646472657373206f72204f776e6572000000000000000000000000000000602082015250565b60006136bc603183612839565b91506136c782613660565b604082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613719826136f2565b61372381856136fd565b935061373381856020860161284a565b61373c8161287d565b840191505092915050565b600060808201905061375c600083018761297e565b613769602083018661297e565b6137766040830185612a14565b8181036060830152613788818461370e565b905095945050505050565b6000815190506137a28161279f565b92915050565b6000602082840312156137be576137bd612769565b5b60006137cc84828501613793565b9150509291505056fea2646970667358221220ba65fd3871999fb3b31f439c9385ddb9795a5e5b6de56f1e8ce1753e545e8f8764736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb
-----Decoded View---------------
Arg [0] : _adrMinter (address): 0xe6e2e8017ba5716a0d01195dc65a5b048c16bbbb
Arg [1] : _adrBurner (address): 0xe6e2e8017ba5716a0d01195dc65a5b048c16bbbb
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb
Arg [1] : 000000000000000000000000e6e2e8017ba5716a0d01195dc65a5b048c16bbbb
Deployed ByteCode Sourcemap
53868:2307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14696:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20343:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22289:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21837:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13750:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31554:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54537:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54010:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23179:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48920:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20132:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54043:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15375:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55137:607;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54424:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52732:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20512:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49778:2505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54658:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22565:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54325:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54979:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23435:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48341:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54769:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22944:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53978:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14696:615;14781:4;15096:10;15081:25;;:11;:25;;;;:102;;;;15173:10;15158:25;;:11;:25;;;;15081:102;:179;;;;15250:10;15235:25;;:11;:25;;;;15081:179;15061:199;;14696:615;;;:::o;20343:100::-;20397:13;20430:5;20423:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20343:100;:::o;22289:204::-;22357:7;22382:16;22390:7;22382;:16::i;:::-;22377:64;;22407:34;;;;;;;;;;;;;;22377:64;22461:15;:24;22477:7;22461:24;;;;;;;;;;;;;;;;;;;;;22454:31;;22289:204;;;:::o;21837:386::-;21910:13;21926:16;21934:7;21926;:16::i;:::-;21910:32;;21982:5;21959:28;;:19;:17;:19::i;:::-;:28;;;21955:175;;22007:44;22024:5;22031:19;:17;:19::i;:::-;22007:16;:44::i;:::-;22002:128;;22079:35;;;;;;;;;;;;;;22002:128;21955:175;22169:2;22142:15;:24;22158:7;22142:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22207:7;22203:2;22187:28;;22196:5;22187:28;;;;;;;;;;;;21899:324;21837:386;;:::o;13750:315::-;13803:7;14031:15;:13;:15::i;:::-;14016:12;;14000:13;;:28;:46;13993:53;;13750:315;:::o;31554:2800::-;31688:27;31718;31737:7;31718:18;:27::i;:::-;31688:57;;31803:4;31762:45;;31778:19;31762:45;;;31758:86;;31816:28;;;;;;;;;;;;;;31758:86;31858:27;31887:23;31914:28;31934:7;31914:19;:28::i;:::-;31857:85;;;;32042:62;32061:15;32078:4;32084:19;:17;:19::i;:::-;32042:18;:62::i;:::-;32037:174;;32124:43;32141:4;32147:19;:17;:19::i;:::-;32124:16;:43::i;:::-;32119:92;;32176:35;;;;;;;;;;;;;;32119:92;32037:174;32242:1;32228:16;;:2;:16;;;32224:52;;32253:23;;;;;;;;;;;;;;32224:52;32289:43;32311:4;32317:2;32321:7;32330:1;32289:21;:43::i;:::-;32425:15;32422:160;;;32565:1;32544:19;32537:30;32422:160;32960:18;:24;32979:4;32960:24;;;;;;;;;;;;;;;;32958:26;;;;;;;;;;;;33029:18;:22;33048:2;33029:22;;;;;;;;;;;;;;;;33027:24;;;;;;;;;;;33351:145;33388:2;33436:45;33451:4;33457:2;33461:19;33436:14;:45::i;:::-;10978:8;33409:72;33351:18;:145::i;:::-;33322:17;:26;33340:7;33322:26;;;;;;;;;;;:174;;;;33666:1;10978:8;33616:19;:46;:51;33612:626;;33688:19;33720:1;33710:7;:11;33688:33;;33877:1;33843:17;:30;33861:11;33843:30;;;;;;;;;;;;:35;33839:384;;33981:13;;33966:11;:28;33962:242;;34161:19;34128:17;:30;34146:11;34128:30;;;;;;;;;;;:52;;;;33962:242;33839:384;33669:569;33612:626;34285:7;34281:2;34266:27;;34275:4;34266:27;;;;;;;;;;;;34304:42;34325:4;34331:2;34335:7;34344:1;34304:20;:42::i;:::-;31677:2677;;;31554:2800;;;:::o;54537:113::-;55802:5;;;;;;;;;;;55788:19;;:10;:19;;;55780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54632:10:::1;54620:9;;:22;;;;;;;;;;;;;;;;;;54537:113:::0;:::o;54010:24::-;;;;;;;;;;;;;:::o;23179:185::-;23317:39;23334:4;23340:2;23344:7;23317:39;;;;;;;;;;;;:16;:39::i;:::-;23179:185;;;:::o;48920:468::-;49009:23;49070:22;49095:8;:15;49070:40;;49125:34;49183:14;49162:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49125:73;;49218:9;49213:125;49234:14;49229:1;:19;49213:125;;49290:32;49310:8;49319:1;49310:11;;;;;;;;:::i;:::-;;;;;;;;49290:19;:32::i;:::-;49274:10;49285:1;49274:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;49250:3;;;;;49213:125;;;;49359:10;49352:17;;;;48920:468;;;:::o;20132:144::-;20196:7;20239:27;20258:7;20239:18;:27::i;:::-;20216:52;;20132:144;;;:::o;54043:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15375:224::-;15439:7;15480:1;15463:19;;:5;:19;;;15459:60;;15491:28;;;;;;;;;;;;;;15459:60;9930:13;15537:18;:25;15556:5;15537:25;;;;;;;;;;;;;;;;:54;15530:61;;15375:224;;;:::o;55137:607::-;55242:4;55916:5;;;;;;;;;;;55902:19;;:10;:19;;;:46;;;;55939:9;;;;;;;;;;;55925:23;;:10;:23;;;55902:46;55894:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;55327:9:::1;55297:4;55272:41;;;55314:8;55272:51;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;55264:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;55411:6;55407:195;55427:9;55423:1;:13;55407:195;;;55532:8;55475:65;;55500:4;55475:39;;;55515:9;55525:1;55515:12;;;;;;;;:::i;:::-;;;;;;;;55475:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;;55467:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;55438:3;;;;;:::i;:::-;;;;55407:195;;;;55626:6;55622:91;55642:9;55638:1;:13;55622:91;;;55682:19;55688:9;55698:1;55688:12;;;;;;;;:::i;:::-;;;;;;;;55682:5;:19::i;:::-;55653:3;;;;;:::i;:::-;;;;55622:91;;;;55732:4;55725:11;;55137:607:::0;;;;;:::o;54424:105::-;55802:5;;;;;;;;;;;55788:19;;:10;:19;;;55780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54511:10:::1;54499:9;;:22;;;;;;;;;;;;;;;;;;54424:105:::0;:::o;52732:892::-;52802:16;52856:19;52890:25;52930:22;52955:16;52965:5;52955:9;:16::i;:::-;52930:41;;52986:25;53028:14;53014:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52986:57;;53058:31;;:::i;:::-;53109:9;53121:15;:13;:15::i;:::-;53109:27;;53104:472;53153:14;53138:11;:29;53104:472;;53205:15;53218:1;53205:12;:15::i;:::-;53193:27;;53243:9;:16;;;53284:8;53239:73;53360:1;53334:28;;:9;:14;;;:28;;;53330:111;;53407:9;:14;;;53387:34;;53330:111;53484:5;53463:26;;:17;:26;;;53459:102;;53540:1;53514:8;53523:13;;;;;;53514:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;53459:102;53104:472;53169:3;;;;;53104:472;;;;53597:8;53590:15;;;;;;;52732:892;;;:::o;20512:104::-;20568:13;20601:7;20594:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20512:104;:::o;49778:2505::-;49913:16;49980:4;49971:5;:13;49967:45;;49993:19;;;;;;;;;;;;;;49967:45;50027:19;50061:17;50081:14;:12;:14::i;:::-;50061:34;;50181:15;:13;:15::i;:::-;50173:5;:23;50169:87;;;50225:15;:13;:15::i;:::-;50217:23;;50169:87;50332:9;50325:4;:16;50321:73;;;50369:9;50362:16;;50321:73;50408:25;50436:16;50446:5;50436:9;:16::i;:::-;50408:44;;50630:4;50622:5;:12;50618:278;;;50655:19;50684:5;50677:4;:12;50655:34;;50726:17;50712:11;:31;50708:111;;;50788:11;50768:31;;50708:111;50636:198;50618:278;;;50879:1;50859:21;;50618:278;50910:25;50952:17;50938:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50910:60;;51010:1;50989:17;:22;50985:78;;51039:8;51032:15;;;;;;;;50985:78;51207:31;51241:26;51261:5;51241:19;:26::i;:::-;51207:60;;51282:25;51527:9;:16;;;51522:92;;51584:9;:14;;;51564:34;;51522:92;51633:9;51645:5;51633:17;;51628:478;51657:4;51652:1;:9;;:45;;;;;51680:17;51665:11;:32;;51652:45;51628:478;;;51735:15;51748:1;51735:12;:15::i;:::-;51723:27;;51773:9;:16;;;51814:8;51769:73;51890:1;51864:28;;:9;:14;;;:28;;;51860:111;;51937:9;:14;;;51917:34;;51860:111;52014:5;51993:26;;:17;:26;;;51989:102;;52070:1;52044:8;52053:13;;;;;;52044:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;51989:102;51628:478;51699:3;;;;;51628:478;;;;52208:11;52198:8;52191:29;52256:8;52249:15;;;;;;;;49778:2505;;;;;;:::o;54658:103::-;55802:5;;;;;;;;;;;55788:19;;:10;:19;;;55780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54745:8:::1;54735:7;:18;;;;;;;;;;;;:::i;:::-;;54658:103:::0;:::o;22565:308::-;22676:19;:17;:19::i;:::-;22664:31;;:8;:31;;;22660:61;;22704:17;;;;;;;;;;;;;;22660:61;22786:8;22734:18;:39;22753:19;:17;:19::i;:::-;22734:39;;;;;;;;;;;;;;;:49;22774:8;22734:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22846:8;22810:55;;22825:19;:17;:19::i;:::-;22810:55;;;22856:8;22810:55;;;;;;:::i;:::-;;;;;;;;22565:308;;:::o;54325:91::-;55802:5;;;;;;;;;;;55788:19;;:10;:19;;;55780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54402:6:::1;54395:5;;:13;;;;;;;;;;;;;;;;;;54325:91:::0;:::o;54979:150::-;55053:4;56068:5;;;;;;;;;;;56054:19;;:10;:19;;;:46;;;;56091:9;;;;;;;;;;;56077:23;;:10;:23;;;56054:46;56046:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;55075:24:::1;55085:2;55089:9;55075;:24::i;:::-;55117:4;55110:11;;54979:150:::0;;;;:::o;23435:399::-;23602:31;23615:4;23621:2;23625:7;23602:12;:31::i;:::-;23666:1;23648:2;:14;;;:19;23644:183;;23687:56;23718:4;23724:2;23728:7;23737:5;23687:30;:56::i;:::-;23682:145;;23771:40;;;;;;;;;;;;;;23682:145;23644:183;23435:399;;;;:::o;48341:420::-;48417:21;;:::i;:::-;48451:31;;:::i;:::-;48507:15;:13;:15::i;:::-;48497:7;:25;:54;;;;48537:14;:12;:14::i;:::-;48526:7;:25;;48497:54;48493:103;;;48575:9;48568:16;;;;;48493:103;48618:21;48631:7;48618:12;:21::i;:::-;48606:33;;48654:9;:16;;;48650:65;;;48694:9;48687:16;;;;;48650:65;48732:21;48745:7;48732:12;:21::i;:::-;48725:28;;;48341:420;;;;:::o;54769:202::-;54853:13;54884:16;54892:7;54884;:16::i;:::-;54879:59;;54909:29;;;;;;;;;;;;;;54879:59;54956:7;54949:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54769:202;;;:::o;22944:164::-;23041:4;23065:18;:25;23084:5;23065:25;;;;;;;;;;;;;;;:35;23091:8;23065:35;;;;;;;;;;;;;;;;;;;;;;;;;23058:42;;22944:164;;;;:::o;53978:25::-;;;;;;;;;;;;;:::o;24089:273::-;24146:4;24202:7;24183:15;:13;:15::i;:::-;:26;;:66;;;;;24236:13;;24226:7;:23;24183:66;:152;;;;;24334:1;10700:8;24287:17;:26;24305:7;24287:26;;;;;;;;;;;;:43;:48;24183:152;24163:172;;24089:273;;;:::o;42650:105::-;42710:7;42737:10;42730:17;;42650:105;:::o;13274:92::-;13330:7;13274:92;:::o;17049:1129::-;17116:7;17136:12;17151:7;17136:22;;17219:4;17200:15;:13;:15::i;:::-;:23;17196:915;;17253:13;;17246:4;:20;17242:869;;;17291:14;17308:17;:23;17326:4;17308:23;;;;;;;;;;;;17291:40;;17424:1;10700:8;17397:6;:23;:28;17393:699;;17916:113;17933:1;17923:6;:11;17916:113;;17976:17;:25;17994:6;;;;;;;17976:25;;;;;;;;;;;;17967:34;;17916:113;;;18062:6;18055:13;;;;;;17393:699;17268:843;17242:869;17196:915;18139:31;;;;;;;;;;;;;;17049:1129;;;;:::o;29890:652::-;29985:27;30014:23;30055:53;30111:15;30055:71;;30297:7;30291:4;30284:21;30332:22;30326:4;30319:36;30408:4;30402;30392:21;30369:44;;30504:19;30498:26;30479:45;;30235:300;29890:652;;;:::o;30655:645::-;30797:11;30959:15;30953:4;30949:26;30941:34;;31118:15;31107:9;31103:31;31090:44;;31265:15;31254:9;31251:30;31244:4;31233:9;31230:19;31227:55;31217:65;;30655:645;;;;;:::o;41483:159::-;;;;;:::o;39795:309::-;39930:7;39950:16;11101:3;39976:19;:40;;39950:67;;11101:3;40043:31;40054:4;40060:2;40064:9;40043:10;:31::i;:::-;40035:40;;:61;;40028:68;;;39795:309;;;;;:::o;19623:447::-;19703:14;19871:15;19864:5;19860:27;19851:36;;20045:5;20031:11;20007:22;20003:40;20000:51;19993:5;19990:62;19980:72;;19623:447;;;;:::o;42301:158::-;;;;;:::o;34432:89::-;34492:21;34498:7;34507:5;34492;:21::i;:::-;34432:89;:::o;18726:153::-;18786:21;;:::i;:::-;18827:44;18846:17;:24;18864:5;18846:24;;;;;;;;;;;;18827:18;:44::i;:::-;18820:51;;18726:153;;;:::o;13445:95::-;13492:7;13519:13;;13512:20;;13445:95;:::o;24446:104::-;24515:27;24525:2;24529:8;24515:27;;;;;;;;;;;;:9;:27::i;:::-;24446:104;;:::o;38305:716::-;38468:4;38514:2;38489:45;;;38535:19;:17;:19::i;:::-;38556:4;38562:7;38571:5;38489:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38485:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38789:1;38772:6;:13;:18;38768:235;;38818:40;;;;;;;;;;;;;;38768:235;38961:6;38955:13;38946:6;38942:2;38938:15;38931:38;38485:529;38658:54;;;38648:64;;;:6;:64;;;;38641:71;;;38305:716;;;;;;:::o;19382:158::-;19444:21;;:::i;:::-;19485:47;19504:27;19523:7;19504:18;:27::i;:::-;19485:18;:47::i;:::-;19478:54;;19382:158;;;:::o;40680:147::-;40817:6;40680:147;;;;;:::o;34750:3063::-;34830:27;34860;34879:7;34860:18;:27::i;:::-;34830:57;;34900:12;34931:19;34900:52;;34966:27;34995:23;35022:28;35042:7;35022:19;:28::i;:::-;34965:85;;;;35067:13;35063:310;;;35188:62;35207:15;35224:4;35230:19;:17;:19::i;:::-;35188:18;:62::i;:::-;35183:178;;35274:43;35291:4;35297:19;:17;:19::i;:::-;35274:16;:43::i;:::-;35269:92;;35326:35;;;;;;;;;;;;;;35269:92;35183:178;35063:310;35385:51;35407:4;35421:1;35425:7;35434:1;35385:21;:51::i;:::-;35529:15;35526:160;;;35669:1;35648:19;35641:30;35526:160;36345:1;10193:3;36316:1;:25;;36315:31;36287:18;:24;36306:4;36287:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;36613:174;36650:4;36719:53;36734:4;36748:1;36752:19;36719:14;:53::i;:::-;10978:8;10700;36674:41;36673:99;36613:18;:174::i;:::-;36584:17;:26;36602:7;36584:26;;;;;;;;;;;:203;;;;36957:1;10978:8;36907:19;:46;:51;36903:626;;36979:19;37011:1;37001:7;:11;36979:33;;37168:1;37134:17;:30;37152:11;37134:30;;;;;;;;;;;;:35;37130:384;;37272:13;;37257:11;:28;37253:242;;37452:19;37419:17;:30;37437:11;37419:30;;;;;;;;;;;:52;;;;37253:242;37130:384;36960:569;36903:626;37584:7;37580:1;37557:35;;37566:4;37557:35;;;;;;;;;;;;37603:50;37624:4;37638:1;37642:7;37651:1;37603:20;:50::i;:::-;37780:12;;:14;;;;;;;;;;;;;34819:2994;;;;34750:3063;;:::o;18272:363::-;18338:31;;:::i;:::-;18415:6;18382:9;:14;;:41;;;;;;;;;;;10584:3;18468:6;:32;;18434:9;:24;;:67;;;;;;;;;;;18558:1;10700:8;18531:6;:23;:28;;18512:9;:16;;:47;;;;;;;;;;;11101:3;18599:6;:27;;18570:9;:19;;:57;;;;;;;;;;;18272:363;;;:::o;24966:681::-;25089:19;25095:2;25099:8;25089:5;:19::i;:::-;25168:1;25150:2;:14;;;:19;25146:483;;25190:11;25204:13;;25190:27;;25236:13;25258:8;25252:3;:14;25236:30;;25285:233;25316:62;25355:1;25359:2;25363:7;;;;;;25372:5;25316:30;:62::i;:::-;25311:167;;25414:40;;;;;;;;;;;;;;25311:167;25513:3;25505:5;:11;25285:233;;25600:3;25583:13;;:20;25579:34;;25605:8;;;25579:34;25171:458;;25146:483;24966:681;;;:::o;25920:1529::-;25985:20;26008:13;;25985:36;;26050:1;26036:16;;:2;:16;;;26032:48;;26061:19;;;;;;;;;;;;;;26032:48;26107:1;26095:8;:13;26091:44;;26117:18;;;;;;;;;;;;;;26091:44;26148:61;26178:1;26182:2;26186:12;26200:8;26148:21;:61::i;:::-;26691:1;10067:2;26662:1;:25;;26661:31;26649:8;:44;26623:18;:22;26642:2;26623:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26970:139;27007:2;27061:33;27084:1;27088:2;27092:1;27061:14;:33::i;:::-;27028:30;27049:8;27028:20;:30::i;:::-;:66;26970:18;:139::i;:::-;26936:17;:31;26954:12;26936:31;;;;;;;;;;;:173;;;;27126:15;27144:12;27126:30;;27171:11;27200:8;27185:12;:23;27171:37;;27223:101;27275:9;;;;;;27271:2;27250:35;;27267:1;27250:35;;;;;;;;;;;;27319:3;27309:7;:13;27223:101;;27356:3;27340:13;:19;;;;26397:974;;27381:60;27410:1;27414:2;27418:12;27432:8;27381:20;:60::i;:::-;25974:1475;25920:1529;;:::o;21453:322::-;21523:14;21754:1;21744:8;21741:15;21716:23;21712:45;21702:55;;21453:322;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::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:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:144::-;9189:6;9223:5;9217:12;9207:22;;9092:144;;;:::o;9242:214::-;9371:11;9405:6;9400:3;9393:19;9445:4;9440:3;9436:14;9421:29;;9242:214;;;;:::o;9462:162::-;9559:4;9582:3;9574:11;;9612:4;9607:3;9603:14;9595:22;;9462:162;;;:::o;9630:108::-;9707:24;9725:5;9707:24;:::i;:::-;9702:3;9695:37;9630:108;;:::o;9744:101::-;9780:7;9820:18;9813:5;9809:30;9798:41;;9744:101;;;:::o;9851:105::-;9926:23;9943:5;9926:23;:::i;:::-;9921:3;9914:36;9851:105;;:::o;9962:99::-;10033:21;10048:5;10033:21;:::i;:::-;10028:3;10021:34;9962:99;;:::o;10067:91::-;10103:7;10143:8;10136:5;10132:20;10121:31;;10067:91;;;:::o;10164:105::-;10239:23;10256:5;10239:23;:::i;:::-;10234:3;10227:36;10164:105;;:::o;10347:862::-;10494:4;10489:3;10485:14;10581:4;10574:5;10570:16;10564:23;10600:63;10657:4;10652:3;10648:14;10634:12;10600:63;:::i;:::-;10509:164;10765:4;10758:5;10754:16;10748:23;10784:61;10839:4;10834:3;10830:14;10816:12;10784:61;:::i;:::-;10683:172;10939:4;10932:5;10928:16;10922:23;10958:57;11009:4;11004:3;11000:14;10986:12;10958:57;:::i;:::-;10865:160;11112:4;11105:5;11101:16;11095:23;11131:61;11186:4;11181:3;11177:14;11163:12;11131:61;:::i;:::-;11035:167;10463:746;10347:862;;:::o;11215:299::-;11344:10;11365:106;11467:3;11459:6;11365:106;:::i;:::-;11503:4;11498:3;11494:14;11480:28;;11215:299;;;;:::o;11520:143::-;11620:4;11652;11647:3;11643:14;11635:22;;11520:143;;;:::o;11745:972::-;11924:3;11953:84;12031:5;11953:84;:::i;:::-;12053:116;12162:6;12157:3;12053:116;:::i;:::-;12046:123;;12193:86;12273:5;12193:86;:::i;:::-;12302:7;12333:1;12318:374;12343:6;12340:1;12337:13;12318:374;;;12419:6;12413:13;12446:123;12565:3;12550:13;12446:123;:::i;:::-;12439:130;;12592:90;12675:6;12592:90;:::i;:::-;12582:100;;12378:314;12365:1;12362;12358:9;12353:14;;12318:374;;;12322:14;12708:3;12701:10;;11929:788;;;11745:972;;;;:::o;12723:493::-;12926:4;12964:2;12953:9;12949:18;12941:26;;13013:9;13007:4;13003:20;12999:1;12988:9;12984:17;12977:47;13041:168;13204:4;13195:6;13041:168;:::i;:::-;13033:176;;12723:493;;;;:::o;13222:829::-;13324:6;13332;13340;13389:2;13377:9;13368:7;13364:23;13360:32;13357:119;;;13395:79;;:::i;:::-;13357:119;13515:1;13540:53;13585:7;13576:6;13565:9;13561:22;13540:53;:::i;:::-;13530:63;;13486:117;13642:2;13668:53;13713:7;13704:6;13693:9;13689:22;13668:53;:::i;:::-;13658:63;;13613:118;13798:2;13787:9;13783:18;13770:32;13829:18;13821:6;13818:30;13815:117;;;13851:79;;:::i;:::-;13815:117;13956:78;14026:7;14017:6;14006:9;14002:22;13956:78;:::i;:::-;13946:88;;13741:303;13222:829;;;;;:::o;14057:114::-;14124:6;14158:5;14152:12;14142:22;;14057:114;;;:::o;14177:184::-;14276:11;14310:6;14305:3;14298:19;14350:4;14345:3;14341:14;14326:29;;14177:184;;;;:::o;14367:132::-;14434:4;14457:3;14449:11;;14487:4;14482:3;14478:14;14470:22;;14367:132;;;:::o;14505:108::-;14582:24;14600:5;14582:24;:::i;:::-;14577:3;14570:37;14505:108;;:::o;14619:179::-;14688:10;14709:46;14751:3;14743:6;14709:46;:::i;:::-;14787:4;14782:3;14778:14;14764:28;;14619:179;;;;:::o;14804:113::-;14874:4;14906;14901:3;14897:14;14889:22;;14804:113;;;:::o;14953:732::-;15072:3;15101:54;15149:5;15101:54;:::i;:::-;15171:86;15250:6;15245:3;15171:86;:::i;:::-;15164:93;;15281:56;15331:5;15281:56;:::i;:::-;15360:7;15391:1;15376:284;15401:6;15398:1;15395:13;15376:284;;;15477:6;15471:13;15504:63;15563:3;15548:13;15504:63;:::i;:::-;15497:70;;15590:60;15643:6;15590:60;:::i;:::-;15580:70;;15436:224;15423:1;15420;15416:9;15411:14;;15376:284;;;15380:14;15676:3;15669:10;;15077:608;;;14953:732;;;;:::o;15691:373::-;15834:4;15872:2;15861:9;15857:18;15849:26;;15921:9;15915:4;15911:20;15907:1;15896:9;15892:17;15885:47;15949:108;16052:4;16043:6;15949:108;:::i;:::-;15941:116;;15691:373;;;;:::o;16070:619::-;16147:6;16155;16163;16212:2;16200:9;16191:7;16187:23;16183:32;16180:119;;;16218:79;;:::i;:::-;16180:119;16338:1;16363:53;16408:7;16399:6;16388:9;16384:22;16363:53;:::i;:::-;16353:63;;16309:117;16465:2;16491:53;16536:7;16527:6;16516:9;16512:22;16491:53;:::i;:::-;16481:63;;16436:118;16593:2;16619:53;16664:7;16655:6;16644:9;16640:22;16619:53;:::i;:::-;16609:63;;16564:118;16070:619;;;;;:::o;16695:117::-;16804:1;16801;16794:12;16818:308;16880:4;16970:18;16962:6;16959:30;16956:56;;;16992:18;;:::i;:::-;16956:56;17030:29;17052:6;17030:29;:::i;:::-;17022:37;;17114:4;17108;17104:15;17096:23;;16818:308;;;:::o;17132:154::-;17216:6;17211:3;17206;17193:30;17278:1;17269:6;17264:3;17260:16;17253:27;17132:154;;;:::o;17292:412::-;17370:5;17395:66;17411:49;17453:6;17411:49;:::i;:::-;17395:66;:::i;:::-;17386:75;;17484:6;17477:5;17470:21;17522:4;17515:5;17511:16;17560:3;17551:6;17546:3;17542:16;17539:25;17536:112;;;17567:79;;:::i;:::-;17536:112;17657:41;17691:6;17686:3;17681;17657:41;:::i;:::-;17376:328;17292:412;;;;;:::o;17724:340::-;17780:5;17829:3;17822:4;17814:6;17810:17;17806:27;17796:122;;17837:79;;:::i;:::-;17796:122;17954:6;17941:20;17979:79;18054:3;18046:6;18039:4;18031:6;18027:17;17979:79;:::i;:::-;17970:88;;17786:278;17724:340;;;;:::o;18070:509::-;18139:6;18188:2;18176:9;18167:7;18163:23;18159:32;18156:119;;;18194:79;;:::i;:::-;18156:119;18342:1;18331:9;18327:17;18314:31;18372:18;18364:6;18361:30;18358:117;;;18394:79;;:::i;:::-;18358:117;18499:63;18554:7;18545:6;18534:9;18530:22;18499:63;:::i;:::-;18489:73;;18285:287;18070:509;;;;:::o;18585:116::-;18655:21;18670:5;18655:21;:::i;:::-;18648:5;18645:32;18635:60;;18691:1;18688;18681:12;18635:60;18585:116;:::o;18707:133::-;18750:5;18788:6;18775:20;18766:29;;18804:30;18828:5;18804:30;:::i;:::-;18707:133;;;;:::o;18846:468::-;18911:6;18919;18968:2;18956:9;18947:7;18943:23;18939:32;18936:119;;;18974:79;;:::i;:::-;18936:119;19094:1;19119:53;19164:7;19155:6;19144:9;19140:22;19119:53;:::i;:::-;19109:63;;19065:117;19221:2;19247:50;19289:7;19280:6;19269:9;19265:22;19247:50;:::i;:::-;19237:60;;19192:115;18846:468;;;;;:::o;19320:307::-;19381:4;19471:18;19463:6;19460:30;19457:56;;;19493:18;;:::i;:::-;19457:56;19531:29;19553:6;19531:29;:::i;:::-;19523:37;;19615:4;19609;19605:15;19597:23;;19320:307;;;:::o;19633:410::-;19710:5;19735:65;19751:48;19792:6;19751:48;:::i;:::-;19735:65;:::i;:::-;19726:74;;19823:6;19816:5;19809:21;19861:4;19854:5;19850:16;19899:3;19890:6;19885:3;19881:16;19878:25;19875:112;;;19906:79;;:::i;:::-;19875:112;19996:41;20030:6;20025:3;20020;19996:41;:::i;:::-;19716:327;19633:410;;;;;:::o;20062:338::-;20117:5;20166:3;20159:4;20151:6;20147:17;20143:27;20133:122;;20174:79;;:::i;:::-;20133:122;20291:6;20278:20;20316:78;20390:3;20382:6;20375:4;20367:6;20363:17;20316:78;:::i;:::-;20307:87;;20123:277;20062:338;;;;:::o;20406:943::-;20501:6;20509;20517;20525;20574:3;20562:9;20553:7;20549:23;20545:33;20542:120;;;20581:79;;:::i;:::-;20542:120;20701:1;20726:53;20771:7;20762:6;20751:9;20747:22;20726:53;:::i;:::-;20716:63;;20672:117;20828:2;20854:53;20899:7;20890:6;20879:9;20875:22;20854:53;:::i;:::-;20844:63;;20799:118;20956:2;20982:53;21027:7;21018:6;21007:9;21003:22;20982:53;:::i;:::-;20972:63;;20927:118;21112:2;21101:9;21097:18;21084:32;21143:18;21135:6;21132:30;21129:117;;;21165:79;;:::i;:::-;21129:117;21270:62;21324:7;21315:6;21304:9;21300:22;21270:62;:::i;:::-;21260:72;;21055:287;20406:943;;;;;;;:::o;21427:872::-;21584:4;21579:3;21575:14;21671:4;21664:5;21660:16;21654:23;21690:63;21747:4;21742:3;21738:14;21724:12;21690:63;:::i;:::-;21599:164;21855:4;21848:5;21844:16;21838:23;21874:61;21929:4;21924:3;21920:14;21906:12;21874:61;:::i;:::-;21773:172;22029:4;22022:5;22018:16;22012:23;22048:57;22099:4;22094:3;22090:14;22076:12;22048:57;:::i;:::-;21955:160;22202:4;22195:5;22191:16;22185:23;22221:61;22276:4;22271:3;22267:14;22253:12;22221:61;:::i;:::-;22125:167;21553:746;21427:872;;:::o;22305:343::-;22458:4;22496:3;22485:9;22481:19;22473:27;;22510:131;22638:1;22627:9;22623:17;22614:6;22510:131;:::i;:::-;22305:343;;;;:::o;22654:474::-;22722:6;22730;22779:2;22767:9;22758:7;22754:23;22750:32;22747:119;;;22785:79;;:::i;:::-;22747:119;22905:1;22930:53;22975:7;22966:6;22955:9;22951:22;22930:53;:::i;:::-;22920:63;;22876:117;23032:2;23058:53;23103:7;23094:6;23083:9;23079:22;23058:53;:::i;:::-;23048:63;;23003:118;22654:474;;;;;:::o;23134:180::-;23182:77;23179:1;23172:88;23279:4;23276:1;23269:15;23303:4;23300:1;23293:15;23320:320;23364:6;23401:1;23395:4;23391:12;23381:22;;23448:1;23442:4;23438:12;23469:18;23459:81;;23525:4;23517:6;23513:17;23503:27;;23459:81;23587:2;23579:6;23576:14;23556:18;23553:38;23550:84;;23606:18;;:::i;:::-;23550:84;23371:269;23320:320;;;:::o;23646:177::-;23786:29;23782:1;23774:6;23770:14;23763:53;23646:177;:::o;23829:366::-;23971:3;23992:67;24056:2;24051:3;23992:67;:::i;:::-;23985:74;;24068:93;24157:3;24068:93;:::i;:::-;24186:2;24181:3;24177:12;24170:19;;23829:366;;;:::o;24201:419::-;24367:4;24405:2;24394:9;24390:18;24382:26;;24454:9;24448:4;24444:20;24440:1;24429:9;24425:17;24418:47;24482:131;24608:4;24482:131;:::i;:::-;24474:139;;24201:419;;;:::o;24626:180::-;24674:77;24671:1;24664:88;24771:4;24768:1;24761:15;24795:4;24792:1;24785:15;24812:225;24952:34;24948:1;24940:6;24936:14;24929:58;25021:8;25016:2;25008:6;25004:15;24997:33;24812:225;:::o;25043:366::-;25185:3;25206:67;25270:2;25265:3;25206:67;:::i;:::-;25199:74;;25282:93;25371:3;25282:93;:::i;:::-;25400:2;25395:3;25391:12;25384:19;;25043:366;;;:::o;25415:419::-;25581:4;25619:2;25608:9;25604:18;25596:26;;25668:9;25662:4;25658:20;25654:1;25643:9;25639:17;25632:47;25696:131;25822:4;25696:131;:::i;:::-;25688:139;;25415:419;;;:::o;25840:143::-;25897:5;25928:6;25922:13;25913:22;;25944:33;25971:5;25944:33;:::i;:::-;25840:143;;;;:::o;25989:351::-;26059:6;26108:2;26096:9;26087:7;26083:23;26079:32;26076:119;;;26114:79;;:::i;:::-;26076:119;26234:1;26259:64;26315:7;26306:6;26295:9;26291:22;26259:64;:::i;:::-;26249:74;;26205:128;25989:351;;;;:::o;26346:232::-;26486:34;26482:1;26474:6;26470:14;26463:58;26555:15;26550:2;26542:6;26538:15;26531:40;26346:232;:::o;26584:366::-;26726:3;26747:67;26811:2;26806:3;26747:67;:::i;:::-;26740:74;;26823:93;26912:3;26823:93;:::i;:::-;26941:2;26936:3;26932:12;26925:19;;26584:366;;;:::o;26956:419::-;27122:4;27160:2;27149:9;27145:18;27137:26;;27209:9;27203:4;27199:20;27195:1;27184:9;27180:17;27173:47;27237:131;27363:4;27237:131;:::i;:::-;27229:139;;26956:419;;;:::o;27381:143::-;27438:5;27469:6;27463:13;27454:22;;27485:33;27512:5;27485:33;:::i;:::-;27381:143;;;;:::o;27530:351::-;27600:6;27649:2;27637:9;27628:7;27624:23;27620:32;27617:119;;;27655:79;;:::i;:::-;27617:119;27775:1;27800:64;27856:7;27847:6;27836:9;27832:22;27800:64;:::i;:::-;27790:74;;27746:128;27530:351;;;;:::o;27887:232::-;28027:34;28023:1;28015:6;28011:14;28004:58;28096:15;28091:2;28083:6;28079:15;28072:40;27887:232;:::o;28125:366::-;28267:3;28288:67;28352:2;28347:3;28288:67;:::i;:::-;28281:74;;28364:93;28453:3;28364:93;:::i;:::-;28482:2;28477:3;28473:12;28466:19;;28125:366;;;:::o;28497:419::-;28663:4;28701:2;28690:9;28686:18;28678:26;;28750:9;28744:4;28740:20;28736:1;28725:9;28721:17;28714:47;28778:131;28904:4;28778:131;:::i;:::-;28770:139;;28497:419;;;:::o;28922:180::-;28970:77;28967:1;28960:88;29067:4;29064:1;29057:15;29091:4;29088:1;29081:15;29108:233;29147:3;29170:24;29188:5;29170:24;:::i;:::-;29161:33;;29216:66;29209:5;29206:77;29203:103;;29286:18;;:::i;:::-;29203:103;29333:1;29326:5;29322:13;29315:20;;29108:233;;;:::o;29347:236::-;29487:34;29483:1;29475:6;29471:14;29464:58;29556:19;29551:2;29543:6;29539:15;29532:44;29347:236;:::o;29589:366::-;29731:3;29752:67;29816:2;29811:3;29752:67;:::i;:::-;29745:74;;29828:93;29917:3;29828:93;:::i;:::-;29946:2;29941:3;29937:12;29930:19;;29589:366;;;:::o;29961:419::-;30127:4;30165:2;30154:9;30150:18;30142:26;;30214:9;30208:4;30204:20;30200:1;30189:9;30185:17;30178:47;30242:131;30368:4;30242:131;:::i;:::-;30234:139;;29961:419;;;:::o;30386:98::-;30437:6;30471:5;30465:12;30455:22;;30386:98;;;:::o;30490:168::-;30573:11;30607:6;30602:3;30595:19;30647:4;30642:3;30638:14;30623:29;;30490:168;;;;:::o;30664:360::-;30750:3;30778:38;30810:5;30778:38;:::i;:::-;30832:70;30895:6;30890:3;30832:70;:::i;:::-;30825:77;;30911:52;30956:6;30951:3;30944:4;30937:5;30933:16;30911:52;:::i;:::-;30988:29;31010:6;30988:29;:::i;:::-;30983:3;30979:39;30972:46;;30754:270;30664:360;;;;:::o;31030:640::-;31225:4;31263:3;31252:9;31248:19;31240:27;;31277:71;31345:1;31334:9;31330:17;31321:6;31277:71;:::i;:::-;31358:72;31426:2;31415:9;31411:18;31402:6;31358:72;:::i;:::-;31440;31508:2;31497:9;31493:18;31484:6;31440:72;:::i;:::-;31559:9;31553:4;31549:20;31544:2;31533:9;31529:18;31522:48;31587:76;31658:4;31649:6;31587:76;:::i;:::-;31579:84;;31030:640;;;;;;;:::o;31676:141::-;31732:5;31763:6;31757:13;31748:22;;31779:32;31805:5;31779:32;:::i;:::-;31676:141;;;;:::o;31823:349::-;31892:6;31941:2;31929:9;31920:7;31916:23;31912:32;31909:119;;;31947:79;;:::i;:::-;31909:119;32067:1;32092:63;32147:7;32138:6;32127:9;32123:22;32092:63;:::i;:::-;32082:73;;32038:127;31823:349;;;;:::o
Swarm Source
ipfs://ba65fd3871999fb3b31f439c9385ddb9795a5e5b6de56f1e8ce1753e545e8f87