ERC-721
Source Code
Overview
Max Total Supply
1,546 NDG
Holders
802
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NDGLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
NyanDogs
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2022-06-27
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Interface of an ERC721A compliant contract.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* The caller cannot approve to their own address.
*/
error ApproveToCaller();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
uint24 extraData;
}
/**
* @dev Returns the total amount of tokens stored by the contract.
*
* Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
*/
function totalSupply() external view returns (uint256);
// ==============================
// IERC165
// ==============================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// ==============================
// IERC721
// ==============================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// ==============================
// IERC721Metadata
// ==============================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// ==============================
// IERC2309
// ==============================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
* as defined in the ERC2309 standard. See `_mintERC2309` for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
/**
* @dev ERC721 token receiver interface.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
* including the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at `_startTokenId()`
* (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Mask of an entry in packed address data.
uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with `_mintERC2309`.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
// is required to cause an overflow, which is unrealistic.
uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The tokenId of the next token to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See `_packedOwnershipOf` implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see `_totalMinted`.
*/
function totalSupply() public view override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to `_startTokenId()`
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view returns (uint256) {
return _burnCounter;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes of the XOR of
// all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
// e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> BITPOS_AUX);
}
/**
* Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
_packedAddressData[owner] = packed;
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & BITMASK_BURNED == 0) {
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed is zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
ownership.burned = packed & BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
}
/**
* Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, BITMASK_ADDRESS)
// `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSenderERC721A()) revert ApproveToCaller();
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event for each mint.
*/
function _mint(address to, uint256 quantity) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 tokenId = startTokenId;
uint256 end = startTokenId + quantity;
do {
emit Transfer(address(0), to, tokenId++);
} while (tokenId < end);
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
assembly {
// Compute the slot.
mstore(0x00, tokenId)
mstore(0x20, tokenApprovalsPtr.slot)
approvedAddressSlot := keccak256(0x00, 0x40)
// Load the slot's value from storage.
approvedAddress := sload(approvedAddressSlot)
}
}
/**
* @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
*/
function _isOwnerOrApproved(
address approvedAddress,
address from,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
from := and(from, BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, BITMASK_ADDRESS)
// `msgSender == from || msgSender == approvedAddress`.
result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
* This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred.
* This includes minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function _toString(uint256 value) internal pure returns (string memory ptr) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit),
// but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
// We will need 1 32-byte word to store the length,
// and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
ptr := add(mload(0x40), 128)
// Update the free memory pointer to allocate.
mstore(0x40, ptr)
// Cache the end of the memory to calculate the length later.
let end := ptr
// We write the string from the rightmost digit to the leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// Costs a bit more than early returning for the zero case,
// but cheaper in terms of deployment and overall runtime costs.
for {
// Initialize and perform the first pass without check.
let temp := value
// Move the pointer 1 byte leftwards to point to an empty character slot.
ptr := sub(ptr, 1)
// Write the character to the pointer. 48 is the ASCII index of '0'.
mstore8(ptr, add(48, mod(temp, 10)))
temp := div(temp, 10)
} temp {
// Keep dividing `temp` until zero.
temp := div(temp, 10)
} {
// Body of the for loop.
ptr := sub(ptr, 1)
mstore8(ptr, add(48, mod(temp, 10)))
}
let length := sub(end, ptr)
// Move the pointer 32 bytes leftwards to make room for the length.
ptr := sub(ptr, 32)
// Store the length.
mstore(ptr, length)
}
}
}
/**
* @dev Interface of an ERC721AQueryable compliant contract.
*/
interface IERC721AQueryable is IERC721A {
/**
* Invalid query range (`start` >= `stop`).
*/
error InvalidQueryRange();
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
* - `addr` = `address(0)`
* - `startTimestamp` = `0`
* - `burned` = `false`
*
* If the `tokenId` is burned:
* - `addr` = `<Address of owner before token was burned>`
* - `startTimestamp` = `<Timestamp when token was burned>`
* - `burned = `true`
*
* Otherwise:
* - `addr` = `<Address of owner>`
* - `startTimestamp` = `<Timestamp of start of ownership>`
* - `burned = `false`
*/
function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start` < `stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view returns (uint256[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(totalSupply) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K pfp collections should be fine).
*/
function tokensOfOwner(address owner) external view returns (uint256[] memory);
}
/**
* @title ERC721A Queryable
* @dev ERC721A subclass with convenience query functions.
*/
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
* - `addr` = `address(0)`
* - `startTimestamp` = `0`
* - `burned` = `false`
* - `extraData` = `0`
*
* If the `tokenId` is burned:
* - `addr` = `<Address of owner before token was burned>`
* - `startTimestamp` = `<Timestamp when token was burned>`
* - `burned = `true`
* - `extraData` = `<Extra data when token was burned>`
*
* Otherwise:
* - `addr` = `<Address of owner>`
* - `startTimestamp` = `<Timestamp of start of ownership>`
* - `burned = `false`
* - `extraData` = `<Extra data at start of ownership>`
*/
function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
TokenOwnership memory ownership;
if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
return ownership;
}
ownership = _ownershipAt(tokenId);
if (ownership.burned) {
return ownership;
}
return _ownershipOf(tokenId);
}
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
unchecked {
uint256 tokenIdsLength = tokenIds.length;
TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
for (uint256 i; i != tokenIdsLength; ++i) {
ownerships[i] = explicitOwnershipOf(tokenIds[i]);
}
return ownerships;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start` < `stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view override returns (uint256[] memory) {
unchecked {
if (start >= stop) revert InvalidQueryRange();
uint256 tokenIdsIdx;
uint256 stopLimit = _nextTokenId();
// Set `start = max(start, _startTokenId())`.
if (start < _startTokenId()) {
start = _startTokenId();
}
// Set `stop = min(stop, stopLimit)`.
if (stop > stopLimit) {
stop = stopLimit;
}
uint256 tokenIdsMaxLength = balanceOf(owner);
// Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
// to cater for cases where `balanceOf(owner)` is too big.
if (start < stop) {
uint256 rangeLength = stop - start;
if (rangeLength < tokenIdsMaxLength) {
tokenIdsMaxLength = rangeLength;
}
} else {
tokenIdsMaxLength = 0;
}
uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
if (tokenIdsMaxLength == 0) {
return tokenIds;
}
// We need to call `explicitOwnershipOf(start)`,
// because the slot at `start` may not be initialized.
TokenOwnership memory ownership = explicitOwnershipOf(start);
address currOwnershipAddr;
// If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
// `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
if (!ownership.burned) {
currOwnershipAddr = ownership.addr;
}
for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
// Downsize the array to fit.
assembly {
mstore(tokenIds, tokenIdsIdx)
}
return tokenIds;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(totalSupply) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K pfp collections should be fine).
*/
function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
unchecked {
uint256 tokenIdsIdx;
address currOwnershipAddr;
uint256 tokenIdsLength = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenIdsLength);
TokenOwnership memory ownership;
for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
return tokenIds;
}
}
}
contract NyanDogs is ERC721AQueryable, Ownable {
string public baseURI;
string public baseExtension = ".json";
uint256 public cost = 5000000000000000;
uint256 public maxSupply = 10000;
bool public presale = false;
bool public publicsale = false;
mapping(address => bool) public isWhitelisted;
uint constant WhitelistMintAmount = 1;
constructor() ERC721A("Nyan Dogs", "NDG") {
}
// ====== Settings ======
modifier callerIsUser() {
require(tx.origin == msg.sender, "cannot be called by a contract");
_;
}
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
function _startTokenId() internal pure override returns (uint256){
return 1;
}
//
// ====== public ======
function mint(uint256 _mintAmount) public payable callerIsUser {
// Is publicsale active
require(publicsale, "publicsale is not active");
//
// Amount and payment control
uint256 supply = totalSupply();
require(_mintAmount > 0, "need to mint at least 1 NFT");
require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");
require(msg.value >= cost * _mintAmount, "insufficient funds");
//
_safeMint(msg.sender, _mintAmount);
}
function whitelistMint() public callerIsUser {
// Is presale active
require(presale, "presale is not active");
//
require(isWhitelisted[msg.sender], "user is not whitelisted or already claimed");
// Amount and payments control
uint256 supply = totalSupply();
require(supply + WhitelistMintAmount <= maxSupply, "max NFT limit exceeded");
//
isWhitelisted[msg.sender] = false; // claimed
_safeMint(msg.sender, WhitelistMintAmount);
}
function ownerMint(uint256 _mintAmount) public onlyOwner {
// Amount Control
uint256 supply = totalSupply();
require(_mintAmount > 0, "need to mint at least 1 NFT");
require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");
//
_safeMint(msg.sender, _mintAmount);
}
// ====== View ======
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, _toString(tokenId), baseExtension))
: "";
}
// ====== Only Owner ======
function setCost(uint256 _newCost) public onlyOwner {
cost = _newCost;
}
function setWhitelist(address[] memory _addresses) public onlyOwner {
for(uint256 i = 0; i < _addresses.length; i++){
isWhitelisted[_addresses[i]] = true;
}
}
// Metadata
function setBaseURI(string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
baseExtension = _newBaseExtension;
}
//
// Sale states
function setPresale() public onlyOwner {
presale = !presale;
}
function setPublicsale() public onlyOwner {
publicsale = !publicsale;
}
//
function withdraw() public payable onlyOwner {
(bool os, ) = payable(owner()).call{value: address(this).balance}("");
require(os);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a9080519060200190620000519291906200025a565b506611c37937e08000600b55612710600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550348015620000a657600080fd5b506040518060400160405280600981526020017f4e79616e20446f677300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e4447000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012b9291906200025a565b508060039080519060200190620001449291906200025a565b50620001556200018360201b60201c565b60008190555050506200017d620001716200018c60201b60201c565b6200019460201b60201c565b6200036f565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000268906200030a565b90600052602060002090601f0160209004810192826200028c5760008555620002d8565b82601f10620002a757805160ff1916838001178555620002d8565b82800160010185558215620002d8579182015b82811115620002d7578251825591602001919060010190620002ba565b5b509050620002e79190620002eb565b5090565b5b8082111562000306576000816000905550600101620002ec565b5090565b600060028204905060018216806200032357607f821691505b602082108114156200033a576200033962000340565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6143a1806200037f6000396000f3fe6080604052600436106102255760003560e01c80638da5cb5b11610123578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c5146107d9578063f19e75d414610816578063f2fde38b1461083f578063f421764814610868578063fdea8e0b1461089157610225565b8063c87b56dd1461071a578063d5abeb0114610757578063da3ef23f14610782578063dcc40744146107ab578063e6524224146107c257610225565b8063a22cb465116100f2578063a22cb46514610635578063b88d4fde1461065e578063b94805a214610687578063c23dc68f146106b2578063c6682862146106ef57610225565b80638da5cb5b1461058657806395d89b41146105b157806399a2557a146105dc578063a0712d681461061957610225565b806342842e0e116101b15780636c0360eb116101755780636c0360eb146104b357806370a08231146104de578063715018a61461051b578063804f43cd146105325780638462151c1461054957610225565b806342842e0e146103be57806344a0d68a146103e757806355f804b3146104105780635bbb2177146104395780636352211e1461047657610225565b806313faede6116101f857806313faede6146102f857806318160ddd1461032357806323b872dd1461034e5780633af32abf146103775780633ccfd60b146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061340c565b6108bc565b60405161025e9190613a7e565b60405180910390f35b34801561027357600080fd5b5061027c61094e565b6040516102899190613a99565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906134af565b6109e0565b6040516102c691906139d3565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132e7565b610a5c565b005b34801561030457600080fd5b5061030d610b9d565b60405161031a9190613c16565b60405180910390f35b34801561032f57600080fd5b50610338610ba3565b6040516103459190613c16565b60405180910390f35b34801561035a57600080fd5b50610375600480360381019061037091906131d1565b610bba565b005b34801561038357600080fd5b5061039e60048036038101906103999190613164565b610edf565b6040516103ab9190613a7e565b60405180910390f35b6103bc610eff565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906131d1565b610ffb565b005b3480156103f357600080fd5b5061040e600480360381019061040991906134af565b61101b565b005b34801561041c57600080fd5b5061043760048036038101906104329190613466565b6110a1565b005b34801561044557600080fd5b50610460600480360381019061045b91906133c3565b611137565b60405161046d9190613a3a565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906134af565b6111f8565b6040516104aa91906139d3565b60405180910390f35b3480156104bf57600080fd5b506104c861120a565b6040516104d59190613a99565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613164565b611298565b6040516105129190613c16565b60405180910390f35b34801561052757600080fd5b50610530611351565b005b34801561053e57600080fd5b506105476113d9565b005b34801561055557600080fd5b50610570600480360381019061056b9190613164565b6115e5565b60405161057d9190613a5c565b60405180910390f35b34801561059257600080fd5b5061059b61172f565b6040516105a891906139d3565b60405180910390f35b3480156105bd57600080fd5b506105c6611759565b6040516105d39190613a99565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613327565b6117eb565b6040516106109190613a5c565b60405180910390f35b610633600480360381019061062e91906134af565b6119ff565b005b34801561064157600080fd5b5061065c600480360381019061065791906132a7565b611bb9565b005b34801561066a57600080fd5b5061068560048036038101906106809190613224565b611d31565b005b34801561069357600080fd5b5061069c611da4565b6040516106a99190613a7e565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906134af565b611db7565b6040516106e69190613bfb565b60405180910390f35b3480156106fb57600080fd5b50610704611e21565b6040516107119190613a99565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906134af565b611eaf565b60405161074e9190613a99565b60405180910390f35b34801561076357600080fd5b5061076c611f59565b6040516107799190613c16565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613466565b611f5f565b005b3480156107b757600080fd5b506107c0611ff5565b005b3480156107ce57600080fd5b506107d761209d565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613191565b612145565b60405161080d9190613a7e565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906134af565b6121d9565b005b34801561084b57600080fd5b5061086660048036038101906108619190613164565b612302565b005b34801561087457600080fd5b5061088f600480360381019061088a919061337a565b6123fa565b005b34801561089d57600080fd5b506108a661250b565b6040516108b39190613a7e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109475750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461095d90613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461098990613f6e565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb8261251e565b610a21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a67826111f8565b90508073ffffffffffffffffffffffffffffffffffffffff16610a8861257d565b73ffffffffffffffffffffffffffffffffffffffff1614610aeb57610ab481610aaf61257d565b612145565b610aea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610bad612585565b6001546000540303905090565b6000610bc58261258e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c388461265c565b91509150610c4e8187610c4961257d565b61267e565b610c9a57610c6386610c5e61257d565b612145565b610c99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0e86868660016126c2565b8015610d1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610de785610dc38888876126c8565b7c0200000000000000000000000000000000000000000000000000000000176126f0565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e6f576000600185019050600060046000838152602001908152602001600020541415610e6d576000548114610e6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ed7868686600161271b565b505050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610f07612721565b73ffffffffffffffffffffffffffffffffffffffff16610f2561172f565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613b3b565b60405180910390fd5b6000610f8561172f565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa8906139be565b60006040518083038185875af1925050503d8060008114610fe5576040519150601f19603f3d011682016040523d82523d6000602084013e610fea565b606091505b5050905080610ff857600080fd5b50565b61101683838360405180602001604052806000815250611d31565b505050565b611023612721565b73ffffffffffffffffffffffffffffffffffffffff1661104161172f565b73ffffffffffffffffffffffffffffffffffffffff1614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613b3b565b60405180910390fd5b80600b8190555050565b6110a9612721565b73ffffffffffffffffffffffffffffffffffffffff166110c761172f565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490613b3b565b60405180910390fd5b8060099080519060200190611133929190612ded565b5050565b606060008251905060008167ffffffffffffffff81111561115b5761115a6140a7565b5b60405190808252806020026020018201604052801561119457816020015b611181612e73565b8152602001906001900390816111795790505b50905060005b8281146111ed576111c48582815181106111b7576111b6614078565b5b6020026020010151611db7565b8282815181106111d7576111d6614078565b5b602002602001018190525080600101905061119a565b508092505050919050565b60006112038261258e565b9050919050565b6009805461121790613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461124390613f6e565b80156112905780601f1061126557610100808354040283529160200191611290565b820191906000526020600020905b81548152906001019060200180831161127357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611300576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611359612721565b73ffffffffffffffffffffffffffffffffffffffff1661137761172f565b73ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490613b3b565b60405180910390fd5b6113d76000612729565b565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90613b9b565b60405180910390fd5b600d60009054906101000a900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90613afb565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613bbb565b60405180910390fd5b600061152c610ba3565b9050600c5460018261153e9190613de5565b111561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613adb565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115e23360016127ef565b50565b606060008060006115f585611298565b905060008167ffffffffffffffff811115611613576116126140a7565b5b6040519080825280602002602001820160405280156116415781602001602082028036833780820191505090505b50905061164c612e73565b6000611656612585565b90505b838614611721576116698161280d565b915081604001511561167a57611716565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ba57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611715578083878060010198508151811061170857611707614078565b5b6020026020010181815250505b5b806001019050611659565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461176890613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461179490613f6e565b80156117e15780601f106117b6576101008083540402835291602001916117e1565b820191906000526020600020905b8154815290600101906020018083116117c457829003601f168201915b5050505050905090565b6060818310611826576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611831612838565b905061183b612585565b85101561184d5761184a612585565b94505b80841115611859578093505b600061186487611298565b905084861015611887576000868603905081811015611881578091505b5061188c565b600090505b60008167ffffffffffffffff8111156118a8576118a76140a7565b5b6040519080825280602002602001820160405280156118d65781602001602082028036833780820191505090505b50905060008214156118ee57809450505050506119f8565b60006118f988611db7565b90506000816040015161190e57816000015190505b60008990505b8881141580156119245750848714155b156119ea576119328161280d565b9250826040015115611943576119df565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461198357826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de57808488806001019950815181106119d1576119d0614078565b5b6020026020010181815250505b5b806001019050611914565b508583528296505050505050505b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613b9b565b60405180910390fd5b600d60019054906101000a900460ff16611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613b1b565b60405180910390fd5b6000611ac6610ba3565b905060008211611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290613bdb565b60405180910390fd5b600c548282611b1a9190613de5565b1115611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613adb565b60405180910390fd5b81600b54611b699190613e3b565b341015611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290613b7b565b60405180910390fd5b611bb533836127ef565b5050565b611bc161257d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c3361257d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce061257d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d259190613a7e565b60405180910390a35050565b611d3c848484610bba565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d9e57611d6784848484612841565b611d9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d60019054906101000a900460ff1681565b611dbf612e73565b611dc7612e73565b611dcf612585565b831080611de35750611ddf612838565b8310155b15611df15780915050611e1c565b611dfa8361280d565b9050806040015115611e0f5780915050611e1c565b611e18836129a1565b9150505b919050565b600a8054611e2e90613f6e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5a90613f6e565b8015611ea75780601f10611e7c57610100808354040283529160200191611ea7565b820191906000526020600020905b815481529060010190602001808311611e8a57829003601f168201915b505050505081565b6060611eba8261251e565b611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090613b5b565b60405180910390fd5b6000611f036129c1565b90506000815111611f235760405180602001604052806000815250611f51565b80611f2d84612a53565b600a604051602001611f419392919061398d565b6040516020818303038152906040525b915050919050565b600c5481565b611f67612721565b73ffffffffffffffffffffffffffffffffffffffff16611f8561172f565b73ffffffffffffffffffffffffffffffffffffffff1614611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290613b3b565b60405180910390fd5b80600a9080519060200190611ff1929190612ded565b5050565b611ffd612721565b73ffffffffffffffffffffffffffffffffffffffff1661201b61172f565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613b3b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6120a5612721565b73ffffffffffffffffffffffffffffffffffffffff166120c361172f565b73ffffffffffffffffffffffffffffffffffffffff1614612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090613b3b565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e1612721565b73ffffffffffffffffffffffffffffffffffffffff166121ff61172f565b73ffffffffffffffffffffffffffffffffffffffff1614612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90613b3b565b60405180910390fd5b600061225f610ba3565b9050600082116122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90613bdb565b60405180910390fd5b600c5482826122b39190613de5565b11156122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122eb90613adb565b60405180910390fd5b6122fe33836127ef565b5050565b61230a612721565b73ffffffffffffffffffffffffffffffffffffffff1661232861172f565b73ffffffffffffffffffffffffffffffffffffffff161461237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237590613b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e590613abb565b60405180910390fd5b6123f781612729565b50565b612402612721565b73ffffffffffffffffffffffffffffffffffffffff1661242061172f565b73ffffffffffffffffffffffffffffffffffffffff1614612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90613b3b565b60405180910390fd5b60005b8151811015612507576001600e600084848151811061249b5761249a614078565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124ff90613fd1565b915050612479565b5050565b600d60009054906101000a900460ff1681565b600081612529612585565b11158015612538575060005482105b8015612576575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061259d612585565b11612625576000548110156126245760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612622575b60008114156126185760046000836001900393508381526020019081526020016000205490506125ed565b8092505050612657565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126df868684612aad565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612809828260405180602001604052806000815250612ab6565b5050565b612815612e73565b6128316004600084815260200190815260200160002054612b53565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286761257d565b8786866040518563ffffffff1660e01b815260040161288994939291906139ee565b602060405180830381600087803b1580156128a357600080fd5b505af19250505080156128d457506040513d601f19601f820116820180604052508101906128d19190613439565b60015b61294e573d8060008114612904576040519150601f19603f3d011682016040523d82523d6000602084013e612909565b606091505b50600081511415612946576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6129a9612e73565b6129ba6129b58361258e565b612b53565b9050919050565b6060600980546129d090613f6e565b80601f01602080910402602001604051908101604052809291908181526020018280546129fc90613f6e565b8015612a495780601f10612a1e57610100808354040283529160200191612a49565b820191906000526020600020905b815481529060010190602001808311612a2c57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612a9957600183039250600a81066030018353600a81049050612a79565b508181036020830392508083525050919050565b60009392505050565b612ac08383612c09565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b4e57600080549050600083820390505b612b006000868380600101945086612841565b612b36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612aed578160005414612b4b57600080fd5b50505b505050565b612b5b612e73565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c76576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612cb1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cbe60008483856126c2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d3583612d2660008660006126c8565b612d2f85612ddd565b176126f0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d5957806000819055505050612dd8600084838561271b565b505050565b60006001821460e11b9050919050565b828054612df990613f6e565b90600052602060002090601f016020900481019282612e1b5760008555612e62565b82601f10612e3457805160ff1916838001178555612e62565b82800160010185558215612e62579182015b82811115612e61578251825591602001919060010190612e46565b5b509050612e6f9190612ec2565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612edb576000816000905550600101612ec3565b5090565b6000612ef2612eed84613c56565b613c31565b90508083825260208201905082856020860282011115612f1557612f146140db565b5b60005b85811015612f455781612f2b8882613043565b845260208401935060208301925050600181019050612f18565b5050509392505050565b6000612f62612f5d84613c82565b613c31565b90508083825260208201905082856020860282011115612f8557612f846140db565b5b60005b85811015612fb55781612f9b888261314f565b845260208401935060208301925050600181019050612f88565b5050509392505050565b6000612fd2612fcd84613cae565b613c31565b905082815260208101848484011115612fee57612fed6140e0565b5b612ff9848285613f2c565b509392505050565b600061301461300f84613cdf565b613c31565b9050828152602081018484840111156130305761302f6140e0565b5b61303b848285613f2c565b509392505050565b6000813590506130528161430f565b92915050565b600082601f83011261306d5761306c6140d6565b5b813561307d848260208601612edf565b91505092915050565b600082601f83011261309b5761309a6140d6565b5b81356130ab848260208601612f4f565b91505092915050565b6000813590506130c381614326565b92915050565b6000813590506130d88161433d565b92915050565b6000815190506130ed8161433d565b92915050565b600082601f830112613108576131076140d6565b5b8135613118848260208601612fbf565b91505092915050565b600082601f830112613136576131356140d6565b5b8135613146848260208601613001565b91505092915050565b60008135905061315e81614354565b92915050565b60006020828403121561317a576131796140ea565b5b600061318884828501613043565b91505092915050565b600080604083850312156131a8576131a76140ea565b5b60006131b685828601613043565b92505060206131c785828601613043565b9150509250929050565b6000806000606084860312156131ea576131e96140ea565b5b60006131f886828701613043565b935050602061320986828701613043565b925050604061321a8682870161314f565b9150509250925092565b6000806000806080858703121561323e5761323d6140ea565b5b600061324c87828801613043565b945050602061325d87828801613043565b935050604061326e8782880161314f565b925050606085013567ffffffffffffffff81111561328f5761328e6140e5565b5b61329b878288016130f3565b91505092959194509250565b600080604083850312156132be576132bd6140ea565b5b60006132cc85828601613043565b92505060206132dd858286016130b4565b9150509250929050565b600080604083850312156132fe576132fd6140ea565b5b600061330c85828601613043565b925050602061331d8582860161314f565b9150509250929050565b6000806000606084860312156133405761333f6140ea565b5b600061334e86828701613043565b935050602061335f8682870161314f565b92505060406133708682870161314f565b9150509250925092565b6000602082840312156133905761338f6140ea565b5b600082013567ffffffffffffffff8111156133ae576133ad6140e5565b5b6133ba84828501613058565b91505092915050565b6000602082840312156133d9576133d86140ea565b5b600082013567ffffffffffffffff8111156133f7576133f66140e5565b5b61340384828501613086565b91505092915050565b600060208284031215613422576134216140ea565b5b6000613430848285016130c9565b91505092915050565b60006020828403121561344f5761344e6140ea565b5b600061345d848285016130de565b91505092915050565b60006020828403121561347c5761347b6140ea565b5b600082013567ffffffffffffffff81111561349a576134996140e5565b5b6134a684828501613121565b91505092915050565b6000602082840312156134c5576134c46140ea565b5b60006134d38482850161314f565b91505092915050565b60006134e883836138a7565b60808301905092915050565b60006135008383613960565b60208301905092915050565b61351581613e95565b82525050565b61352481613e95565b82525050565b600061353582613d45565b61353f8185613d8b565b935061354a83613d10565b8060005b8381101561357b57815161356288826134dc565b975061356d83613d71565b92505060018101905061354e565b5085935050505092915050565b600061359382613d50565b61359d8185613d9c565b93506135a883613d20565b8060005b838110156135d95781516135c088826134f4565b97506135cb83613d7e565b9250506001810190506135ac565b5085935050505092915050565b6135ef81613ea7565b82525050565b6135fe81613ea7565b82525050565b600061360f82613d5b565b6136198185613dad565b9350613629818560208601613f3b565b613632816140ef565b840191505092915050565b600061364882613d66565b6136528185613dc9565b9350613662818560208601613f3b565b61366b816140ef565b840191505092915050565b600061368182613d66565b61368b8185613dda565b935061369b818560208601613f3b565b80840191505092915050565b600081546136b481613f6e565b6136be8186613dda565b945060018216600081146136d957600181146136ea5761371d565b60ff1983168652818601935061371d565b6136f385613d30565b60005b83811015613715578154818901526001820191506020810190506136f6565b838801955050505b50505092915050565b6000613733602683613dc9565b915061373e82614100565b604082019050919050565b6000613756601683613dc9565b91506137618261414f565b602082019050919050565b6000613779601583613dc9565b915061378482614178565b602082019050919050565b600061379c601883613dc9565b91506137a7826141a1565b602082019050919050565b60006137bf602083613dc9565b91506137ca826141ca565b602082019050919050565b60006137e2602f83613dc9565b91506137ed826141f3565b604082019050919050565b6000613805600083613dbe565b915061381082614242565b600082019050919050565b6000613828601283613dc9565b915061383382614245565b602082019050919050565b600061384b601e83613dc9565b91506138568261426e565b602082019050919050565b600061386e602a83613dc9565b915061387982614297565b604082019050919050565b6000613891601b83613dc9565b915061389c826142e6565b602082019050919050565b6080820160008201516138bd600085018261350c565b5060208201516138d0602085018261397e565b5060408201516138e360408501826135e6565b5060608201516138f66060850182613951565b50505050565b608082016000820151613912600085018261350c565b506020820151613925602085018261397e565b50604082015161393860408501826135e6565b50606082015161394b6060850182613951565b50505050565b61395a81613eff565b82525050565b61396981613f0e565b82525050565b61397881613f0e565b82525050565b61398781613f18565b82525050565b60006139998286613676565b91506139a58285613676565b91506139b182846136a7565b9150819050949350505050565b60006139c9826137f8565b9150819050919050565b60006020820190506139e8600083018461351b565b92915050565b6000608082019050613a03600083018761351b565b613a10602083018661351b565b613a1d604083018561396f565b8181036060830152613a2f8184613604565b905095945050505050565b60006020820190508181036000830152613a54818461352a565b905092915050565b60006020820190508181036000830152613a768184613588565b905092915050565b6000602082019050613a9360008301846135f5565b92915050565b60006020820190508181036000830152613ab3818461363d565b905092915050565b60006020820190508181036000830152613ad481613726565b9050919050565b60006020820190508181036000830152613af481613749565b9050919050565b60006020820190508181036000830152613b148161376c565b9050919050565b60006020820190508181036000830152613b348161378f565b9050919050565b60006020820190508181036000830152613b54816137b2565b9050919050565b60006020820190508181036000830152613b74816137d5565b9050919050565b60006020820190508181036000830152613b948161381b565b9050919050565b60006020820190508181036000830152613bb48161383e565b9050919050565b60006020820190508181036000830152613bd481613861565b9050919050565b60006020820190508181036000830152613bf481613884565b9050919050565b6000608082019050613c1060008301846138fc565b92915050565b6000602082019050613c2b600083018461396f565b92915050565b6000613c3b613c4c565b9050613c478282613fa0565b919050565b6000604051905090565b600067ffffffffffffffff821115613c7157613c706140a7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c9d57613c9c6140a7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cc957613cc86140a7565b5b613cd2826140ef565b9050602081019050919050565b600067ffffffffffffffff821115613cfa57613cf96140a7565b5b613d03826140ef565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df082613f0e565b9150613dfb83613f0e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3057613e2f61401a565b5b828201905092915050565b6000613e4682613f0e565b9150613e5183613f0e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8a57613e8961401a565b5b828202905092915050565b6000613ea082613edf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613f59578082015181840152602081019050613f3e565b83811115613f68576000848401525b50505050565b60006002820490506001821680613f8657607f821691505b60208210811415613f9a57613f99614049565b5b50919050565b613fa9826140ef565b810181811067ffffffffffffffff82111715613fc857613fc76140a7565b5b80604052505050565b6000613fdc82613f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561400f5761400e61401a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f70726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f7075626c696373616c65206973206e6f74206163746976650000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f63616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b7f75736572206973206e6f742077686974656c6973746564206f7220616c72656160008201527f647920636c61696d656400000000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b61431881613e95565b811461432357600080fd5b50565b61432f81613ea7565b811461433a57600080fd5b50565b61434681613eb3565b811461435157600080fd5b50565b61435d81613f0e565b811461436857600080fd5b5056fea264697066735822122030ad438830cc184f7b24cdd1fde4b8ad7f5396e8bffba8fdf2bdb3264b0be7f764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80638da5cb5b11610123578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c5146107d9578063f19e75d414610816578063f2fde38b1461083f578063f421764814610868578063fdea8e0b1461089157610225565b8063c87b56dd1461071a578063d5abeb0114610757578063da3ef23f14610782578063dcc40744146107ab578063e6524224146107c257610225565b8063a22cb465116100f2578063a22cb46514610635578063b88d4fde1461065e578063b94805a214610687578063c23dc68f146106b2578063c6682862146106ef57610225565b80638da5cb5b1461058657806395d89b41146105b157806399a2557a146105dc578063a0712d681461061957610225565b806342842e0e116101b15780636c0360eb116101755780636c0360eb146104b357806370a08231146104de578063715018a61461051b578063804f43cd146105325780638462151c1461054957610225565b806342842e0e146103be57806344a0d68a146103e757806355f804b3146104105780635bbb2177146104395780636352211e1461047657610225565b806313faede6116101f857806313faede6146102f857806318160ddd1461032357806323b872dd1461034e5780633af32abf146103775780633ccfd60b146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061340c565b6108bc565b60405161025e9190613a7e565b60405180910390f35b34801561027357600080fd5b5061027c61094e565b6040516102899190613a99565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906134af565b6109e0565b6040516102c691906139d3565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132e7565b610a5c565b005b34801561030457600080fd5b5061030d610b9d565b60405161031a9190613c16565b60405180910390f35b34801561032f57600080fd5b50610338610ba3565b6040516103459190613c16565b60405180910390f35b34801561035a57600080fd5b50610375600480360381019061037091906131d1565b610bba565b005b34801561038357600080fd5b5061039e60048036038101906103999190613164565b610edf565b6040516103ab9190613a7e565b60405180910390f35b6103bc610eff565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906131d1565b610ffb565b005b3480156103f357600080fd5b5061040e600480360381019061040991906134af565b61101b565b005b34801561041c57600080fd5b5061043760048036038101906104329190613466565b6110a1565b005b34801561044557600080fd5b50610460600480360381019061045b91906133c3565b611137565b60405161046d9190613a3a565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906134af565b6111f8565b6040516104aa91906139d3565b60405180910390f35b3480156104bf57600080fd5b506104c861120a565b6040516104d59190613a99565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613164565b611298565b6040516105129190613c16565b60405180910390f35b34801561052757600080fd5b50610530611351565b005b34801561053e57600080fd5b506105476113d9565b005b34801561055557600080fd5b50610570600480360381019061056b9190613164565b6115e5565b60405161057d9190613a5c565b60405180910390f35b34801561059257600080fd5b5061059b61172f565b6040516105a891906139d3565b60405180910390f35b3480156105bd57600080fd5b506105c6611759565b6040516105d39190613a99565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613327565b6117eb565b6040516106109190613a5c565b60405180910390f35b610633600480360381019061062e91906134af565b6119ff565b005b34801561064157600080fd5b5061065c600480360381019061065791906132a7565b611bb9565b005b34801561066a57600080fd5b5061068560048036038101906106809190613224565b611d31565b005b34801561069357600080fd5b5061069c611da4565b6040516106a99190613a7e565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906134af565b611db7565b6040516106e69190613bfb565b60405180910390f35b3480156106fb57600080fd5b50610704611e21565b6040516107119190613a99565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906134af565b611eaf565b60405161074e9190613a99565b60405180910390f35b34801561076357600080fd5b5061076c611f59565b6040516107799190613c16565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613466565b611f5f565b005b3480156107b757600080fd5b506107c0611ff5565b005b3480156107ce57600080fd5b506107d761209d565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613191565b612145565b60405161080d9190613a7e565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906134af565b6121d9565b005b34801561084b57600080fd5b5061086660048036038101906108619190613164565b612302565b005b34801561087457600080fd5b5061088f600480360381019061088a919061337a565b6123fa565b005b34801561089d57600080fd5b506108a661250b565b6040516108b39190613a7e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109475750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461095d90613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461098990613f6e565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb8261251e565b610a21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a67826111f8565b90508073ffffffffffffffffffffffffffffffffffffffff16610a8861257d565b73ffffffffffffffffffffffffffffffffffffffff1614610aeb57610ab481610aaf61257d565b612145565b610aea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610bad612585565b6001546000540303905090565b6000610bc58261258e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c388461265c565b91509150610c4e8187610c4961257d565b61267e565b610c9a57610c6386610c5e61257d565b612145565b610c99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0e86868660016126c2565b8015610d1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610de785610dc38888876126c8565b7c0200000000000000000000000000000000000000000000000000000000176126f0565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e6f576000600185019050600060046000838152602001908152602001600020541415610e6d576000548114610e6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ed7868686600161271b565b505050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610f07612721565b73ffffffffffffffffffffffffffffffffffffffff16610f2561172f565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613b3b565b60405180910390fd5b6000610f8561172f565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa8906139be565b60006040518083038185875af1925050503d8060008114610fe5576040519150601f19603f3d011682016040523d82523d6000602084013e610fea565b606091505b5050905080610ff857600080fd5b50565b61101683838360405180602001604052806000815250611d31565b505050565b611023612721565b73ffffffffffffffffffffffffffffffffffffffff1661104161172f565b73ffffffffffffffffffffffffffffffffffffffff1614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613b3b565b60405180910390fd5b80600b8190555050565b6110a9612721565b73ffffffffffffffffffffffffffffffffffffffff166110c761172f565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490613b3b565b60405180910390fd5b8060099080519060200190611133929190612ded565b5050565b606060008251905060008167ffffffffffffffff81111561115b5761115a6140a7565b5b60405190808252806020026020018201604052801561119457816020015b611181612e73565b8152602001906001900390816111795790505b50905060005b8281146111ed576111c48582815181106111b7576111b6614078565b5b6020026020010151611db7565b8282815181106111d7576111d6614078565b5b602002602001018190525080600101905061119a565b508092505050919050565b60006112038261258e565b9050919050565b6009805461121790613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461124390613f6e565b80156112905780601f1061126557610100808354040283529160200191611290565b820191906000526020600020905b81548152906001019060200180831161127357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611300576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611359612721565b73ffffffffffffffffffffffffffffffffffffffff1661137761172f565b73ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490613b3b565b60405180910390fd5b6113d76000612729565b565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90613b9b565b60405180910390fd5b600d60009054906101000a900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90613afb565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613bbb565b60405180910390fd5b600061152c610ba3565b9050600c5460018261153e9190613de5565b111561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613adb565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115e23360016127ef565b50565b606060008060006115f585611298565b905060008167ffffffffffffffff811115611613576116126140a7565b5b6040519080825280602002602001820160405280156116415781602001602082028036833780820191505090505b50905061164c612e73565b6000611656612585565b90505b838614611721576116698161280d565b915081604001511561167a57611716565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ba57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611715578083878060010198508151811061170857611707614078565b5b6020026020010181815250505b5b806001019050611659565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461176890613f6e565b80601f016020809104026020016040519081016040528092919081815260200182805461179490613f6e565b80156117e15780601f106117b6576101008083540402835291602001916117e1565b820191906000526020600020905b8154815290600101906020018083116117c457829003601f168201915b5050505050905090565b6060818310611826576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611831612838565b905061183b612585565b85101561184d5761184a612585565b94505b80841115611859578093505b600061186487611298565b905084861015611887576000868603905081811015611881578091505b5061188c565b600090505b60008167ffffffffffffffff8111156118a8576118a76140a7565b5b6040519080825280602002602001820160405280156118d65781602001602082028036833780820191505090505b50905060008214156118ee57809450505050506119f8565b60006118f988611db7565b90506000816040015161190e57816000015190505b60008990505b8881141580156119245750848714155b156119ea576119328161280d565b9250826040015115611943576119df565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461198357826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de57808488806001019950815181106119d1576119d0614078565b5b6020026020010181815250505b5b806001019050611914565b508583528296505050505050505b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613b9b565b60405180910390fd5b600d60019054906101000a900460ff16611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613b1b565b60405180910390fd5b6000611ac6610ba3565b905060008211611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290613bdb565b60405180910390fd5b600c548282611b1a9190613de5565b1115611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613adb565b60405180910390fd5b81600b54611b699190613e3b565b341015611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290613b7b565b60405180910390fd5b611bb533836127ef565b5050565b611bc161257d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c3361257d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce061257d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d259190613a7e565b60405180910390a35050565b611d3c848484610bba565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d9e57611d6784848484612841565b611d9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d60019054906101000a900460ff1681565b611dbf612e73565b611dc7612e73565b611dcf612585565b831080611de35750611ddf612838565b8310155b15611df15780915050611e1c565b611dfa8361280d565b9050806040015115611e0f5780915050611e1c565b611e18836129a1565b9150505b919050565b600a8054611e2e90613f6e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5a90613f6e565b8015611ea75780601f10611e7c57610100808354040283529160200191611ea7565b820191906000526020600020905b815481529060010190602001808311611e8a57829003601f168201915b505050505081565b6060611eba8261251e565b611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090613b5b565b60405180910390fd5b6000611f036129c1565b90506000815111611f235760405180602001604052806000815250611f51565b80611f2d84612a53565b600a604051602001611f419392919061398d565b6040516020818303038152906040525b915050919050565b600c5481565b611f67612721565b73ffffffffffffffffffffffffffffffffffffffff16611f8561172f565b73ffffffffffffffffffffffffffffffffffffffff1614611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290613b3b565b60405180910390fd5b80600a9080519060200190611ff1929190612ded565b5050565b611ffd612721565b73ffffffffffffffffffffffffffffffffffffffff1661201b61172f565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613b3b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6120a5612721565b73ffffffffffffffffffffffffffffffffffffffff166120c361172f565b73ffffffffffffffffffffffffffffffffffffffff1614612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211090613b3b565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e1612721565b73ffffffffffffffffffffffffffffffffffffffff166121ff61172f565b73ffffffffffffffffffffffffffffffffffffffff1614612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90613b3b565b60405180910390fd5b600061225f610ba3565b9050600082116122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90613bdb565b60405180910390fd5b600c5482826122b39190613de5565b11156122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122eb90613adb565b60405180910390fd5b6122fe33836127ef565b5050565b61230a612721565b73ffffffffffffffffffffffffffffffffffffffff1661232861172f565b73ffffffffffffffffffffffffffffffffffffffff161461237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237590613b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e590613abb565b60405180910390fd5b6123f781612729565b50565b612402612721565b73ffffffffffffffffffffffffffffffffffffffff1661242061172f565b73ffffffffffffffffffffffffffffffffffffffff1614612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90613b3b565b60405180910390fd5b60005b8151811015612507576001600e600084848151811061249b5761249a614078565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124ff90613fd1565b915050612479565b5050565b600d60009054906101000a900460ff1681565b600081612529612585565b11158015612538575060005482105b8015612576575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061259d612585565b11612625576000548110156126245760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612622575b60008114156126185760046000836001900393508381526020019081526020016000205490506125ed565b8092505050612657565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126df868684612aad565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612809828260405180602001604052806000815250612ab6565b5050565b612815612e73565b6128316004600084815260200190815260200160002054612b53565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286761257d565b8786866040518563ffffffff1660e01b815260040161288994939291906139ee565b602060405180830381600087803b1580156128a357600080fd5b505af19250505080156128d457506040513d601f19601f820116820180604052508101906128d19190613439565b60015b61294e573d8060008114612904576040519150601f19603f3d011682016040523d82523d6000602084013e612909565b606091505b50600081511415612946576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6129a9612e73565b6129ba6129b58361258e565b612b53565b9050919050565b6060600980546129d090613f6e565b80601f01602080910402602001604051908101604052809291908181526020018280546129fc90613f6e565b8015612a495780601f10612a1e57610100808354040283529160200191612a49565b820191906000526020600020905b815481529060010190602001808311612a2c57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612a9957600183039250600a81066030018353600a81049050612a79565b508181036020830392508083525050919050565b60009392505050565b612ac08383612c09565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b4e57600080549050600083820390505b612b006000868380600101945086612841565b612b36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612aed578160005414612b4b57600080fd5b50505b505050565b612b5b612e73565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c76576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612cb1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cbe60008483856126c2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d3583612d2660008660006126c8565b612d2f85612ddd565b176126f0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d5957806000819055505050612dd8600084838561271b565b505050565b60006001821460e11b9050919050565b828054612df990613f6e565b90600052602060002090601f016020900481019282612e1b5760008555612e62565b82601f10612e3457805160ff1916838001178555612e62565b82800160010185558215612e62579182015b82811115612e61578251825591602001919060010190612e46565b5b509050612e6f9190612ec2565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612edb576000816000905550600101612ec3565b5090565b6000612ef2612eed84613c56565b613c31565b90508083825260208201905082856020860282011115612f1557612f146140db565b5b60005b85811015612f455781612f2b8882613043565b845260208401935060208301925050600181019050612f18565b5050509392505050565b6000612f62612f5d84613c82565b613c31565b90508083825260208201905082856020860282011115612f8557612f846140db565b5b60005b85811015612fb55781612f9b888261314f565b845260208401935060208301925050600181019050612f88565b5050509392505050565b6000612fd2612fcd84613cae565b613c31565b905082815260208101848484011115612fee57612fed6140e0565b5b612ff9848285613f2c565b509392505050565b600061301461300f84613cdf565b613c31565b9050828152602081018484840111156130305761302f6140e0565b5b61303b848285613f2c565b509392505050565b6000813590506130528161430f565b92915050565b600082601f83011261306d5761306c6140d6565b5b813561307d848260208601612edf565b91505092915050565b600082601f83011261309b5761309a6140d6565b5b81356130ab848260208601612f4f565b91505092915050565b6000813590506130c381614326565b92915050565b6000813590506130d88161433d565b92915050565b6000815190506130ed8161433d565b92915050565b600082601f830112613108576131076140d6565b5b8135613118848260208601612fbf565b91505092915050565b600082601f830112613136576131356140d6565b5b8135613146848260208601613001565b91505092915050565b60008135905061315e81614354565b92915050565b60006020828403121561317a576131796140ea565b5b600061318884828501613043565b91505092915050565b600080604083850312156131a8576131a76140ea565b5b60006131b685828601613043565b92505060206131c785828601613043565b9150509250929050565b6000806000606084860312156131ea576131e96140ea565b5b60006131f886828701613043565b935050602061320986828701613043565b925050604061321a8682870161314f565b9150509250925092565b6000806000806080858703121561323e5761323d6140ea565b5b600061324c87828801613043565b945050602061325d87828801613043565b935050604061326e8782880161314f565b925050606085013567ffffffffffffffff81111561328f5761328e6140e5565b5b61329b878288016130f3565b91505092959194509250565b600080604083850312156132be576132bd6140ea565b5b60006132cc85828601613043565b92505060206132dd858286016130b4565b9150509250929050565b600080604083850312156132fe576132fd6140ea565b5b600061330c85828601613043565b925050602061331d8582860161314f565b9150509250929050565b6000806000606084860312156133405761333f6140ea565b5b600061334e86828701613043565b935050602061335f8682870161314f565b92505060406133708682870161314f565b9150509250925092565b6000602082840312156133905761338f6140ea565b5b600082013567ffffffffffffffff8111156133ae576133ad6140e5565b5b6133ba84828501613058565b91505092915050565b6000602082840312156133d9576133d86140ea565b5b600082013567ffffffffffffffff8111156133f7576133f66140e5565b5b61340384828501613086565b91505092915050565b600060208284031215613422576134216140ea565b5b6000613430848285016130c9565b91505092915050565b60006020828403121561344f5761344e6140ea565b5b600061345d848285016130de565b91505092915050565b60006020828403121561347c5761347b6140ea565b5b600082013567ffffffffffffffff81111561349a576134996140e5565b5b6134a684828501613121565b91505092915050565b6000602082840312156134c5576134c46140ea565b5b60006134d38482850161314f565b91505092915050565b60006134e883836138a7565b60808301905092915050565b60006135008383613960565b60208301905092915050565b61351581613e95565b82525050565b61352481613e95565b82525050565b600061353582613d45565b61353f8185613d8b565b935061354a83613d10565b8060005b8381101561357b57815161356288826134dc565b975061356d83613d71565b92505060018101905061354e565b5085935050505092915050565b600061359382613d50565b61359d8185613d9c565b93506135a883613d20565b8060005b838110156135d95781516135c088826134f4565b97506135cb83613d7e565b9250506001810190506135ac565b5085935050505092915050565b6135ef81613ea7565b82525050565b6135fe81613ea7565b82525050565b600061360f82613d5b565b6136198185613dad565b9350613629818560208601613f3b565b613632816140ef565b840191505092915050565b600061364882613d66565b6136528185613dc9565b9350613662818560208601613f3b565b61366b816140ef565b840191505092915050565b600061368182613d66565b61368b8185613dda565b935061369b818560208601613f3b565b80840191505092915050565b600081546136b481613f6e565b6136be8186613dda565b945060018216600081146136d957600181146136ea5761371d565b60ff1983168652818601935061371d565b6136f385613d30565b60005b83811015613715578154818901526001820191506020810190506136f6565b838801955050505b50505092915050565b6000613733602683613dc9565b915061373e82614100565b604082019050919050565b6000613756601683613dc9565b91506137618261414f565b602082019050919050565b6000613779601583613dc9565b915061378482614178565b602082019050919050565b600061379c601883613dc9565b91506137a7826141a1565b602082019050919050565b60006137bf602083613dc9565b91506137ca826141ca565b602082019050919050565b60006137e2602f83613dc9565b91506137ed826141f3565b604082019050919050565b6000613805600083613dbe565b915061381082614242565b600082019050919050565b6000613828601283613dc9565b915061383382614245565b602082019050919050565b600061384b601e83613dc9565b91506138568261426e565b602082019050919050565b600061386e602a83613dc9565b915061387982614297565b604082019050919050565b6000613891601b83613dc9565b915061389c826142e6565b602082019050919050565b6080820160008201516138bd600085018261350c565b5060208201516138d0602085018261397e565b5060408201516138e360408501826135e6565b5060608201516138f66060850182613951565b50505050565b608082016000820151613912600085018261350c565b506020820151613925602085018261397e565b50604082015161393860408501826135e6565b50606082015161394b6060850182613951565b50505050565b61395a81613eff565b82525050565b61396981613f0e565b82525050565b61397881613f0e565b82525050565b61398781613f18565b82525050565b60006139998286613676565b91506139a58285613676565b91506139b182846136a7565b9150819050949350505050565b60006139c9826137f8565b9150819050919050565b60006020820190506139e8600083018461351b565b92915050565b6000608082019050613a03600083018761351b565b613a10602083018661351b565b613a1d604083018561396f565b8181036060830152613a2f8184613604565b905095945050505050565b60006020820190508181036000830152613a54818461352a565b905092915050565b60006020820190508181036000830152613a768184613588565b905092915050565b6000602082019050613a9360008301846135f5565b92915050565b60006020820190508181036000830152613ab3818461363d565b905092915050565b60006020820190508181036000830152613ad481613726565b9050919050565b60006020820190508181036000830152613af481613749565b9050919050565b60006020820190508181036000830152613b148161376c565b9050919050565b60006020820190508181036000830152613b348161378f565b9050919050565b60006020820190508181036000830152613b54816137b2565b9050919050565b60006020820190508181036000830152613b74816137d5565b9050919050565b60006020820190508181036000830152613b948161381b565b9050919050565b60006020820190508181036000830152613bb48161383e565b9050919050565b60006020820190508181036000830152613bd481613861565b9050919050565b60006020820190508181036000830152613bf481613884565b9050919050565b6000608082019050613c1060008301846138fc565b92915050565b6000602082019050613c2b600083018461396f565b92915050565b6000613c3b613c4c565b9050613c478282613fa0565b919050565b6000604051905090565b600067ffffffffffffffff821115613c7157613c706140a7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c9d57613c9c6140a7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cc957613cc86140a7565b5b613cd2826140ef565b9050602081019050919050565b600067ffffffffffffffff821115613cfa57613cf96140a7565b5b613d03826140ef565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df082613f0e565b9150613dfb83613f0e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3057613e2f61401a565b5b828201905092915050565b6000613e4682613f0e565b9150613e5183613f0e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8a57613e8961401a565b5b828202905092915050565b6000613ea082613edf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613f59578082015181840152602081019050613f3e565b83811115613f68576000848401525b50505050565b60006002820490506001821680613f8657607f821691505b60208210811415613f9a57613f99614049565b5b50919050565b613fa9826140ef565b810181811067ffffffffffffffff82111715613fc857613fc76140a7565b5b80604052505050565b6000613fdc82613f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561400f5761400e61401a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f70726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f7075626c696373616c65206973206e6f74206163746976650000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f63616e6e6f742062652063616c6c6564206279206120636f6e74726163740000600082015250565b7f75736572206973206e6f742077686974656c6973746564206f7220616c72656160008201527f647920636c61696d656400000000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b61431881613e95565b811461432357600080fd5b50565b61432f81613ea7565b811461433a57600080fd5b50565b61434681613eb3565b811461435157600080fd5b50565b61435d81613f0e565b811461436857600080fd5b5056fea264697066735822122030ad438830cc184f7b24cdd1fde4b8ad7f5396e8bffba8fdf2bdb3264b0be7f764736f6c63430008070033
Deployed Bytecode Sourcemap
56188:3458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17548:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23195:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25141:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24689:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56308:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16602:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34406:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56457:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59498:145;;;:::i;:::-;;26031:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58787:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59074:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51475:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22984:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56240:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18227:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2390:103;;;;;;;;;;;;;:::i;:::-;;57483:496;;;;;;;;;;;;;:::i;:::-;;55287:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1739:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23364:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52333:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56986:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25417:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26287:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56420:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50896:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56266:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58327:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56351:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59178:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59330:70;;;;;;;;;;;;;:::i;:::-;;59406:79;;;;;;;;;;;;;:::i;:::-;;25796:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57985:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2648:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58873:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56388:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17548:615;17633:4;17948:10;17933:25;;:11;:25;;;;:102;;;;18025:10;18010:25;;:11;:25;;;;17933:102;:179;;;;18102:10;18087:25;;:11;:25;;;;17933:179;17913:199;;17548:615;;;:::o;23195:100::-;23249:13;23282:5;23275:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23195:100;:::o;25141:204::-;25209:7;25234:16;25242:7;25234;:16::i;:::-;25229:64;;25259:34;;;;;;;;;;;;;;25229:64;25313:15;:24;25329:7;25313:24;;;;;;;;;;;;;;;;;;;;;25306:31;;25141:204;;;:::o;24689:386::-;24762:13;24778:16;24786:7;24778;:16::i;:::-;24762:32;;24834:5;24811:28;;:19;:17;:19::i;:::-;:28;;;24807:175;;24859:44;24876:5;24883:19;:17;:19::i;:::-;24859:16;:44::i;:::-;24854:128;;24931:35;;;;;;;;;;;;;;24854:128;24807:175;25021:2;24994:15;:24;25010:7;24994:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25059:7;25055:2;25039:28;;25048:5;25039:28;;;;;;;;;;;;24751:324;24689:386;;:::o;56308:38::-;;;;:::o;16602:315::-;16655:7;16883:15;:13;:15::i;:::-;16868:12;;16852:13;;:28;:46;16845:53;;16602:315;:::o;34406:2800::-;34540:27;34570;34589:7;34570:18;:27::i;:::-;34540:57;;34655:4;34614:45;;34630:19;34614:45;;;34610:86;;34668:28;;;;;;;;;;;;;;34610:86;34710:27;34739:23;34766:28;34786:7;34766:19;:28::i;:::-;34709:85;;;;34894:62;34913:15;34930:4;34936:19;:17;:19::i;:::-;34894:18;:62::i;:::-;34889:174;;34976:43;34993:4;34999:19;:17;:19::i;:::-;34976:16;:43::i;:::-;34971:92;;35028:35;;;;;;;;;;;;;;34971:92;34889:174;35094:1;35080:16;;:2;:16;;;35076:52;;;35105:23;;;;;;;;;;;;;;35076:52;35141:43;35163:4;35169:2;35173:7;35182:1;35141:21;:43::i;:::-;35277:15;35274:160;;;35417:1;35396:19;35389:30;35274:160;35812:18;:24;35831:4;35812:24;;;;;;;;;;;;;;;;35810:26;;;;;;;;;;;;35881:18;:22;35900:2;35881:22;;;;;;;;;;;;;;;;35879:24;;;;;;;;;;;36203:145;36240:2;36288:45;36303:4;36309:2;36313:19;36288:14;:45::i;:::-;13830:8;36261:72;36203:18;:145::i;:::-;36174:17;:26;36192:7;36174:26;;;;;;;;;;;:174;;;;36518:1;13830:8;36468:19;:46;:51;36464:626;;;36540:19;36572:1;36562:7;:11;36540:33;;36729:1;36695:17;:30;36713:11;36695:30;;;;;;;;;;;;:35;36691:384;;;36833:13;;36818:11;:28;36814:242;;37013:19;36980:17;:30;36998:11;36980:30;;;;;;;;;;;:52;;;;36814:242;36691:384;36521:569;36464:626;37137:7;37133:2;37118:27;;37127:4;37118:27;;;;;;;;;;;;37156:42;37177:4;37183:2;37187:7;37196:1;37156:20;:42::i;:::-;34529:2677;;;34406:2800;;;:::o;56457:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;59498:145::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59551:7:::1;59572;:5;:7::i;:::-;59564:21;;59593;59564:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59550:69;;;59634:2;59626:11;;;::::0;::::1;;59543:100;59498:145::o:0;26031:185::-;26169:39;26186:4;26192:2;26196:7;26169:39;;;;;;;;;;;;:16;:39::i;:::-;26031:185;;;:::o;58787:80::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58853:8:::1;58846:4;:15;;;;58787:80:::0;:::o;59074:98::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59155:11:::1;59145:7;:21;;;;;;;;;;;;:::i;:::-;;59074:98:::0;:::o;51475:468::-;51564:23;51625:22;51650:8;:15;51625:40;;51680:34;51738:14;51717:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;51680:73;;51773:9;51768:125;51789:14;51784:1;:19;51768:125;;51845:32;51865:8;51874:1;51865:11;;;;;;;;:::i;:::-;;;;;;;;51845:19;:32::i;:::-;51829:10;51840:1;51829:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;51805:3;;;;;51768:125;;;;51914:10;51907:17;;;;51475:468;;;:::o;22984:144::-;23048:7;23091:27;23110:7;23091:18;:27::i;:::-;23068:52;;22984:144;;;:::o;56240:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18227:224::-;18291:7;18332:1;18315:19;;:5;:19;;;18311:60;;;18343:28;;;;;;;;;;;;;;18311:60;12782:13;18389:18;:25;18408:5;18389:25;;;;;;;;;;;;;;;;:54;18382:61;;18227:224;;;:::o;2390:103::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2455:30:::1;2482:1;2455:18;:30::i;:::-;2390:103::o:0;57483:496::-;56686:10;56673:23;;:9;:23;;;56665:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57569:7:::1;;;;;;;;;;;57561:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;57627:13;:25;57641:10;57627:25;;;;;;;;;;;;;;;;;;;;;;;;;57619:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57744:14;57761:13;:11;:13::i;:::-;57744:30;;57821:9;;56543:1;57789:6;:28;;;;:::i;:::-;:41;;57781:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57906:5;57878:13;:25;57892:10;57878:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;57931:42;57941:10;56543:1;57931:9;:42::i;:::-;57528:451;57483:496::o:0;55287:892::-;55357:16;55411:19;55445:25;55485:22;55510:16;55520:5;55510:9;:16::i;:::-;55485:41;;55541:25;55583:14;55569:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55541:57;;55613:31;;:::i;:::-;55664:9;55676:15;:13;:15::i;:::-;55664:27;;55659:472;55708:14;55693:11;:29;55659:472;;55760:15;55773:1;55760:12;:15::i;:::-;55748:27;;55798:9;:16;;;55794:73;;;55839:8;;55794:73;55915:1;55889:28;;:9;:14;;;:28;;;55885:111;;55962:9;:14;;;55942:34;;55885:111;56039:5;56018:26;;:17;:26;;;56014:102;;;56095:1;56069:8;56078:13;;;;;;56069:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;56014:102;55659:472;55724:3;;;;;55659:472;;;;56152:8;56145:15;;;;;;;55287:892;;;:::o;1739:87::-;1785:7;1812:6;;;;;;;;;;;1805:13;;1739:87;:::o;23364:104::-;23420:13;23453:7;23446:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23364:104;:::o;52333:2505::-;52468:16;52535:4;52526:5;:13;52522:45;;52548:19;;;;;;;;;;;;;;52522:45;52582:19;52616:17;52636:14;:12;:14::i;:::-;52616:34;;52736:15;:13;:15::i;:::-;52728:5;:23;52724:87;;;52780:15;:13;:15::i;:::-;52772:23;;52724:87;52887:9;52880:4;:16;52876:73;;;52924:9;52917:16;;52876:73;52963:25;52991:16;53001:5;52991:9;:16::i;:::-;52963:44;;53185:4;53177:5;:12;53173:278;;;53210:19;53239:5;53232:4;:12;53210:34;;53281:17;53267:11;:31;53263:111;;;53343:11;53323:31;;53263:111;53191:198;53173:278;;;53434:1;53414:21;;53173:278;53465:25;53507:17;53493:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53465:60;;53565:1;53544:17;:22;53540:78;;;53594:8;53587:15;;;;;;;;53540:78;53762:31;53796:26;53816:5;53796:19;:26::i;:::-;53762:60;;53837:25;54082:9;:16;;;54077:92;;54139:9;:14;;;54119:34;;54077:92;54188:9;54200:5;54188:17;;54183:478;54212:4;54207:1;:9;;:45;;;;;54235:17;54220:11;:32;;54207:45;54183:478;;;54290:15;54303:1;54290:12;:15::i;:::-;54278:27;;54328:9;:16;;;54324:73;;;54369:8;;54324:73;54445:1;54419:28;;:9;:14;;;:28;;;54415:111;;54492:9;:14;;;54472:34;;54415:111;54569:5;54548:26;;:17;:26;;;54544:102;;;54625:1;54599:8;54608:13;;;;;;54599:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;54544:102;54183:478;54254:3;;;;;54183:478;;;;54763:11;54753:8;54746:29;54811:8;54804:15;;;;;;;;52333:2505;;;;;;:::o;56986:491::-;56686:10;56673:23;;:9;:23;;;56665:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57093:10:::1;;;;;;;;;;;57085:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57184:14;57201:13;:11;:13::i;:::-;57184:30;;57243:1;57229:11;:15;57221:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57315:9;;57300:11;57291:6;:20;;;;:::i;:::-;:33;;57283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57386:11;57379:4;;:18;;;;:::i;:::-;57366:9;:31;;57358:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57437:34;57447:10;57459:11;57437:9;:34::i;:::-;57049:428;56986:491:::0;:::o;25417:308::-;25528:19;:17;:19::i;:::-;25516:31;;:8;:31;;;25512:61;;;25556:17;;;;;;;;;;;;;;25512:61;25638:8;25586:18;:39;25605:19;:17;:19::i;:::-;25586:39;;;;;;;;;;;;;;;:49;25626:8;25586:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25698:8;25662:55;;25677:19;:17;:19::i;:::-;25662:55;;;25708:8;25662:55;;;;;;:::i;:::-;;;;;;;;25417:308;;:::o;26287:399::-;26454:31;26467:4;26473:2;26477:7;26454:12;:31::i;:::-;26518:1;26500:2;:14;;;:19;26496:183;;26539:56;26570:4;26576:2;26580:7;26589:5;26539:30;:56::i;:::-;26534:145;;26623:40;;;;;;;;;;;;;;26534:145;26496:183;26287:399;;;;:::o;56420:30::-;;;;;;;;;;;;;:::o;50896:420::-;50972:21;;:::i;:::-;51006:31;;:::i;:::-;51062:15;:13;:15::i;:::-;51052:7;:25;:54;;;;51092:14;:12;:14::i;:::-;51081:7;:25;;51052:54;51048:103;;;51130:9;51123:16;;;;;51048:103;51173:21;51186:7;51173:12;:21::i;:::-;51161:33;;51209:9;:16;;;51205:65;;;51249:9;51242:16;;;;;51205:65;51287:21;51300:7;51287:12;:21::i;:::-;51280:28;;;50896:420;;;;:::o;56266:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58327:423::-;58425:13;58466:16;58474:7;58466;:16::i;:::-;58450:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;58556:28;58587:10;:8;:10::i;:::-;58556:41;;58642:1;58617:14;58611:28;:32;:133;;;;;;;;;;;;;;;;;58679:14;58695:18;58705:7;58695:9;:18::i;:::-;58715:13;58662:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58611:133;58604:140;;;58327:423;;;:::o;56351:32::-;;;;:::o;59178:122::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59277:17:::1;59261:13;:33;;;;;;;;;;;;:::i;:::-;;59178:122:::0;:::o;59330:70::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59387:7:::1;;;;;;;;;;;59386:8;59376:7;;:18;;;;;;;;;;;;;;;;;;59330:70::o:0;59406:79::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59469:10:::1;;;;;;;;;;;59468:11;59455:10;;:24;;;;;;;;;;;;;;;;;;59406:79::o:0;25796:164::-;25893:4;25917:18;:25;25936:5;25917:25;;;;;;;;;;;;;;;:35;25943:8;25917:35;;;;;;;;;;;;;;;;;;;;;;;;;25910:42;;25796:164;;;;:::o;57985:311::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58072:14:::1;58089:13;:11;:13::i;:::-;58072:30;;58131:1;58117:11;:15;58109:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58203:9;;58188:11;58179:6;:20;;;;:::i;:::-;:33;;58171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58256:34;58266:10;58278:11;58256:9;:34::i;:::-;58042:254;57985:311:::0;:::o;2648:201::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2757:1:::1;2737:22;;:8;:22;;;;2729:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2813:28;2832:8;2813:18;:28::i;:::-;2648:201:::0;:::o;58873:180::-;1970:12;:10;:12::i;:::-;1959:23;;:7;:5;:7::i;:::-;:23;;;1951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58952:9:::1;58948:100;58971:10;:17;58967:1;:21;58948:100;;;59036:4;59005:13;:28;59019:10;59030:1;59019:13;;;;;;;;:::i;:::-;;;;;;;;59005:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;58990:3;;;;;:::i;:::-;;;;58948:100;;;;58873:180:::0;:::o;56388:27::-;;;;;;;;;;;;;:::o;26941:273::-;26998:4;27054:7;27035:15;:13;:15::i;:::-;:26;;:66;;;;;27088:13;;27078:7;:23;27035:66;:152;;;;;27186:1;13552:8;27139:17;:26;27157:7;27139:26;;;;;;;;;;;;:43;:48;27035:152;27015:172;;26941:273;;;:::o;45502:105::-;45562:7;45589:10;45582:17;;45502:105;:::o;56861:86::-;56918:7;56940:1;56933:8;;56861:86;:::o;19901:1129::-;19968:7;19988:12;20003:7;19988:22;;20071:4;20052:15;:13;:15::i;:::-;:23;20048:915;;20105:13;;20098:4;:20;20094:869;;;20143:14;20160:17;:23;20178:4;20160:23;;;;;;;;;;;;20143:40;;20276:1;13552:8;20249:6;:23;:28;20245:699;;;20768:113;20785:1;20775:6;:11;20768:113;;;20828:17;:25;20846:6;;;;;;;20828:25;;;;;;;;;;;;20819:34;;20768:113;;;20914:6;20907:13;;;;;;20245:699;20120:843;20094:869;20048:915;20991:31;;;;;;;;;;;;;;19901:1129;;;;:::o;32742:652::-;32837:27;32866:23;32907:53;32963:15;32907:71;;33149:7;33143:4;33136:21;33184:22;33178:4;33171:36;33260:4;33254;33244:21;33221:44;;33356:19;33350:26;33331:45;;33087:300;32742:652;;;:::o;33507:645::-;33649:11;33811:15;33805:4;33801:26;33793:34;;33970:15;33959:9;33955:31;33942:44;;34117:15;34106:9;34103:30;34096:4;34085:9;34082:19;34079:55;34069:65;;33507:645;;;;;:::o;44335:159::-;;;;;:::o;42647:309::-;42782:7;42802:16;13953:3;42828:19;:40;;42802:67;;13953:3;42895:31;42906:4;42912:2;42916:9;42895:10;:31::i;:::-;42887:40;;:61;;42880:68;;;42647:309;;;;;:::o;22475:447::-;22555:14;22723:15;22716:5;22712:27;22703:36;;22897:5;22883:11;22859:22;22855:40;22852:51;22845:5;22842:62;22832:72;;22475:447;;;;:::o;45153:158::-;;;;;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;3009:191::-;3083:16;3102:6;;;;;;;;;;;3083:25;;3128:8;3119:6;;:17;;;;;;;;;;;;;;;;;;3183:8;3152:40;;3173:8;3152:40;;;;;;;;;;;;3072:128;3009:191;:::o;27298:104::-;27367:27;27377:2;27381:8;27367:27;;;;;;;;;;;;:9;:27::i;:::-;27298:104;;:::o;21578:153::-;21638:21;;:::i;:::-;21679:44;21698:17;:24;21716:5;21698:24;;;;;;;;;;;;21679:18;:44::i;:::-;21672:51;;21578:153;;;:::o;16297:95::-;16344:7;16371:13;;16364:20;;16297:95;:::o;41157:716::-;41320:4;41366:2;41341:45;;;41387:19;:17;:19::i;:::-;41408:4;41414:7;41423:5;41341:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41337:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41641:1;41624:6;:13;:18;41620:235;;;41670:40;;;;;;;;;;;;;;41620:235;41813:6;41807:13;41798:6;41794:2;41790:15;41783:38;41337:529;41510:54;;;41500:64;;;:6;:64;;;;41493:71;;;41157:716;;;;;;:::o;22234:158::-;22296:21;;:::i;:::-;22337:47;22356:27;22375:7;22356:18;:27::i;:::-;22337:18;:47::i;:::-;22330:54;;22234:158;;;:::o;56751:102::-;56811:13;56840:7;56833:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56751:102;:::o;45713:1960::-;45770:17;46189:3;46182:4;46176:11;46172:21;46165:28;;46280:3;46274:4;46267:17;46386:3;46842:5;46972:1;46967:3;46963:11;46956:18;;47109:2;47103:4;47099:13;47095:2;47091:22;47086:3;47078:36;47150:2;47144:4;47140:13;47132:21;;46734:697;47169:4;46734:697;;;47360:1;47355:3;47351:11;47344:18;;47411:2;47405:4;47401:13;47397:2;47393:22;47388:3;47380:36;47264:2;47258:4;47254:13;47246:21;;46734:697;;;46738:430;47470:3;47465;47461:13;47585:2;47580:3;47576:12;47569:19;;47648:6;47643:3;47636:19;45809:1857;;45713:1960;;;:::o;43532:147::-;43669:6;43532:147;;;;;:::o;27818:681::-;27941:19;27947:2;27951:8;27941:5;:19::i;:::-;28020:1;28002:2;:14;;;:19;27998:483;;28042:11;28056:13;;28042:27;;28088:13;28110:8;28104:3;:14;28088:30;;28137:233;28168:62;28207:1;28211:2;28215:7;;;;;;28224:5;28168:30;:62::i;:::-;28163:167;;28266:40;;;;;;;;;;;;;;28163:167;28365:3;28357:5;:11;28137:233;;28452:3;28435:13;;:20;28431:34;;28457:8;;;28431:34;28023:458;;27998:483;27818:681;;;:::o;21124:363::-;21190:31;;:::i;:::-;21267:6;21234:9;:14;;:41;;;;;;;;;;;13436:3;21320:6;:32;;21286:9;:24;;:67;;;;;;;;;;;21410:1;13552:8;21383:6;:23;:28;;21364:9;:16;;:47;;;;;;;;;;;13953:3;21451:6;:27;;21422:9;:19;;:57;;;;;;;;;;;21124:363;;;:::o;28772:1529::-;28837:20;28860:13;;28837:36;;28902:1;28888:16;;:2;:16;;;28884:48;;;28913:19;;;;;;;;;;;;;;28884:48;28959:1;28947:8;:13;28943:44;;;28969:18;;;;;;;;;;;;;;28943:44;29000:61;29030:1;29034:2;29038:12;29052:8;29000:21;:61::i;:::-;29543:1;12919:2;29514:1;:25;;29513:31;29501:8;:44;29475:18;:22;29494:2;29475:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;29822:139;29859:2;29913:33;29936:1;29940:2;29944:1;29913:14;:33::i;:::-;29880:30;29901:8;29880:20;:30::i;:::-;:66;29822:18;:139::i;:::-;29788:17;:31;29806:12;29788:31;;;;;;;;;;;:173;;;;29978:15;29996:12;29978:30;;30023:11;30052:8;30037:12;:23;30023:37;;30075:101;30127:9;;;;;;30123:2;30102:35;;30119:1;30102:35;;;;;;;;;;;;30171:3;30161:7;:13;30075:101;;30208:3;30192:13;:19;;;;29249:974;;30233:60;30262:1;30266:2;30270:12;30284:8;30233:20;:60::i;:::-;28826:1475;28772:1529;;:::o;24305:322::-;24375:14;24606:1;24596:8;24593:15;24568:23;24564:45;24554:55;;24305:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:619::-;7973:6;7981;7989;8038:2;8026:9;8017:7;8013:23;8009:32;8006:119;;;8044:79;;:::i;:::-;8006:119;8164:1;8189:53;8234:7;8225:6;8214:9;8210:22;8189:53;:::i;:::-;8179:63;;8135:117;8291:2;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;:::i;:::-;8307:63;;8262:118;8419:2;8445:53;8490:7;8481:6;8470:9;8466:22;8445:53;:::i;:::-;8435:63;;8390:118;7896:619;;;;;:::o;8521:539::-;8605:6;8654:2;8642:9;8633:7;8629:23;8625:32;8622:119;;;8660:79;;:::i;:::-;8622:119;8808:1;8797:9;8793:17;8780:31;8838:18;8830:6;8827:30;8824:117;;;8860:79;;:::i;:::-;8824:117;8965:78;9035:7;9026:6;9015:9;9011:22;8965:78;:::i;:::-;8955:88;;8751:302;8521:539;;;;:::o;9066:::-;9150:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:119;;;9205:79;;:::i;:::-;9167:119;9353:1;9342:9;9338:17;9325:31;9383:18;9375:6;9372:30;9369:117;;;9405:79;;:::i;:::-;9369:117;9510:78;9580:7;9571:6;9560:9;9556:22;9510:78;:::i;:::-;9500:88;;9296:302;9066:539;;;;:::o;9611:327::-;9669:6;9718:2;9706:9;9697:7;9693:23;9689:32;9686:119;;;9724:79;;:::i;:::-;9686:119;9844:1;9869:52;9913:7;9904:6;9893:9;9889:22;9869:52;:::i;:::-;9859:62;;9815:116;9611:327;;;;:::o;9944:349::-;10013:6;10062:2;10050:9;10041:7;10037:23;10033:32;10030:119;;;10068:79;;:::i;:::-;10030:119;10188:1;10213:63;10268:7;10259:6;10248:9;10244:22;10213:63;:::i;:::-;10203:73;;10159:127;9944:349;;;;:::o;10299:509::-;10368:6;10417:2;10405:9;10396:7;10392:23;10388:32;10385:119;;;10423:79;;:::i;:::-;10385:119;10571:1;10560:9;10556:17;10543:31;10601:18;10593:6;10590:30;10587:117;;;10623:79;;:::i;:::-;10587:117;10728:63;10783:7;10774:6;10763:9;10759:22;10728:63;:::i;:::-;10718:73;;10514:287;10299:509;;;;:::o;10814:329::-;10873:6;10922:2;10910:9;10901:7;10897:23;10893:32;10890:119;;;10928:79;;:::i;:::-;10890:119;11048:1;11073:53;11118:7;11109:6;11098:9;11094:22;11073:53;:::i;:::-;11063:63;;11019:117;10814:329;;;;:::o;11149:303::-;11280:10;11301:108;11405:3;11397:6;11301:108;:::i;:::-;11441:4;11436:3;11432:14;11418:28;;11149:303;;;;:::o;11458:179::-;11527:10;11548:46;11590:3;11582:6;11548:46;:::i;:::-;11626:4;11621:3;11617:14;11603:28;;11458:179;;;;:::o;11643:108::-;11720:24;11738:5;11720:24;:::i;:::-;11715:3;11708:37;11643:108;;:::o;11757:118::-;11844:24;11862:5;11844:24;:::i;:::-;11839:3;11832:37;11757:118;;:::o;11957:980::-;12138:3;12167:85;12246:5;12167:85;:::i;:::-;12268:117;12378:6;12373:3;12268:117;:::i;:::-;12261:124;;12409:87;12490:5;12409:87;:::i;:::-;12519:7;12550:1;12535:377;12560:6;12557:1;12554:13;12535:377;;;12636:6;12630:13;12663:125;12784:3;12769:13;12663:125;:::i;:::-;12656:132;;12811:91;12895:6;12811:91;:::i;:::-;12801:101;;12595:317;12582:1;12579;12575:9;12570:14;;12535:377;;;12539:14;12928:3;12921:10;;12143:794;;;11957:980;;;;:::o;12973:732::-;13092:3;13121:54;13169:5;13121:54;:::i;:::-;13191:86;13270:6;13265:3;13191:86;:::i;:::-;13184:93;;13301:56;13351:5;13301:56;:::i;:::-;13380:7;13411:1;13396:284;13421:6;13418:1;13415:13;13396:284;;;13497:6;13491:13;13524:63;13583:3;13568:13;13524:63;:::i;:::-;13517:70;;13610:60;13663:6;13610:60;:::i;:::-;13600:70;;13456:224;13443:1;13440;13436:9;13431:14;;13396:284;;;13400:14;13696:3;13689:10;;13097:608;;;12973:732;;;;:::o;13711:99::-;13782:21;13797:5;13782:21;:::i;:::-;13777:3;13770:34;13711:99;;:::o;13816:109::-;13897:21;13912:5;13897:21;:::i;:::-;13892:3;13885:34;13816:109;;:::o;13931:360::-;14017:3;14045:38;14077:5;14045:38;:::i;:::-;14099:70;14162:6;14157:3;14099:70;:::i;:::-;14092:77;;14178:52;14223:6;14218:3;14211:4;14204:5;14200:16;14178:52;:::i;:::-;14255:29;14277:6;14255:29;:::i;:::-;14250:3;14246:39;14239:46;;14021:270;13931:360;;;;:::o;14297:364::-;14385:3;14413:39;14446:5;14413:39;:::i;:::-;14468:71;14532:6;14527:3;14468:71;:::i;:::-;14461:78;;14548:52;14593:6;14588:3;14581:4;14574:5;14570:16;14548:52;:::i;:::-;14625:29;14647:6;14625:29;:::i;:::-;14620:3;14616:39;14609:46;;14389:272;14297:364;;;;:::o;14667:377::-;14773:3;14801:39;14834:5;14801:39;:::i;:::-;14856:89;14938:6;14933:3;14856:89;:::i;:::-;14849:96;;14954:52;14999:6;14994:3;14987:4;14980:5;14976:16;14954:52;:::i;:::-;15031:6;15026:3;15022:16;15015:23;;14777:267;14667:377;;;;:::o;15074:845::-;15177:3;15214:5;15208:12;15243:36;15269:9;15243:36;:::i;:::-;15295:89;15377:6;15372:3;15295:89;:::i;:::-;15288:96;;15415:1;15404:9;15400:17;15431:1;15426:137;;;;15577:1;15572:341;;;;15393:520;;15426:137;15510:4;15506:9;15495;15491:25;15486:3;15479:38;15546:6;15541:3;15537:16;15530:23;;15426:137;;15572:341;15639:38;15671:5;15639:38;:::i;:::-;15699:1;15713:154;15727:6;15724:1;15721:13;15713:154;;;15801:7;15795:14;15791:1;15786:3;15782:11;15775:35;15851:1;15842:7;15838:15;15827:26;;15749:4;15746:1;15742:12;15737:17;;15713:154;;;15896:6;15891:3;15887:16;15880:23;;15579:334;;15393:520;;15181:738;;15074:845;;;;:::o;15925:366::-;16067:3;16088:67;16152:2;16147:3;16088:67;:::i;:::-;16081:74;;16164:93;16253:3;16164:93;:::i;:::-;16282:2;16277:3;16273:12;16266:19;;15925:366;;;:::o;16297:::-;16439:3;16460:67;16524:2;16519:3;16460:67;:::i;:::-;16453:74;;16536:93;16625:3;16536:93;:::i;:::-;16654:2;16649:3;16645:12;16638:19;;16297:366;;;:::o;16669:::-;16811:3;16832:67;16896:2;16891:3;16832:67;:::i;:::-;16825:74;;16908:93;16997:3;16908:93;:::i;:::-;17026:2;17021:3;17017:12;17010:19;;16669:366;;;:::o;17041:::-;17183:3;17204:67;17268:2;17263:3;17204:67;:::i;:::-;17197:74;;17280:93;17369:3;17280:93;:::i;:::-;17398:2;17393:3;17389:12;17382:19;;17041:366;;;:::o;17413:::-;17555:3;17576:67;17640:2;17635:3;17576:67;:::i;:::-;17569:74;;17652:93;17741:3;17652:93;:::i;:::-;17770:2;17765:3;17761:12;17754:19;;17413:366;;;:::o;17785:::-;17927:3;17948:67;18012:2;18007:3;17948:67;:::i;:::-;17941:74;;18024:93;18113:3;18024:93;:::i;:::-;18142:2;18137:3;18133:12;18126:19;;17785:366;;;:::o;18157:398::-;18316:3;18337:83;18418:1;18413:3;18337:83;:::i;:::-;18330:90;;18429:93;18518:3;18429:93;:::i;:::-;18547:1;18542:3;18538:11;18531:18;;18157:398;;;:::o;18561:366::-;18703:3;18724:67;18788:2;18783:3;18724:67;:::i;:::-;18717:74;;18800:93;18889:3;18800:93;:::i;:::-;18918:2;18913:3;18909:12;18902:19;;18561:366;;;:::o;18933:::-;19075:3;19096:67;19160:2;19155:3;19096:67;:::i;:::-;19089:74;;19172:93;19261:3;19172:93;:::i;:::-;19290:2;19285:3;19281:12;19274:19;;18933:366;;;:::o;19305:::-;19447:3;19468:67;19532:2;19527:3;19468:67;:::i;:::-;19461:74;;19544:93;19633:3;19544:93;:::i;:::-;19662:2;19657:3;19653:12;19646:19;;19305:366;;;:::o;19677:::-;19819:3;19840:67;19904:2;19899:3;19840:67;:::i;:::-;19833:74;;19916:93;20005:3;19916:93;:::i;:::-;20034:2;20029:3;20025:12;20018:19;;19677:366;;;:::o;20121:864::-;20270:4;20265:3;20261:14;20357:4;20350:5;20346:16;20340:23;20376:63;20433:4;20428:3;20424:14;20410:12;20376:63;:::i;:::-;20285:164;20541:4;20534:5;20530:16;20524:23;20560:61;20615:4;20610:3;20606:14;20592:12;20560:61;:::i;:::-;20459:172;20715:4;20708:5;20704:16;20698:23;20734:57;20785:4;20780:3;20776:14;20762:12;20734:57;:::i;:::-;20641:160;20888:4;20881:5;20877:16;20871:23;20907:61;20962:4;20957:3;20953:14;20939:12;20907:61;:::i;:::-;20811:167;20239:746;20121:864;;:::o;21063:874::-;21222:4;21217:3;21213:14;21309:4;21302:5;21298:16;21292:23;21328:63;21385:4;21380:3;21376:14;21362:12;21328:63;:::i;:::-;21237:164;21493:4;21486:5;21482:16;21476:23;21512:61;21567:4;21562:3;21558:14;21544:12;21512:61;:::i;:::-;21411:172;21667:4;21660:5;21656:16;21650:23;21686:57;21737:4;21732:3;21728:14;21714:12;21686:57;:::i;:::-;21593:160;21840:4;21833:5;21829:16;21823:23;21859:61;21914:4;21909:3;21905:14;21891:12;21859:61;:::i;:::-;21763:167;21191:746;21063:874;;:::o;21943:105::-;22018:23;22035:5;22018:23;:::i;:::-;22013:3;22006:36;21943:105;;:::o;22054:108::-;22131:24;22149:5;22131:24;:::i;:::-;22126:3;22119:37;22054:108;;:::o;22168:118::-;22255:24;22273:5;22255:24;:::i;:::-;22250:3;22243:37;22168:118;;:::o;22292:105::-;22367:23;22384:5;22367:23;:::i;:::-;22362:3;22355:36;22292:105;;:::o;22403:589::-;22628:3;22650:95;22741:3;22732:6;22650:95;:::i;:::-;22643:102;;22762:95;22853:3;22844:6;22762:95;:::i;:::-;22755:102;;22874:92;22962:3;22953:6;22874:92;:::i;:::-;22867:99;;22983:3;22976:10;;22403:589;;;;;;:::o;22998:379::-;23182:3;23204:147;23347:3;23204:147;:::i;:::-;23197:154;;23368:3;23361:10;;22998:379;;;:::o;23383:222::-;23476:4;23514:2;23503:9;23499:18;23491:26;;23527:71;23595:1;23584:9;23580:17;23571:6;23527:71;:::i;:::-;23383:222;;;;:::o;23611:640::-;23806:4;23844:3;23833:9;23829:19;23821:27;;23858:71;23926:1;23915:9;23911:17;23902:6;23858:71;:::i;:::-;23939:72;24007:2;23996:9;23992:18;23983:6;23939:72;:::i;:::-;24021;24089:2;24078:9;24074:18;24065:6;24021:72;:::i;:::-;24140:9;24134:4;24130:20;24125:2;24114:9;24110:18;24103:48;24168:76;24239:4;24230:6;24168:76;:::i;:::-;24160:84;;23611:640;;;;;;;:::o;24257:497::-;24462:4;24500:2;24489:9;24485:18;24477:26;;24549:9;24543:4;24539:20;24535:1;24524:9;24520:17;24513:47;24577:170;24742:4;24733:6;24577:170;:::i;:::-;24569:178;;24257:497;;;;:::o;24760:373::-;24903:4;24941:2;24930:9;24926:18;24918:26;;24990:9;24984:4;24980:20;24976:1;24965:9;24961:17;24954:47;25018:108;25121:4;25112:6;25018:108;:::i;:::-;25010:116;;24760:373;;;;:::o;25139:210::-;25226:4;25264:2;25253:9;25249:18;25241:26;;25277:65;25339:1;25328:9;25324:17;25315:6;25277:65;:::i;:::-;25139:210;;;;:::o;25355:313::-;25468:4;25506:2;25495:9;25491:18;25483:26;;25555:9;25549:4;25545:20;25541:1;25530:9;25526:17;25519:47;25583:78;25656:4;25647:6;25583:78;:::i;:::-;25575:86;;25355:313;;;;:::o;25674:419::-;25840:4;25878:2;25867:9;25863:18;25855:26;;25927:9;25921:4;25917:20;25913:1;25902:9;25898:17;25891:47;25955:131;26081:4;25955:131;:::i;:::-;25947:139;;25674:419;;;:::o;26099:::-;26265:4;26303:2;26292:9;26288:18;26280:26;;26352:9;26346:4;26342:20;26338:1;26327:9;26323:17;26316:47;26380:131;26506:4;26380:131;:::i;:::-;26372:139;;26099:419;;;:::o;26524:::-;26690:4;26728:2;26717:9;26713:18;26705:26;;26777:9;26771:4;26767:20;26763:1;26752:9;26748:17;26741:47;26805:131;26931:4;26805:131;:::i;:::-;26797:139;;26524:419;;;:::o;26949:::-;27115:4;27153:2;27142:9;27138:18;27130:26;;27202:9;27196:4;27192:20;27188:1;27177:9;27173:17;27166:47;27230:131;27356:4;27230:131;:::i;:::-;27222:139;;26949:419;;;:::o;27374:::-;27540:4;27578:2;27567:9;27563:18;27555:26;;27627:9;27621:4;27617:20;27613:1;27602:9;27598:17;27591:47;27655:131;27781:4;27655:131;:::i;:::-;27647:139;;27374:419;;;:::o;27799:::-;27965:4;28003:2;27992:9;27988:18;27980:26;;28052:9;28046:4;28042:20;28038:1;28027:9;28023:17;28016:47;28080:131;28206:4;28080:131;:::i;:::-;28072:139;;27799:419;;;:::o;28224:::-;28390:4;28428:2;28417:9;28413:18;28405:26;;28477:9;28471:4;28467:20;28463:1;28452:9;28448:17;28441:47;28505:131;28631:4;28505:131;:::i;:::-;28497:139;;28224:419;;;:::o;28649:::-;28815:4;28853:2;28842:9;28838:18;28830:26;;28902:9;28896:4;28892:20;28888:1;28877:9;28873:17;28866:47;28930:131;29056:4;28930:131;:::i;:::-;28922:139;;28649:419;;;:::o;29074:::-;29240:4;29278:2;29267:9;29263:18;29255:26;;29327:9;29321:4;29317:20;29313:1;29302:9;29298:17;29291:47;29355:131;29481:4;29355:131;:::i;:::-;29347:139;;29074:419;;;:::o;29499:::-;29665:4;29703:2;29692:9;29688:18;29680:26;;29752:9;29746:4;29742:20;29738:1;29727:9;29723:17;29716:47;29780:131;29906:4;29780:131;:::i;:::-;29772:139;;29499:419;;;:::o;29924:347::-;30079:4;30117:3;30106:9;30102:19;30094:27;;30131:133;30261:1;30250:9;30246:17;30237:6;30131:133;:::i;:::-;29924:347;;;;:::o;30277:222::-;30370:4;30408:2;30397:9;30393:18;30385:26;;30421:71;30489:1;30478:9;30474:17;30465:6;30421:71;:::i;:::-;30277:222;;;;:::o;30505:129::-;30539:6;30566:20;;:::i;:::-;30556:30;;30595:33;30623:4;30615:6;30595:33;:::i;:::-;30505:129;;;:::o;30640:75::-;30673:6;30706:2;30700:9;30690:19;;30640:75;:::o;30721:311::-;30798:4;30888:18;30880:6;30877:30;30874:56;;;30910:18;;:::i;:::-;30874:56;30960:4;30952:6;30948:17;30940:25;;31020:4;31014;31010:15;31002:23;;30721:311;;;:::o;31038:::-;31115:4;31205:18;31197:6;31194:30;31191:56;;;31227:18;;:::i;:::-;31191:56;31277:4;31269:6;31265:17;31257:25;;31337:4;31331;31327:15;31319:23;;31038:311;;;:::o;31355:307::-;31416:4;31506:18;31498:6;31495:30;31492:56;;;31528:18;;:::i;:::-;31492:56;31566:29;31588:6;31566:29;:::i;:::-;31558:37;;31650:4;31644;31640:15;31632:23;;31355:307;;;:::o;31668:308::-;31730:4;31820:18;31812:6;31809:30;31806:56;;;31842:18;;:::i;:::-;31806:56;31880:29;31902:6;31880:29;:::i;:::-;31872:37;;31964:4;31958;31954:15;31946:23;;31668:308;;;:::o;31982:163::-;32080:4;32103:3;32095:11;;32133:4;32128:3;32124:14;32116:22;;31982:163;;;:::o;32151:132::-;32218:4;32241:3;32233:11;;32271:4;32266:3;32262:14;32254:22;;32151:132;;;:::o;32289:141::-;32338:4;32361:3;32353:11;;32384:3;32381:1;32374:14;32418:4;32415:1;32405:18;32397:26;;32289:141;;;:::o;32436:145::-;32534:6;32568:5;32562:12;32552:22;;32436:145;;;:::o;32587:114::-;32654:6;32688:5;32682:12;32672:22;;32587:114;;;:::o;32707:98::-;32758:6;32792:5;32786:12;32776:22;;32707:98;;;:::o;32811:99::-;32863:6;32897:5;32891:12;32881:22;;32811:99;;;:::o;32916:144::-;33017:4;33049;33044:3;33040:14;33032:22;;32916:144;;;:::o;33066:113::-;33136:4;33168;33163:3;33159:14;33151:22;;33066:113;;;:::o;33185:215::-;33315:11;33349:6;33344:3;33337:19;33389:4;33384:3;33380:14;33365:29;;33185:215;;;;:::o;33406:184::-;33505:11;33539:6;33534:3;33527:19;33579:4;33574:3;33570:14;33555:29;;33406:184;;;;:::o;33596:168::-;33679:11;33713:6;33708:3;33701:19;33753:4;33748:3;33744:14;33729:29;;33596:168;;;;:::o;33770:147::-;33871:11;33908:3;33893:18;;33770:147;;;;:::o;33923:169::-;34007:11;34041:6;34036:3;34029:19;34081:4;34076:3;34072:14;34057:29;;33923:169;;;;:::o;34098:148::-;34200:11;34237:3;34222:18;;34098:148;;;;:::o;34252:305::-;34292:3;34311:20;34329:1;34311:20;:::i;:::-;34306:25;;34345:20;34363:1;34345:20;:::i;:::-;34340:25;;34499:1;34431:66;34427:74;34424:1;34421:81;34418:107;;;34505:18;;:::i;:::-;34418:107;34549:1;34546;34542:9;34535:16;;34252:305;;;;:::o;34563:348::-;34603:7;34626:20;34644:1;34626:20;:::i;:::-;34621:25;;34660:20;34678:1;34660:20;:::i;:::-;34655:25;;34848:1;34780:66;34776:74;34773:1;34770:81;34765:1;34758:9;34751:17;34747:105;34744:131;;;34855:18;;:::i;:::-;34744:131;34903:1;34900;34896:9;34885:20;;34563:348;;;;:::o;34917:96::-;34954:7;34983:24;35001:5;34983:24;:::i;:::-;34972:35;;34917:96;;;:::o;35019:90::-;35053:7;35096:5;35089:13;35082:21;35071:32;;35019:90;;;:::o;35115:149::-;35151:7;35191:66;35184:5;35180:78;35169:89;;35115:149;;;:::o;35270:126::-;35307:7;35347:42;35340:5;35336:54;35325:65;;35270:126;;;:::o;35402:91::-;35438:7;35478:8;35471:5;35467:20;35456:31;;35402:91;;;:::o;35499:77::-;35536:7;35565:5;35554:16;;35499:77;;;:::o;35582:101::-;35618:7;35658:18;35651:5;35647:30;35636:41;;35582:101;;;:::o;35689:154::-;35773:6;35768:3;35763;35750:30;35835:1;35826:6;35821:3;35817:16;35810:27;35689:154;;;:::o;35849:307::-;35917:1;35927:113;35941:6;35938:1;35935:13;35927:113;;;36026:1;36021:3;36017:11;36011:18;36007:1;36002:3;35998:11;35991:39;35963:2;35960:1;35956:10;35951:15;;35927:113;;;36058:6;36055:1;36052:13;36049:101;;;36138:1;36129:6;36124:3;36120:16;36113:27;36049:101;35898:258;35849:307;;;:::o;36162:320::-;36206:6;36243:1;36237:4;36233:12;36223:22;;36290:1;36284:4;36280:12;36311:18;36301:81;;36367:4;36359:6;36355:17;36345:27;;36301:81;36429:2;36421:6;36418:14;36398:18;36395:38;36392:84;;;36448:18;;:::i;:::-;36392:84;36213:269;36162:320;;;:::o;36488:281::-;36571:27;36593:4;36571:27;:::i;:::-;36563:6;36559:40;36701:6;36689:10;36686:22;36665:18;36653:10;36650:34;36647:62;36644:88;;;36712:18;;:::i;:::-;36644:88;36752:10;36748:2;36741:22;36531:238;36488:281;;:::o;36775:233::-;36814:3;36837:24;36855:5;36837:24;:::i;:::-;36828:33;;36883:66;36876:5;36873:77;36870:103;;;36953:18;;:::i;:::-;36870:103;37000:1;36993:5;36989:13;36982:20;;36775:233;;;:::o;37014:180::-;37062:77;37059:1;37052:88;37159:4;37156:1;37149:15;37183:4;37180:1;37173:15;37200:180;37248:77;37245:1;37238:88;37345:4;37342:1;37335:15;37369:4;37366:1;37359:15;37386:180;37434:77;37431:1;37424:88;37531:4;37528:1;37521:15;37555:4;37552:1;37545:15;37572:180;37620:77;37617:1;37610:88;37717:4;37714:1;37707:15;37741:4;37738:1;37731:15;37758:117;37867:1;37864;37857:12;37881:117;37990:1;37987;37980:12;38004:117;38113:1;38110;38103:12;38127:117;38236:1;38233;38226:12;38250:117;38359:1;38356;38349:12;38373:102;38414:6;38465:2;38461:7;38456:2;38449:5;38445:14;38441:28;38431:38;;38373:102;;;:::o;38481:225::-;38621:34;38617:1;38609:6;38605:14;38598:58;38690:8;38685:2;38677:6;38673:15;38666:33;38481:225;:::o;38712:172::-;38852:24;38848:1;38840:6;38836:14;38829:48;38712:172;:::o;38890:171::-;39030:23;39026:1;39018:6;39014:14;39007:47;38890:171;:::o;39067:174::-;39207:26;39203:1;39195:6;39191:14;39184:50;39067:174;:::o;39247:182::-;39387:34;39383:1;39375:6;39371:14;39364:58;39247:182;:::o;39435:234::-;39575:34;39571:1;39563:6;39559:14;39552:58;39644:17;39639:2;39631:6;39627:15;39620:42;39435:234;:::o;39675:114::-;;:::o;39795:168::-;39935:20;39931:1;39923:6;39919:14;39912:44;39795:168;:::o;39969:180::-;40109:32;40105:1;40097:6;40093:14;40086:56;39969:180;:::o;40155:229::-;40295:34;40291:1;40283:6;40279:14;40272:58;40364:12;40359:2;40351:6;40347:15;40340:37;40155:229;:::o;40390:177::-;40530:29;40526:1;40518:6;40514:14;40507:53;40390:177;:::o;40573:122::-;40646:24;40664:5;40646:24;:::i;:::-;40639:5;40636:35;40626:63;;40685:1;40682;40675:12;40626:63;40573:122;:::o;40701:116::-;40771:21;40786:5;40771:21;:::i;:::-;40764:5;40761:32;40751:60;;40807:1;40804;40797:12;40751:60;40701:116;:::o;40823:120::-;40895:23;40912:5;40895:23;:::i;:::-;40888:5;40885:34;40875:62;;40933:1;40930;40923:12;40875:62;40823:120;:::o;40949:122::-;41022:24;41040:5;41022:24;:::i;:::-;41015:5;41012:35;41002:63;;41061:1;41058;41051:12;41002:63;40949:122;:::o
Swarm Source
ipfs://30ad438830cc184f7b24cdd1fde4b8ad7f5396e8bffba8fdf2bdb3264b0be7f7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.