Overview
CRO Balance
0 CRO
CRO Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,180 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16206030 | 24 hrs ago | IN | 0 CRO | 0.23596125 | ||||
Safe Transfer Fr... | 16095976 | 8 days ago | IN | 0 CRO | 0.25116532 | ||||
Safe Transfer Fr... | 16095974 | 8 days ago | IN | 0 CRO | 0.33669097 | ||||
Safe Transfer Fr... | 16032242 | 12 days ago | IN | 0 CRO | 0.25234545 | ||||
Safe Transfer Fr... | 16032237 | 12 days ago | IN | 0 CRO | 0.25931319 | ||||
Safe Transfer Fr... | 16032232 | 12 days ago | IN | 0 CRO | 0.27896099 | ||||
Safe Transfer Fr... | 16032226 | 12 days ago | IN | 0 CRO | 0.35527074 | ||||
Transfer From | 16029562 | 12 days ago | IN | 0 CRO | 0.505 | ||||
Safe Transfer Fr... | 16028957 | 12 days ago | IN | 0 CRO | 0.6414308 | ||||
Transfer From | 15932546 | 18 days ago | IN | 0 CRO | 0.505 | ||||
Safe Transfer Fr... | 15930621 | 19 days ago | IN | 0 CRO | 0.35118205 | ||||
Safe Transfer Fr... | 15706774 | 33 days ago | IN | 0 CRO | 0.33975697 | ||||
Safe Transfer Fr... | 15463736 | 49 days ago | IN | 0 CRO | 0.30272414 | ||||
Transfer From | 15145636 | 70 days ago | IN | 0 CRO | 0.505 | ||||
Transfer From | 15145627 | 70 days ago | IN | 0 CRO | 0.505 | ||||
Transfer From | 15138343 | 71 days ago | IN | 0 CRO | 0.505 | ||||
Transfer From | 15106219 | 73 days ago | IN | 0 CRO | 0.505 | ||||
Safe Transfer Fr... | 15018768 | 78 days ago | IN | 0 CRO | 0.7997988 | ||||
Transfer From | 14962557 | 82 days ago | IN | 0 CRO | 0.505 | ||||
Safe Transfer Fr... | 14786106 | 94 days ago | IN | 0 CRO | 0.27833878 | ||||
Safe Transfer Fr... | 14786098 | 94 days ago | IN | 0 CRO | 0.25234545 | ||||
Safe Transfer Fr... | 14785998 | 94 days ago | IN | 0 CRO | 0.2536009 | ||||
Safe Transfer Fr... | 14785974 | 94 days ago | IN | 0 CRO | 0.25178677 | ||||
Safe Transfer Fr... | 14785937 | 94 days ago | IN | 0 CRO | 0.25112766 | ||||
Safe Transfer Fr... | 14785849 | 94 days ago | IN | 0 CRO | 0.2536009 |
Loading...
Loading
Contract Name:
BasicERC721A
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-12-13 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // SPDX-License-Identifier: MIT // File erc721a/contracts/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ 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(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores 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 via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @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() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 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`, * 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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` 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](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File erc721a/contracts/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // 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 `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID 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 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual 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 virtual { 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; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ 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: [ERC165](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. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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 ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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 initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev 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); } /** * @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 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)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns 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)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 virtual { uint256 startTokenId = _currentIndex; 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 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _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 virtual { 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 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 virtual { _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 Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @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) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(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++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { 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 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 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; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @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 virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/utils/structs/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ 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` * - `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) 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 collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `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 virtual 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[] calldata tokenIds) external view virtual 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 virtual 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 collections should be fine). */ function tokensOfOwner(address owner) external view virtual 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 contracts/StartTokenIdHelper.sol pragma solidity ^0.8.4; /** * This Helper is used to return a dynamic value in the overridden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overridden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { uint256 public startTokenId; constructor(uint256 startTokenId_) { startTokenId = startTokenId_; } } // File contracts/BasicErc721A.sol pragma solidity 0.8.4; // import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; contract BasicERC721A is StartTokenIdHelper, ERC165, ERC721A, ERC2981, ERC721AQueryable, AccessControlEnumerable { string private _baseTokenURI; uint256 public maxSupply; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); event UpdateRoyalty(address indexed _royaltyReceiver, uint96 _royaltyFee); event UpdateTokenRoyalty(uint256 indexed _tokenId, address indexed _royaltyReceiver, uint96 _royaltyFee); event ResetTokenRoyalty(uint256 indexed _tokenId); event DeleteDefaultRoyalty(); event UpdateMaxSupply(uint256 oldMaxSupply, uint256 newMaxSupply); constructor( string memory name_, string memory symbol_, uint256 _startTokenId_, uint256 _maxSupply, address _minter, address _royaltyReceiver, uint96 _royaltyFee // 100 = 1% ) StartTokenIdHelper(_startTokenId_) ERC721A(name_, symbol_) { require(_maxSupply > 0, "maxSupply is 0"); maxSupply = _maxSupply; _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "__grantRole failed for DEFAULT_ADMIN_ROLE"); // Minter is not required. If minter address is specified, then give the minter role if (_minter != address(0)) { _grantRole(MINTER_ROLE, _minter); require(hasRole(MINTER_ROLE, _minter), "__grantRole failed for MINTER_ROLE"); } // set royalty information if (_royaltyReceiver != address(0)) { _setDefaultRoyalty(_royaltyReceiver, _royaltyFee); } } function _startTokenId() internal view virtual override returns (uint256) { return startTokenId; } function updateMaxSupply(uint256 _newMaxSupply) public { require(_newMaxSupply >= totalSupply(), "invalid maxSupply"); emit UpdateMaxSupply(maxSupply, _newMaxSupply); maxSupply = _newMaxSupply; } function totalMinted() public view returns (uint256) { return _totalMinted(); } function safeMint(address to) external { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || hasRole(MINTER_ROLE, msg.sender), "no permission to call" ); require(totalSupply() < maxSupply, "max supply reached"); _mint(to, 1); } function batchMint(address to, uint256 quantity) external { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || hasRole(MINTER_ROLE, msg.sender), "no permission to call" ); require(totalSupply() + quantity <= maxSupply, "max supply reached"); _mint(to, quantity); } function burn(uint256 _tokenId) public { _burn(_tokenId, true); } function batchBurn(uint256 fromIndex, uint256 toIndex) public { for (uint256 index = fromIndex; index <= toIndex; index++) { _burn(index, true); } } function batchBurn(uint256[] memory _tokenIds) public { for (uint256 i = 0; i < _tokenIds.length; i++) { _burn(_tokenIds[i], true); } } function batchTransfer( uint256 fromIndex, uint256 toIndex, address receiverAddress ) public { for (uint256 index = fromIndex; index <= toIndex; index++) { transferFrom(msg.sender, receiverAddress, index); } } function batchTransfer(uint256[] calldata indexes, address receiverAddress) public { for (uint256 i = 0; i < indexes.length; i++) { transferFrom(msg.sender, receiverAddress, indexes[i]); } } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function baseURI() public view returns (string memory) { return _baseURI(); } function setBaseURI(string calldata _newBaseURI) public onlyRole(DEFAULT_ADMIN_ROLE) { _baseTokenURI = _newBaseURI; } function supportsInterface(bytes4 interfaceId) public view override(ERC165, ERC721A, ERC2981, AccessControlEnumerable) returns (bool) { return super.supportsInterface(interfaceId); } // royalty function updateRoyalty(address _royaltyReceiver, uint96 _royaltyFee) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultRoyalty(_royaltyReceiver, _royaltyFee); emit UpdateRoyalty(_royaltyReceiver, _royaltyFee); } function deleteDefaultRoyalty() external onlyRole(DEFAULT_ADMIN_ROLE) { _deleteDefaultRoyalty(); emit DeleteDefaultRoyalty(); } function updateTokenRoyalty( uint256 _tokenId, address _royaltyReceiver, uint96 _royaltyFee ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setTokenRoyalty(_tokenId, _royaltyReceiver, _royaltyFee); emit UpdateTokenRoyalty(_tokenId, _royaltyReceiver, _royaltyFee); } function resetTokenRoyalty(uint256 _tokenId) external onlyRole(DEFAULT_ADMIN_ROLE) { _resetTokenRoyalty(_tokenId); emit ResetTokenRoyalty(_tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"_startTokenId_","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"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":[],"name":"DeleteDefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ResetTokenRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"UpdateMaxSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"UpdateRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"UpdateTokenRoyalty","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256","name":"fromIndex","type":"uint256"},{"internalType":"uint256","name":"toIndex","type":"uint256"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address","name":"receiverAddress","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromIndex","type":"uint256"},{"internalType":"uint256","name":"toIndex","type":"uint256"},{"internalType":"address","name":"receiverAddress","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"updateTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005efa38038062005efa833981810160405281019062000037919062000816565b868686806000819055505081600390805190602001906200005a929190620006af565b50806004908051906020019062000073929190620006af565b50620000846200027660201b60201c565b600181905550505060008411620000d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c990620009b8565b60405180910390fd5b83600e81905550620000ee6000801b336200027f60201b60201c565b620001036000801b33620002c760201b60201c565b62000145576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013c90620009da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200022157620001ac7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6846200027f60201b60201c565b620001de7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684620002c760201b60201c565b62000220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021790620009fc565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000269576200026882826200033260201b60201c565b5b5050505050505062000dc6565b60008054905090565b620002968282620004d660201b620021a61760201c565b620002c281600c6000858152602001908152602001600020620005c860201b620022871790919060201c565b505050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620003426200060060201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039a9062000a1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040d9062000a40565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620004e88282620002c760201b60201c565b620005c4576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005696200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620005f8836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200061260201b60201c565b905092915050565b6000612710905090565b600033905090565b60006200062683836200068c60201b60201c565b6200068157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000686565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620006bd9062000b5e565b90600052602060002090601f016020900481019282620006e157600085556200072d565b82601f10620006fc57805160ff19168380011785556200072d565b828001600101855582156200072d579182015b828111156200072c5782518255916020019190600101906200070f565b5b5090506200073c919062000740565b5090565b5b808211156200075b57600081600090555060010162000741565b5090565b600062000776620007708462000a8b565b62000a62565b9050828152602081018484840111156200078f57600080fd5b6200079c84828562000b28565b509392505050565b600081519050620007b58162000d78565b92915050565b600082601f830112620007cd57600080fd5b8151620007df8482602086016200075f565b91505092915050565b600081519050620007f98162000d92565b92915050565b600081519050620008108162000dac565b92915050565b600080600080600080600060e0888a0312156200083257600080fd5b600088015167ffffffffffffffff8111156200084d57600080fd5b6200085b8a828b01620007bb565b975050602088015167ffffffffffffffff8111156200087957600080fd5b620008878a828b01620007bb565b96505060406200089a8a828b01620007e8565b9550506060620008ad8a828b01620007e8565b9450506080620008c08a828b01620007a4565b93505060a0620008d38a828b01620007a4565b92505060c0620008e68a828b01620007ff565b91505092959891949750929550565b600062000904600e8362000ac1565b9150620009118262000c39565b602082019050919050565b60006200092b60298362000ac1565b9150620009388262000c62565b604082019050919050565b60006200095260228362000ac1565b91506200095f8262000cb1565b604082019050919050565b600062000979602a8362000ac1565b9150620009868262000d00565b604082019050919050565b6000620009a060198362000ac1565b9150620009ad8262000d4f565b602082019050919050565b60006020820190508181036000830152620009d381620008f5565b9050919050565b60006020820190508181036000830152620009f5816200091c565b9050919050565b6000602082019050818103600083015262000a178162000943565b9050919050565b6000602082019050818103600083015262000a39816200096a565b9050919050565b6000602082019050818103600083015262000a5b8162000991565b9050919050565b600062000a6e62000a81565b905062000a7c828262000b94565b919050565b6000604051905090565b600067ffffffffffffffff82111562000aa95762000aa862000bf9565b5b62000ab48262000c28565b9050602081019050919050565b600082825260208201905092915050565b600062000adf8262000ae6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b8381101562000b4857808201518184015260208101905062000b2b565b8381111562000b58576000848401525b50505050565b6000600282049050600182168062000b7757607f821691505b6020821081141562000b8e5762000b8d62000bca565b5b50919050565b62000b9f8262000c28565b810181811067ffffffffffffffff8211171562000bc15762000bc062000bf9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d6178537570706c792069732030000000000000000000000000000000000000600082015250565b7f5f5f6772616e74526f6c65206661696c656420666f722044454641554c545f4160008201527f444d494e5f524f4c450000000000000000000000000000000000000000000000602082015250565b7f5f5f6772616e74526f6c65206661696c656420666f72204d494e5445525f524f60008201527f4c45000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000d838162000ad2565b811462000d8f57600080fd5b50565b62000d9d8162000b06565b811462000da957600080fd5b50565b62000db78162000b10565b811462000dc357600080fd5b50565b6151248062000dd66000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80638a616bc01161015c578063c87b56dd116100ce578063daa83c6d11610087578063daa83c6d146107df578063dc02c822146107fb578063dc8e92ea14610817578063e6798baa14610833578063e985e9c514610851578063f103b433146108815761027f565b8063c87b56dd1461070b578063ca15c8731461073b578063ce40ad861461076b578063d539139314610787578063d547741f146107a5578063d5abeb01146107c15761027f565b8063a217fddf11610120578063a217fddf1461065d578063a22cb4651461067b578063a2309ff814610697578063aa1b103f146106b5578063b88d4fde146106bf578063c23dc68f146106db5761027f565b80638a616bc0146105935780639010d07c146105af57806391d14854146105df57806395d89b411461060f57806399a2557a1461062d5761027f565b806342842e0e116101f55780636352211e116101b95780636352211e146104ad5780636c0360eb146104dd57806370a08231146104fb5780638462151c1461052b578063860cad791461055b57806386e228d5146105775761027f565b806342842e0e1461040d57806342966c681461042957806343508b051461044557806355f804b3146104615780635bbb21771461047d5761027f565b806323b872dd1161024757806323b872dd1461033c578063248a9ca3146103585780632a55205a146103885780632f2ff15d146103b957806336568abe146103d557806340d097c3146103f15761027f565b806301ffc9a71461028457806306fdde03146102b4578063081812fc146102d2578063095ea7b31461030257806318160ddd1461031e575b600080fd5b61029e600480360381019061029991906140c9565b61089d565b6040516102ab91906147c2565b60405180910390f35b6102bc6108af565b6040516102c991906147f8565b60405180910390f35b6102ec60048036038101906102e79190614160565b610941565b6040516102f991906146ee565b60405180910390f35b61031c60048036038101906103179190613e83565b6109c0565b005b610326610b04565b6040516103339190614935565b60405180910390f35b61035660048036038101906103519190613d7d565b610b1b565b005b610372600480360381019061036d9190614028565b610e40565b60405161037f91906147dd565b60405180910390f35b6103a2600480360381019061039d91906141d8565b610e60565b6040516103b0929190614755565b60405180910390f35b6103d360048036038101906103ce9190614051565b61104b565b005b6103ef60048036038101906103ea9190614051565b611074565b005b61040b60048036038101906104069190613d18565b6110f7565b005b61042760048036038101906104229190613d7d565b6111cd565b005b610443600480360381019061043e9190614160565b6111ed565b005b61045f600480360381019061045a9190613e83565b6111fb565b005b61047b6004803603810190610476919061411b565b6112dd565b005b61049760048036038101906104929190613f4a565b611309565b6040516104a4919061477e565b60405180910390f35b6104c760048036038101906104c29190614160565b61143e565b6040516104d491906146ee565b60405180910390f35b6104e5611450565b6040516104f291906147f8565b60405180910390f35b61051560048036038101906105109190613d18565b61145f565b6040516105229190614935565b60405180910390f35b61054560048036038101906105409190613d18565b611518565b60405161055291906147a0565b60405180910390f35b610575600480360381019061057091906141d8565b6116ae565b005b610591600480360381019061058c9190614189565b6116de565b005b6105ad60048036038101906105a89190614160565b611753565b005b6105c960048036038101906105c4919061408d565b6117a2565b6040516105d691906146ee565b60405180910390f35b6105f960048036038101906105f49190614051565b6117d1565b60405161060691906147c2565b60405180910390f35b61061761183c565b60405161062491906147f8565b60405180910390f35b61064760048036038101906106429190613ebf565b6118ce565b60405161065491906147a0565b60405180910390f35b610665611b2e565b60405161067291906147dd565b60405180910390f35b61069560048036038101906106909190613e47565b611b35565b005b61069f611cad565b6040516106ac9190614935565b60405180910390f35b6106bd611cbc565b005b6106d960048036038101906106d49190613dcc565b611d08565b005b6106f560048036038101906106f09190614160565b611d7b565b604051610702919061491a565b60405180910390f35b61072560048036038101906107209190614160565b611de5565b60405161073291906147f8565b60405180910390f35b61075560048036038101906107509190614028565b611e84565b6040516107629190614935565b60405180910390f35b61078560048036038101906107809190613f8f565b611ea8565b005b61078f611f19565b60405161079c91906147dd565b60405180910390f35b6107bf60048036038101906107ba9190614051565b611f3d565b005b6107c9611f66565b6040516107d69190614935565b60405180910390f35b6107f960048036038101906107f49190613f0e565b611f6c565b005b61081560048036038101906108109190614214565b611fde565b005b610831600480360381019061082c9190613fe7565b61200f565b005b61083b61207d565b6040516108489190614935565b60405180910390f35b61086b60048036038101906108669190613d41565b612083565b60405161087891906147c2565b60405180910390f35b61089b60048036038101906108969190614160565b612117565b005b60006108a8826122b7565b9050919050565b6060600380546108be90614d05565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea90614d05565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82612331565b610982576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cb8261143e565b90508073ffffffffffffffffffffffffffffffffffffffff166109ec612390565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f57610a1881610a13612390565b612083565b610a4e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b0e612398565b6002546001540303905090565b6000610b26826123a1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b8d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b998461246f565b91509150610baf8187610baa612390565b612496565b610bfb57610bc486610bbf612390565b612083565b610bfa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c62576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6f86868660016124da565b8015610c7a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d4885610d248888876124e0565b7c020000000000000000000000000000000000000000000000000000000017612508565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610dd0576000600185019050600060056000838152602001908152602001600020541415610dce576001548114610dcd578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e388686866001612533565b505050505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ff65760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611000612539565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661102c9190614b52565b6110369190614b21565b90508160000151819350935050509250929050565b61105482610e40565b61106581611060612543565b61254b565b61106f83836125e8565b505050565b61107c612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906148fa565b60405180910390fd5b6110f3828261261c565b5050565b6111046000801b336117d1565b8061113557506111347f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336117d1565b5b611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b9061485a565b60405180910390fd5b600e5461117f610b04565b106111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b69061487a565b60405180910390fd5b6111ca816001612650565b50565b6111e883838360405180602001604052806000815250611d08565b505050565b6111f881600161280e565b50565b6112086000801b336117d1565b8061123957506112387f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336117d1565b5b611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f9061485a565b60405180910390fd5b600e5481611284610b04565b61128e9190614acb565b11156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c69061487a565b60405180910390fd5b6112d98282612650565b5050565b6000801b6112f2816112ed612543565b61254b565b8282600d9190611303929190613a01565b50505050565b6060600083839050905060008167ffffffffffffffff811115611355577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561138e57816020015b61137b613a87565b8152602001906001900390816113735790505b50905060005b828114611432576113e38686838181106113d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135611d7b565b82828151811061141c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250806001019050611394565b50809250505092915050565b6000611449826123a1565b9050919050565b606061145a612a62565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060008060006115288561145f565b905060008167ffffffffffffffff81111561156c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561159a5781602001602082028036833780820191505090505b5090506115a5613a87565b60006115af612398565b90505b8386146116a0576115c281612af4565b91508160400151156115d357611695565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461161357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116945780838780600101985081518110611687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b8060010190506115b2565b508195505050505050919050565b60008290505b8181116116d9576116c681600161280e565b80806116d190614d68565b9150506116b4565b505050565b6000801b6116f3816116ee612543565b61254b565b6116fe848484612b1f565b8273ffffffffffffffffffffffffffffffffffffffff16847f8219bae90c1815288c07ea441a930eb14c911bcee209d79219ff8098e9b243a2846040516117459190614979565b60405180910390a350505050565b6000801b61176881611763612543565b61254b565b61177182612cc7565b817f2d0c64cb223c165096aa5260f0c4f12caf09469f917f6139ff17e1795a01225d60405160405180910390a25050565b60006117c982600c6000868152602001908152602001600020612d2690919063ffffffff16565b905092915050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461184b90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461187790614d05565b80156118c45780601f10611899576101008083540402835291602001916118c4565b820191906000526020600020905b8154815290600101906020018083116118a757829003601f168201915b5050505050905090565b6060818310611909576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611914612d40565b905061191e612398565b8510156119305761192d612398565b94505b8084111561193c578093505b60006119478761145f565b90508486101561196a576000868603905081811015611964578091505b5061196f565b600090505b60008167ffffffffffffffff8111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119df5781602001602082028036833780820191505090505b50905060008214156119f75780945050505050611b27565b6000611a0288611d7b565b905060008160400151611a1757816000015190505b60008990505b888114158015611a2d5750848714155b15611b1957611a3b81612af4565b9250826040015115611a4c57611b0e565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a8c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d5780848880600101995081518110611b00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b806001019050611a1d565b508583528296505050505050505b9392505050565b6000801b81565b611b3d612390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611baf612390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c5c612390565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ca191906147c2565b60405180910390a35050565b6000611cb7612d4a565b905090565b6000801b611cd181611ccc612543565b61254b565b611cd9612d5d565b7f4a5f27b6a26c1d168b49c56a68ba4bb0aff57144387eb6bd10db8831e9cafdd960405160405180910390a150565b611d13848484610b1b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d7557611d3e84848484612daa565b611d74576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d83613a87565b611d8b613a87565b611d93612398565b831080611da75750611da3612d40565b8310155b15611db55780915050611de0565b611dbe83612af4565b9050806040015115611dd35780915050611de0565b611ddc83612f0a565b9150505b919050565b6060611df082612331565b611e26576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e30612a62565b9050600081511415611e515760405180602001604052806000815250611e7c565b80611e5b84612f2a565b604051602001611e6c929190614690565b6040516020818303038152906040525b915050919050565b6000611ea1600c6000848152602001908152602001600020612f7a565b9050919050565b60005b83839050811015611f1357611f003383868685818110611ef4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135610b1b565b8080611f0b90614d68565b915050611eab565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611f4682610e40565b611f5781611f52612543565b61254b565b611f61838361261c565b505050565b600e5481565b6000801b611f8181611f7c612543565b61254b565b611f8b8383612f8f565b8273ffffffffffffffffffffffffffffffffffffffff167f3e91409a02926290c65d2e6b1c28957f255d42cb904b947d566829981d0fc8f183604051611fd19190614979565b60405180910390a2505050565b60008390505b82811161200957611ff6338383610b1b565b808061200190614d68565b915050611fe4565b50505050565b60005b815181101561207957612066828281518110612057577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600161280e565b808061207190614d68565b915050612012565b5050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61211f610b04565b811015612161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121589061483a565b60405180910390fd5b7f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc600e5482604051612194929190614950565b60405180910390a180600e8190555050565b6121b082826117d1565b612283576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612228612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006122af836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613125565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061232a575061232982613195565b5b9050919050565b60008161233c612398565b1115801561234b575060015482105b8015612389575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b600080829050806123b0612398565b11612438576001548110156124375760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612435575b600081141561242b576005600083600190039350838152602001908152602001600020549050612400565b809250505061246a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124f786868461320f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b61255582826117d1565b6125e45761257a8173ffffffffffffffffffffffffffffffffffffffff166014613218565b6125888360001c6020613218565b6040516020016125999291906146b4565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db91906147f8565b60405180910390fd5b5050565b6125f282826121a6565b61261781600c600085815260200190815260200160002061228790919063ffffffff16565b505050565b6126268282613512565b61264b81600c60008581526020019081526020016000206135f490919063ffffffff16565b505050565b600060015490506000821415612692576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61269f60008483856124da565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127168361270760008660006124e0565b61271085613624565b17612508565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127b757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061277c565b5060008214156127f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506128096000848385612533565b505050565b6000612819836123a1565b9050600081905060008061282c8661246f565b915091508415612895576128488184612843612390565b612496565b6128945761285d83612858612390565b612083565b612893576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6128a38360008860016124da565b80156128ae57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061295683612913856000886124e0565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612508565b600560008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156129de5760006001870190506000600560008381526020019081526020016000205414156129dc5760015481146129db578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a48836000886001612533565b600260008154809291906001019190505550505050505050565b6060600d8054612a7190614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054612a9d90614d05565b8015612aea5780601f10612abf57610100808354040283529160200191612aea565b820191906000526020600020905b815481529060010190602001808311612acd57829003601f168201915b5050505050905090565b612afc613a87565b612b186005600084815260200190815260200160002054613634565b9050919050565b612b27612539565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7c906148ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec9061489a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600a6000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000612d3583600001836136ea565b60001c905092915050565b6000600154905090565b6000612d54612398565b60015403905090565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dd0612390565b8786866040518563ffffffff1660e01b8152600401612df29493929190614709565b602060405180830381600087803b158015612e0c57600080fd5b505af1925050508015612e3d57506040513d601f19601f82011682018060405250810190612e3a91906140f2565b60015b612eb7573d8060008114612e6d576040519150601f19603f3d011682016040523d82523d6000602084013e612e72565b606091505b50600081511415612eaf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612f12613a87565b612f23612f1e836123a1565b613634565b9050919050565b606060806040510190508060405280825b600115612f6657600183039250600a81066030018353600a8104905080612f6157612f66565b612f3b565b508181036020830392508083525050919050565b6000612f888260000161373b565b9050919050565b612f97612539565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec906148ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c906148da565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000613131838361374c565b61318a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061318f565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061320857506132078261376f565b5b9050919050565b60009392505050565b60606000600283600261322b9190614b52565b6132359190614acb565b67ffffffffffffffff811115613274577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132a65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613304577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061338e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133ce9190614b52565b6133d89190614acb565b90505b60018111156134c4577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613440577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061347d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806134bd90614cdb565b90506133db565b5060008414613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff9061481a565b60405180910390fd5b8091505092915050565b61351c82826117d1565b156135f0576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613595612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061361c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137e9565b905092915050565b60006001821460e11b9050919050565b61363c613a87565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000826000018281548110613728577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137e257506137e18261396f565b5b9050919050565b6000808360010160008481526020019081526020016000205490506000811461396357600060018261381b9190614bac565b90506000600186600001805490506138339190614bac565b90508181146138ee57600086600001828154811061387a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106138c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613928577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613969565b60009150505b92915050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806139ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806139fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b828054613a0d90614d05565b90600052602060002090601f016020900481019282613a2f5760008555613a76565b82601f10613a4857803560ff1916838001178555613a76565b82800160010185558215613a76579182015b82811115613a75578235825591602001919060010190613a5a565b5b509050613a839190613ad6565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613aef576000816000905550600101613ad7565b5090565b6000613b06613b01846149b9565b614994565b90508083825260208201905082856020860282011115613b2557600080fd5b60005b85811015613b555781613b3b8882613cee565b845260208401935060208301925050600181019050613b28565b5050509392505050565b6000613b72613b6d846149e5565b614994565b905082815260208101848484011115613b8a57600080fd5b613b95848285614c99565b509392505050565b600081359050613bac81615064565b92915050565b60008083601f840112613bc457600080fd5b8235905067ffffffffffffffff811115613bdd57600080fd5b602083019150836020820283011115613bf557600080fd5b9250929050565b600082601f830112613c0d57600080fd5b8135613c1d848260208601613af3565b91505092915050565b600081359050613c358161507b565b92915050565b600081359050613c4a81615092565b92915050565b600081359050613c5f816150a9565b92915050565b600081519050613c74816150a9565b92915050565b600082601f830112613c8b57600080fd5b8135613c9b848260208601613b5f565b91505092915050565b60008083601f840112613cb657600080fd5b8235905067ffffffffffffffff811115613ccf57600080fd5b602083019150836001820283011115613ce757600080fd5b9250929050565b600081359050613cfd816150c0565b92915050565b600081359050613d12816150d7565b92915050565b600060208284031215613d2a57600080fd5b6000613d3884828501613b9d565b91505092915050565b60008060408385031215613d5457600080fd5b6000613d6285828601613b9d565b9250506020613d7385828601613b9d565b9150509250929050565b600080600060608486031215613d9257600080fd5b6000613da086828701613b9d565b9350506020613db186828701613b9d565b9250506040613dc286828701613cee565b9150509250925092565b60008060008060808587031215613de257600080fd5b6000613df087828801613b9d565b9450506020613e0187828801613b9d565b9350506040613e1287828801613cee565b925050606085013567ffffffffffffffff811115613e2f57600080fd5b613e3b87828801613c7a565b91505092959194509250565b60008060408385031215613e5a57600080fd5b6000613e6885828601613b9d565b9250506020613e7985828601613c26565b9150509250929050565b60008060408385031215613e9657600080fd5b6000613ea485828601613b9d565b9250506020613eb585828601613cee565b9150509250929050565b600080600060608486031215613ed457600080fd5b6000613ee286828701613b9d565b9350506020613ef386828701613cee565b9250506040613f0486828701613cee565b9150509250925092565b60008060408385031215613f2157600080fd5b6000613f2f85828601613b9d565b9250506020613f4085828601613d03565b9150509250929050565b60008060208385031215613f5d57600080fd5b600083013567ffffffffffffffff811115613f7757600080fd5b613f8385828601613bb2565b92509250509250929050565b600080600060408486031215613fa457600080fd5b600084013567ffffffffffffffff811115613fbe57600080fd5b613fca86828701613bb2565b93509350506020613fdd86828701613b9d565b9150509250925092565b600060208284031215613ff957600080fd5b600082013567ffffffffffffffff81111561401357600080fd5b61401f84828501613bfc565b91505092915050565b60006020828403121561403a57600080fd5b600061404884828501613c3b565b91505092915050565b6000806040838503121561406457600080fd5b600061407285828601613c3b565b925050602061408385828601613b9d565b9150509250929050565b600080604083850312156140a057600080fd5b60006140ae85828601613c3b565b92505060206140bf85828601613cee565b9150509250929050565b6000602082840312156140db57600080fd5b60006140e984828501613c50565b91505092915050565b60006020828403121561410457600080fd5b600061411284828501613c65565b91505092915050565b6000806020838503121561412e57600080fd5b600083013567ffffffffffffffff81111561414857600080fd5b61415485828601613ca4565b92509250509250929050565b60006020828403121561417257600080fd5b600061418084828501613cee565b91505092915050565b60008060006060848603121561419e57600080fd5b60006141ac86828701613cee565b93505060206141bd86828701613b9d565b92505060406141ce86828701613d03565b9150509250925092565b600080604083850312156141eb57600080fd5b60006141f985828601613cee565b925050602061420a85828601613cee565b9150509250929050565b60008060006060848603121561422957600080fd5b600061423786828701613cee565b935050602061424886828701613cee565b925050604061425986828701613b9d565b9150509250925092565b600061426f838361459b565b60808301905092915050565b60006142878383614654565b60208301905092915050565b61429c81614be0565b82525050565b6142ab81614be0565b82525050565b60006142bc82614a36565b6142c68185614a7c565b93506142d183614a16565b8060005b838110156143025781516142e98882614263565b97506142f483614a62565b9250506001810190506142d5565b5085935050505092915050565b600061431a82614a41565b6143248185614a8d565b935061432f83614a26565b8060005b83811015614360578151614347888261427b565b975061435283614a6f565b925050600181019050614333565b5085935050505092915050565b61437681614bf2565b82525050565b61438581614bf2565b82525050565b61439481614bfe565b82525050565b60006143a582614a4c565b6143af8185614a9e565b93506143bf818560208601614ca8565b6143c881614e6d565b840191505092915050565b60006143de82614a57565b6143e88185614aaf565b93506143f8818560208601614ca8565b61440181614e6d565b840191505092915050565b600061441782614a57565b6144218185614ac0565b9350614431818560208601614ca8565b80840191505092915050565b600061444a602083614aaf565b915061445582614e7e565b602082019050919050565b600061446d601183614aaf565b915061447882614ea7565b602082019050919050565b6000614490601583614aaf565b915061449b82614ed0565b602082019050919050565b60006144b3601283614aaf565b91506144be82614ef9565b602082019050919050565b60006144d6601b83614aaf565b91506144e182614f22565b602082019050919050565b60006144f9601783614ac0565b915061450482614f4b565b601782019050919050565b600061451c602a83614aaf565b915061452782614f74565b604082019050919050565b600061453f601983614aaf565b915061454a82614fc3565b602082019050919050565b6000614562601183614ac0565b915061456d82614fec565b601182019050919050565b6000614585602f83614aaf565b915061459082615015565b604082019050919050565b6080820160008201516145b16000850182614293565b5060208201516145c46020850182614672565b5060408201516145d7604085018261436d565b5060608201516145ea6060850182614645565b50505050565b6080820160008201516146066000850182614293565b5060208201516146196020850182614672565b50604082015161462c604085018261436d565b50606082015161463f6060850182614645565b50505050565b61464e81614c54565b82525050565b61465d81614c63565b82525050565b61466c81614c63565b82525050565b61467b81614c6d565b82525050565b61468a81614c81565b82525050565b600061469c828561440c565b91506146a8828461440c565b91508190509392505050565b60006146bf826144ec565b91506146cb828561440c565b91506146d682614555565b91506146e2828461440c565b91508190509392505050565b600060208201905061470360008301846142a2565b92915050565b600060808201905061471e60008301876142a2565b61472b60208301866142a2565b6147386040830185614663565b818103606083015261474a818461439a565b905095945050505050565b600060408201905061476a60008301856142a2565b6147776020830184614663565b9392505050565b6000602082019050818103600083015261479881846142b1565b905092915050565b600060208201905081810360008301526147ba818461430f565b905092915050565b60006020820190506147d7600083018461437c565b92915050565b60006020820190506147f2600083018461438b565b92915050565b6000602082019050818103600083015261481281846143d3565b905092915050565b600060208201905081810360008301526148338161443d565b9050919050565b6000602082019050818103600083015261485381614460565b9050919050565b6000602082019050818103600083015261487381614483565b9050919050565b60006020820190508181036000830152614893816144a6565b9050919050565b600060208201905081810360008301526148b3816144c9565b9050919050565b600060208201905081810360008301526148d38161450f565b9050919050565b600060208201905081810360008301526148f381614532565b9050919050565b6000602082019050818103600083015261491381614578565b9050919050565b600060808201905061492f60008301846145f0565b92915050565b600060208201905061494a6000830184614663565b92915050565b60006040820190506149656000830185614663565b6149726020830184614663565b9392505050565b600060208201905061498e6000830184614681565b92915050565b600061499e6149af565b90506149aa8282614d37565b919050565b6000604051905090565b600067ffffffffffffffff8211156149d4576149d3614e3e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a00576149ff614e3e565b5b614a0982614e6d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad682614c63565b9150614ae183614c63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1657614b15614db1565b5b828201905092915050565b6000614b2c82614c63565b9150614b3783614c63565b925082614b4757614b46614de0565b5b828204905092915050565b6000614b5d82614c63565b9150614b6883614c63565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba157614ba0614db1565b5b828202905092915050565b6000614bb782614c63565b9150614bc283614c63565b925082821015614bd557614bd4614db1565b5b828203905092915050565b6000614beb82614c34565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614cc6578082015181840152602081019050614cab565b83811115614cd5576000848401525b50505050565b6000614ce682614c63565b91506000821415614cfa57614cf9614db1565b5b600182039050919050565b60006002820490506001821680614d1d57607f821691505b60208210811415614d3157614d30614e0f565b5b50919050565b614d4082614e6d565b810181811067ffffffffffffffff82111715614d5f57614d5e614e3e565b5b80604052505050565b6000614d7382614c63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614da657614da5614db1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f696e76616c6964206d6178537570706c79000000000000000000000000000000600082015250565b7f6e6f207065726d697373696f6e20746f2063616c6c0000000000000000000000600082015250565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61506d81614be0565b811461507857600080fd5b50565b61508481614bf2565b811461508f57600080fd5b50565b61509b81614bfe565b81146150a657600080fd5b50565b6150b281614c08565b81146150bd57600080fd5b50565b6150c981614c63565b81146150d457600080fd5b50565b6150e081614c81565b81146150eb57600080fd5b5056fea2646970667358221220457ef4da040c5ed46bb58f28c67c5469227e0bf887aebaa637b6ec49b5b7c46164736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000083bbe83c1b91e1caeaf277335bd1a82f593d8430000000000000000000000002c3ca748a62b9c678fea8917955b1f0fa417fd9e00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000001547616e67766572736520536f6369616c20436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000001547616e67766572736520536f6369616c20436c75620000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80638a616bc01161015c578063c87b56dd116100ce578063daa83c6d11610087578063daa83c6d146107df578063dc02c822146107fb578063dc8e92ea14610817578063e6798baa14610833578063e985e9c514610851578063f103b433146108815761027f565b8063c87b56dd1461070b578063ca15c8731461073b578063ce40ad861461076b578063d539139314610787578063d547741f146107a5578063d5abeb01146107c15761027f565b8063a217fddf11610120578063a217fddf1461065d578063a22cb4651461067b578063a2309ff814610697578063aa1b103f146106b5578063b88d4fde146106bf578063c23dc68f146106db5761027f565b80638a616bc0146105935780639010d07c146105af57806391d14854146105df57806395d89b411461060f57806399a2557a1461062d5761027f565b806342842e0e116101f55780636352211e116101b95780636352211e146104ad5780636c0360eb146104dd57806370a08231146104fb5780638462151c1461052b578063860cad791461055b57806386e228d5146105775761027f565b806342842e0e1461040d57806342966c681461042957806343508b051461044557806355f804b3146104615780635bbb21771461047d5761027f565b806323b872dd1161024757806323b872dd1461033c578063248a9ca3146103585780632a55205a146103885780632f2ff15d146103b957806336568abe146103d557806340d097c3146103f15761027f565b806301ffc9a71461028457806306fdde03146102b4578063081812fc146102d2578063095ea7b31461030257806318160ddd1461031e575b600080fd5b61029e600480360381019061029991906140c9565b61089d565b6040516102ab91906147c2565b60405180910390f35b6102bc6108af565b6040516102c991906147f8565b60405180910390f35b6102ec60048036038101906102e79190614160565b610941565b6040516102f991906146ee565b60405180910390f35b61031c60048036038101906103179190613e83565b6109c0565b005b610326610b04565b6040516103339190614935565b60405180910390f35b61035660048036038101906103519190613d7d565b610b1b565b005b610372600480360381019061036d9190614028565b610e40565b60405161037f91906147dd565b60405180910390f35b6103a2600480360381019061039d91906141d8565b610e60565b6040516103b0929190614755565b60405180910390f35b6103d360048036038101906103ce9190614051565b61104b565b005b6103ef60048036038101906103ea9190614051565b611074565b005b61040b60048036038101906104069190613d18565b6110f7565b005b61042760048036038101906104229190613d7d565b6111cd565b005b610443600480360381019061043e9190614160565b6111ed565b005b61045f600480360381019061045a9190613e83565b6111fb565b005b61047b6004803603810190610476919061411b565b6112dd565b005b61049760048036038101906104929190613f4a565b611309565b6040516104a4919061477e565b60405180910390f35b6104c760048036038101906104c29190614160565b61143e565b6040516104d491906146ee565b60405180910390f35b6104e5611450565b6040516104f291906147f8565b60405180910390f35b61051560048036038101906105109190613d18565b61145f565b6040516105229190614935565b60405180910390f35b61054560048036038101906105409190613d18565b611518565b60405161055291906147a0565b60405180910390f35b610575600480360381019061057091906141d8565b6116ae565b005b610591600480360381019061058c9190614189565b6116de565b005b6105ad60048036038101906105a89190614160565b611753565b005b6105c960048036038101906105c4919061408d565b6117a2565b6040516105d691906146ee565b60405180910390f35b6105f960048036038101906105f49190614051565b6117d1565b60405161060691906147c2565b60405180910390f35b61061761183c565b60405161062491906147f8565b60405180910390f35b61064760048036038101906106429190613ebf565b6118ce565b60405161065491906147a0565b60405180910390f35b610665611b2e565b60405161067291906147dd565b60405180910390f35b61069560048036038101906106909190613e47565b611b35565b005b61069f611cad565b6040516106ac9190614935565b60405180910390f35b6106bd611cbc565b005b6106d960048036038101906106d49190613dcc565b611d08565b005b6106f560048036038101906106f09190614160565b611d7b565b604051610702919061491a565b60405180910390f35b61072560048036038101906107209190614160565b611de5565b60405161073291906147f8565b60405180910390f35b61075560048036038101906107509190614028565b611e84565b6040516107629190614935565b60405180910390f35b61078560048036038101906107809190613f8f565b611ea8565b005b61078f611f19565b60405161079c91906147dd565b60405180910390f35b6107bf60048036038101906107ba9190614051565b611f3d565b005b6107c9611f66565b6040516107d69190614935565b60405180910390f35b6107f960048036038101906107f49190613f0e565b611f6c565b005b61081560048036038101906108109190614214565b611fde565b005b610831600480360381019061082c9190613fe7565b61200f565b005b61083b61207d565b6040516108489190614935565b60405180910390f35b61086b60048036038101906108669190613d41565b612083565b60405161087891906147c2565b60405180910390f35b61089b60048036038101906108969190614160565b612117565b005b60006108a8826122b7565b9050919050565b6060600380546108be90614d05565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea90614d05565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82612331565b610982576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cb8261143e565b90508073ffffffffffffffffffffffffffffffffffffffff166109ec612390565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f57610a1881610a13612390565b612083565b610a4e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b0e612398565b6002546001540303905090565b6000610b26826123a1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b8d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b998461246f565b91509150610baf8187610baa612390565b612496565b610bfb57610bc486610bbf612390565b612083565b610bfa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c62576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6f86868660016124da565b8015610c7a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d4885610d248888876124e0565b7c020000000000000000000000000000000000000000000000000000000017612508565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610dd0576000600185019050600060056000838152602001908152602001600020541415610dce576001548114610dcd578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e388686866001612533565b505050505050565b6000600b6000838152602001908152602001600020600101549050919050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ff65760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611000612539565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661102c9190614b52565b6110369190614b21565b90508160000151819350935050509250929050565b61105482610e40565b61106581611060612543565b61254b565b61106f83836125e8565b505050565b61107c612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906148fa565b60405180910390fd5b6110f3828261261c565b5050565b6111046000801b336117d1565b8061113557506111347f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336117d1565b5b611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b9061485a565b60405180910390fd5b600e5461117f610b04565b106111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b69061487a565b60405180910390fd5b6111ca816001612650565b50565b6111e883838360405180602001604052806000815250611d08565b505050565b6111f881600161280e565b50565b6112086000801b336117d1565b8061123957506112387f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336117d1565b5b611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f9061485a565b60405180910390fd5b600e5481611284610b04565b61128e9190614acb565b11156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c69061487a565b60405180910390fd5b6112d98282612650565b5050565b6000801b6112f2816112ed612543565b61254b565b8282600d9190611303929190613a01565b50505050565b6060600083839050905060008167ffffffffffffffff811115611355577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561138e57816020015b61137b613a87565b8152602001906001900390816113735790505b50905060005b828114611432576113e38686838181106113d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135611d7b565b82828151811061141c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250806001019050611394565b50809250505092915050565b6000611449826123a1565b9050919050565b606061145a612a62565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060008060006115288561145f565b905060008167ffffffffffffffff81111561156c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561159a5781602001602082028036833780820191505090505b5090506115a5613a87565b60006115af612398565b90505b8386146116a0576115c281612af4565b91508160400151156115d357611695565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461161357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116945780838780600101985081518110611687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b8060010190506115b2565b508195505050505050919050565b60008290505b8181116116d9576116c681600161280e565b80806116d190614d68565b9150506116b4565b505050565b6000801b6116f3816116ee612543565b61254b565b6116fe848484612b1f565b8273ffffffffffffffffffffffffffffffffffffffff16847f8219bae90c1815288c07ea441a930eb14c911bcee209d79219ff8098e9b243a2846040516117459190614979565b60405180910390a350505050565b6000801b61176881611763612543565b61254b565b61177182612cc7565b817f2d0c64cb223c165096aa5260f0c4f12caf09469f917f6139ff17e1795a01225d60405160405180910390a25050565b60006117c982600c6000868152602001908152602001600020612d2690919063ffffffff16565b905092915050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461184b90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461187790614d05565b80156118c45780601f10611899576101008083540402835291602001916118c4565b820191906000526020600020905b8154815290600101906020018083116118a757829003601f168201915b5050505050905090565b6060818310611909576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611914612d40565b905061191e612398565b8510156119305761192d612398565b94505b8084111561193c578093505b60006119478761145f565b90508486101561196a576000868603905081811015611964578091505b5061196f565b600090505b60008167ffffffffffffffff8111156119b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119df5781602001602082028036833780820191505090505b50905060008214156119f75780945050505050611b27565b6000611a0288611d7b565b905060008160400151611a1757816000015190505b60008990505b888114158015611a2d5750848714155b15611b1957611a3b81612af4565b9250826040015115611a4c57611b0e565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a8c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d5780848880600101995081518110611b00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b806001019050611a1d565b508583528296505050505050505b9392505050565b6000801b81565b611b3d612390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611baf612390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c5c612390565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ca191906147c2565b60405180910390a35050565b6000611cb7612d4a565b905090565b6000801b611cd181611ccc612543565b61254b565b611cd9612d5d565b7f4a5f27b6a26c1d168b49c56a68ba4bb0aff57144387eb6bd10db8831e9cafdd960405160405180910390a150565b611d13848484610b1b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d7557611d3e84848484612daa565b611d74576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d83613a87565b611d8b613a87565b611d93612398565b831080611da75750611da3612d40565b8310155b15611db55780915050611de0565b611dbe83612af4565b9050806040015115611dd35780915050611de0565b611ddc83612f0a565b9150505b919050565b6060611df082612331565b611e26576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e30612a62565b9050600081511415611e515760405180602001604052806000815250611e7c565b80611e5b84612f2a565b604051602001611e6c929190614690565b6040516020818303038152906040525b915050919050565b6000611ea1600c6000848152602001908152602001600020612f7a565b9050919050565b60005b83839050811015611f1357611f003383868685818110611ef4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135610b1b565b8080611f0b90614d68565b915050611eab565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611f4682610e40565b611f5781611f52612543565b61254b565b611f61838361261c565b505050565b600e5481565b6000801b611f8181611f7c612543565b61254b565b611f8b8383612f8f565b8273ffffffffffffffffffffffffffffffffffffffff167f3e91409a02926290c65d2e6b1c28957f255d42cb904b947d566829981d0fc8f183604051611fd19190614979565b60405180910390a2505050565b60008390505b82811161200957611ff6338383610b1b565b808061200190614d68565b915050611fe4565b50505050565b60005b815181101561207957612066828281518110612057577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600161280e565b808061207190614d68565b915050612012565b5050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61211f610b04565b811015612161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121589061483a565b60405180910390fd5b7f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc600e5482604051612194929190614950565b60405180910390a180600e8190555050565b6121b082826117d1565b612283576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612228612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006122af836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613125565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061232a575061232982613195565b5b9050919050565b60008161233c612398565b1115801561234b575060015482105b8015612389575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b600080829050806123b0612398565b11612438576001548110156124375760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612435575b600081141561242b576005600083600190039350838152602001908152602001600020549050612400565b809250505061246a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124f786868461320f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b61255582826117d1565b6125e45761257a8173ffffffffffffffffffffffffffffffffffffffff166014613218565b6125888360001c6020613218565b6040516020016125999291906146b4565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db91906147f8565b60405180910390fd5b5050565b6125f282826121a6565b61261781600c600085815260200190815260200160002061228790919063ffffffff16565b505050565b6126268282613512565b61264b81600c60008581526020019081526020016000206135f490919063ffffffff16565b505050565b600060015490506000821415612692576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61269f60008483856124da565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127168361270760008660006124e0565b61271085613624565b17612508565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127b757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061277c565b5060008214156127f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506128096000848385612533565b505050565b6000612819836123a1565b9050600081905060008061282c8661246f565b915091508415612895576128488184612843612390565b612496565b6128945761285d83612858612390565b612083565b612893576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6128a38360008860016124da565b80156128ae57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061295683612913856000886124e0565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612508565b600560008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851614156129de5760006001870190506000600560008381526020019081526020016000205414156129dc5760015481146129db578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a48836000886001612533565b600260008154809291906001019190505550505050505050565b6060600d8054612a7190614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054612a9d90614d05565b8015612aea5780601f10612abf57610100808354040283529160200191612aea565b820191906000526020600020905b815481529060010190602001808311612acd57829003601f168201915b5050505050905090565b612afc613a87565b612b186005600084815260200190815260200160002054613634565b9050919050565b612b27612539565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7c906148ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec9061489a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600a6000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000612d3583600001836136ea565b60001c905092915050565b6000600154905090565b6000612d54612398565b60015403905090565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dd0612390565b8786866040518563ffffffff1660e01b8152600401612df29493929190614709565b602060405180830381600087803b158015612e0c57600080fd5b505af1925050508015612e3d57506040513d601f19601f82011682018060405250810190612e3a91906140f2565b60015b612eb7573d8060008114612e6d576040519150601f19603f3d011682016040523d82523d6000602084013e612e72565b606091505b50600081511415612eaf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612f12613a87565b612f23612f1e836123a1565b613634565b9050919050565b606060806040510190508060405280825b600115612f6657600183039250600a81066030018353600a8104905080612f6157612f66565b612f3b565b508181036020830392508083525050919050565b6000612f888260000161373b565b9050919050565b612f97612539565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec906148ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c906148da565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000613131838361374c565b61318a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061318f565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061320857506132078261376f565b5b9050919050565b60009392505050565b60606000600283600261322b9190614b52565b6132359190614acb565b67ffffffffffffffff811115613274577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132a65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613304577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061338e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133ce9190614b52565b6133d89190614acb565b90505b60018111156134c4577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613440577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061347d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806134bd90614cdb565b90506133db565b5060008414613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff9061481a565b60405180910390fd5b8091505092915050565b61351c82826117d1565b156135f0576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613595612543565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061361c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137e9565b905092915050565b60006001821460e11b9050919050565b61363c613a87565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000826000018281548110613728577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137e257506137e18261396f565b5b9050919050565b6000808360010160008481526020019081526020016000205490506000811461396357600060018261381b9190614bac565b90506000600186600001805490506138339190614bac565b90508181146138ee57600086600001828154811061387a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106138c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613928577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613969565b60009150505b92915050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806139ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806139fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b828054613a0d90614d05565b90600052602060002090601f016020900481019282613a2f5760008555613a76565b82601f10613a4857803560ff1916838001178555613a76565b82800160010185558215613a76579182015b82811115613a75578235825591602001919060010190613a5a565b5b509050613a839190613ad6565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613aef576000816000905550600101613ad7565b5090565b6000613b06613b01846149b9565b614994565b90508083825260208201905082856020860282011115613b2557600080fd5b60005b85811015613b555781613b3b8882613cee565b845260208401935060208301925050600181019050613b28565b5050509392505050565b6000613b72613b6d846149e5565b614994565b905082815260208101848484011115613b8a57600080fd5b613b95848285614c99565b509392505050565b600081359050613bac81615064565b92915050565b60008083601f840112613bc457600080fd5b8235905067ffffffffffffffff811115613bdd57600080fd5b602083019150836020820283011115613bf557600080fd5b9250929050565b600082601f830112613c0d57600080fd5b8135613c1d848260208601613af3565b91505092915050565b600081359050613c358161507b565b92915050565b600081359050613c4a81615092565b92915050565b600081359050613c5f816150a9565b92915050565b600081519050613c74816150a9565b92915050565b600082601f830112613c8b57600080fd5b8135613c9b848260208601613b5f565b91505092915050565b60008083601f840112613cb657600080fd5b8235905067ffffffffffffffff811115613ccf57600080fd5b602083019150836001820283011115613ce757600080fd5b9250929050565b600081359050613cfd816150c0565b92915050565b600081359050613d12816150d7565b92915050565b600060208284031215613d2a57600080fd5b6000613d3884828501613b9d565b91505092915050565b60008060408385031215613d5457600080fd5b6000613d6285828601613b9d565b9250506020613d7385828601613b9d565b9150509250929050565b600080600060608486031215613d9257600080fd5b6000613da086828701613b9d565b9350506020613db186828701613b9d565b9250506040613dc286828701613cee565b9150509250925092565b60008060008060808587031215613de257600080fd5b6000613df087828801613b9d565b9450506020613e0187828801613b9d565b9350506040613e1287828801613cee565b925050606085013567ffffffffffffffff811115613e2f57600080fd5b613e3b87828801613c7a565b91505092959194509250565b60008060408385031215613e5a57600080fd5b6000613e6885828601613b9d565b9250506020613e7985828601613c26565b9150509250929050565b60008060408385031215613e9657600080fd5b6000613ea485828601613b9d565b9250506020613eb585828601613cee565b9150509250929050565b600080600060608486031215613ed457600080fd5b6000613ee286828701613b9d565b9350506020613ef386828701613cee565b9250506040613f0486828701613cee565b9150509250925092565b60008060408385031215613f2157600080fd5b6000613f2f85828601613b9d565b9250506020613f4085828601613d03565b9150509250929050565b60008060208385031215613f5d57600080fd5b600083013567ffffffffffffffff811115613f7757600080fd5b613f8385828601613bb2565b92509250509250929050565b600080600060408486031215613fa457600080fd5b600084013567ffffffffffffffff811115613fbe57600080fd5b613fca86828701613bb2565b93509350506020613fdd86828701613b9d565b9150509250925092565b600060208284031215613ff957600080fd5b600082013567ffffffffffffffff81111561401357600080fd5b61401f84828501613bfc565b91505092915050565b60006020828403121561403a57600080fd5b600061404884828501613c3b565b91505092915050565b6000806040838503121561406457600080fd5b600061407285828601613c3b565b925050602061408385828601613b9d565b9150509250929050565b600080604083850312156140a057600080fd5b60006140ae85828601613c3b565b92505060206140bf85828601613cee565b9150509250929050565b6000602082840312156140db57600080fd5b60006140e984828501613c50565b91505092915050565b60006020828403121561410457600080fd5b600061411284828501613c65565b91505092915050565b6000806020838503121561412e57600080fd5b600083013567ffffffffffffffff81111561414857600080fd5b61415485828601613ca4565b92509250509250929050565b60006020828403121561417257600080fd5b600061418084828501613cee565b91505092915050565b60008060006060848603121561419e57600080fd5b60006141ac86828701613cee565b93505060206141bd86828701613b9d565b92505060406141ce86828701613d03565b9150509250925092565b600080604083850312156141eb57600080fd5b60006141f985828601613cee565b925050602061420a85828601613cee565b9150509250929050565b60008060006060848603121561422957600080fd5b600061423786828701613cee565b935050602061424886828701613cee565b925050604061425986828701613b9d565b9150509250925092565b600061426f838361459b565b60808301905092915050565b60006142878383614654565b60208301905092915050565b61429c81614be0565b82525050565b6142ab81614be0565b82525050565b60006142bc82614a36565b6142c68185614a7c565b93506142d183614a16565b8060005b838110156143025781516142e98882614263565b97506142f483614a62565b9250506001810190506142d5565b5085935050505092915050565b600061431a82614a41565b6143248185614a8d565b935061432f83614a26565b8060005b83811015614360578151614347888261427b565b975061435283614a6f565b925050600181019050614333565b5085935050505092915050565b61437681614bf2565b82525050565b61438581614bf2565b82525050565b61439481614bfe565b82525050565b60006143a582614a4c565b6143af8185614a9e565b93506143bf818560208601614ca8565b6143c881614e6d565b840191505092915050565b60006143de82614a57565b6143e88185614aaf565b93506143f8818560208601614ca8565b61440181614e6d565b840191505092915050565b600061441782614a57565b6144218185614ac0565b9350614431818560208601614ca8565b80840191505092915050565b600061444a602083614aaf565b915061445582614e7e565b602082019050919050565b600061446d601183614aaf565b915061447882614ea7565b602082019050919050565b6000614490601583614aaf565b915061449b82614ed0565b602082019050919050565b60006144b3601283614aaf565b91506144be82614ef9565b602082019050919050565b60006144d6601b83614aaf565b91506144e182614f22565b602082019050919050565b60006144f9601783614ac0565b915061450482614f4b565b601782019050919050565b600061451c602a83614aaf565b915061452782614f74565b604082019050919050565b600061453f601983614aaf565b915061454a82614fc3565b602082019050919050565b6000614562601183614ac0565b915061456d82614fec565b601182019050919050565b6000614585602f83614aaf565b915061459082615015565b604082019050919050565b6080820160008201516145b16000850182614293565b5060208201516145c46020850182614672565b5060408201516145d7604085018261436d565b5060608201516145ea6060850182614645565b50505050565b6080820160008201516146066000850182614293565b5060208201516146196020850182614672565b50604082015161462c604085018261436d565b50606082015161463f6060850182614645565b50505050565b61464e81614c54565b82525050565b61465d81614c63565b82525050565b61466c81614c63565b82525050565b61467b81614c6d565b82525050565b61468a81614c81565b82525050565b600061469c828561440c565b91506146a8828461440c565b91508190509392505050565b60006146bf826144ec565b91506146cb828561440c565b91506146d682614555565b91506146e2828461440c565b91508190509392505050565b600060208201905061470360008301846142a2565b92915050565b600060808201905061471e60008301876142a2565b61472b60208301866142a2565b6147386040830185614663565b818103606083015261474a818461439a565b905095945050505050565b600060408201905061476a60008301856142a2565b6147776020830184614663565b9392505050565b6000602082019050818103600083015261479881846142b1565b905092915050565b600060208201905081810360008301526147ba818461430f565b905092915050565b60006020820190506147d7600083018461437c565b92915050565b60006020820190506147f2600083018461438b565b92915050565b6000602082019050818103600083015261481281846143d3565b905092915050565b600060208201905081810360008301526148338161443d565b9050919050565b6000602082019050818103600083015261485381614460565b9050919050565b6000602082019050818103600083015261487381614483565b9050919050565b60006020820190508181036000830152614893816144a6565b9050919050565b600060208201905081810360008301526148b3816144c9565b9050919050565b600060208201905081810360008301526148d38161450f565b9050919050565b600060208201905081810360008301526148f381614532565b9050919050565b6000602082019050818103600083015261491381614578565b9050919050565b600060808201905061492f60008301846145f0565b92915050565b600060208201905061494a6000830184614663565b92915050565b60006040820190506149656000830185614663565b6149726020830184614663565b9392505050565b600060208201905061498e6000830184614681565b92915050565b600061499e6149af565b90506149aa8282614d37565b919050565b6000604051905090565b600067ffffffffffffffff8211156149d4576149d3614e3e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a00576149ff614e3e565b5b614a0982614e6d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad682614c63565b9150614ae183614c63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1657614b15614db1565b5b828201905092915050565b6000614b2c82614c63565b9150614b3783614c63565b925082614b4757614b46614de0565b5b828204905092915050565b6000614b5d82614c63565b9150614b6883614c63565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba157614ba0614db1565b5b828202905092915050565b6000614bb782614c63565b9150614bc283614c63565b925082821015614bd557614bd4614db1565b5b828203905092915050565b6000614beb82614c34565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614cc6578082015181840152602081019050614cab565b83811115614cd5576000848401525b50505050565b6000614ce682614c63565b91506000821415614cfa57614cf9614db1565b5b600182039050919050565b60006002820490506001821680614d1d57607f821691505b60208210811415614d3157614d30614e0f565b5b50919050565b614d4082614e6d565b810181811067ffffffffffffffff82111715614d5f57614d5e614e3e565b5b80604052505050565b6000614d7382614c63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614da657614da5614db1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f696e76616c6964206d6178537570706c79000000000000000000000000000000600082015250565b7f6e6f207065726d697373696f6e20746f2063616c6c0000000000000000000000600082015250565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61506d81614be0565b811461507857600080fd5b50565b61508481614bf2565b811461508f57600080fd5b50565b61509b81614bfe565b81146150a657600080fd5b50565b6150b281614c08565b81146150bd57600080fd5b50565b6150c981614c63565b81146150d457600080fd5b50565b6150e081614c81565b81146150eb57600080fd5b5056fea2646970667358221220457ef4da040c5ed46bb58f28c67c5469227e0bf887aebaa637b6ec49b5b7c46164736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000083bbe83c1b91e1caeaf277335bd1a82f593d8430000000000000000000000002c3ca748a62b9c678fea8917955b1f0fa417fd9e00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000001547616e67766572736520536f6369616c20436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000001547616e67766572736520536f6369616c20436c75620000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Gangverse Social Club
Arg [1] : symbol_ (string): Gangverse Social Club
Arg [2] : _startTokenId_ (uint256): 1
Arg [3] : _maxSupply (uint256): 8888
Arg [4] : _minter (address): 0x083Bbe83c1b91E1CaEaF277335bd1A82F593d843
Arg [5] : _royaltyReceiver (address): 0x2c3CA748a62B9c678fea8917955b1f0Fa417fd9E
Arg [6] : _royaltyFee (uint96): 1000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [4] : 000000000000000000000000083bbe83c1b91e1caeaf277335bd1a82f593d843
Arg [5] : 0000000000000000000000002c3ca748a62b9c678fea8917955b1f0fa417fd9e
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [8] : 47616e67766572736520536f6369616c20436c75620000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [10] : 47616e67766572736520536f6369616c20436c75620000000000000000000000
Deployed Bytecode Sourcemap
97785:5266:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101867:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19440:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25923:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25364:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15191:323;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29630:2817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64257:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85518:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64650:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65698:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99888:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32543:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100530:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100190:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101728:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92311:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20833:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101629:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16375:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96187:900;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100617:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102552:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102875:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81794:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63126:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19616:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93227:2513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62217:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26481:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99787:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102394:150;;;:::i;:::-;;33326:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91724:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19826:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82121:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101273:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98002:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65042:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97971:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102128:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100988:277;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100809:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97517:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26946:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99552:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101867:237;102031:4;102060:36;102084:11;102060:23;:36::i;:::-;102053:43;;101867:237;;;:::o;19440:100::-;19494:13;19527:5;19520:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19440:100;:::o;25923:218::-;25999:7;26024:16;26032:7;26024;:16::i;:::-;26019:64;;26049:34;;;;;;;;;;;;;;26019:64;26103:15;:24;26119:7;26103:24;;;;;;;;;;;:30;;;;;;;;;;;;26096:37;;25923:218;;;:::o;25364:400::-;25445:13;25461:16;25469:7;25461;:16::i;:::-;25445:32;;25517:5;25494:28;;:19;:17;:19::i;:::-;:28;;;25490:175;;25542:44;25559:5;25566:19;:17;:19::i;:::-;25542:16;:44::i;:::-;25537:128;;25614:35;;;;;;;;;;;;;;25537:128;25490:175;25710:2;25677:15;:24;25693:7;25677:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25748:7;25744:2;25728:28;;25737:5;25728:28;;;;;;;;;;;;25364:400;;;:::o;15191:323::-;15252:7;15480:15;:13;:15::i;:::-;15465:12;;15449:13;;:28;:46;15442:53;;15191:323;:::o;29630:2817::-;29764:27;29794;29813:7;29794:18;:27::i;:::-;29764:57;;29879:4;29838:45;;29854:19;29838:45;;;29834:86;;29892:28;;;;;;;;;;;;;;29834:86;29934:27;29963:23;29990:35;30017:7;29990:26;:35::i;:::-;29933:92;;;;30125:68;30150:15;30167:4;30173:19;:17;:19::i;:::-;30125:24;:68::i;:::-;30120:180;;30213:43;30230:4;30236:19;:17;:19::i;:::-;30213:16;:43::i;:::-;30208:92;;30265:35;;;;;;;;;;;;;;30208:92;30120:180;30331:1;30317:16;;:2;:16;;;30313:52;;;30342:23;;;;;;;;;;;;;;30313:52;30378:43;30400:4;30406:2;30410:7;30419:1;30378:21;:43::i;:::-;30514:15;30511:2;;;30654:1;30633:19;30626:30;30511:2;31051:18;:24;31070:4;31051:24;;;;;;;;;;;;;;;;31049:26;;;;;;;;;;;;31120:18;:22;31139:2;31120:22;;;;;;;;;;;;;;;;31118:24;;;;;;;;;;;31442:146;31479:2;31528:45;31543:4;31549:2;31553:19;31528:14;:45::i;:::-;11590:8;31500:73;31442:18;:146::i;:::-;31413:17;:26;31431:7;31413:26;;;;;;;;;;;:175;;;;31759:1;11590:8;31708:19;:47;:52;31704:627;;;31781:19;31813:1;31803:7;:11;31781:33;;31970:1;31936:17;:30;31954:11;31936:30;;;;;;;;;;;;:35;31932:384;;;32074:13;;32059:11;:28;32055:242;;32254:19;32221:17;:30;32239:11;32221:30;;;;;;;;;;;:52;;;;32055:242;31932:384;31704:627;;32378:7;32374:2;32359:27;;32368:4;32359:27;;;;;;;;;;;;32397:42;32418:4;32424:2;32428:7;32437:1;32397:20;:42::i;:::-;29630:2817;;;;;;:::o;64257:131::-;64331:7;64358:6;:12;64365:4;64358:12;;;;;;;;;;;:22;;;64351:29;;64257:131;;;:::o;85518:494::-;85662:7;85671;85696:26;85725:17;:27;85743:8;85725:27;;;;;;;;;;;85696:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85797:1;85769:30;;:7;:16;;;:30;;;85765:92;;;85826:19;85816:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85765:92;85869:21;85934:17;:15;:17::i;:::-;85893:58;;85907:7;:23;;;85894:36;;:10;:36;;;;:::i;:::-;85893:58;;;;:::i;:::-;85869:82;;85972:7;:16;;;85990:13;85964:40;;;;;;85518:494;;;;;:::o;64650:147::-;64733:18;64746:4;64733:12;:18::i;:::-;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;64764:25:::1;64775:4;64781:7;64764:10;:25::i;:::-;64650:147:::0;;;:::o;65698:218::-;65805:12;:10;:12::i;:::-;65794:23;;:7;:23;;;65786:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65882:26;65894:4;65900:7;65882:11;:26::i;:::-;65698:218;;:::o;99888:294::-;99960:39;62262:4;99968:18;;99988:10;99960:7;:39::i;:::-;:75;;;;100003:32;98040:24;100024:10;100003:7;:32::i;:::-;99960:75;99938:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;100119:9;;100103:13;:11;:13::i;:::-;:25;100095:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;100162:12;100168:2;100172:1;100162:5;:12::i;:::-;99888:294;:::o;32543:185::-;32681:39;32698:4;32704:2;32708:7;32681:39;;;;;;;;;;;;:16;:39::i;:::-;32543:185;;;:::o;100530:79::-;100580:21;100586:8;100596:4;100580:5;:21::i;:::-;100530:79;:::o;100190:332::-;100281:39;62262:4;100289:18;;100309:10;100281:7;:39::i;:::-;:75;;;;100324:32;98040:24;100345:10;100324:7;:32::i;:::-;100281:75;100259:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;100452:9;;100440:8;100424:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;100416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;100495:19;100501:2;100505:8;100495:5;:19::i;:::-;100190:332;;:::o;101728:131::-;62262:4;101793:18;;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;101840:11:::1;;101824:13;:27;;;;;;;:::i;:::-;;101728:131:::0;;;:::o;92311:528::-;92455:23;92521:22;92546:8;;:15;;92521:40;;92576:34;92634:14;92613:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;92576:73;;92669:9;92664:125;92685:14;92680:1;:19;92664:125;;92741:32;92761:8;;92770:1;92761:11;;;;;;;;;;;;;;;;;;;;;92741:19;:32::i;:::-;92725:10;92736:1;92725:13;;;;;;;;;;;;;;;;;;;;;:48;;;;92701:3;;;;;92664:125;;;;92810:10;92803:17;;;;92311:528;;;;:::o;20833:152::-;20905:7;20948:27;20967:7;20948:18;:27::i;:::-;20925:52;;20833:152;;;:::o;101629:91::-;101669:13;101702:10;:8;:10::i;:::-;101695:17;;101629:91;:::o;16375:233::-;16447:7;16488:1;16471:19;;:5;:19;;;16467:60;;;16499:28;;;;;;;;;;;;;;16467:60;10534:13;16545:18;:25;16564:5;16545:25;;;;;;;;;;;;;;;;:55;16538:62;;16375:233;;;:::o;96187:900::-;96265:16;96319:19;96353:25;96393:22;96418:16;96428:5;96418:9;:16::i;:::-;96393:41;;96449:25;96491:14;96477:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96449:57;;96521:31;;:::i;:::-;96572:9;96584:15;:13;:15::i;:::-;96572:27;;96567:472;96616:14;96601:11;:29;96567:472;;96668:15;96681:1;96668:12;:15::i;:::-;96656:27;;96706:9;:16;;;96702:73;;;96747:8;;96702:73;96823:1;96797:28;;:9;:14;;;:28;;;96793:111;;96870:9;:14;;;96850:34;;96793:111;96947:5;96926:26;;:17;:26;;;96922:102;;;97003:1;96977:8;96986:13;;;;;;96977:23;;;;;;;;;;;;;;;;;;;;;:27;;;;;96922:102;96567:472;96632:3;;;;;96567:472;;;;97060:8;97053:15;;;;;;;96187:900;;;:::o;100617:184::-;100695:13;100711:9;100695:25;;100690:104;100731:7;100722:5;:16;100690:104;;100764:18;100770:5;100777:4;100764:5;:18::i;:::-;100740:7;;;;;:::i;:::-;;;;100690:104;;;;100617:184;;:::o;102552:315::-;62262:4;102696:18;;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;102727:57:::1;102744:8;102754:16;102772:11;102727:16;:57::i;:::-;102829:16;102800:59;;102819:8;102800:59;102847:11;102800:59;;;;;;:::i;:::-;;;;;;;;102552:315:::0;;;;:::o;102875:173::-;62262:4;102938:18;;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;102969:28:::1;102988:8;102969:18;:28::i;:::-;103031:8;103013:27;;;;;;;;;;102875:173:::0;;:::o;81794:153::-;81884:7;81911:28;81933:5;81911:12;:18;81924:4;81911:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;81904:35;;81794:153;;;;:::o;63126:147::-;63212:4;63236:6;:12;63243:4;63236:12;;;;;;;;;;;:20;;:29;63257:7;63236:29;;;;;;;;;;;;;;;;;;;;;;;;;63229:36;;63126:147;;;;:::o;19616:104::-;19672:13;19705:7;19698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19616:104;:::o;93227:2513::-;93370:16;93437:4;93428:5;:13;93424:45;;93450:19;;;;;;;;;;;;;;93424:45;93484:19;93518:17;93538:14;:12;:14::i;:::-;93518:34;;93638:15;:13;:15::i;:::-;93630:5;:23;93626:87;;;93682:15;:13;:15::i;:::-;93674:23;;93626:87;93789:9;93782:4;:16;93778:73;;;93826:9;93819:16;;93778:73;93865:25;93893:16;93903:5;93893:9;:16::i;:::-;93865:44;;94087:4;94079:5;:12;94075:278;;;94112:19;94141:5;94134:4;:12;94112:34;;94183:17;94169:11;:31;94165:111;;;94245:11;94225:31;;94165:111;94075:278;;;;94336:1;94316:21;;94075:278;94367:25;94409:17;94395:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94367:60;;94467:1;94446:17;:22;94442:78;;;94496:8;94489:15;;;;;;;;94442:78;94664:31;94698:26;94718:5;94698:19;:26::i;:::-;94664:60;;94739:25;94984:9;:16;;;94979:92;;95041:9;:14;;;95021:34;;94979:92;95090:9;95102:5;95090:17;;95085:478;95114:4;95109:1;:9;;:45;;;;;95137:17;95122:11;:32;;95109:45;95085:478;;;95192:15;95205:1;95192:12;:15::i;:::-;95180:27;;95230:9;:16;;;95226:73;;;95271:8;;95226:73;95347:1;95321:28;;:9;:14;;;:28;;;95317:111;;95394:9;:14;;;95374:34;;95317:111;95471:5;95450:26;;:17;:26;;;95446:102;;;95527:1;95501:8;95510:13;;;;;;95501:23;;;;;;;;;;;;;;;;;;;;;:27;;;;;95446:102;95085:478;95156:3;;;;;95085:478;;;;95665:11;95655:8;95648:29;95713:8;95706:15;;;;;;;;93227:2513;;;;;;:::o;62217:49::-;62262:4;62217:49;;;:::o;26481:308::-;26592:19;:17;:19::i;:::-;26580:31;;:8;:31;;;26576:61;;;26620:17;;;;;;;;;;;;;;26576:61;26702:8;26650:18;:39;26669:19;:17;:19::i;:::-;26650:39;;;;;;;;;;;;;;;:49;26690:8;26650:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26762:8;26726:55;;26741:19;:17;:19::i;:::-;26726:55;;;26772:8;26726:55;;;;;;:::i;:::-;;;;;;;;26481:308;;:::o;99787:93::-;99831:7;99858:14;:12;:14::i;:::-;99851:21;;99787:93;:::o;102394:150::-;62262:4;102444:18;;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;102475:23:::1;:21;:23::i;:::-;102514:22;;;;;;;;;;102394:150:::0;:::o;33326:399::-;33493:31;33506:4;33512:2;33516:7;33493:12;:31::i;:::-;33557:1;33539:2;:14;;;:19;33535:183;;33578:56;33609:4;33615:2;33619:7;33628:5;33578:30;:56::i;:::-;33573:145;;33662:40;;;;;;;;;;;;;;33573:145;33535:183;33326:399;;;;:::o;91724:428::-;91808:21;;:::i;:::-;91842:31;;:::i;:::-;91898:15;:13;:15::i;:::-;91888:7;:25;:54;;;;91928:14;:12;:14::i;:::-;91917:7;:25;;91888:54;91884:103;;;91966:9;91959:16;;;;;91884:103;92009:21;92022:7;92009:12;:21::i;:::-;91997:33;;92045:9;:16;;;92041:65;;;92085:9;92078:16;;;;;92041:65;92123:21;92136:7;92123:12;:21::i;:::-;92116:28;;;91724:428;;;;:::o;19826:318::-;19899:13;19930:16;19938:7;19930;:16::i;:::-;19925:59;;19955:29;;;;;;;;;;;;;;19925:59;19997:21;20021:10;:8;:10::i;:::-;19997:34;;20074:1;20055:7;20049:21;:26;;:87;;;;;;;;;;;;;;;;;20102:7;20111:18;20121:7;20111:9;:18::i;:::-;20085:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20049:87;20042:94;;;19826:318;;;:::o;82121:142::-;82201:7;82228:27;:12;:18;82241:4;82228:18;;;;;;;;;;;:25;:27::i;:::-;82221:34;;82121:142;;;:::o;101273:226::-;101372:9;101367:125;101391:7;;:14;;101387:1;:18;101367:125;;;101427:53;101440:10;101452:15;101469:7;;101477:1;101469:10;;;;;;;;;;;;;;;;;;;;;101427:12;:53::i;:::-;101407:3;;;;;:::i;:::-;;;;101367:125;;;;101273:226;;;:::o;98002:62::-;98040:24;98002:62;:::o;65042:149::-;65126:18;65139:4;65126:12;:18::i;:::-;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;65157:26:::1;65169:4;65175:7;65157:11;:26::i;:::-;65042:149:::0;;;:::o;97971:24::-;;;;:::o;102128:258::-;62262:4;102233:18;;62708:30;62719:4;62725:12;:10;:12::i;:::-;62708:10;:30::i;:::-;102269:49:::1;102288:16;102306:11;102269:18;:49::i;:::-;102348:16;102334:44;;;102366:11;102334:44;;;;;;:::i;:::-;;;;;;;;102128:258:::0;;;:::o;100988:277::-;101129:13;101145:9;101129:25;;101124:134;101165:7;101156:5;:16;101124:134;;101198:48;101211:10;101223:15;101240:5;101198:12;:48::i;:::-;101174:7;;;;;:::i;:::-;;;;101124:134;;;;100988:277;;;:::o;100809:171::-;100879:9;100874:99;100898:9;:16;100894:1;:20;100874:99;;;100936:25;100942:9;100952:1;100942:12;;;;;;;;;;;;;;;;;;;;;;100956:4;100936:5;:25::i;:::-;100916:3;;;;;:::i;:::-;;;;100874:99;;;;100809:171;:::o;97517:27::-;;;;:::o;26946:164::-;27043:4;27067:18;:25;27086:5;27067:25;;;;;;;;;;;;;;;:35;27093:8;27067:35;;;;;;;;;;;;;;;;;;;;;;;;;27060:42;;26946:164;;;;:::o;99552:227::-;99643:13;:11;:13::i;:::-;99626;:30;;99618:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;99694:41;99710:9;;99721:13;99694:41;;;;;;;:::i;:::-;;;;;;;;99758:13;99746:9;:25;;;;99552:227;:::o;67199:238::-;67283:22;67291:4;67297:7;67283;:22::i;:::-;67278:152;;67354:4;67322:6;:12;67329:4;67322:12;;;;;;;;;;;:20;;:29;67343:7;67322:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;67405:12;:10;:12::i;:::-;67378:40;;67396:7;67378:40;;67390:4;67378:40;;;;;;;;;;67278:152;67199:238;;:::o;75693:152::-;75763:4;75787:50;75792:3;:10;;75828:5;75812:23;;75804:32;;75787:4;:50::i;:::-;75780:57;;75693:152;;;;:::o;80981:214::-;81066:4;81105:42;81090:57;;;:11;:57;;;;:97;;;;81151:36;81175:11;81151:23;:36::i;:::-;81090:97;81083:104;;80981:214;;;:::o;27368:282::-;27433:4;27489:7;27470:15;:13;:15::i;:::-;:26;;:66;;;;;27523:13;;27513:7;:23;27470:66;:153;;;;;27622:1;11310:8;27574:17;:26;27592:7;27574:26;;;;;;;;;;;;:44;:49;27470:153;27450:173;;27368:282;;;:::o;49134:105::-;49194:7;49221:10;49214:17;;49134:105;:::o;99432:112::-;99497:7;99524:12;;99517:19;;99432:112;:::o;21988:1275::-;22055:7;22075:12;22090:7;22075:22;;22158:4;22139:15;:13;:15::i;:::-;:23;22135:1061;;22192:13;;22185:4;:20;22181:1015;;;22230:14;22247:17;:23;22265:4;22247:23;;;;;;;;;;;;22230:40;;22364:1;11310:8;22336:6;:24;:29;22332:845;;;23001:113;23018:1;23008:6;:11;23001:113;;;23061:17;:25;23079:6;;;;;;;23061:25;;;;;;;;;;;;23052:34;;23001:113;;;23147:6;23140:13;;;;;;22332:845;22181:1015;;22135:1061;23224:31;;;;;;;;;;;;;;21988:1275;;;;:::o;28531:479::-;28633:27;28662:23;28703:38;28744:15;:24;28760:7;28744:24;;;;;;;;;;;28703:65;;28915:18;28892:41;;28972:19;28966:26;28947:45;;28877:126;;;;:::o;27759:659::-;27908:11;28073:16;28066:5;28062:28;28053:37;;28233:16;28222:9;28218:32;28205:45;;28383:15;28372:9;28369:30;28361:5;28350:9;28347:20;28344:56;28334:66;;27941:470;;;;;:::o;34387:159::-;;;;;:::o;48443:311::-;48578:7;48598:16;11714:3;48624:19;:41;;48598:68;;11714:3;48692:31;48703:4;48709:2;48713:9;48692:10;:31::i;:::-;48684:40;;:62;;48677:69;;;48443:311;;;;;:::o;23811:450::-;23891:14;24059:16;24052:5;24048:28;24039:37;;24236:5;24222:11;24197:23;24193:41;24190:52;24183:5;24180:63;24170:73;;23927:327;;;;:::o;35211:158::-;;;;;:::o;86294:97::-;86352:6;86378:5;86371:12;;86294:97;:::o;57891:98::-;57944:7;57971:10;57964:17;;57891:98;:::o;63563:505::-;63652:22;63660:4;63666:7;63652;:22::i;:::-;63647:414;;63840:41;63868:7;63840:41;;63878:2;63840:19;:41::i;:::-;63954:38;63982:4;63974:13;;63989:2;63954:19;:38::i;:::-;63745:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63691:358;;;;;;;;;;;:::i;:::-;;;;;;;;63647:414;63563:505;;:::o;82356:169::-;82444:31;82461:4;82467:7;82444:16;:31::i;:::-;82486;82509:7;82486:12;:18;82499:4;82486:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;82356:169;;:::o;82619:174::-;82708:32;82726:4;82732:7;82708:17;:32::i;:::-;82751:34;82777:7;82751:12;:18;82764:4;82751:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;82619:174;;:::o;36987:2454::-;37060:20;37083:13;;37060:36;;37123:1;37111:8;:13;37107:44;;;37133:18;;;;;;;;;;;;;;37107:44;37164:61;37194:1;37198:2;37202:12;37216:8;37164:21;:61::i;:::-;37708:1;10672:2;37678:1;:26;;37677:32;37665:8;:45;37639:18;:22;37658:2;37639:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37987:139;38024:2;38078:33;38101:1;38105:2;38109:1;38078:14;:33::i;:::-;38045:30;38066:8;38045:20;:30::i;:::-;:66;37987:18;:139::i;:::-;37953:17;:31;37971:12;37953:31;;;;;;;;;;;:173;;;;38143:16;38174:11;38203:8;38188:12;:23;38174:37;;38458:16;38454:2;38450:25;38438:37;;38830:12;38790:8;38749:1;38687:25;38628:1;38567;38540:335;38955:1;38941:12;38937:20;38895:346;38996:3;38987:7;38984:16;38895:346;;39214:7;39204:8;39201:1;39174:25;39171:1;39168;39163:59;39049:1;39040:7;39036:15;39025:26;;38895:346;;;38899:77;39286:1;39274:8;:13;39270:45;;;39296:19;;;;;;;;;;;;;;39270:45;39348:3;39332:13;:19;;;;36987:2454;;39373:60;39402:1;39406:2;39410:12;39424:8;39373:20;:60::i;:::-;36987:2454;;;:::o;43663:3081::-;43743:27;43773;43792:7;43773:18;:27::i;:::-;43743:57;;43813:12;43844:19;43813:52;;43879:27;43908:23;43935:35;43962:7;43935:26;:35::i;:::-;43878:92;;;;43987:13;43983:316;;;44108:68;44133:15;44150:4;44156:19;:17;:19::i;:::-;44108:24;:68::i;:::-;44103:184;;44200:43;44217:4;44223:19;:17;:19::i;:::-;44200:16;:43::i;:::-;44195:92;;44252:35;;;;;;;;;;;;;;44195:92;44103:184;43983:316;44311:51;44333:4;44347:1;44351:7;44360:1;44311:21;:51::i;:::-;44455:15;44452:2;;;44595:1;44574:19;44567:30;44452:2;45273:1;10799:3;45243:1;:26;;45242:32;45214:18;:24;45233:4;45214:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45541:176;45578:4;45649:53;45664:4;45678:1;45682:19;45649:14;:53::i;:::-;11590:8;11310;45602:43;45601:101;45541:18;:176::i;:::-;45512:17;:26;45530:7;45512:26;;;;;;;;;;;:205;;;;45888:1;11590:8;45837:19;:47;:52;45833:627;;;45910:19;45942:1;45932:7;:11;45910:33;;46099:1;46065:17;:30;46083:11;46065:30;;;;;;;;;;;;:35;46061:384;;;46203:13;;46188:11;:28;46184:242;;46383:19;46350:17;:30;46368:11;46350:30;;;;;;;;;;;:52;;;;46184:242;46061:384;45833:627;;46515:7;46511:1;46488:35;;46497:4;46488:35;;;;;;;;;;;;46534:50;46555:4;46569:1;46573:7;46582:1;46534:20;:50::i;:::-;46711:12;;:14;;;;;;;;;;;;;43663:3081;;;;;;:::o;101507:114::-;101567:13;101600;101593:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101507:114;:::o;21436:161::-;21504:21;;:::i;:::-;21545:44;21564:17;:24;21582:5;21564:24;;;;;;;;;;;;21545:18;:44::i;:::-;21538:51;;21436:161;;;:::o;87489:390::-;87657:17;:15;:17::i;:::-;87641:33;;:12;:33;;;;87633:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;87760:1;87740:22;;:8;:22;;;;87732:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;87836:35;;;;;;;;87848:8;87836:35;;;;;;87858:12;87836:35;;;;;87807:17;:26;87825:7;87807:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87489:390;;;:::o;87990:114::-;88070:17;:26;88088:7;88070:26;;;;;;;;;;;;88063:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87990:114;:::o;76989:158::-;77063:7;77114:22;77118:3;:10;;77130:5;77114:3;:22::i;:::-;77106:31;;77083:56;;76989:158;;;;:::o;14878:103::-;14933:7;14960:13;;14953:20;;14878:103;:::o;15612:296::-;15667:7;15874:15;:13;:15::i;:::-;15858:13;;:31;15851:38;;15612:296;:::o;87070:95::-;87138:19;;87131:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87070:95::o;35809:716::-;35972:4;36018:2;35993:45;;;36039:19;:17;:19::i;:::-;36060:4;36066:7;36075:5;35993:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35989:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36293:1;36276:6;:13;:18;36272:235;;;36322:40;;;;;;;;;;;;;;36272:235;36465:6;36459:13;36450:6;36446:2;36442:15;36435:38;35989:529;36162:54;;;36152:64;;;:6;:64;;;;36145:71;;;35809:716;;;;;;:::o;21174:166::-;21244:21;;:::i;:::-;21285:47;21304:27;21323:7;21304:18;:27::i;:::-;21285:18;:47::i;:::-;21278:54;;21174:166;;;:::o;49341:1581::-;49406:17;49831:4;49824;49818:11;49814:22;49807:29;;49923:3;49917:4;49910:17;50029:3;50268:5;50250:428;50276:1;50250:428;;;50316:1;50311:3;50307:11;50300:18;;50487:2;50481:4;50477:13;50473:2;50469:22;50464:3;50456:36;50581:2;50575:4;50571:13;50563:21;;50648:4;50638:2;;50656:5;;50638:2;50250:428;;;50254:21;50717:3;50712;50708:13;50832:4;50827:3;50823:14;50816:21;;50897:6;50892:3;50885:19;49445:1470;;;;;:::o;76518:117::-;76581:7;76608:19;76616:3;:10;;76608:7;:19::i;:::-;76601:26;;76518:117;;;:::o;86662:332::-;86781:17;:15;:17::i;:::-;86765:33;;:12;:33;;;;86757:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;86884:1;86864:22;;:8;:22;;;;86856:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;86951:35;;;;;;;;86963:8;86951:35;;;;;;86973:12;86951:35;;;;;86929:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86662:332;;:::o;69608:414::-;69671:4;69693:21;69703:3;69708:5;69693:9;:21::i;:::-;69688:327;;69731:3;:11;;69748:5;69731:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69914:3;:11;;:18;;;;69892:3;:12;;:19;69905:5;69892:19;;;;;;;;;;;:40;;;;69954:4;69947:11;;;;69688:327;69998:5;69991:12;;69608:414;;;;;:::o;62830:204::-;62915:4;62954:32;62939:47;;;:11;:47;;;;:87;;;;62990:36;63014:11;62990:23;:36::i;:::-;62939:87;62932:94;;62830:204;;;:::o;48144:147::-;48281:6;48144:147;;;;;:::o;59777:451::-;59852:13;59878:19;59923:1;59914:6;59910:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;59900:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59878:47;;59936:15;:6;59943:1;59936:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;59962;:6;59969:1;59962:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;59993:9;60018:1;60009:6;60005:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;59993:26;;59988:135;60025:1;60021;:5;59988:135;;;60060:12;60081:3;60073:5;:11;60060:25;;;;;;;;;;;;;;;;;;60048:6;60055:1;60048:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;60110:1;60100:11;;;;;60028:3;;;;:::i;:::-;;;59988:135;;;;60150:1;60141:5;:10;60133:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60213:6;60199:21;;;59777:451;;;;:::o;67569:239::-;67653:22;67661:4;67667:7;67653;:22::i;:::-;67649:152;;;67724:5;67692:6;:12;67699:4;67692:12;;;;;;;;;;;:20;;:29;67713:7;67692:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;67776:12;:10;:12::i;:::-;67749:40;;67767:7;67749:40;;67761:4;67749:40;;;;;;;;;;67649:152;67569:239;;:::o;76021:158::-;76094:4;76118:53;76126:3;:10;;76162:5;76146:23;;76138:32;;76118:7;:53::i;:::-;76111:60;;76021:158;;;;:::o;24363:324::-;24433:14;24666:1;24656:8;24653:15;24627:24;24623:46;24613:56;;24535:145;;;:::o;23362:366::-;23428:31;;:::i;:::-;23505:6;23472:9;:14;;:41;;;;;;;;;;;11193:3;23558:6;:33;;23524:9;:24;;:68;;;;;;;;;;;23650:1;11310:8;23622:6;:24;:29;;23603:9;:16;;:48;;;;;;;;;;;11714:3;23691:6;:28;;23662:9;:19;;:58;;;;;;;;;;;23362:366;;;:::o;72382:120::-;72449:7;72476:3;:11;;72488:5;72476:18;;;;;;;;;;;;;;;;;;;;;;;;72469:25;;72382:120;;;;:::o;71919:109::-;71975:7;72002:3;:11;;:18;;;;71995:25;;71919:109;;;:::o;71704:129::-;71777:4;71824:1;71801:3;:12;;:19;71814:5;71801:19;;;;;;;;;;;;:24;;71794:31;;71704:129;;;;:::o;85248:215::-;85350:4;85389:26;85374:41;;;:11;:41;;;;:81;;;;85419:36;85443:11;85419:23;:36::i;:::-;85374:81;85367:88;;85248:215;;;:::o;70198:1420::-;70264:4;70382:18;70403:3;:12;;:19;70416:5;70403:19;;;;;;;;;;;;70382:40;;70453:1;70439:10;:15;70435:1176;;70814:21;70851:1;70838:10;:14;;;;:::i;:::-;70814:38;;70867:17;70908:1;70887:3;:11;;:18;;;;:22;;;;:::i;:::-;70867:42;;70943:13;70930:9;:26;70926:405;;70977:17;70997:3;:11;;71009:9;70997:22;;;;;;;;;;;;;;;;;;;;;;;;70977:42;;71151:9;71122:3;:11;;71134:13;71122:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;71262:10;71236:3;:12;;:23;71249:9;71236:23;;;;;;;;;;;:36;;;;70926:405;;71412:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71507:3;:12;;:19;71520:5;71507:19;;;;;;;;;;;71500:26;;;71550:4;71543:11;;;;;;;70435:1176;71594:5;71587:12;;;70198:1420;;;;;:::o;18538:639::-;18623:4;18962:10;18947:25;;:11;:25;;;;:102;;;;19039:10;19024:25;;:11;:25;;;;18947:102;:179;;;;19116:10;19101:25;;:11;:25;;;;18947:179;18927:199;;18538:639;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1196:367::-;1269:8;1279:6;1329:3;1322:4;1314:6;1310:17;1306:27;1296:2;;1347:1;1344;1337:12;1296:2;1383:6;1370:20;1360:30;;1413:18;1405:6;1402:30;1399:2;;;1445:1;1442;1435:12;1399:2;1482:4;1474:6;1470:17;1458:29;;1536:3;1528:4;1520:6;1516:17;1506:8;1502:32;1499:41;1496:2;;;1553:1;1550;1543:12;1496:2;1286:277;;;;;:::o;1586:303::-;1657:5;1706:3;1699:4;1691:6;1687:17;1683:27;1673:2;;1724:1;1721;1714:12;1673:2;1764:6;1751:20;1789:94;1879:3;1871:6;1864:4;1856:6;1852:17;1789:94;:::i;:::-;1780:103;;1663:226;;;;;:::o;1895:133::-;1938:5;1976:6;1963:20;1954:29;;1992:30;2016:5;1992:30;:::i;:::-;1944:84;;;;:::o;2034:139::-;2080:5;2118:6;2105:20;2096:29;;2134:33;2161:5;2134:33;:::i;:::-;2086:87;;;;:::o;2179:137::-;2224:5;2262:6;2249:20;2240:29;;2278:32;2304:5;2278:32;:::i;:::-;2230:86;;;;:::o;2322:141::-;2378:5;2409:6;2403:13;2394:22;;2425:32;2451:5;2425:32;:::i;:::-;2384:79;;;;:::o;2482:271::-;2537:5;2586:3;2579:4;2571:6;2567:17;2563:27;2553:2;;2604:1;2601;2594:12;2553:2;2644:6;2631:20;2669:78;2743:3;2735:6;2728:4;2720:6;2716:17;2669:78;:::i;:::-;2660:87;;2543:210;;;;;:::o;2773:352::-;2831:8;2841:6;2891:3;2884:4;2876:6;2872:17;2868:27;2858:2;;2909:1;2906;2899:12;2858:2;2945:6;2932:20;2922:30;;2975:18;2967:6;2964:30;2961:2;;;3007:1;3004;2997:12;2961:2;3044:4;3036:6;3032:17;3020:29;;3098:3;3090:4;3082:6;3078:17;3068:8;3064:32;3061:41;3058:2;;;3115:1;3112;3105:12;3058:2;2848:277;;;;;:::o;3131:139::-;3177:5;3215:6;3202:20;3193:29;;3231:33;3258:5;3231:33;:::i;:::-;3183:87;;;;:::o;3276:137::-;3321:5;3359:6;3346:20;3337:29;;3375:32;3401:5;3375:32;:::i;:::-;3327:86;;;;:::o;3419:262::-;3478:6;3527:2;3515:9;3506:7;3502:23;3498:32;3495:2;;;3543:1;3540;3533:12;3495:2;3586:1;3611:53;3656:7;3647:6;3636:9;3632:22;3611:53;:::i;:::-;3601:63;;3557:117;3485:196;;;;:::o;3687:407::-;3755:6;3763;3812:2;3800:9;3791:7;3787:23;3783:32;3780:2;;;3828:1;3825;3818:12;3780:2;3871:1;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;:::i;:::-;3886:63;;3842:117;3998:2;4024:53;4069:7;4060:6;4049:9;4045:22;4024:53;:::i;:::-;4014:63;;3969:118;3770:324;;;;;:::o;4100:552::-;4177:6;4185;4193;4242:2;4230:9;4221:7;4217:23;4213:32;4210:2;;;4258:1;4255;4248:12;4210:2;4301:1;4326:53;4371:7;4362:6;4351:9;4347:22;4326:53;:::i;:::-;4316:63;;4272:117;4428:2;4454:53;4499:7;4490:6;4479:9;4475:22;4454:53;:::i;:::-;4444:63;;4399:118;4556:2;4582:53;4627:7;4618:6;4607:9;4603:22;4582:53;:::i;:::-;4572:63;;4527:118;4200:452;;;;;:::o;4658:809::-;4753:6;4761;4769;4777;4826:3;4814:9;4805:7;4801:23;4797:33;4794:2;;;4843:1;4840;4833:12;4794:2;4886:1;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4857:117;5013:2;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4984:118;5141:2;5167:53;5212:7;5203:6;5192:9;5188:22;5167:53;:::i;:::-;5157:63;;5112:118;5297:2;5286:9;5282:18;5269:32;5328:18;5320:6;5317:30;5314:2;;;5360:1;5357;5350:12;5314:2;5388:62;5442:7;5433:6;5422:9;5418:22;5388:62;:::i;:::-;5378:72;;5240:220;4784:683;;;;;;;:::o;5473:401::-;5538:6;5546;5595:2;5583:9;5574:7;5570:23;5566:32;5563:2;;;5611:1;5608;5601:12;5563:2;5654:1;5679:53;5724:7;5715:6;5704:9;5700:22;5679:53;:::i;:::-;5669:63;;5625:117;5781:2;5807:50;5849:7;5840:6;5829:9;5825:22;5807:50;:::i;:::-;5797:60;;5752:115;5553:321;;;;;:::o;5880:407::-;5948:6;5956;6005:2;5993:9;5984:7;5980:23;5976:32;5973:2;;;6021:1;6018;6011:12;5973:2;6064:1;6089:53;6134:7;6125:6;6114:9;6110:22;6089:53;:::i;:::-;6079:63;;6035:117;6191:2;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6162:118;5963:324;;;;;:::o;6293:552::-;6370:6;6378;6386;6435:2;6423:9;6414:7;6410:23;6406:32;6403:2;;;6451:1;6448;6441:12;6403:2;6494:1;6519:53;6564:7;6555:6;6544:9;6540:22;6519:53;:::i;:::-;6509:63;;6465:117;6621:2;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6592:118;6749:2;6775:53;6820:7;6811:6;6800:9;6796:22;6775:53;:::i;:::-;6765:63;;6720:118;6393:452;;;;;:::o;6851:405::-;6918:6;6926;6975:2;6963:9;6954:7;6950:23;6946:32;6943:2;;;6991:1;6988;6981:12;6943:2;7034:1;7059:53;7104:7;7095:6;7084:9;7080:22;7059:53;:::i;:::-;7049:63;;7005:117;7161:2;7187:52;7231:7;7222:6;7211:9;7207:22;7187:52;:::i;:::-;7177:62;;7132:117;6933:323;;;;;:::o;7262:425::-;7348:6;7356;7405:2;7393:9;7384:7;7380:23;7376:32;7373:2;;;7421:1;7418;7411:12;7373:2;7492:1;7481:9;7477:17;7464:31;7522:18;7514:6;7511:30;7508:2;;;7554:1;7551;7544:12;7508:2;7590:80;7662:7;7653:6;7642:9;7638:22;7590:80;:::i;:::-;7572:98;;;;7435:245;7363:324;;;;;:::o;7693:570::-;7788:6;7796;7804;7853:2;7841:9;7832:7;7828:23;7824:32;7821:2;;;7869:1;7866;7859:12;7821:2;7940:1;7929:9;7925:17;7912:31;7970:18;7962:6;7959:30;7956:2;;;8002:1;7999;7992:12;7956:2;8038:80;8110:7;8101:6;8090:9;8086:22;8038:80;:::i;:::-;8020:98;;;;7883:245;8167:2;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8138:118;7811:452;;;;;:::o;8269:405::-;8353:6;8402:2;8390:9;8381:7;8377:23;8373:32;8370:2;;;8418:1;8415;8408:12;8370:2;8489:1;8478:9;8474:17;8461:31;8519:18;8511:6;8508:30;8505:2;;;8551:1;8548;8541:12;8505:2;8579:78;8649:7;8640:6;8629:9;8625:22;8579:78;:::i;:::-;8569:88;;8432:235;8360:314;;;;:::o;8680:262::-;8739:6;8788:2;8776:9;8767:7;8763:23;8759:32;8756:2;;;8804:1;8801;8794:12;8756:2;8847:1;8872:53;8917:7;8908:6;8897:9;8893:22;8872:53;:::i;:::-;8862:63;;8818:117;8746:196;;;;:::o;8948:407::-;9016:6;9024;9073:2;9061:9;9052:7;9048:23;9044:32;9041:2;;;9089:1;9086;9079:12;9041:2;9132:1;9157:53;9202:7;9193:6;9182:9;9178:22;9157:53;:::i;:::-;9147:63;;9103:117;9259:2;9285:53;9330:7;9321:6;9310:9;9306:22;9285:53;:::i;:::-;9275:63;;9230:118;9031:324;;;;;:::o;9361:407::-;9429:6;9437;9486:2;9474:9;9465:7;9461:23;9457:32;9454:2;;;9502:1;9499;9492:12;9454:2;9545:1;9570:53;9615:7;9606:6;9595:9;9591:22;9570:53;:::i;:::-;9560:63;;9516:117;9672:2;9698:53;9743:7;9734:6;9723:9;9719:22;9698:53;:::i;:::-;9688:63;;9643:118;9444:324;;;;;:::o;9774:260::-;9832:6;9881:2;9869:9;9860:7;9856:23;9852:32;9849:2;;;9897:1;9894;9887:12;9849:2;9940:1;9965:52;10009:7;10000:6;9989:9;9985:22;9965:52;:::i;:::-;9955:62;;9911:116;9839:195;;;;:::o;10040:282::-;10109:6;10158:2;10146:9;10137:7;10133:23;10129:32;10126:2;;;10174:1;10171;10164:12;10126:2;10217:1;10242:63;10297:7;10288:6;10277:9;10273:22;10242:63;:::i;:::-;10232:73;;10188:127;10116:206;;;;:::o;10328:395::-;10399:6;10407;10456:2;10444:9;10435:7;10431:23;10427:32;10424:2;;;10472:1;10469;10462:12;10424:2;10543:1;10532:9;10528:17;10515:31;10573:18;10565:6;10562:30;10559:2;;;10605:1;10602;10595:12;10559:2;10641:65;10698:7;10689:6;10678:9;10674:22;10641:65;:::i;:::-;10623:83;;;;10486:230;10414:309;;;;;:::o;10729:262::-;10788:6;10837:2;10825:9;10816:7;10812:23;10808:32;10805:2;;;10853:1;10850;10843:12;10805:2;10896:1;10921:53;10966:7;10957:6;10946:9;10942:22;10921:53;:::i;:::-;10911:63;;10867:117;10795:196;;;;:::o;10997:550::-;11073:6;11081;11089;11138:2;11126:9;11117:7;11113:23;11109:32;11106:2;;;11154:1;11151;11144:12;11106:2;11197:1;11222:53;11267:7;11258:6;11247:9;11243:22;11222:53;:::i;:::-;11212:63;;11168:117;11324:2;11350:53;11395:7;11386:6;11375:9;11371:22;11350:53;:::i;:::-;11340:63;;11295:118;11452:2;11478:52;11522:7;11513:6;11502:9;11498:22;11478:52;:::i;:::-;11468:62;;11423:117;11096:451;;;;;:::o;11553:407::-;11621:6;11629;11678:2;11666:9;11657:7;11653:23;11649:32;11646:2;;;11694:1;11691;11684:12;11646:2;11737:1;11762:53;11807:7;11798:6;11787:9;11783:22;11762:53;:::i;:::-;11752:63;;11708:117;11864:2;11890:53;11935:7;11926:6;11915:9;11911:22;11890:53;:::i;:::-;11880:63;;11835:118;11636:324;;;;;:::o;11966:552::-;12043:6;12051;12059;12108:2;12096:9;12087:7;12083:23;12079:32;12076:2;;;12124:1;12121;12114:12;12076:2;12167:1;12192:53;12237:7;12228:6;12217:9;12213:22;12192:53;:::i;:::-;12182:63;;12138:117;12294:2;12320:53;12365:7;12356:6;12345:9;12341:22;12320:53;:::i;:::-;12310:63;;12265:118;12422:2;12448:53;12493:7;12484:6;12473:9;12469:22;12448:53;:::i;:::-;12438:63;;12393:118;12066:452;;;;;:::o;12524:299::-;12653:10;12674:106;12776:3;12768:6;12674:106;:::i;:::-;12812:4;12807:3;12803:14;12789:28;;12664:159;;;;:::o;12829:179::-;12898:10;12919:46;12961:3;12953:6;12919:46;:::i;:::-;12997:4;12992:3;12988:14;12974:28;;12909:99;;;;:::o;13014:108::-;13091:24;13109:5;13091:24;:::i;:::-;13086:3;13079:37;13069:53;;:::o;13128:118::-;13215:24;13233:5;13215:24;:::i;:::-;13210:3;13203:37;13193:53;;:::o;13328:972::-;13507:3;13536:84;13614:5;13536:84;:::i;:::-;13636:116;13745:6;13740:3;13636:116;:::i;:::-;13629:123;;13776:86;13856:5;13776:86;:::i;:::-;13885:7;13916:1;13901:374;13926:6;13923:1;13920:13;13901:374;;;14002:6;13996:13;14029:123;14148:3;14133:13;14029:123;:::i;:::-;14022:130;;14175:90;14258:6;14175:90;:::i;:::-;14165:100;;13961:314;13948:1;13945;13941:9;13936:14;;13901:374;;;13905:14;14291:3;14284:10;;13512:788;;;;;;;:::o;14336:732::-;14455:3;14484:54;14532:5;14484:54;:::i;:::-;14554:86;14633:6;14628:3;14554:86;:::i;:::-;14547:93;;14664:56;14714:5;14664:56;:::i;:::-;14743:7;14774:1;14759:284;14784:6;14781:1;14778:13;14759:284;;;14860:6;14854:13;14887:63;14946:3;14931:13;14887:63;:::i;:::-;14880:70;;14973:60;15026:6;14973:60;:::i;:::-;14963:70;;14819:224;14806:1;14803;14799:9;14794:14;;14759:284;;;14763:14;15059:3;15052:10;;14460:608;;;;;;;:::o;15074:99::-;15145:21;15160:5;15145:21;:::i;:::-;15140:3;15133:34;15123:50;;:::o;15179:109::-;15260:21;15275:5;15260:21;:::i;:::-;15255:3;15248:34;15238:50;;:::o;15294:118::-;15381:24;15399:5;15381:24;:::i;:::-;15376:3;15369:37;15359:53;;:::o;15418:360::-;15504:3;15532:38;15564:5;15532:38;:::i;:::-;15586:70;15649:6;15644:3;15586:70;:::i;:::-;15579:77;;15665:52;15710:6;15705:3;15698:4;15691:5;15687:16;15665:52;:::i;:::-;15742:29;15764:6;15742:29;:::i;:::-;15737:3;15733:39;15726:46;;15508:270;;;;;:::o;15784:364::-;15872:3;15900:39;15933:5;15900:39;:::i;:::-;15955:71;16019:6;16014:3;15955:71;:::i;:::-;15948:78;;16035:52;16080:6;16075:3;16068:4;16061:5;16057:16;16035:52;:::i;:::-;16112:29;16134:6;16112:29;:::i;:::-;16107:3;16103:39;16096:46;;15876:272;;;;;:::o;16154:377::-;16260:3;16288:39;16321:5;16288:39;:::i;:::-;16343:89;16425:6;16420:3;16343:89;:::i;:::-;16336:96;;16441:52;16486:6;16481:3;16474:4;16467:5;16463:16;16441:52;:::i;:::-;16518:6;16513:3;16509:16;16502:23;;16264:267;;;;;:::o;16537:366::-;16679:3;16700:67;16764:2;16759:3;16700:67;:::i;:::-;16693:74;;16776:93;16865:3;16776:93;:::i;:::-;16894:2;16889:3;16885:12;16878:19;;16683:220;;;:::o;16909:366::-;17051:3;17072:67;17136:2;17131:3;17072:67;:::i;:::-;17065:74;;17148:93;17237:3;17148:93;:::i;:::-;17266:2;17261:3;17257:12;17250:19;;17055:220;;;:::o;17281:366::-;17423:3;17444:67;17508:2;17503:3;17444:67;:::i;:::-;17437:74;;17520:93;17609:3;17520:93;:::i;:::-;17638:2;17633:3;17629:12;17622:19;;17427:220;;;:::o;17653:366::-;17795:3;17816:67;17880:2;17875:3;17816:67;:::i;:::-;17809:74;;17892:93;17981:3;17892:93;:::i;:::-;18010:2;18005:3;18001:12;17994:19;;17799:220;;;:::o;18025:366::-;18167:3;18188:67;18252:2;18247:3;18188:67;:::i;:::-;18181:74;;18264:93;18353:3;18264:93;:::i;:::-;18382:2;18377:3;18373:12;18366:19;;18171:220;;;:::o;18397:402::-;18557:3;18578:85;18660:2;18655:3;18578:85;:::i;:::-;18571:92;;18672:93;18761:3;18672:93;:::i;:::-;18790:2;18785:3;18781:12;18774:19;;18561:238;;;:::o;18805:366::-;18947:3;18968:67;19032:2;19027:3;18968:67;:::i;:::-;18961:74;;19044:93;19133:3;19044:93;:::i;:::-;19162:2;19157:3;19153:12;19146:19;;18951:220;;;:::o;19177:366::-;19319:3;19340:67;19404:2;19399:3;19340:67;:::i;:::-;19333:74;;19416:93;19505:3;19416:93;:::i;:::-;19534:2;19529:3;19525:12;19518:19;;19323:220;;;:::o;19549:402::-;19709:3;19730:85;19812:2;19807:3;19730:85;:::i;:::-;19723:92;;19824:93;19913:3;19824:93;:::i;:::-;19942:2;19937:3;19933:12;19926:19;;19713:238;;;:::o;19957:366::-;20099:3;20120:67;20184:2;20179:3;20120:67;:::i;:::-;20113:74;;20196:93;20285:3;20196:93;:::i;:::-;20314:2;20309:3;20305:12;20298:19;;20103:220;;;:::o;20401:862::-;20548:4;20543:3;20539:14;20635:4;20628:5;20624:16;20618:23;20654:63;20711:4;20706:3;20702:14;20688:12;20654:63;:::i;:::-;20563:164;20819:4;20812:5;20808:16;20802:23;20838:61;20893:4;20888:3;20884:14;20870:12;20838:61;:::i;:::-;20737:172;20993:4;20986:5;20982:16;20976:23;21012:57;21063:4;21058:3;21054:14;21040:12;21012:57;:::i;:::-;20919:160;21166:4;21159:5;21155:16;21149:23;21185:61;21240:4;21235:3;21231:14;21217:12;21185:61;:::i;:::-;21089:167;20517:746;;;:::o;21341:872::-;21498:4;21493:3;21489:14;21585:4;21578:5;21574:16;21568:23;21604:63;21661:4;21656:3;21652:14;21638:12;21604:63;:::i;:::-;21513:164;21769:4;21762:5;21758:16;21752:23;21788:61;21843:4;21838:3;21834:14;21820:12;21788:61;:::i;:::-;21687:172;21943:4;21936:5;21932:16;21926:23;21962:57;22013:4;22008:3;22004:14;21990:12;21962:57;:::i;:::-;21869:160;22116:4;22109:5;22105:16;22099:23;22135:61;22190:4;22185:3;22181:14;22167:12;22135:61;:::i;:::-;22039:167;21467:746;;;:::o;22219:105::-;22294:23;22311:5;22294:23;:::i;:::-;22289:3;22282:36;22272:52;;:::o;22330:108::-;22407:24;22425:5;22407:24;:::i;:::-;22402:3;22395:37;22385:53;;:::o;22444:118::-;22531:24;22549:5;22531:24;:::i;:::-;22526:3;22519:37;22509:53;;:::o;22568:105::-;22643:23;22660:5;22643:23;:::i;:::-;22638:3;22631:36;22621:52;;:::o;22679:115::-;22764:23;22781:5;22764:23;:::i;:::-;22759:3;22752:36;22742:52;;:::o;22800:435::-;22980:3;23002:95;23093:3;23084:6;23002:95;:::i;:::-;22995:102;;23114:95;23205:3;23196:6;23114:95;:::i;:::-;23107:102;;23226:3;23219:10;;22984:251;;;;;:::o;23241:967::-;23623:3;23645:148;23789:3;23645:148;:::i;:::-;23638:155;;23810:95;23901:3;23892:6;23810:95;:::i;:::-;23803:102;;23922:148;24066:3;23922:148;:::i;:::-;23915:155;;24087:95;24178:3;24169:6;24087:95;:::i;:::-;24080:102;;24199:3;24192:10;;23627:581;;;;;:::o;24214:222::-;24307:4;24345:2;24334:9;24330:18;24322:26;;24358:71;24426:1;24415:9;24411:17;24402:6;24358:71;:::i;:::-;24312:124;;;;:::o;24442:640::-;24637:4;24675:3;24664:9;24660:19;24652:27;;24689:71;24757:1;24746:9;24742:17;24733:6;24689:71;:::i;:::-;24770:72;24838:2;24827:9;24823:18;24814:6;24770:72;:::i;:::-;24852;24920:2;24909:9;24905:18;24896:6;24852:72;:::i;:::-;24971:9;24965:4;24961:20;24956:2;24945:9;24941:18;24934:48;24999:76;25070:4;25061:6;24999:76;:::i;:::-;24991:84;;24642:440;;;;;;;:::o;25088:332::-;25209:4;25247:2;25236:9;25232:18;25224:26;;25260:71;25328:1;25317:9;25313:17;25304:6;25260:71;:::i;:::-;25341:72;25409:2;25398:9;25394:18;25385:6;25341:72;:::i;:::-;25214:206;;;;;:::o;25426:493::-;25629:4;25667:2;25656:9;25652:18;25644:26;;25716:9;25710:4;25706:20;25702:1;25691:9;25687:17;25680:47;25744:168;25907:4;25898:6;25744:168;:::i;:::-;25736:176;;25634:285;;;;:::o;25925:373::-;26068:4;26106:2;26095:9;26091:18;26083:26;;26155:9;26149:4;26145:20;26141:1;26130:9;26126:17;26119:47;26183:108;26286:4;26277:6;26183:108;:::i;:::-;26175:116;;26073:225;;;;:::o;26304:210::-;26391:4;26429:2;26418:9;26414:18;26406:26;;26442:65;26504:1;26493:9;26489:17;26480:6;26442:65;:::i;:::-;26396:118;;;;:::o;26520:222::-;26613:4;26651:2;26640:9;26636:18;26628:26;;26664:71;26732:1;26721:9;26717:17;26708:6;26664:71;:::i;:::-;26618:124;;;;:::o;26748:313::-;26861:4;26899:2;26888:9;26884:18;26876:26;;26948:9;26942:4;26938:20;26934:1;26923:9;26919:17;26912:47;26976:78;27049:4;27040:6;26976:78;:::i;:::-;26968:86;;26866:195;;;;:::o;27067:419::-;27233:4;27271:2;27260:9;27256:18;27248:26;;27320:9;27314:4;27310:20;27306:1;27295:9;27291:17;27284:47;27348:131;27474:4;27348:131;:::i;:::-;27340:139;;27238:248;;;:::o;27492:419::-;27658:4;27696:2;27685:9;27681:18;27673:26;;27745:9;27739:4;27735:20;27731:1;27720:9;27716:17;27709:47;27773:131;27899:4;27773:131;:::i;:::-;27765:139;;27663:248;;;:::o;27917:419::-;28083:4;28121:2;28110:9;28106:18;28098:26;;28170:9;28164:4;28160:20;28156:1;28145:9;28141:17;28134:47;28198:131;28324:4;28198:131;:::i;:::-;28190:139;;28088:248;;;:::o;28342:419::-;28508:4;28546:2;28535:9;28531:18;28523:26;;28595:9;28589:4;28585:20;28581:1;28570:9;28566:17;28559:47;28623:131;28749:4;28623:131;:::i;:::-;28615:139;;28513:248;;;:::o;28767:419::-;28933:4;28971:2;28960:9;28956:18;28948:26;;29020:9;29014:4;29010:20;29006:1;28995:9;28991:17;28984:47;29048:131;29174:4;29048:131;:::i;:::-;29040:139;;28938:248;;;:::o;29192:419::-;29358:4;29396:2;29385:9;29381:18;29373:26;;29445:9;29439:4;29435:20;29431:1;29420:9;29416:17;29409:47;29473:131;29599:4;29473:131;:::i;:::-;29465:139;;29363:248;;;:::o;29617:419::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29870:9;29864:4;29860:20;29856:1;29845:9;29841:17;29834:47;29898:131;30024:4;29898:131;:::i;:::-;29890:139;;29788:248;;;:::o;30042:419::-;30208:4;30246:2;30235:9;30231:18;30223:26;;30295:9;30289:4;30285:20;30281:1;30270:9;30266:17;30259:47;30323:131;30449:4;30323:131;:::i;:::-;30315:139;;30213:248;;;:::o;30467:343::-;30620:4;30658:3;30647:9;30643:19;30635:27;;30672:131;30800:1;30789:9;30785:17;30776:6;30672:131;:::i;:::-;30625:185;;;;:::o;30816:222::-;30909:4;30947:2;30936:9;30932:18;30924:26;;30960:71;31028:1;31017:9;31013:17;31004:6;30960:71;:::i;:::-;30914:124;;;;:::o;31044:332::-;31165:4;31203:2;31192:9;31188:18;31180:26;;31216:71;31284:1;31273:9;31269:17;31260:6;31216:71;:::i;:::-;31297:72;31365:2;31354:9;31350:18;31341:6;31297:72;:::i;:::-;31170:206;;;;;:::o;31382:218::-;31473:4;31511:2;31500:9;31496:18;31488:26;;31524:69;31590:1;31579:9;31575:17;31566:6;31524:69;:::i;:::-;31478:122;;;;:::o;31606:129::-;31640:6;31667:20;;:::i;:::-;31657:30;;31696:33;31724:4;31716:6;31696:33;:::i;:::-;31647:88;;;:::o;31741:75::-;31774:6;31807:2;31801:9;31791:19;;31781:35;:::o;31822:311::-;31899:4;31989:18;31981:6;31978:30;31975:2;;;32011:18;;:::i;:::-;31975:2;32061:4;32053:6;32049:17;32041:25;;32121:4;32115;32111:15;32103:23;;31904:229;;;:::o;32139:307::-;32200:4;32290:18;32282:6;32279:30;32276:2;;;32312:18;;:::i;:::-;32276:2;32350:29;32372:6;32350:29;:::i;:::-;32342:37;;32434:4;32428;32424:15;32416:23;;32205:241;;;:::o;32452:162::-;32549:4;32572:3;32564:11;;32602:4;32597:3;32593:14;32585:22;;32554:60;;;:::o;32620:132::-;32687:4;32710:3;32702:11;;32740:4;32735:3;32731:14;32723:22;;32692:60;;;:::o;32758:144::-;32855:6;32889:5;32883:12;32873:22;;32862:40;;;:::o;32908:114::-;32975:6;33009:5;33003:12;32993:22;;32982:40;;;:::o;33028:98::-;33079:6;33113:5;33107:12;33097:22;;33086:40;;;:::o;33132:99::-;33184:6;33218:5;33212:12;33202:22;;33191:40;;;:::o;33237:143::-;33337:4;33369;33364:3;33360:14;33352:22;;33342:38;;;:::o;33386:113::-;33456:4;33488;33483:3;33479:14;33471:22;;33461:38;;;:::o;33505:214::-;33634:11;33668:6;33663:3;33656:19;33708:4;33703:3;33699:14;33684:29;;33646:73;;;;:::o;33725:184::-;33824:11;33858:6;33853:3;33846:19;33898:4;33893:3;33889:14;33874:29;;33836:73;;;;:::o;33915:168::-;33998:11;34032:6;34027:3;34020:19;34072:4;34067:3;34063:14;34048:29;;34010:73;;;;:::o;34089:169::-;34173:11;34207:6;34202:3;34195:19;34247:4;34242:3;34238:14;34223:29;;34185:73;;;;:::o;34264:148::-;34366:11;34403:3;34388:18;;34378:34;;;;:::o;34418:305::-;34458:3;34477:20;34495:1;34477:20;:::i;:::-;34472:25;;34511:20;34529:1;34511:20;:::i;:::-;34506:25;;34665:1;34597:66;34593:74;34590:1;34587:81;34584:2;;;34671:18;;:::i;:::-;34584:2;34715:1;34712;34708:9;34701:16;;34462:261;;;;:::o;34729:185::-;34769:1;34786:20;34804:1;34786:20;:::i;:::-;34781:25;;34820:20;34838:1;34820:20;:::i;:::-;34815:25;;34859:1;34849:2;;34864:18;;:::i;:::-;34849:2;34906:1;34903;34899:9;34894:14;;34771:143;;;;:::o;34920:348::-;34960:7;34983:20;35001:1;34983:20;:::i;:::-;34978:25;;35017:20;35035:1;35017:20;:::i;:::-;35012:25;;35205:1;35137:66;35133:74;35130:1;35127:81;35122:1;35115:9;35108:17;35104:105;35101:2;;;35212:18;;:::i;:::-;35101:2;35260:1;35257;35253:9;35242:20;;34968:300;;;;:::o;35274:191::-;35314:4;35334:20;35352:1;35334:20;:::i;:::-;35329:25;;35368:20;35386:1;35368:20;:::i;:::-;35363:25;;35407:1;35404;35401:8;35398:2;;;35412:18;;:::i;:::-;35398:2;35457:1;35454;35450:9;35442:17;;35319:146;;;;:::o;35471:96::-;35508:7;35537:24;35555:5;35537:24;:::i;:::-;35526:35;;35516:51;;;:::o;35573:90::-;35607:7;35650:5;35643:13;35636:21;35625:32;;35615:48;;;:::o;35669:77::-;35706:7;35735:5;35724:16;;35714:32;;;:::o;35752:149::-;35788:7;35828:66;35821:5;35817:78;35806:89;;35796:105;;;:::o;35907:126::-;35944:7;35984:42;35977:5;35973:54;35962:65;;35952:81;;;:::o;36039:91::-;36075:7;36115:8;36108:5;36104:20;36093:31;;36083:47;;;:::o;36136:77::-;36173:7;36202:5;36191:16;;36181:32;;;:::o;36219:101::-;36255:7;36295:18;36288:5;36284:30;36273:41;;36263:57;;;:::o;36326:109::-;36362:7;36402:26;36395:5;36391:38;36380:49;;36370:65;;;:::o;36441:154::-;36525:6;36520:3;36515;36502:30;36587:1;36578:6;36573:3;36569:16;36562:27;36492:103;;;:::o;36601:307::-;36669:1;36679:113;36693:6;36690:1;36687:13;36679:113;;;36778:1;36773:3;36769:11;36763:18;36759:1;36754:3;36750:11;36743:39;36715:2;36712:1;36708:10;36703:15;;36679:113;;;36810:6;36807:1;36804:13;36801:2;;;36890:1;36881:6;36876:3;36872:16;36865:27;36801:2;36650:258;;;;:::o;36914:171::-;36953:3;36976:24;36994:5;36976:24;:::i;:::-;36967:33;;37022:4;37015:5;37012:15;37009:2;;;37030:18;;:::i;:::-;37009:2;37077:1;37070:5;37066:13;37059:20;;36957:128;;;:::o;37091:320::-;37135:6;37172:1;37166:4;37162:12;37152:22;;37219:1;37213:4;37209:12;37240:18;37230:2;;37296:4;37288:6;37284:17;37274:27;;37230:2;37358;37350:6;37347:14;37327:18;37324:38;37321:2;;;37377:18;;:::i;:::-;37321:2;37142:269;;;;:::o;37417:281::-;37500:27;37522:4;37500:27;:::i;:::-;37492:6;37488:40;37630:6;37618:10;37615:22;37594:18;37582:10;37579:34;37576:62;37573:2;;;37641:18;;:::i;:::-;37573:2;37681:10;37677:2;37670:22;37460:238;;;:::o;37704:233::-;37743:3;37766:24;37784:5;37766:24;:::i;:::-;37757:33;;37812:66;37805:5;37802:77;37799:2;;;37882:18;;:::i;:::-;37799:2;37929:1;37922:5;37918:13;37911:20;;37747:190;;;:::o;37943:180::-;37991:77;37988:1;37981:88;38088:4;38085:1;38078:15;38112:4;38109:1;38102:15;38129:180;38177:77;38174:1;38167:88;38274:4;38271:1;38264:15;38298:4;38295:1;38288:15;38315:180;38363:77;38360:1;38353:88;38460:4;38457:1;38450:15;38484:4;38481:1;38474:15;38501:180;38549:77;38546:1;38539:88;38646:4;38643:1;38636:15;38670:4;38667:1;38660:15;38687:102;38728:6;38779:2;38775:7;38770:2;38763:5;38759:14;38755:28;38745:38;;38735:54;;;:::o;38795:182::-;38935:34;38931:1;38923:6;38919:14;38912:58;38901:76;:::o;38983:167::-;39123:19;39119:1;39111:6;39107:14;39100:43;39089:61;:::o;39156:171::-;39296:23;39292:1;39284:6;39280:14;39273:47;39262:65;:::o;39333:168::-;39473:20;39469:1;39461:6;39457:14;39450:44;39439:62;:::o;39507:177::-;39647:29;39643:1;39635:6;39631:14;39624:53;39613:71;:::o;39690:173::-;39830:25;39826:1;39818:6;39814:14;39807:49;39796:67;:::o;39869:229::-;40009:34;40005:1;39997:6;39993:14;39986:58;40078:12;40073:2;40065:6;40061:15;40054:37;39975:123;:::o;40104:175::-;40244:27;40240:1;40232:6;40228:14;40221:51;40210:69;:::o;40285:167::-;40425:19;40421:1;40413:6;40409:14;40402:43;40391:61;:::o;40458:234::-;40598:34;40594:1;40586:6;40582:14;40575:58;40667:17;40662:2;40654:6;40650:15;40643:42;40564:128;:::o;40698:122::-;40771:24;40789:5;40771:24;:::i;:::-;40764:5;40761:35;40751:2;;40810:1;40807;40800:12;40751:2;40741:79;:::o;40826:116::-;40896:21;40911:5;40896:21;:::i;:::-;40889:5;40886:32;40876:2;;40932:1;40929;40922:12;40876:2;40866:76;:::o;40948:122::-;41021:24;41039:5;41021:24;:::i;:::-;41014:5;41011:35;41001:2;;41060:1;41057;41050:12;41001:2;40991:79;:::o;41076:120::-;41148:23;41165:5;41148:23;:::i;:::-;41141:5;41138:34;41128:2;;41186:1;41183;41176:12;41128:2;41118:78;:::o;41202:122::-;41275:24;41293:5;41275:24;:::i;:::-;41268:5;41265:35;41255:2;;41314:1;41311;41304:12;41255:2;41245:79;:::o;41330:120::-;41402:23;41419:5;41402:23;:::i;:::-;41395:5;41392:34;41382:2;;41440:1;41437;41430:12;41382:2;41372:78;:::o
Swarm Source
ipfs://457ef4da040c5ed46bb58f28c67c5469227e0bf887aebaa637b6ec49b5b7c461
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.